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

Вниз

Update Failed   Найти похожие ветки 

 
Drowsy   (2009-03-17 06:50) [0]

(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.


 
Sergey13 ©   (2009-03-17 08:20) [1]

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


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

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


 
Sergey13 ©   (2009-03-17 08:51) [3]

> [2] Drowsy   (17.03.09 08:32)

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


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

uoDryBar: TIBUpdateSQL;
qrDryBar: TIBQuery;

qrDryBar.UpdateObject :=  uoDryBar;

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


 
ЮЮ ©   (2009-03-17 10:41) [5]


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

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

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

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


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

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

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


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


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

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


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

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


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

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


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


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


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


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


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

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


 
Drowsy   (2009-03-18 06:06) [10]

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


 
Sergey13 ©   (2009-03-18 08:45) [11]

> [10] Drowsy   (18.03.09 06:06)

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


 
ЮЮ ©   (2009-03-18 09:41) [12]


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


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


 
Sergey13 ©   (2009-03-18 10:44) [13]

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

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

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

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


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

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


 
Sergey13 ©   (2009-03-18 11:29) [15]

> [14] Drowsy   (18.03.09 11:19)

> TIBQuery1

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

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


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

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


 
Sergey13 ©   (2009-03-18 11:44) [17]

> [16] Drowsy   (18.03.09 11:39)

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

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

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


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

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


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

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 12:37) [20]

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


 
Sergey13 ©   (2009-03-18 13:26) [21]

> [19] Drowsy   (18.03.09 11:59)

Попробуй прописать все запросы и прочее свойства в дизайне.


 
Drowsy   (2009-03-18 13:28) [22]

У меня они изначально в дизайне были. Я их от отчаяния вытащил в реал-тайм. :(


 
Drowsy   (2009-03-18 13:34) [23]

Я, не выходя из проги, после инсерта смотрю в IBExpert-е и вижу, что все данные внесены. Но сколько форму с гридом не вызываю - пусто. Выхожу из проги, захожу снова, и только тогда появлются.


 
Sergey13 ©   (2009-03-18 13:52) [24]

> [23] Drowsy   (18.03.09 13:34)

Какие параметры у твоих транзакций?


 
Drowsy   (2009-03-18 13:57) [25]

Всё, разобрался!
Как  понял, перед инсертом надо закрывать транзакцию на наборе.
После инсерта StartTransaction. И потом Ореn.
Сергей, Юрий, спасибо за участие!!!


 
Drowsy   (2009-03-18 13:59) [26]

Я думал, по-наивности, что Close закрывает транзакцию на селект наборе.


 
Sergey13 ©   (2009-03-18 14:11) [27]

> [25] Drowsy   (18.03.09 13:57)
> Всё, разобрался!

Сомнительно. 8-)

> Как  понял, перед инсертом надо закрывать транзакцию на наборе.
А попонятнее можешь объяснить эту фразу. Какая транзакция, какой набор?

И все таки ответь на
> [24] Sergey13 ©   (18.03.09 13:52)


 
Drowsy   (2009-03-18 14:22) [28]

Параметры всех транзакций по-умолчанию.

Было :
/=========================
 dmMain.qrDryBar_S.Close;

(!!!)  dmMain.trDryBar_S.Active := False;

 with dmMain.IBSQL, SQL do begin
   Transaction.StartTransaction;
   Clear;
   Add("   insert into DRYBAR_S");
//..........
//..........
   ExecQuery;
   Transaction.Commit;
 end;

(!!!)  dmMain.trDryBar_S.Active := True;
 dmMain.qrDryBar_S.Open;
 if dmMain.qrDryBar_S.RecordCount <> 0 then begin
   fmFDBTest.DBGridEh.DataSource := dmMain.dsDryBar_S;
   fmFDBTest.ShowModal;
 end;
 dmMain.qrDryBar_S.Close;
(!!!)  dmMain.trDryBar_S.Active := False;

/=========================

(!!!) - добавленные-заработало.

Что скажешь,Сергей?


 
Sergey13 ©   (2009-03-18 15:11) [29]

> [28] Drowsy   (18.03.09 14:22)
> Что скажешь,Сергей?

Шаманизм какой то. С бубном. 8-)

> Было :
> /=========

Что то не очень похоже на код из
> [19] Drowsy   (18.03.09 11:59)

> if dmMain.qrDryBar_S.RecordCount

Не надо пользоваться RecordCount на серверных СУБД. На пустоту датасет проверяется isEmpty.

> (!!!)  dmMain.trDryBar_S.Active := True;
> dmMain.qrDryBar_S.Open;

Это по сути одно и то же.


 
Sergey13 ©   (2009-03-18 15:18) [30]

> [28] Drowsy   (18.03.09 14:22)
> Параметры всех транзакций по-умолчанию.

какие конкретно?


 
Drowsy   (2009-03-18 15:45) [31]

Я параметры транзакций не устанавливал.
В дизайн тайме они так выглядят:

 object trDryBar_S: TIBTransaction
   Active = False
   DefaultDatabase = dbProjects
   AutoStopAction = saNone
   Left = 416
   Top = 400
 end


 
Drowsy   (2009-03-18 15:47) [32]


> Что то не очень похоже на код из

Я ж не ровно на попе сижу, а еложу... :)


 
Drowsy   (2009-03-18 15:52) [33]

dmMain.trDryBar_S.Active := True;
И
dmMain.qrDryBar_S.Open;

но:
dmMain.trDryBar_S.Active := False;
И
dmMain.qrDryBar_S.Close;

получается, что разные.
В этом, как я понял, и была ошибка в коде.


 
Sergey13 ©   (2009-03-18 15:54) [34]

> [31] Drowsy   (18.03.09 15:45)

Правой кнопкой на них жмякни и выбери редактор транзакций - посмотри что написано.


 
Drowsy   (2009-03-18 16:01) [35]

А там все радио-баттоны девственно-пусты.
Наверно, в ран-тайме по-умолчанию Read Commited устанавливается???
...
ХМ, хотя Transaction.Params, в рантайме, как я проверил, тоже пусты....


 
Sergey13 ©   (2009-03-18 16:10) [36]

> [35] Drowsy   (18.03.09 16:01)
> Наверно, в ран-тайме по-умолчанию Read Commited устанавливается?
> ??

Ну так поставь ручками. И проверь без своих "наворотов".


 
Drowsy   (2009-03-18 16:26) [37]

Да, если поставить Read Commited, то транзакция отрабатывает по Open, Close набора.
Спасибо, Сергей, бузнать! :)


 
Sergey13 ©   (2009-03-18 16:49) [38]

> [37] Drowsy   (18.03.09 16:26)

Методом тыка долго будешь узнавать. И не факт, что узнаешь правильно.
Советую прочитать "Мир Интербейс" Ковязина.
Ну и ibase.ru сделать стартовой страницей. 8-)


 
Drowsy   (2009-03-18 17:10) [39]

Обязательно!
Теория это основа.
Но, я уверен, что такие нюансы, которые я с твоей помощью, узнал,
в книгах если и встречаются, то без актуально-решаемой-в-данный-момент-проблемы, не запишутся в моск.
Теория+практика+добрый совет(ещё раз огромное спасибо) - это оптимально.


 
Drowsy   (2009-03-18 17:13) [40]

Я Хелен Борри "Firebird..." штудирую. :)



Страницы: 1 2 вся ветка

Текущий архив: 2009.05.03;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.015 c
2-1238057758
D@nger
2009-03-26 11:55
2009.05.03
Работа с отладчиком в Delphi 7


15-1236093100
boa_kaa
2009-03-03 18:11
2009.05.03
Те, кто ждал - дождались...


2-1238002705
Alex_C
2009-03-25 20:38
2009.05.03
Ограничения ф-ции Pos?


6-1200736870
Kav
2008-01-19 13:01
2009.05.03
аутефикация на прокси


15-1234853071
24ruswebmaster
2009-02-17 09:44
2009.05.03
This is a multi-part message in MIME format