powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / id в DW для PB8 - firebird
25 сообщений из 48, страница 1 из 2
id в DW для PB8 - firebird
    #32254119
с127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема PB8 - firebird.
Есть таблица с уникальным полем id, заполняемым генератором по типу autoincrement. В DW при выполнении update это поле должно заполняться автоматически, но почему-то остается пустым. В базе все отрабатывает, при следующем перечитывании вижу правильные значения. Update properties установлены вроде бы правильно, в ASA в аналогичной ситуации все работает. Что делать?
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32254178
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Identity column in Rows > Update Properties указывает на уникальное поле id?

А в updateable columns list оно случаем не включено (если да - убрать)?

А PBODBх0.INI в той же папке, что и PBODBх0.DLL?

А PBODBх0.INI имеет вот такую строчку GetIdentity='Select @@identity from dummy' ?
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32254393
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если мне не изменяет память в IB нет @@identity. Там через функции генератора последнее вставленное значение получить можно. Хотя я только с 5 версией работал. Но вот "GetIdentity=" обязательно проверить надо, чего там стоит.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32254561
Натурально, в Firebird нет автоикремента. Поскольку из PB c интербейзами не работал, могу только посоветовать юзать GEN_ID прямо из кода на PB. На самом деле генератор в IB - это лучше чем автоинкремент в MS SQL.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32255156
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо же, а я и понятия не имею, что это за firebird :-)
Увидел, что слово ASA пробежало, вот и ...
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32255288
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное я неудачно сформулировал вопрос.

В файерберде действительно autoincrement нет, там как у оракла, генератор последовательности чисел. Он и используется, а в БД кладется в поле "id" триггером before insert и в БД все работает. По документации PB очередное значение такого поля должно автоматически появлявляться в соответствующем поле DW при выполнении dw.update, если для него указан Identity column in Rows > Update Properties (как и сказал Филипп). Проблема в том что поле DW не заполняется. Делать ретрив не хочется.

А кто работал с PB и ораклом, там заполняются поля типа ID в дтавиндов правильными значениями?

"GetIdentity=" посмотрю обязательно.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32255299
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127 , вы же понимаете, что чудес на свете не бывает.
Datawindow engine должен ЗНАТЬ, какой синтакс использовать, чтобы доставать значение autoincrmentа во время insertа, чтобы потом совать его в буфер.
Что такое этот ваш firebird? Чем вы к нему подъезжаете - ODBC?
Если PBODBх0.INI не имеет секции специфически относящейся к firebird, и прописывающей то каким образом надо делать GetIdentity, то никакого autoincrmentа не будет.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32255368
Firebird - Open source DBMS, один из наследников InterBase, наряду с самим IB и Yaffil. Полноценная кроссплатформенная СУБД, простая, легкая и бесплатно (IB за деньги). Для небольших проектов - самое оно.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32255381
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Илья, нашёл я уже, что такое Firebird...
Просто я ещё ни разу не работал в местах (и не имел клиентов), где разрешалось бы бизнес вешать на Open Source DBMS :-)
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32256447
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Филипп

Коннект идет через ODBC. Это я упустил.

По идее ситуация должна быть аналогична с ораклом. Что там нужно указывать в поле "GetIdentity="?

> Просто я ещё ни разу не работал в местах (и не имел клиентов), где разрешалось бы бизнес вешать на Open Source DBMS :-)

Так для меня это тоже впервые.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32256452
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127 , на самом деле в Оракле нет identity.

Тебе нужно точно выяснить из доки по firebird, поддерживают ли они identity или нет, и если да, то каков синтакс её доставания, потом прописать это в PBODBх0.INI по аналогии с другими его секциями в которых есть GetIdentity...
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32256555
Ну вообще-то до версии 6 InterBase не был OpenSource. У шестерки Борланд открыл исходники, на их основе стал развиваться FireBird, потом русский вариант - Yaffil, а Борланд снова исходники закрыл и сделал IB платным. Открытая и закрытая версии различаются некоторой функциональностью, но непринципиально.

Подробнее можно посмотреть здесь http://www.ibase.ru/ibhistory.htm
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32256619
с127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Филипп> на самом деле в Оракле нет identity.

Совершенно верно, в оракле нет identity, зато там есть sequence, которые с точки зрения клиента (PB) совершенно аналогичны generator-ам в FireBird. Поэтому я и написал: "По идее ситуация должна быть аналогична с ораклом." И если есть средство, как получить правильное значение генерируемого первичного ключа в DW для оракла, то возможно оно же сработает и для FB.

identity в FB тоже не поддерживается.

Посмотрел PBODB80.INI. В секции оракла GetIdentity нет, это поле есть только для [WATCOM50_SYNTAX], [SYBASE_SYNTAX], [MS_SQLSERVER_SYNTAX]. Т.е. только те базы, которые поддерживают identity. Что бы туда прописать такого, чтоб оно заработало? Секции для интербейза нет вообще.

Может есть другие идеи?

В любом случае - всем спасибо, узнал кое-что новое. Например о поле GetIdentity раньше не догадывался.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32257463
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с127 , вопрос исчерпан. НИКАКИМ образом при работе с firebird в DW при выполнении update это поле заполняться автоматически НЕ БУДЕТ.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32257561
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, и тогда наверное сработает.

Это есть способ номер два, если получится - сообщу и можно будет вносить в хитрые вопросы на интервью.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32257564
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
'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! ряды.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32257575
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>'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 приложения не хотелось бы менять из-за его отсутствия. А как получить значения ключа по-другому я пока не знаю. Попробую исправить малой кровью, ну а не получится - буду заставлять юзера добавлять по одной записи или еще как-нибудь изворачиваться.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32258203
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена.
В 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.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32259073
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127 , я же вам популярно объяснил, почему не работает рекомендованный сайбейзом способ "GetIdentity='Select max(IDENTCOL) from &TableName'" :-)
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32259263
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Филипп

>c127, я же вам популярно объяснил, почему не работает рекомендованный сайбейзом способ "GetIdentity='Select max(IDENTCOL) from &TableName'" :-)

Неувязочка, объяснение получилось уж слишком популярное. Почему - я уже говорил. Скорее все-таки оно работает, просто я где-то ошибся.

Но меня устраивает и тот вариант, который заработал.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32259400
Фотография alienzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему нельзя просто на упдате повесить свой эвент, который из базы выдергивает следующий ид и встявляет его в поле ИД Датавиндовы ?
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32259739
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alienzzzz
Ненадежно и некрасиво получится. На каждый DW писать код получения конкретного id как то муторно, наследовать DW и пытаться через него автоматом вычислять таблицу и ее identity ненадежно, а на update заполнять поля не правильно - я не знаю до такой степени PB, но во всяком случае в том же Delphi это приводит к тому, что он уже считает, что запись сохранилась и попытка изменить ее во время хода операции ApplyUpdates (аналог DW.update) приводит к интересным глюкам.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32259838
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То ASCRUS:

Если не на Update а на PreInsert - самый раз и запрос на изменение только 1 идет. А насчет ненадежности и ... - вы перебрали... смотря как писать. У нас большинство систем так и работает да еще годами и что-то я там за ними всех перечисленных минусов и не наблюдал :)

Есть конечно 1 момент, к которому вполне можно придраться - это лишний запрос к БД при создании записи (вызов ID) - для ряда систем может не подходить, но в целом - нормально работает.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32260586
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alienzzzz

>А почему нельзя просто на упдате повесить свой эвент, который из базы выдергивает следующий ид и встявляет его в поле ИД Датавиндовы ?

Наверное можно и так, только теперь незачем. Есть стандартное средство, которое как оказалось нормально работает. К тому же в этом случае само DW не зависит от SQL сервера и способа вычисления id добавленной записи.

2 ASCRUS

>в том же Delphi это приводит к тому, что он уже считает, что запись сохранилась и попытка изменить ее во время хода операции ApplyUpdates (аналог DW.update) приводит к интересным глюкам

PB позволяет управлять флагами записи в DW: новая, обновленная, ..., так что в принципе это не проблема. Но нужно хорошо продумать логику, писать дополнителоный код и пр.
...
Рейтинг: 0 / 0
id в DW для PB8 - firebird
    #32260591
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут на самом деле ещё один момент имеется.
Если у вас более менее примитивный интерфейс, то конечно autoincrement очень удобен, но если вы делаете какие нибудь сложные master/detail/linkage штучки, то нужно чтобы в рядах детальных datawindow уже имелись некие суррогатные ключи (чтобы их друг от друга отличать) ДО каких бы то ни было Updatов...
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / id в DW для PB8 - firebird
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]