|
|
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
добрый день! [pb9.01, msSqlServer 2000, провайдер: oledb / MSS Microsoft SQL Server] Проблема: добыча значения первичного ключа после сохранения изменений datawindow (dw.update()) -- для связи таблиц master-detail. Каким образом можно добыть значение identity-столбца (столбца со встроенным инкрементом) после успешного update'а datawindow'ы? я пробовал такие варианты: 1. описание указанного автоинкрементного столбца в dw-painter'е как identity column. Недостаток: новое значение id-столбца считыывается как Код: plaintext либо вместо IDENTITYCOL ставится название колонки. Я до сих пор не могу представить себе, кто ваще мог до этого додуматься! это же только для однопользовательской системы можно считывать максимальное значение, но если два пользователя добавят по записи, то возможны "коллизии". 2. после успешного dw.update() можно сделать Код: plaintext Недостаток: нельзя унифицировать эту datawindow, т.е. сделать класс, при использовании которого указываешь таблицу, id-столбец, а он, класс, сам выполняет нужную работу.. так вот, динамический select не возвращает нужное scope_identity(), Код: plaintext Поэтому у меня пара вопросов если ли для провайдеров pbmssXX.dll и pboleXX.dll настройки, как для ODBC-провайдера? (pbodbXX.ini) то есть, как повлиять на параметр GetIdentity ? у кого как реализовано считывание значения уникальной колонки до или после сохранения изменений в datawindow? Несколько решений уже было высказано , а именно: генерация значения ключевого поля во вспомогательной хранимой процедуре/таблице генерация id "вручную" -- с шагом 300, со сдвигом, равным номеру соединения с сервером (способ, который я предложил к обсуждению, и который никому не понравился) сохранять все связи в datastore (например, с использованием отрицательных значений для ключевых полей), а при сохранении считывать id у мастера, присваивать их в foreign key подч. таблицы. Опять же, надо считывать @@identity или identity_scope() из БД -- потеря универсальности! перенести всю логику сохранения таблицы на хранимые процедуры! и передавать им нужные значения. Недостаток: никакой универсальности (на мой, конечно же, взгляд) -- для каждой таблицы, или даже пары таблиц master-detail, а то и вообще для каждого документа, придётся делать сдециальные хранимые процедуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 12:26 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
(выражение типа select scope_identity() в pb-script'е не проходят! Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 13:41 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ЗоринАндрей Код: plaintext у динамического курсора контекст другой, и select scope_identity() вернёт NULL (хотя select @@identity сработает нормально, так как он от контекста не зависит). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 14:14 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyНедостаток: новое значение id-столбца считыывается как Код: plaintext либо вместо IDENTITYCOL ставится название колонки. Я до сих пор не могу представить себе, кто ваще мог до этого додуматься! Люди не глупее тебя ;). Я весьма смутно помню обсуждение этой проблемы (давно это было), но не всё так просто, как кажется :). (выражение типа select scope_identity() в pb-script'е не проходят!) В M$SQL есть аналог DUMMY из ASA или DUAL из Оракла? Ибо Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 14:19 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
авторЛюди не глупее тебя ;). Я весьма смутно помню обсуждение этой проблемы (давно это было), но не всё так просто, как кажется :). вот-вот, по-подробнее можно? max() он и есть max().. если только таблицу/запись не блокировать от других пользователей.. интересно, что ODBC-провайдер обращается за последним значением ключевого поля как Код: plaintext а oledb и mssqlserver - провайдеры всего лишь как Код: plaintext Dim2000В M$SQL есть аналог DUMMY из ASA или DUAL из Оракла? Ибо SELECT scope_identity() into :id from dummy; эхотаг проглотит. Server: Msg 208, Level 16, State 1, Line 1 Invalid object name 'dummy'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 15:36 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
авторВ M$SQL есть аналог DUMMY из ASA или DUAL из Оракла? Ибо Код: plaintext ой, не заметил, что этотаг = powerBuilder Код: plaintext 1. 2. Database C0038: Invalid object name 'dummy'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 15:40 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyу динамического курсора контекст другой, и select scope_identity() вернёт NULL Проверял? Или это только теоретическое предположение? Четыре года назад, когда в какой-то из версий девятки OLEDB не читал identity вообще, мы именно так извлекали значение identity для свежедобавленных строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 15:50 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyвот-вот, по-подробнее можно? Нельзя :). Если серьёзно - это было слишком давно, чтобы я помнил подробности :(. Server: Msg 208, Level 16, State 1, Line 1 Invalid object name 'dummy'. Ну так я сразу признался, что M$SQL знаю ;). Если ничего похожего на DUMMY из ASA в нём нет - тогда см. письмо Андрея Зорина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 16:19 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyвозвращает при Compile Database C0038: Invalid object name 'dummy'. dummy в MS SQL нет Возьмите что-нибудь из системного: авторlong id SELECT TOP 1 scope_identity() into :id from syscolumns; savosin_sergeyа не всегда подходит, так как если на таблице весит триггер, который добавляет ещё куда-то записи, то он собьёт значение @@identity. В триггере можно значения и восстанавливать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 16:29 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ЗоринАндрей savosin_sergeyу динамического курсора контекст другой, и select scope_identity() вернёт NULL Проверял? Или это только теоретическое предположение? Четыре года назад, когда в какой-то из версий девятки OLEDB не читал identity вообще, мы именно так извлекали значение identity для свежедобавленных строк. признаю -- я был не прав! действительно, если провайдер = MSOLEDB, то возвращает нужное значение это динамичесвий курсор! лог profiler'а: Код: plaintext Код: plaintext Код: plaintext Код: plaintext Код: plaintext а если провайдер = ms sql server, то в профайлере видно: Код: plaintext Код: plaintext Код: plaintext Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 16:32 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
..и в провайдере ms sql server select scope_identity() в динамическом курсоре возвращает NULL.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 16:34 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergey..и в провайдере ms sql server select scope_identity() в динамическом курсоре возвращает NULL.. А если не морочиться с динамическим курсором, и сделать RPC FUNC? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 19:59 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
Может не совсем в тему, но если в схожей ситуации решил эту проблему несколько иначе : 1. В "detail" таблице добавляю строку с данными. 2. Триггер "detail" таблицы добавляет строку с данными ( в том числе и с ключем из "detail" таблицы в "master" таблицу ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 10:45 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ChVМожет не совсем в тему, но если в схожей ситуации решил эту проблему несколько иначе : 1. В "detail" таблице добавляю строку с данными. 2. Триггер "detail" таблицы добавляет строку с данными ( в том числе и с ключем из "detail" таблицы в "master" таблицу ) то есть, при вводе новой строки в detail добавляется новая строка в master? как это? обычно пользователь сначала вводит заголовок документа (=master-таблица), а потом перечень позиций документа (=detail-таблица). Так что непонятно, откуда триггеру (на подчинённой таблице) знать id главной таблицы.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 10:59 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergey то есть, при вводе новой строки в detail добавляется новая строка в master? как это? обычно пользователь сначала вводит заголовок документа (=master-таблица), а потом перечень позиций документа (=detail-таблица). Так что непонятно, откуда триггеру (на подчинённой таблице) знать id главной таблицы.. При такой последовательности действий - конечно - "откуда". Но не пользователь работает не с БД, а программы, написанные нами. Что мешает вначале создать связанные записи в обеих таблицах, а потом заполнять их вводимой информацией ? Конечно я не знаю особенностей Вашей задачи. Могу только более описать как решил свои проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 11:37 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ФилиппА если не морочиться с динамическим курсором, и сделать RPC FUNC? что-то не получается у меня сделать RPCFUNC для функции mss2000, а оборачивать её в ХП нет смысла, так как контекст изменится! ChVМогу только более описать как решил свои проблемы. Если не сложно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 12:37 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyчто-то не получается у меня сделать RPCFUNC для функции mss2000, а оборачивать её в ХП нет смысла, так как контекст изменится! У меня так: 1. хранимая процедура в БД: Код: plaintext 1. 2. Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. PB6.5.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 13:20 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
Мне досталась "в наследство" база ( MS SQL ) с такой организацией : в одной таблице ( назовем "status" ) хранится общая информация записей нескольких таблиц ( назовем "tab...") с разной структурой. Запись в таблица Status содержит ключ таблицы tab... ( назовем id_tab ) ,её тип и т.д. Проблема создания - уничтожения связанных записей решалась с помощью триггеров. Создание: В каждой таблице tab...( создающей для каждой строки уникальный ключ "ident" ) прописан триггер Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Всё. Таким образом я создаю запись только в таблице Tab..., а уже потом (после dw.retrieve()) вношу изменения в таблицу Tab... или Status ( dw.update()). Всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 13:47 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ChVМне досталась "в наследство" база ( MS SQL ) с такой организацией : в одной таблице ( назовем "status" ) хранится общая информация записей нескольких таблиц ( назовем "tab...") с разной структурой. Запись в таблица Status содержит ключ таблицы tab... ( назовем id_tab ) ,её тип и т.д. Проблема создания - уничтожения связанных записей решалась с помощью триггеров. Создание: В каждой таблице tab...( создающей для каждой строки уникальный ключ "ident" ) прописан триггер Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Таким образом я создаю запись только в таблице Tab..., а уже потом (после dw.retrieve()) вношу изменения в таблицу Tab... или Status ( dw.update()). Всё.Sorry ! Хочу уточнить "использовать @@identity нельзя" вне триггера. А в самом триггере, он должен отработать правильно - уже давно было - проблемы помню, а нюансы подзабыл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 15:18 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ChVSorry ! Хочу уточнить "использовать @@identity нельзя" вне триггера. А в самом триггере, он должен отработать правильно - уже давно было - проблемы помню, а нюансы подзабыл.Спросите у Марка - он знает способ как восстановить значение @@identity в триггере. там три или четыре строчки всего. и никаких извратов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 19:41 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
Вот, соранить значение @@identity в начале триггера, а в конце вызвать процедуру: Код: plaintext 1. 2. 3. 4. 5. 6. Догадаться до идеи не сложно. Но авторство метода не мое... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 20:38 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
Какой все таки это тяжелый процесс, получить инкремент с MSSQL :( Интересно, в Юконе будет эта проблема решена "культурным путем" или же в игру еще C# включится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 23:28 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
ASCRUSКакой все таки это тяжелый процесс, получить инкремент с MSSQL :( Интересно, в Юконе будет эта проблема решена "культурным путем" или же в игру еще C# включится. Так давно уже все решено - SCOPE_IDENTITY( ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2005, 08:55 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
... а то, что какая-то отдельная программа какой-то отдельной фирмы не дает им без некоторых выкрутасов пользоваться, по-моему Microsoft волновать и не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2005, 08:58 |
|
||
|
GetIdentity
|
|||
|---|---|---|---|
|
#18+
если провайдер ms oledb, то с помощью динамического курсора scope_identity() нормально извлекается.. хотя и Код: plaintext 1. 2. ------------------- Меня волновал в начале темы такой вопрос: использует ли кто свойство DW identity column? ведь (для oledb-, mssqlserver- провайдеров) оно считывает первичный ключ как max(имя_колонки).. и второе: если не используется это identity column, то какая альтернатива в реальных программах этому есть? на первый вопрос более-менее вразумительно ответил лишь Dim2000Люди не глупее тебя ;). Я весьма смутно помню обсуждение этой проблемы (давно это было), но не всё так просто, как кажется :). а ответы на второй вопрос до сих пор интересуют меня! видимо, основные решения я сам перечислил (набранные с других тем) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2005, 09:33 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=33080134&tid=1338101]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 416ms |

| 0 / 0 |
