Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизСтупор при редактировании поля VARCHAR с пом. FIBPLus Найти похожие ветки
← →
s_t_d (2010-03-25 01:26) [0]Редактирование поля 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.
Если можно, пожалуйста посоветуйте.
← →
Правильный$Вася (2010-03-25 01:31) [1]используй параметры
UPDATE T1 SET VAL = :1 WHERE ID = :2
← →
s_t_d (2010-03-25 01:43) [2]> Правильный$Вася (25.03.10 01:31) [1]
Спасибо, а не подскажете, где про это можно почитать...
← →
s_t_d (2010-03-25 12:24) [3]>Правильный$Вася (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;
Очевидно, что чего-то не понимаю. Пожалуйста подскажите, куда двигаться.
← →
oldman © (2010-03-25 12:31) [4]
> получаю добавление новой записи со значением в поле VAL="F7".sql_update := sql_update + " VAL = :p2";
F1.pFIBDataSet3.ParamByName("p2").Value := "F7";
← →
s_t_d (2010-03-25 12:34) [5]>oldman © (25.03.10 12:31) [4]
Извините, но я Вас не понял.
← →
oldman © (2010-03-25 12:35) [6]Туплю. Тебе не нравится, что вместо редакции идет добавление.
А мне показалось, что тебя и F7 не устраивает...
Пардон.
← →
s_t_d (2010-03-25 12:39) [7]>oldman © (25.03.10 12:35) [6]
Да. я хочу редактировать поле VAL записи, где ID=1 , а получаю добавление новой...
← →
oldman © (2010-03-25 13:04) [8]
> F1.pFIBDataSet3.ParamByName("p1").Value := 1;
Попробуй
F1.pFIBDataSet3.ParamByName("p1").Value := "1";
Должно же работать... Уже совсем "тупые" предложения...
← →
s_t_d (2010-03-25 13:15) [9]>oldman © (25.03.10 13:04) [8]
Попробуй
F1.pFIBDataSet3.ParamByName("p1").Value := "1";
Должно же работать... Уже совсем "тупые" предложения...
Спасибо за внимание. Попробовал.
Увы, не проходит. Р-т прежний - добавляется новя запись. И потом, ведь параметр ":p1" - это ID(integer); почему же Вы предлагаете ("p1").Value := "1" ?
← →
Sergey13 © (2010-03-25 13:22) [10]может быть офтоп, сори.
Уже не первый раз вижу примерно такой код при работе с 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:38) [11]> Sergey13 © (25.03.10 13:22) [10]
Зачем постоянно переписывать UpdateSQL? Зачем закрывать и открывать датасет?
Но ведь в общем случае этот же датасет может исп. не для одной таблицы. А как это менять при открытом датасете? Код вполне может быть "диким". Ведь к цивилизации я только пытаюсь приблизиться...
← →
Sergey13 © (2010-03-25 13:42) [12]> [11] s_t_d (25.03.10 13:38)
> Но ведь в общем случае этот же датасет может исп. не для одной таблицы
Датасетов не хватает?
> А как это менять при открытом датасете?
Да так и менять. Датасет для этого и предназначен. И добавлять можно. И даже удалять. При открытом.
← →
s_t_d (2010-03-25 13:52) [13]>Sergey13 © (25.03.10 13:42) [12]
Да так и менять. Датасет для этого и предназначен. И добавлять можно. И даже удалять. При открытом.
"Всякий раз, когда необходимо изменять значения параметорв запроса, программа должна закрыть TQuery, присвоить значения параметрам и повторно открыть его..." В.В.Фаронов, П.В.Шумаков "Delphi 5 Руководство разработчика баз данных". Когда изучал BDE, пользовался этой книгой и может быть не вполне осознанно (опыта маловато) перенес это механизм и сюда...
← →
Sergey13 © (2010-03-25 14:16) [14]> [13] s_t_d (25.03.10 13:52)
Смешались в кучу кони, люди. (с)Лермонтов.
Квери и датасет суть немного разные вещи.
Я, повторяю, не работал с FIBPLus, поэтому возможно и не прав в твоем случае.
В датасете (в данном случае говорю про IBX) есть 5 свойств, которые содержат 5 запросов. Один select, три модифицирующих и один на обновление (почти аналог первого но для конкретной записи). Модифицирующие запросы вызываются когда пользователь вызывает методы Edit Insert и Delete у открытого датасета. Параметры в модифицирующие запросы подставляются автоматически. Ничего отдельно запускать и закрывать не надо.
← →
MsGuns © (2010-03-25 14:52) [15]Отказ от редактирования в гриде - суть панацея от множества подобных граблей
← →
s_t_d (2010-03-25 14:57) [16]>MsGuns © (25.03.10 14:52) [15]
Отказ от редактирования в гриде - суть панацея от множества подобных граблей
Простите, не понял, о каком гриде речь? У меня на форме поле ввода...
← →
Sergey13 © (2010-03-25 15:15) [17]> [15] MsGuns © (25.03.10 14:52)
8-)
← →
s_t_d (2010-03-25 15:34) [18]Господа, извините, что занял ваши мысли столь бестолковым вопросом. Но по другому, наверное, научиться и невозможно. Всем большое спасибо. Отдельное спасибо г-м 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:49) [19]> [18] s_t_d (25.03.10 15:34)
Только учти, что приведенный тобой код исправит ПЕРВУЮ запись датасета, а не ту которая была активна до этого.
← →
s_t_d (2010-03-25 16:06) [20]Sergey13 © (25.03.10 15:49) [19]
Только учти, что приведенный тобой код исправит ПЕРВУЮ запись датасета, а не ту которая была активна до этого.
Это понятно. Но в данной схеме искомых записей ВСЕГДА одна.
← →
Sergey13 © (2010-03-25 16:30) [21]> [20] s_t_d (25.03.10 16:06)
> Это понятно.
Это радует. 8-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.067 c