Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ступор при редактировании поля VARCHAR с пом. FIBPLus [D7, XP]


Страницы:   1 2

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]
Спасибо, а не подскажете, где про это можно почитать...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо