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

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

Update Failed [D6, XP]


Страницы:   1 2

Drowsy ©   (2009-03-17 06:50:00) 

(IBASE)
Есть таблица с данными :
CREATE TABLE LAYOUT (
   TYPERAZ       D_TYPERAZ /* D_TYPERAZ = CHAR(20) */,
   CNT_PRO       SMALLINT,
   WID_PRO_1     SMALLINT,
   WID_PRO_2     SMALLINT,
   WID_PRO_3     SMALLINT,
....
....
.....
);

TYPERAZ  CNT_PRO     WID_PRO_1    WID_PRO_2   WID_PRO_3    
2х12              2           12           18          18
2,2х14            2           12           24          24
2,2х16            2           12           24          24
2,5х14            2           12           24          24
2,5х20            3           15           30          30
2,8х14            3           15           30          30

и новая:

CREATE TABLE DRYBAR (
   CODE     INTEGER NOT NULL, // ключ с автоинкрементом.
   CNT_PRO  SMALLINT
   WID_PRO_1     SMALLINT
);

Вопрос: Можно ли одним запросом заполнить её значениями соответствующих полей из LAYOUT?

Делал разные попытки с
//===== INSERT
uoDryBar.SQL[ukINSERT] =
insert into DRYBAR_S
(CNT_PRO, WID_PRO_1)
SELECT
 CNT_PRO, WID_PRO_1
From LAYOUT ;

//======== UPDATE
uoDryBar.SQL[ukMODIFY] =
update DRYBAR_S
set
 CODE = :CODE,
 CNT_PRO = :CNT_PRO,
 WID_PRO_1 = :WID_PRO_1
where
 CODE = :OLD_CODE

.....
При выполнении:

uoDryBar.ExecSQL(ukInsert);
всё время возникает ошибка Update Failed.


Drowsy   (2009-03-18 12:37:00) [21]

"Хоть бы кричал - аж зло берёт..." :)


Drowsy   (2009-03-18 11:59:00) [22]

procedure FirstLoadSections;
begin
 dmMain.qrExecProc.Transaction.StartTransaction;

with dmMain.qrExecProc, SQL do begin
   Add('   insert into DRYBAR_S');
   Add('  (PR_ID,  LAY_CODE, TYPERAZ, CNT_PRO, WID_PRO_1, WID_PRO_2, WID_PRO_3,');
   Add('   DRY_STEP, CNT_REM_PRO, CNT_FREE_PRO, VOL_PRICE, SLOPE_1, SLOPE_2, SLOPE_3,');
   Add('   STEP_COL)');
   Add('SELECT');
   Add(INTToStr(PRID) +',   CODE,  TYPERAZ, CNT_PRO, WID_PRO_1, WID_PRO_2,');
   Add('   WID_PRO_3, DRY_STEP, CNT_REM_PRO, CNT_FREE_PRO, VOL_PRICE, SLOPE_1,');
   Add('   SLOPE_2, SLOPE_3, STEP_COL');
   Add('   FROM LAYOUT4 ');
 end;

dmMain.qrExecProc.ExecSQL;
dmMain.qrExecProc.Transaction.Commit;

 with dmMain.QueryWork do begin
   with SQL do begin
     Clear;
     Add('SELECT * FROM DRYBAR_S ');
   end;
   dmMain.QueryWork.Open;
 end;

 dmMain.dsQueryWork.DataSet :=  dmMain.QueryWork;
 fmFDBTest.DBGridEh.DataSource := dmMain.dsQueryWork;
 fmFDBTest.ShowModal;
 dmMain.QueryWork.Close;
end;


Drowsy   (2009-03-18 11:46:00) [23]

Недавно вообще 0-понимал. :)


Sergey13   (2009-03-18 11:44:00) [24]

> [16] Drowsy   (18.03.09 11:39)

> т.е. труднее понять  что происходит с даннымии и причину ошибок

То-то ты сейчас все понимаешь, что с данными происходит. 8-)

Что-то мне говорит за то, что ты комитишь другую транзакцию. Давай конкретный код.


Drowsy   (2009-03-18 11:39:00) [25]

TIBDataSet, как я читал, более "глухой", по сравнению со связкой TIBQuery + TIBUpdateSQL ( т.е. труднее понять  что происходит с даннымии и причину ошибок).
А запрос первый на инсерт данных в таблицу (он выполняется после коммита). После этого формирую набор Select * From Table, открываю его и бросаю на грид - пусто. Перезапускаю прогу, открываю грид - данные есть.


Sergey13   (2009-03-18 11:29:00) [26]

> [14] Drowsy   (18.03.09 11:19)

> TIBQuery1

Почему не IBDataSet используешь?

Что за запросы конкретно?


Drowsy   (2009-03-18 11:19:00) [27]

Закрываю TIBQuery1. Делаю инсерт в таблицу на другом TIBQuery2 с другой транзакцией. Коммит этой транзакции. И отрываю селект-набор заданный в TIBQuery1. Смотрю его на гриде - пусто. Появлются данные после перезапуска проги.


Sergey13   (2009-03-18 10:44:00) [28]

> [11] Sergey13 ©   (18.03.09 08:45)

Че то я поторопился похоже.

> [10] Drowsy   (18.03.09 06:06)
> а потом пытаюсь посмотреть селект набор по всем полям этой
> таблицы на гриде.

Ты его переоткрываешь или просто смотришь в ранее открытый?


ЮЮ   (2009-03-18 09:41:00) [29]


> Без цикла с параметром не обойтись??


Для выполнения твоего запроса - это я тоже говорил - не нужен TIBQuery , а нужен TIBSQL


Sergey13   (2009-03-18 08:45:00) [30]

> [10] Drowsy   (18.03.09 06:06)

Коммит в одной транзакции делаешь, селект в другой.


Drowsy   (2009-03-18 06:06:00) [31]

И ещё вопрос: делаю инсерт и коммит в таблицу,
а потом пытаюсь посмотреть селект набор по всем полям этой таблицы на гриде.
И он пуст. Внесённые изменения появляются только после нового звпуска программы.


Drowsy   (2009-03-18 05:58:00) [32]

Без цикла с параметром не обойтись??


ЮЮ   (2009-03-18 04:00:00) [33]


> Неужели никто не сталкивался с подобной ошибкой??


> примечательно, что хотя ошибка Update Failed вываливается,
>  но ВСЕ записи при uoDryBar.ExecSQL(ukInsert) заносятся
> в таблицу.


Я же сказал. Записи-то заносятся, но так как одним запросом занесено более одной записи, то с точки зрения кэшированного датасета это ошибка. Аналогичная ошибка будет и в случае, если запрос не добавит ни одной записи. Запросы датасета должны модифицировать РОВНО ОДНУ запись


Drowsy   (2009-03-17 21:09:00) [34]

Неужели никто не сталкивался с подобной ошибкой??


Drowsy   (2009-03-17 10:58:00) [35]


> Зачем для выполнения запроса, тем более вставляющего несколько
> записей, использовать связку TIBQuery + TIBUpdateSQL.
>
> Почему просто не выполнить запрос в TIBSQL?

Можно. И работает. Только нужно иметь "агрегирующий" компонент работы с набором (select,insert,delete,modify)
, которым и является, как  понял, TIBQuery + TIBUpdateSQL.


> А запросы в TIBUpdateSQL должны затрагивать толко 1 запись,
>  ИМХО, не больше и не меньше

примечательно, что хотя ошибка Update Failed вываливается, но ВСЕ записи при uoDryBar.ExecSQL(ukInsert) заносятся в таблицу.


ЮЮ   (2009-03-17 10:41:00) [36]


Вопрос: Можно ли одним запросом заполнить её значениями
соответствующих полей из LAYOUT?

uoDryBar + qrDryBar - аналог (по-функциональности) TIBDataset.

.....
При выполнении:

uoDryBar.ExecSQL(ukInsert);
всё время возникает ошибка Update Failed.


Зачем для выполнения запроса, тем более вставляющего несколько записей, использовать связку TIBQuery + TIBUpdateSQL.

Почему просто не выполнить запрос в TIBSQL?

А запросы в TIBUpdateSQL должны затрагивать толко 1 запись, ИМХО, не больше и не меньше


Drowsy   (2009-03-17 10:15:00) [37]

uoDryBar: TIBUpdateSQL;
qrDryBar: TIBQuery;

qrDryBar.UpdateObject :=  uoDryBar;

uoDryBar + qrDryBar - аналог (по-функциональности) TIBDataset.


Sergey13   (2009-03-17 08:51:00) [38]

> [2] Drowsy   (17.03.09 08:32)

Твоя ошибка, по моему, не связана собственно с запросами. Ты где то напутал в коде.
Что есть uoDryBar?


Drowsy   (2009-03-17 08:32:00) [39]

Если честно, то мне нужна вообще 1 запись и её можно выделись ограничением Where, но
я только начинаю работать с IBASE и понял, что без чёткого понимания, как
работает связка TIBQuery - TIBUpdateSQL не обойтись, а с подобной ошибкой уже пару раз встречался и "обходил кривым боком"....


Sergey13   (2009-03-17 08:20:00) [40]

А тебе это надо непременно из своей программы сделать? Это постоянная операция?


Страницы:   1 2

Наверх

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