Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.006 c
15-1236071588
Анна
2009-03-03 12:13
2009.05.03
проверка запуска одного экземпляра приложения


10-1148459999
irena_ok
2006-05-24 12:39
2009.05.03
Создание и заполнениев таблиц в Ворде


15-1234962314
KSergey
2009-02-18 16:05
2009.05.03
Что движет авторами статей?


4-1209049754
constantine
2008-04-24 19:09
2009.05.03
просмотр системных событий (Приложение, Безопасность, Система)


4-1208928035
AlexK
2008-04-23 09:20
2009.05.03
TSWStringArray (LPWSTR)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский