Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 генерация primary key до вставки  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
(powerBuilder 9.01 + msSqlServer 2000)
 У нас на фирме написана библиотека, аналогичная PFC.. и вот, хочу обсудить одну довольно общую проблему: ввод документа, состоящего из нескольких окон, связанных master-detail (один-ко-многим). Например, счёт-фактура может состоять из
1. заголовка
2. списка позиций
3. перечня дополнительных свойств для каждой позиции
 Пользователь должен иметь возможность сначала ввести документ целиком (или даже ввести несколько документов), и только потом -- сохранить (или отменить ввод). Собственно проблема: чтобы привязать строки подчинённых окон к главным, необходимо знать значение Primary Key главного окна (и это до сохранения!). У нас на фирме было (давно) принято такое решение: отказаться от автогенерации Primary Key и генерировать значение уникального поля до вставки в таблицу (пересечения с данными, вводимыми другими пользователями, исключаются использованием при генерации функции SQL-сервера, возвращающей номер соединения, @@uuid), а после ввода уже спокойно сохранять. Коллизии такой генерации PK пока (за три-четыре года эксплуатации) не встречались.

 Вопрос:
1. какие ещё алгоритмы ввода многооконных документов предложите?
2. как это реализовано в PFC (в этой библиотеке тоже ведь есть службы связи окон (спрашиваю потому, что сам я ещё не пользовался этой библиотекой)
3. какие есть недостатки предложенного здесь метода ввода документов -- с помощью генерации первичного ключа до вставки? (подробности генерации там же.

спасибо!
24 апр 05, 16:13    [1492988]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
Может это и неправильно, но последние десятилетия мои приложения, в основном, получают ID до формирования новой записи на клиенте.

На псевдокоде - of_GetId ()
24 апр 05, 17:30    [1493040]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
Sorry, не туда нажал

Продолжу

На псевдоколе:
decimal{0} ld_ID 
long ll_row
ld_ID = of_GetId()
ll_row = InsertRow()
SetItem (ll_Row, "ID_COL", ld_ID)
Если надо обеспечить связь мастер-деталь, то полученный ID вставляется в соответствующее поле детали.

Вот и все, собственно.

Да, чуть не забыл. Для MS SQL был разработан механизм, реализующий аналог сиквенса в Oracle.

Разумеется, в БД уникальность первичных ключей обеспечивается по всей БД, т.е. используется только один сиквенс, кроме каких-то специальных случаев
24 апр 05, 17:37    [1493043]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
Все-таки забыл :-)

Разумеется, что функция of_GetId() обращается за ID к серверу.
24 апр 05, 17:38    [1493046]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Можно завести еще одно поле для связи в DataWindow, а поле PK не трогать. Внутри DataWindow осуществлять связь master-detail по значениям второго поля, используя для новых записей отрицательную нумерацию (в базу естественно ничего не сохраняя из этого второго поля).
А при SELECT'е заполнять его значениями из PK, в этом случае никаких коллизий произойти просто не может.
24 апр 05, 21:55    [1493190]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Estets
Member

Откуда: Химки
Сообщений: 604
Гм, у нас проблема была решена другим способом.
При открытии окна документа в базу уже добавляется запись со всеми начальными значениями и сгенеренным идентификатором. Единственное запись помегена как "неактуальная". Соответственно при вставке перечня идентификатор известен, а при нажатии на клиенте кнопки OK идет обновление существующей записи введенными данными и изменение состояния записи на актуальное. Если "OK" не нажата, то в базе остается "паразитная" неактуальная запись.
25 апр 05, 09:41    [1493520]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
gz
Member

Откуда:
Сообщений: 171
Локшин Марк
Можно завести еще одно поле для связи в DataWindow, а поле PK не трогать. Внутри DataWindow осуществлять связь master-detail по значениям второго поля, используя для новых записей отрицательную нумерацию (в базу естественно ничего не сохраняя из этого второго поля).
А при SELECT'е заполнять его значениями из PK, в этом случае никаких коллизий произойти просто не может.

Почти так же. Новых полей не использую - пишу отрицательные значения как раз в поле PK - а в событии UpdateStart() отрицательные значения заменяю на уникальные из SEQUENS-последовательности (Oracle)
25 апр 05, 09:43    [1493529]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
gz
Почти так же. Новых полей не использую - пишу отрицательные значения как раз в поле PK - а в событии UpdateStart() отрицательные значения заменяю на уникальные из SEQUENS-последовательности (Oracle)

Можно и так, но шанс словить ошибку при кодировании таким образом выше.
25 апр 05, 13:06    [1494404]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
понятно, спасибо за примеры.
 а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.
25 апр 05, 13:08    [1494421]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
gz
Member

Откуда:
Сообщений: 171
Локшин Марк
Можно и так, но шанс словить ошибку при кодировании таким образом выше.

А каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ...
25 апр 05, 13:20    [1494472]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
gz
А каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ...

Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB.
25 апр 05, 13:35    [1494547]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
gz
Member

Откуда:
Сообщений: 171
Локшин Марк
Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB.

Что-й-то плохо соображаю. Вроде бы, и при откатах работает. Может быть, имеете ввиду просто "кривые ручки" программиста ?
25 апр 05, 13:49    [1494618]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
savosin_sergey
понятно, спасибо за примеры.
 а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.

Смотря в какой Sybase СУБД. Если в ASA 9, то просто пишем в клиенте <SELECT GET_IDENTITY('TableName') >, получаем собственный зарезервированный ID, автоматом увеличивая инкримент в таблице без организации транзакции и вообще больше ни о чем не думаем :)
25 апр 05, 13:50    [1494625]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Локшин Марк
gz
А каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ...

Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB.

Откаты на SEQUENS и IDENTITY не влияют, так что ошибок не будет.
25 апр 05, 13:51    [1494635]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
ASCRUS
Откаты на SEQUENS и IDENTITY не влияют, так что ошибок не будет.

Не про те ошибки идет речь.
gz
Может быть, имеете ввиду просто "кривые ручки" программиста ?

Да, именно это я и пытался сказать :) Больше нюансов в реализации, а сл-но больше вероятность ошибки (программиста).
25 апр 05, 13:58    [1494674]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
gz
Member

Откуда:
Сообщений: 171
Локшин Марк
gz
Может быть, имеете ввиду просто "кривые ручки" программиста ?

Да, именно это я и пытался сказать :) Больше нюансов в реализации, а сл-но больше вероятность ошибки (программиста).

Как раз добавление в SELECT дополнительного поля (не поля базы данных + специальным образом заполняемого) и дает дополнительные навороты.
Хотя, чего мы спорим ? У нас реализация совпала процентов на 90-95. Значит, "верным путем идем, товарищи"
25 апр 05, 14:06    [1494717]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
savosin_sergey
понятно, спасибо за примеры.
 а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.
Гм... Не понял. Порядок строк обеспечивается конструкцией ORDER BY в запросе или сортировкой на клиенте.
25 апр 05, 14:47    [1494935]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
gz
Member

Откуда:
Сообщений: 171
PL99
Гм... Не понял. Порядок строк обеспечивается конструкцией ORDER BY в запросе или сортировкой на клиенте.

Случай из жизни. Армия. Вон, розетка - какой ток течет - постоянный или переменный ? Ответ - постоянный. Вышел товарищ. А ты, меня спрашивают - понял ? Ну, говорю, постоянный - прямая, а переменный - синусоида. Нет, говорят, вышедший товарищ имел ввиду, что постоянный - это 220 вольт не больше и не меньше.
Так что PL99, не забивай себе голову, что имел ввиду товарищ
25 апр 05, 15:17    [1495092]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
я имел ввиду порядок строк в таблице без order'а. то есть, добавили несколько новых записей, визуально они появились в конце datawindow, а после retrieve (=select col1, col2, ... from table1 where parent_id=xxx) -- некоторые записи могут своё место в DW изменить.. но я это не видел, передаю лишь слова.. и не могу понять, почему, ведь нет сортировки даже по первичному ключу..
 Хотя, на мой взгляд, причины генерации первичного ключа другие (нежели простое соблюдение порядка строк в DW):
1. возможность заполнять несколько master'ов с detail'ами внутри (привязка строк в detail'е до сохранения master'а).
2. на сервере средства работы с identity (автогенератором числового первичного ключа) не понравились главному разработчику (напр., потому что реализованы кривова-то или, там, требуют вызова хранимой процедуры)

 Как выяснилось, у нас именно второй случай. а при вводе нового master'а происходит тихое сохранение введённых dateil'ов для строки, потерявшей фокус ввода.
25 апр 05, 17:46    [1495871]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
savosin_sergey
я имел ввиду порядок строк в таблице без order'а. то есть, добавили несколько новых записей, визуально они появились в конце datawindow, а после retrieve (=select col1, col2, ... from table1 where parent_id=xxx) -- некоторые записи могут своё место в DW изменить.. но я это не видел, передаю лишь слова.. и не могу понять, почему, ведь нет сортировки даже по первичному ключу..

Для любой реляционной операции порядок следования кортежей отношений никогда не определен.
В конкретном частном случае записи по запросу
select col1, col2, ... from table1 where parent_id=xxx
будут возвращены в порядке следования ссылок на строки table1 в parent_id.
Или в порядке физического местоположения записей записей в таблице table1 (в зависимости от селективности условия parent_id).
Но это никто и никому не обязан. Допустим, все может измениться от числа процессоров в системе
savosin_sergey
на сервере средства работы с identity (автогенератором числового первичного ключа) не понравились главному разработчику

И какие же альтернативы?
25 апр 05, 18:31    [1496044]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
gz
Member

Откуда:
Сообщений: 171
to savosin_sergey
Выборка строк "без ордера". В общем-то, реляционная база не гарантирует последовательность вывода строк в порядке их ввода. Хотя некоторое подобие порядка при полупустой базе может и наблюдаться.
Вопрос по сохранению сортировки при повторном вызове формы имеет иногда принципиальное значение. Можно, конечно, использовать уникальный ключ для сортировки (помучаться при этом), но лучше добавить просто поле "номер строки" в таблицу.

"Тихое сохранение" - это что-то новое. Какие-то нехорошие ассоциации. Конечно, от ошибок никто не застрахован, однако, если таких ситуаций много, бежать надо скорее от таких разработчиков.
25 апр 05, 18:34    [1496057]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
Локшин Марк
И какие же альтернативы?

Вот алгоритм генерации нового уникального значения, применяемый у нас (в классах, работающих со связанными DW).. Правда, эта функция немного переделанная (работает лишь с одной таблицей bu_extravalues, но, жумаю, смысл будет ясен.. Переменные gnv_appl.i_step и gnv_appl.i_spid заполняются при запуске приложения.
/***************************************************
 функция возвращает новый ПервичныйКлюч            *
для таблицы bu_extraValues со структурой           *
create table bu_extraValues (bu_vlsid int not null)*
gnv_appl.i_step -- переменная, раза в три больше   *
 максимального числа пользователей (шаг значений   *
 первичного ключа)                                 *
gnv_appl.i_spid -- номер коннекта к БД: @@sp_id на *
 microsoft sql server                              */
long du_id, l_mx

/*запрос максимального значения первичного ключа*/
select isnull(max(bu_vlsid),1) into :l_mx from bu_extravalues;
if sqlca.sqlcode<>0 then
	return -1
end if

/*генерация нового значения ПК*/
du_id = l_mx / gnv_appl.i_step

if du_id * gnv_appl.i_step + gnv_appl.i_spid > l_mx then
	return  du_id * gnv_appl.i_step + gnv_appl.i_spid
else
	return  ( du_id +1 ) * gnv_appl.i_step + gnv_appl.i_spid
end if
26 апр 05, 12:18    [1497694]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
автор
Вот алгоритм генерации нового уникального значения, применяемый у нас (в классах, работающих со связанными DW).. Правда, эта функция немного переделанная (работает лишь с одной таблицей bu_extravalues, но, жумаю, смысл будет ясен.. Переменные gnv_appl.i_step и gnv_appl.i_spid заполняются при запуске приложения.

И в чем же преимущества? Абсолютно не гарантируется никакой уникальности сгенерированных значений. Что, у одного пользователя не может быть несколько connect'ов к базе? Что достигается в результате такого извращения? Это если у вас главный разработчик такое пишет...
26 апр 05, 12:44    [1497855]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
автор
Что, у одного пользователя не может быть несколько connect'ов к базе? Что достигается в результате такого извращения?

Номер коннекшена (через который будет производиться insert) всегда уникальен, среди всех подключённых пользователей. У одного пользователя можут быт два коннекта, но с разными @@spid. Так что коллизий не наблюдается (уже больше трёх лет фурычит в минфине, там пользователей около 100, данные вводят человек 5)
26 апр 05, 13:14    [1498066]     Ответить | Цитировать Сообщить модератору
 Re: генерация primary key до вставки  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
другими словами, у SQLCA всегда один коннект, и у него есть уникальный номер на сервере (среди всез поключений к серверу). Как этот номер узнать в oracle или в sybase-вских СУБД я не знаю. в MsSqlServer это переменная @@spid
26 апр 05, 13:21    [1498102]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / PowerBuilder Ответить