Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Удаление записи на которой находится курсор   Найти похожие ветки 

 
Леонид   (2005-05-31 12:19) [0]

Вообщем такая проблема, хоть и стыдно, но не знаю как сделать или пример где посмотреть.
Имеется Grid в котором данные отображены с TQuery.
Имеется кнопка "Удалить" хочу по нажатию на кнопку удалить строку которая выделена.
В таблице есть уникальное поле RN.

Вопрос только как получить мне значение этого поля, чтобы передать затем в динамич. запрос на удаление...


 
Sergey13 ©   (2005-05-31 12:26) [1]

Заополнить правильно свойства TUpdateSQL. Потом достаточно Delete.


 
Антоныч   (2005-05-31 12:26) [2]

Если в запросе поле упоминалось, то простым обращением к нему:
tmp:=Query1.FieldByName("RN").AsInteger;


 
Леонид   (2005-05-31 12:39) [3]

FieldByName - мне не доступно.
Вообщем поточнее обясню.
В гриде отображены все записи, столбы в по нужному только отсортированы.

DM - DataModule
Kip - TQuery
KipDS - TDataSourse

Вот код кнопки "Удалить"


 DM.Kip.SQL.Clear;
 DM.Kip.SQL.ADD("delete from pribor where RN=:RN");
 DM.Kip.ParamByName("RN").AsInteger:="не знаю как получить значение";
 DM.Kip.ExecSQL;


Так еще и не понял как получить значение поля RN, строка которая в данный момент выделена.


 
Антоныч   (2005-05-31 12:45) [4]


> FieldByName - мне не доступно.

В смысле, не появляется в окне дополнения кода? А ты напиши ручками, заработает. С FieldByName такое бывает.
DM.Kip.ParamByName("RN").AsInteger:=Query1.FieldByName("RN").AsInteger;

Напиши, должно заработать


 
Sergey13 ©   (2005-05-31 12:47) [5]

2[3] Леонид   (31.05.05 12:39)
А не Kip у тебя случайно в гриде отображается? Иначе навиг бы ему KipDS.


 
Сайбель Алексей ©   (2005-05-31 12:48) [6]

2
Воспользуйся советом:
Sergey13 © [1]
потом просто:
Query1.Delete;
удалиться запись на которой сейчас находиться курсор.


 
Леонид   (2005-05-31 12:53) [7]

DM.Kip.SQL.Clear;
 DM.Kip.SQL.ADD("delete from pribor where RN=:RN");
 DM.Kip.ParamByName("RN").AsInteger:=DM.Kip.FieldByName("RN").AsInteger;
 K:=IntToStr(DM.Kip.FieldByName("RN").AsInteger);
 ShowMessage(k);

Вот сделал. Решил проверить. И в результате в ShowMessage всегда 0. :(


 
ANB ©   (2005-05-31 12:58) [8]

Удивительно, что не вывалилась ошибка.
Уже писали же Query1.FieldByName
Ты же пытаешься достать поле из запроса удаления. Откуда оно там возьмется ?
К какому дэйтасету у тебя грид привязан ?


 
_dimka   (2005-05-31 13:01) [9]

Тебе же написали подключи TUpdateSQL, правой кнопкой по нему и там сгенерируй все запросі на удалени, добавление и т.д., и не мучайся.
Потом просто сделаешь Kip.Delete;


 
_dimka   (2005-05-31 13:02) [10]

А відает у тебя 0 потому что после
DM.Kip.SQL.Clear;
у тебя Kip закріваеться.


 
Сайбель Алексей ©   (2005-05-31 13:08) [11]

2 Леонид [7]
Ну ты присваеваешь параметру значения, а кто выполнять сам запрос будет? надо окрывать Kip.Open;
P.S. Ты же сказал что FieldByName тебе не доступно?? =)


 
Антоныч   (2005-05-31 13:09) [12]


> А відает у тебя 0 потому что после
> DM.Kip.SQL.Clear;
> у тебя Kip закріваеться


Неправда. Этим он всего лишь удаляет текст запроса, а его результат все еще находится в KIP - ведь не было команды на какое-нибудь обновление запроса.
Попробуй для удаления записи из KIP использовать запрос с другим именем:
DM.Kip1.SQL.ADD("delete from pribor where RN=:RN");
DM.Kip1.ParamByName("RN").DataType:=ftInteger;
DM.Kip1.ParamByName("RN").AsInteger:=DM.Kip.FieldByName("RN").AsInteger;


 
Леонид   (2005-05-31 13:10) [13]

Спасибо _dimka - ошибку я свою понял. По поводу TUpdateSQL - я еще его не пробовал, вот и боюсь немного...

А вообще всем спасибо.


 
_dimka   (2005-05-31 13:13) [14]


> Антоныч   (31.05.05 13:09)

Query1.SQL.Clear;
if Query1.Active then
  Showmessage("Открыт");
И у меня почему-то сообщение не появляеться...


 
_dimka   (2005-05-31 13:15) [15]


> _dimka   (31.05.05 13:13)


> Антоныч  

Проверьте если не верите :)


 
Антоныч   (2005-05-31 13:27) [16]

А до этого он был Active?


 
_dimka   (2005-05-31 13:31) [17]


> Антоныч   (31.05.05 13:27)

Да

property SQL: TStrings read FSQL write SetQuery;

procedure TQuery.SetQuery(Value: TStrings);
begin
 if SQL.Text <> Value.Text then
 begin
   Disconnect;
   SQL.BeginUpdate;
   try
     SQL.Assign(Value);
   finally
     SQL.EndUpdate;
   end;
 end;
end;


 
Леонид   (2005-05-31 13:36) [18]

TUpdateSql - не знаю как даже применить.
Если кому не трудно, покажите на примере с параметрами или с моими данными.


 
_dimka   (2005-05-31 13:42) [19]


> Леонид   (31.05.05 13:36)

Вобщем добавляешь на форму TUpdateSql в Своем Kip в свойстве UpdateObject ставиш его, потом два раза по TUpdateSql если есть первичній ключ то нажимаешь Select Prymary Key и нажимаешь Generate SQL, если нет ПК то просто нажимаешь Generate SQL. Потом нажимаешь ОК. И можешь юзать
Query1.Delete;
Query1.Insert;
Query1.Edit;


 
Sergey13 ©   (2005-05-31 13:44) [20]

2 [19] _dimka   (31.05.05 13:42)
>  если нет ПК то просто нажимаешь Generate SQL.
То лучше его (ПК) сделать. Иначе ошибки полезут почти гарантировано.


 
_dimka   (2005-05-31 13:46) [21]


> Sergey13 ©   (31.05.05 13:44)

Это точно потому как могут попасть две абсолютно одинаковые записи и потом когда будешь удалять две и удалиться :)


 
Леонид   (2005-05-31 13:58) [22]

Спасибо за разъяснение. Буду пробовать щас.
Вот еще с проблемой столкнулся.
Напр. нужно присвоить какому-либо параметру пустое значение, а Делфи ругается, а как тогда быть, если так как ниже нельзя.

DM.Kip.ParamByName("NomerPP").Value:=null


 
evvcom ©   (2005-05-31 13:59) [23]


> TUpdateSql - не знаю как даже применить.

Кидаешь на форму. Подвязываешь его к TQuery.UpdateObject. В тексте в качестве имен параметров используешь те же имена, что и в курсоре, возвращенном TQuery, имена полей, только начинающиеся с : (двоеточия). Доступ к старым значениям поля через :OLD_<имя поля> (так по-моему). Только в TQuery CachedUpdates в True установи.
В TQuery: select id, a, b from t1 where ...
В TUpdateSql,
Update: update t1 set a = :a, b = :b where id = :old_id -- хотя ключ id меняться не должен и здесь поэтому допустимо использовать :id, тем не менее показана возможность сего для наглядности.
Delete: delete from t1 where id = :id
ну и для Insert что-нибудь.

Далее можно смело пользоваться Query.{Edit | Append | Delete} и затем, чтобы из кеша изменения прошли в реальные таблицы
if Query.UpdatesPending then Query.ApplyUpdates;
или откат изменений Query.CancelUpdates;


 
_dimka   (2005-05-31 14:00) [24]


> Леонид   (31.05.05 13:58)

А какой тип у параметра?


 
evvcom ©   (2005-05-31 14:01) [25]


> Напр. нужно присвоить какому-либо параметру пустое значение

ParamByName("xfx").Clear;


 
Sergey13 ©   (2005-05-31 14:02) [26]

2[22] Леонид   (31.05.05 13:58)
>DM.Kip.ParamByName("NomerPP").Value:=null
DM.Kip.ParamByName("NomerPP").Clear


 
Леонид   (2005-05-31 14:11) [27]

Тип параметра Integer.
Я делаю вот так

if Edit1.text="" then
 DM.Kip.ParamByName("NomerPP").Clear
 else
   DM.Kip.ParamByName("NomerPP").Value:=StrToInt(Edit1.text);


Так не работает


 
Sergey13 ©   (2005-05-31 14:14) [28]

2 [27] Леонид   (31.05.05 14:11)
А запрос какой, где этот параметр? И что значит не работает?


 
Леонид   (2005-05-31 14:20) [29]

Да, хоть в insert, хоть в update
Не работает - ругается типа параметр не определен. Если ставишь например так

DM.Kip.ParamByName("NomerPP").Value:=0

все нормально


 
Sergey13 ©   (2005-05-31 14:25) [30]

2[29] Леонид   (31.05.05 14:20)
Ну дык напиши
DM.Kip.ParamByName("NomerPP").asInteger


 
Леонид   (2005-05-31 14:32) [31]

Это написано до строки и даже написал после

DM.Kip.ParamByName("NomerPP").Clear


 
Виталий Панасенко   (2005-05-31 14:38) [32]

А в GRid откуда данные берутся для показа ?


 
Sergey13 ©   (2005-05-31 14:46) [33]

2[31] Леонид   (31.05.05 14:32)
Не особо понял. Но попробуй тогда определять тип параметра перд присваиванием явно.


 
_dimka   (2005-05-31 14:51) [34]


> Леонид  

Я что-то не понял а зачем тебе параметр при insertе?


 
Sergey13 ©   (2005-05-31 14:54) [35]

2[34] _dimka   (31.05.05 14:51)
>Я что-то не понял а зачем тебе параметр при insertе?
А там Insert? У него что один запрос вообще на ФСЕ. 8-)


 
Леонид   (2005-05-31 14:58) [36]

Вот код, чувствую, что ужасный. Нужно сделать просто поеп побыстрее...

procedure TGlav_f.Button1Click(Sender: TObject);
var nNomerPP, k: integer;
      nNaimen, s: string;
begin
 K:=DM.Kip.FieldByName("RN").AsInteger;
 DM.Kip.ParamByName("NomerPP").AsInteger;
 DM.Kip.SQL.Clear;
if P<>2 then
 begin
   DM.Kip.SQL.ADD("INSERT INTO pribor (NomerPP, Naimen, Tip, Predel, NomerZ, DataPov, DataNext, Inventar, Ceh, Mesto, Prim) values(:NomerPP, :Naimen, :Tip, :Predel, :NomerZ, :DataPov, :DataNext, :Inventar, :Ceh, :Mesto, :Prim)");
   DM.Kip.ParamByName("NomerPP").Value:=StrToInt(Edit1.text);
   DM.Kip.ParamByName("Naimen").Value:=ComboBox1.Text;
   DM.Kip.ParamByName("Tip").Value:=Edit2.text;
   DM.Kip.ParamByName("Predel").Value:=Edit3.text;
   DM.Kip.ParamByName("NomerZ").Value:=Edit4.text;
   DM.Kip.ParamByName("DataPov").Value:=StrToDate(MaskEdit1.text);
   DM.Kip.ParamByName("DataNext").Value:=StrToDate(MaskEdit2.text);
   DM.Kip.ParamByName("Inventar").Value:=Edit5.text;
   DM.Kip.ParamByName("Ceh").Value:=ComboBox2.text;
   DM.Kip.ParamByName("Mesto").Value:=Edit6.text;
   DM.Kip.ParamByName("Prim").Value:=Edit7.text;
//    nNomerPP:=DM.Kip.ParamByName("NomerPP").Value;
//    nNaimen:=DM.Kip.ParamByName("Naimen").Value;
 end
   else
     begin
      DM.Kip.SQL.ADD("UPDATE pribor set NomerPP=:NomerPP, Naimen=:Naimen, Tip=:Tip, Predel=:Predel, NomerZ=:NomerZ, DataPov=:DataPov, DataNext=:DataNext, Inventar=:Inventar, Ceh=:Ceh, Mesto=:Mesto, Prim=:Prim where RN=:RN");
      DM.Kip.ParamByName("RN").AsInteger:=K;
      if Edit1.text="" then
      begin
      DM.Kip.ParamByName("NomerPP").Clear;
      end
      else
      begin
      DM.Kip.ParamByName("NomerPP").Value:=StrToInt(Edit1.text);
      end;
      DM.Kip.ParamByName("Naimen").Value:=ComboBox1.Text;
      DM.Kip.ParamByName("Tip").Value:=Edit2.text;
      DM.Kip.ParamByName("Predel").Value:=Edit3.text;
      DM.Kip.ParamByName("NomerZ").Value:=Edit4.text;
      DM.Kip.ParamByName("DataPov").Value:=StrToDate(MaskEdit1.text);
      DM.Kip.ParamByName("DataNext").Value:=StrToDate(MaskEdit2.text);
      DM.Kip.ParamByName("Inventar").Value:=Edit5.text;
      DM.Kip.ParamByName("Ceh").Value:=ComboBox2.text;
      DM.Kip.ParamByName("Mesto").Value:=Edit6.text;
      DM.Kip.ParamByName("Prim").Value:=Edit7.text;
//       nNomerPP:=DM.Kip.ParamByName("NomerPP").Value;
//       nNaimen:=DM.Kip.ParamByName("Naimen").Value;
     end;
 DM.Kip.ExecSQL;
 DM.Kip.Active:=false;
 DM.Kip.SQL.Clear;
 DM.Kip.SQL.ADD("select * from pribor order by NomerPP, Naimen");
 DM.Kip.Active:=true;
//  DM.Kip.Locate("NomerPP",nNomerPP,[loPartialKey]);
//  DM.Kip.Locate("Naimen",nNaimen,[loPartialKey]);
 Button1.Enabled:=false;
end;


 
_dimka   (2005-05-31 14:59) [37]


> Sergey13 ©   (31.05.05 14:54)


> [29] Леонид   (31.05.05 14:20)
> Да, хоть в insert, хоть в update

Наверно он пітаеться при insert сразу вставить и значения полей...8-)
Если так то делай так:
Kip.Insert;
Kip.FieldByName("NimerPP").AsInteger:=StrToInt(Edit1.text);
....
Kip.Post;


 
Леонид   (2005-05-31 15:05) [38]

У меня в зависимости от переменной P происходит или добавление или апдейт.
Я не понял, а при чем Kip.Post.


 
_dimka   (2005-05-31 15:06) [39]

ИСПОЛЬЗУЙ TUpdateSQL

procedure TGlav_f.Button1Click(Sender: TObject);
var nNomerPP, k: integer;
     nNaimen, s: string;
begin
if DM.Kip.FieldByName("RN").AsInteger<>2 then
DM.Kip.Insert
else
DM.Kip.Edit;
DM.Kip.FieldByName("NomerPP").Value:=StrToInt(Edit1.text);
DM.Kip.FieldByName("Naimen").Value:=ComboBox1.Text;
DM.Kip.FieldByName("Tip").Value:=Edit2.text;
DM.Kip.FieldByName("Predel").Value:=Edit3.text;
.......
DM.Kip.Post;
Button1.Enabled:=false;
End;


 
_dimka   (2005-05-31 15:11) [40]

Извини не правильно понял...

> if DM.Kip.FieldByName("RN").AsInteger<>2 then
> DM.Kip.Insert
> else
> DM.Kip.Edit;
> DM.Kip.FieldByName("NomerPP").Value:=StrToInt(Edit1.text);

k:=DM.Kip.FieldByName("RN").AsInteger;
if P<>2 then
begin
DM.Kip.Insert
DM.Kip.FieldByName("NomerPP").Value:=StrToInt(Edit1.text);
end else
begin
DM.Kip.Edit;
DM.Kip.ParamByName("RN").AsInteger:=K;
end;
Post это означает завершение редактирования записи...



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.039 c
14-1118379504
boriskb
2005-06-10 08:58
2005.07.11
Есть желающие прокоментировать?


4-1115894651
misyachniy
2005-05-12 14:44
2005.07.11
Как правильно организовать задержку при обращении к USB?


14-1118301380
DiamondShark
2005-06-09 11:16
2005.07.11
Хочу писать GINA.


6-1112687353
Sergey2005
2005-04-05 11:49
2005.07.11
Фильтр страниц, загружаемых через протокол HTTP


4-1116431908
George
2005-05-18 19:58
2005.07.11
SolidWorks





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский