Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

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

 
Леонид   (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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.11 c
8-1110034346
Narik
2005-03-05 17:52
2005.07.11
Как прокрутить видео файл компонента MediaPlayer


4-1116235680
СМА
2005-05-16 13:28
2005.07.11
СОМ порт под WIN_XP


1-1118691044
Knoxville
2005-06-13 23:30
2005.07.11
Delphi и Photoshop


6-1112097854
Laboris
2005-03-29 16:04
2005.07.11
Поиск компов с открытым портом


3-1117189350
lifo
2005-05-27 14:22
2005.07.11
тригеры и процедуры