![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ступор при редактировании поля VARCHAR с пом. FIBPLus [D7, XP]
s_t_d © (2010-03-25 01:26:00)Редактирование поля VAL типа VARCHAR в табл. T1 с пом. IB Expert (SQL-Editor) проходит вполне успешно например с пом. вот такого запроса.
UPDATE T1 SET VAL = 'А7' WHERE ID = 1
А вот попытка интерпретировать подобное редактирование след. образом к ни к какому результату не приводит...
t := 'A7';
id := 1;
sqlt := 'UPDATE T1 SET VAL = ' + '''' + t + '''';
sqlt := sqlt + ' WHERE ID = ' + IntToStr(id);
F1.pFIBDataSet1.Close;
F1.pFIBDataSet1.UpdateSQL.Clear;
F1.pFIBDataSet1.UpdateSQL.Add(sqlt);
F1.pFIBDataSet1.Open;
F1.pFIBDataSet1.Edit;
F1.pFIBDataSet1.UpdateRecord;
F1.pFIBDataSet1.Post;
(Кстати, любопытно, что редакция полей INTEGER подобным образом проходит нормально, а вот через VARCHR продраться пока не удается). СУБД FB-1.5, диалект 3.
Если можно, пожалуйста посоветуйте.
Sergey13 (2010-03-25 16:30:00) [1]> [20] s_t_d (25.03.10 16:06)
> Это понятно.
Это радует. 8-)
s_t_d (2010-03-25 16:06:00) [2]Sergey13 © (25.03.10 15:49) [19]
Только учти, что приведенный тобой код исправит ПЕРВУЮ запись датасета, а не ту которая была активна до этого.
Это понятно. Но в данной схеме искомых записей ВСЕГДА одна.
Sergey13 (2010-03-25 15:49:00) [3]> [18] s_t_d (25.03.10 15:34)
Только учти, что приведенный тобой код исправит ПЕРВУЮ запись датасета, а не ту которая была активна до этого.
s_t_d (2010-03-25 15:34:00) [4]Господа, извините, что занял ваши мысли столь бестолковым вопросом. Но по другому, наверное, научиться и невозможно. Всем большое спасибо. Отдельное спасибо г-м oldman и Sergey13. Следующий код дает необходимый результат.
F1.pFIBDataSet3.Close;
F1.pFIBDataSet3.ParamByName('p1').AsInteger := 1;
sql_update := 'UPDATE T1 SET ';
sql_update := sql_update + ' VAL = :VAL';
sql_update := sql_update + ' WHERE ID = :p1';
F1.pFIBDataSet3.UpdateSQL.Clear;
F1.pFIBDataSet3.UpdateSQL.Add(sql_update);
F1.pFIBDataSet3.Open;
F1.pFIBDataSet3.Edit;
F1.pFIBDataSet3.FieldByName('VAL').AsString := 'F7';
F1.pFIBDataSet3.UpdateRecord;
F1.pFIBDataSet3.Post;
Т.е., ID редактируемой записи передается в модифицируемый запрос через параметр (:p1), а новое заносимое значение формируется так:
F1.pFIBDataSet3.FieldByName('VAL').AsString := 'F7';
Sergey13 (2010-03-25 15:15:00) [5]> [15] MsGuns © (25.03.10 14:52)
8-)
s_t_d (2010-03-25 14:57:00) [6]>MsGuns © (25.03.10 14:52) [15]
Отказ от редактирования в гриде - суть панацея от множества подобных граблей
Простите, не понял, о каком гриде речь? У меня на форме поле ввода...
MsGuns (2010-03-25 14:52:00) [7]Отказ от редактирования в гриде - суть панацея от множества подобных граблей
Sergey13 (2010-03-25 14:16:00) [8]> [13] s_t_d (25.03.10 13:52)
Смешались в кучу кони, люди. (с)Лермонтов.
Квери и датасет суть немного разные вещи.
Я, повторяю, не работал с FIBPLus, поэтому возможно и не прав в твоем случае.
В датасете (в данном случае говорю про IBX) есть 5 свойств, которые содержат 5 запросов. Один select, три модифицирующих и один на обновление (почти аналог первого но для конкретной записи). Модифицирующие запросы вызываются когда пользователь вызывает методы Edit Insert и Delete у открытого датасета. Параметры в модифицирующие запросы подставляются автоматически. Ничего отдельно запускать и закрывать не надо.
s_t_d (2010-03-25 13:52:00) [9]>Sergey13 © (25.03.10 13:42) [12]
Да так и менять. Датасет для этого и предназначен. И добавлять можно. И даже удалять. При открытом.
"Всякий раз, когда необходимо изменять значения параметорв запроса, программа должна закрыть TQuery, присвоить значения параметрам и повторно открыть его..." В.В.Фаронов, П.В.Шумаков "Delphi 5 Руководство разработчика баз данных". Когда изучал BDE, пользовался этой книгой и может быть не вполне осознанно (опыта маловато) перенес это механизм и сюда...
Sergey13 (2010-03-25 13:42:00) [10]> [11] s_t_d (25.03.10 13:38)
> Но ведь в общем случае этот же датасет может исп. не для одной таблицы
Датасетов не хватает?
> А как это менять при открытом датасете?
Да так и менять. Датасет для этого и предназначен. И добавлять можно. И даже удалять. При открытом.
s_t_d (2010-03-25 13:38:00) [11]> Sergey13 © (25.03.10 13:22) [10]
Зачем постоянно переписывать UpdateSQL? Зачем закрывать и открывать датасет?
Но ведь в общем случае этот же датасет может исп. не для одной таблицы. А как это менять при открытом датасете? Код вполне может быть "диким". Ведь к цивилизации я только пытаюсь приблизиться...
Sergey13 (2010-03-25 13:22:00) [12]может быть офтоп, сори.
Уже не первый раз вижу примерно такой код при работе с FIBPLus. Это какие то стандартные грабли для новичков? Или это примерно так и надо?
Я с FIBPLus не работал и код мне кажется диким. Зачем постоянно переписывать UpdateSQL? Зачем закрывать и открывать датасет?
Почему просто не написать
F1.pFIBDataSet1.Edit;
F1.pFIBDataSet1.FieldByName('val').asString:='F7';
F1.pFIBDataSet1.Post;
При статически заполненом стандартном запросе с параметрами в UpdateSQL?
UPDATE T1 SET VAL = :VAL WHERE ID = :ID
Вобщем не как в IBX. При стольких уважаемых мной поклонниках этой библиотеки мне кажется это странным.
s_t_d (2010-03-25 13:15:00) [13]>oldman © (25.03.10 13:04) [8]
Попробуй
F1.pFIBDataSet3.ParamByName('p1').Value := '1';
Должно же работать... Уже совсем "тупые" предложения...
Спасибо за внимание. Попробовал.
Увы, не проходит. Р-т прежний - добавляется новя запись. И потом, ведь параметр ':p1' - это ID(integer); почему же Вы предлагаете ('p1').Value := '1' ?
oldman (2010-03-25 13:04:00) [14]
> F1.pFIBDataSet3.ParamByName('p1').Value := 1;
Попробуй
F1.pFIBDataSet3.ParamByName('p1').Value := '1';
Должно же работать... Уже совсем "тупые" предложения...
s_t_d (2010-03-25 12:39:00) [15]>oldman © (25.03.10 12:35) [6]
Да. я хочу редактировать поле VAL записи, где ID=1 , а получаю добавление новой...
oldman (2010-03-25 12:35:00) [16]Туплю. Тебе не нравится, что вместо редакции идет добавление.
А мне показалось, что тебя и F7 не устраивает...
Пардон.
s_t_d (2010-03-25 12:34:00) [17]>oldman © (25.03.10 12:31) [4]
Извините, но я Вас не понял.
oldman (2010-03-25 12:31:00) [18]
> получаю добавление новой записи со значением в поле VAL='F7'.
sql_update := sql_update + ' VAL = :p2';
F1.pFIBDataSet3.ParamByName('p2').Value := 'F7';
s_t_d (2010-03-25 12:24:00) [19]>Правильный$Вася (25.03.10 01:31) [1]
используй параметры
UPDATE T1 SET VAL = :1 WHERE ID = :2
Пытаюсь следовать Вашему совету. Но, к сожалению, пока не получается...Вместо ожидаемой редакции записи с ID=1 (кот. в табл. есть) получаю добавление новой записи со значением в поле VAL='F7'.
F1.pFIBDataSet3.Close;
sql_update := 'UPDATE T1 SET ';
sql_update := sql_update + ' VAL = :p2';
sql_update := sql_update + ' WHERE ID = :p1';
F1.pFIBDataSet3.ParamByName('p1').Value := 1;
F1.pFIBDataSet3.ParamByName('p2').Value := 'F7';
F1.pFIBDataSet3.UpdateSQL.Clear;
F1.pFIBDataSet3.UpdateSQL.Add(sql_update);
F1.pFIBDataSet3.Open;
F1.pFIBDataSet3.Edit;
F1.pFIBDataSet3.UpdateRecord;
F1.pFIBDataSet3.Post;
Очевидно, что чего-то не понимаю. Пожалуйста подскажите, куда двигаться.
s_t_d (2010-03-25 01:43:00) [20]> Правильный$Вася (25.03.10 01:31) [1]
Спасибо, а не подскажете, где про это можно почитать...