|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Проблема PB8 - firebird. Есть таблица с уникальным полем id, заполняемым генератором по типу autoincrement. В DW при выполнении update это поле должно заполняться автоматически, но почему-то остается пустым. В базе все отрабатывает, при следующем перечитывании вижу правильные значения. Update properties установлены вроде бы правильно, в ASA в аналогичной ситуации все работает. Что делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2003, 21:42 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
А Identity column in Rows > Update Properties указывает на уникальное поле id? А в updateable columns list оно случаем не включено (если да - убрать)? А PBODBх0.INI в той же папке, что и PBODBх0.DLL? А PBODBх0.INI имеет вот такую строчку GetIdentity='Select @@identity from dummy' ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2003, 05:07 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
если мне не изменяет память в IB нет @@identity. Там через функции генератора последнее вставленное значение получить можно. Хотя я только с 5 версией работал. Но вот "GetIdentity=" обязательно проверить надо, чего там стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2003, 11:15 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Натурально, в Firebird нет автоикремента. Поскольку из PB c интербейзами не работал, могу только посоветовать юзать GEN_ID прямо из кода на PB. На самом деле генератор в IB - это лучше чем автоинкремент в MS SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2003, 12:36 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Надо же, а я и понятия не имею, что это за firebird :-) Увидел, что слово ASA пробежало, вот и ... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2003, 18:17 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Наверное я неудачно сформулировал вопрос. В файерберде действительно autoincrement нет, там как у оракла, генератор последовательности чисел. Он и используется, а в БД кладется в поле "id" триггером before insert и в БД все работает. По документации PB очередное значение такого поля должно автоматически появлявляться в соответствующем поле DW при выполнении dw.update, если для него указан Identity column in Rows > Update Properties (как и сказал Филипп). Проблема в том что поле DW не заполняется. Делать ретрив не хочется. А кто работал с PB и ораклом, там заполняются поля типа ID в дтавиндов правильными значениями? "GetIdentity=" посмотрю обязательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 00:19 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
c127 , вы же понимаете, что чудес на свете не бывает. Datawindow engine должен ЗНАТЬ, какой синтакс использовать, чтобы доставать значение autoincrmentа во время insertа, чтобы потом совать его в буфер. Что такое этот ваш firebird? Чем вы к нему подъезжаете - ODBC? Если PBODBх0.INI не имеет секции специфически относящейся к firebird, и прописывающей то каким образом надо делать GetIdentity, то никакого autoincrmentа не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 01:57 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Firebird - Open source DBMS, один из наследников InterBase, наряду с самим IB и Yaffil. Полноценная кроссплатформенная СУБД, простая, легкая и бесплатно (IB за деньги). Для небольших проектов - самое оно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 08:03 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Да, Илья, нашёл я уже, что такое Firebird... Просто я ещё ни разу не работал в местах (и не имел клиентов), где разрешалось бы бизнес вешать на Open Source DBMS :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 08:40 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
2 Филипп Коннект идет через ODBC. Это я упустил. По идее ситуация должна быть аналогична с ораклом. Что там нужно указывать в поле "GetIdentity="? > Просто я ещё ни разу не работал в местах (и не имел клиентов), где разрешалось бы бизнес вешать на Open Source DBMS :-) Так для меня это тоже впервые. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 22:33 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
c127 , на самом деле в Оракле нет identity. Тебе нужно точно выяснить из доки по firebird, поддерживают ли они identity или нет, и если да, то каков синтакс её доставания, потом прописать это в PBODBх0.INI по аналогии с другими его секциями в которых есть GetIdentity... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 23:06 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Ну вообще-то до версии 6 InterBase не был OpenSource. У шестерки Борланд открыл исходники, на их основе стал развиваться FireBird, потом русский вариант - Yaffil, а Борланд снова исходники закрыл и сделал IB платным. Открытая и закрытая версии различаются некоторой функциональностью, но непринципиально. Подробнее можно посмотреть здесь http://www.ibase.ru/ibhistory.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2003, 08:44 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Филипп> на самом деле в Оракле нет identity. Совершенно верно, в оракле нет identity, зато там есть sequence, которые с точки зрения клиента (PB) совершенно аналогичны generator-ам в FireBird. Поэтому я и написал: "По идее ситуация должна быть аналогична с ораклом." И если есть средство, как получить правильное значение генерируемого первичного ключа в DW для оракла, то возможно оно же сработает и для FB. identity в FB тоже не поддерживается. Посмотрел PBODB80.INI. В секции оракла GetIdentity нет, это поле есть только для [WATCOM50_SYNTAX], [SYBASE_SYNTAX], [MS_SQLSERVER_SYNTAX]. Т.е. только те базы, которые поддерживают identity. Что бы туда прописать такого, чтоб оно заработало? Секции для интербейза нет вообще. Может есть другие идеи? В любом случае - всем спасибо, узнал кое-что новое. Например о поле GetIdentity раньше не догадывался. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2003, 10:03 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
с127 , вопрос исчерпан. НИКАКИМ образом при работе с firebird в DW при выполнении update это поле заполняться автоматически НЕ БУДЕТ. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2003, 19:00 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
2 Филипп >с127, вопрос исчерпан. НИКАКИМ образом при работе с firebird в DW при выполнении update это поле заполняться автоматически НЕ БУДЕТ. Зуб даешь? А если я запущу автоматическое заполнение поля тобой же подсказанным способом? Поаккуратней нужно быть с категорическими заявлениями. Похоже, что с ораклом вообще очень просто, с файербердом чуть сложнее, для него нужно заводить секцию в PBODB80.INI, но принцип тот же. Способ номер раз. Рекомендовано сайбейзом в секции [SYBASE_SYNTAX] файла PBODB80.INI: ; GetIdentity='Select max(IDENTCOL) from &TableName' ; Alternative technique if table has insert trigger associated with it. Это как раз и есть наш случай. Тут становится понятно как оно работает: DW добавляет строчку в базу, а потом сразу же выполняет оператор, указанный в GetIdentity, подставляя имя таблицы и, если нужно, имя поля, содержащего ID. Т.е. подойдет любое правильное SQL выражение, возваращающее последнее добавленное значение в данную таблицу, в том числе "select current_value(sequence_name) from dual;" (это оракл, не помню точный синтаксис) или "select gen_id(sequence_name,0) from rdb$database;" (это файерберд). Единственная проблема - указать sequence_name, но можно определить sequence_name==&TableName, и тогда наверное сработает. Это есть способ номер два, если получится - сообщу и можно будет вносить в хитрые вопросы на интервью. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2003, 23:18 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
'Select max(IDENTCOL) from &TableName' подразумевает, что datawindow engine может сделать некий системный запрос, чтобы узнать, КАКАЯ КОНКРЕТНАЯ КОЛОНКА была в некоей таблице назначена быть autoincrement, чтобы затем совершить макроподстановку на IDENTCOL. Если СУБД не поддерживает autoincrement, то что будет использоваться вместо IDENTCOL? Я в данный момент работаю на большой системе, сделанной на Оракле - никаких проблем из-за отсутствия autoincrement не испытываю. Где надо - insert triggerы работают, где на клиенте надо, то или pre-insert row логика приносит next sequence и модифицирует intitial value для primary key поля в DW, или Updatestart event предка ставит в NewModified! ряды. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2003, 23:59 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
>'Select max(IDENTCOL) from &TableName' подразумевает, что datawindow engine может сделать некий системный запрос, чтобы узнать, КАКАЯ КОНКРЕТНАЯ КОЛОНКА была в некоей таблице назначена быть autoincrement, чтобы затем совершить макроподстановку на IDENTCOL. Если СУБД не поддерживает autoincrement, то что будет использоваться вместо IDENTCOL? Там речь идет о триггере (Alternative technique if table has insert trigger associated with it.), т.е. поля типа IDENTITY в таблице может и не быть. Я подозреваю, что при макроподстановке в IDENTCOL попадает поле, поставленное в свойствах Update Properties в DW как Identity column in Rows. Ты это свойство тоже вспоминал в самом начале. Иначе я не вижу причин, зачем оно нужно, если PB и так может определить, которое из полей генерит ключ. Это я буду проверять, может и ошибаюсь. Отсутсвие autoincrement само по себе разумеется не проблема, но наработанную логику PB приложения не хотелось бы менять из-за его отсутствия. А как получить значения ключа по-другому я пока не знаю. Попробую исправить малой кровью, ну а не получится - буду заставлять юзера добавлять по одной записи или еще как-нибудь изворачиваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2003, 02:54 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Проблема решена. В pbodb80.ini прописывается следующее (драйвер 'XTG Systems IntrBase6 ODBC Driver'): [InterBase] PBSyntax='InterBase6_SYNTAX' PBNoCatalog='YES' [InterBase6_SYNTAX] CreateTable='CREATE TABLE &TableName (::ColumnElement[, ::ColumnElement]...)' ColumnElement='&ColumnName &DataType' DropTable='DROP TABLE &TableName' GetIdentity='Select gen_id(&TableName,0) from RDB$DATABASE' и все замечательно работает. При этом имя генератора должно совпадать с именем таблицы. RDB$DATABASE наверное нужно заменить на что-то более подходящее, но это детали. Рекомендованный сайбейзом способ "GetIdentity='Select max(IDENTCOL) from &TableName'" почему-то не работает. Ну и не надо. На самом деле в [InterBase6_SYNTAX] по-видимому достаточно только строки с GetIdentity, остальное приводит к тому, что PB начинает правильно создавать/убивать таблицы из DB паинтера. Еще раз спасибо всем за советы, без них я бы не догадался копать в сторону GetIdentity. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2003, 11:47 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
c127 , я же вам популярно объяснил, почему не работает рекомендованный сайбейзом способ "GetIdentity='Select max(IDENTCOL) from &TableName'" :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2003, 18:31 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
2 Филипп >c127, я же вам популярно объяснил, почему не работает рекомендованный сайбейзом способ "GetIdentity='Select max(IDENTCOL) from &TableName'" :-) Неувязочка, объяснение получилось уж слишком популярное. Почему - я уже говорил. Скорее все-таки оно работает, просто я где-то ошибся. Но меня устраивает и тот вариант, который заработал. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2003, 05:23 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
А почему нельзя просто на упдате повесить свой эвент, который из базы выдергивает следующий ид и встявляет его в поле ИД Датавиндовы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2003, 09:58 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
alienzzzz Ненадежно и некрасиво получится. На каждый DW писать код получения конкретного id как то муторно, наследовать DW и пытаться через него автоматом вычислять таблицу и ее identity ненадежно, а на update заполнять поля не правильно - я не знаю до такой степени PB, но во всяком случае в том же Delphi это приводит к тому, что он уже считает, что запись сохранилась и попытка изменить ее во время хода операции ApplyUpdates (аналог DW.update) приводит к интересным глюкам. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2003, 12:32 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
То ASCRUS: Если не на Update а на PreInsert - самый раз и запрос на изменение только 1 идет. А насчет ненадежности и ... - вы перебрали... смотря как писать. У нас большинство систем так и работает да еще годами и что-то я там за ними всех перечисленных минусов и не наблюдал :) Есть конечно 1 момент, к которому вполне можно придраться - это лишний запрос к БД при создании записи (вызов ID) - для ряда систем может не подходить, но в целом - нормально работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2003, 13:17 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
2 alienzzzz >А почему нельзя просто на упдате повесить свой эвент, который из базы выдергивает следующий ид и встявляет его в поле ИД Датавиндовы ? Наверное можно и так, только теперь незачем. Есть стандартное средство, которое как оказалось нормально работает. К тому же в этом случае само DW не зависит от SQL сервера и способа вычисления id добавленной записи. 2 ASCRUS >в том же Delphi это приводит к тому, что он уже считает, что запись сохранилась и попытка изменить ее во время хода операции ApplyUpdates (аналог DW.update) приводит к интересным глюкам PB позволяет управлять флагами записи в DW: новая, обновленная, ..., так что в принципе это не проблема. Но нужно хорошо продумать логику, писать дополнителоный код и пр. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2003, 00:35 |
|
id в DW для PB8 - firebird
|
|||
---|---|---|---|
#18+
Тут на самом деле ещё один момент имеется. Если у вас более менее примитивный интерфейс, то конечно autoincrement очень удобен, но если вы делаете какие нибудь сложные master/detail/linkage штучки, то нужно чтобы в рядах детальных datawindow уже имелись некие суррогатные ключи (чтобы их друг от друга отличать) ДО каких бы то ни было Updatов... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2003, 00:58 |
|
|
start [/forum/topic.php?fid=15&fpage=109&tid=1339299]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 133ms |
0 / 0 |