Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.096 c
2-1271934182
Константин
2010-04-22 15:03
2010.08.27
Как удалть объёкты из TObjectList и не уменьшишь при этом ....


2-1271923997
@!!ex
2010-04-22 12:13
2010.08.27
Как увеличить размер крестика(expand) в TTreeView?


2-1268723049
b/@.
2010-03-16 10:04
2010.08.27
Картинки стандартных акций


2-1268942955
aha
2010-03-18 23:09
2010.08.27
про DLL


15-1264084215
SAN_i
2010-01-21 17:30
2010.08.27
Проблема с использованием памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский