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

Вниз

Ступор при редактировании поля 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.048 c
3-1240748319
ford
2009-04-26 16:18
2010.08.27
список несуществующих записей


15-1268292135
boriskb
2010-03-11 10:22
2010.08.27
ACADEMIA


2-1267846652
allrussia
2010-03-06 06:37
2010.08.27
"Пробежка" по константам


15-1270672202
Юрий
2010-04-08 00:30
2010.08.27
С днем рождения ! 8 апреля 2010 четверг


15-1269692542
Kerk
2010-03-27 15:22
2010.08.27
Задачка