Форум: "Базы";
Текущий архив: 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.037 c