powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / генерация primary key до вставки
25 сообщений из 56, страница 1 из 3
генерация primary key до вставки
    #33032217
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(powerBuilder 9.01 + msSqlServer 2000)
 У нас на фирме написана библиотека, аналогичная PFC.. и вот, хочу обсудить одну довольно общую проблему : ввод документа, состоящего из нескольких окон, связанных master-detail (один-ко-многим). Например, счёт-фактура может состоять из
1. заголовка
2. списка позиций
3. перечня дополнительных свойств для каждой позиции
 Пользователь должен иметь возможность сначала ввести документ целиком (или даже ввести несколько документов), и только потом -- сохранить (или отменить ввод). Собственно проблема: чтобы привязать строки подчинённых окон к главным, необходимо знать значение Primary Key главного окна (и это до сохранения!). У нас на фирме было (давно) принято такое решение: отказаться от автогенерации Primary Key и генерировать значение уникального поля до вставки в таблицу (пересечения с данными, вводимыми другими пользователями, исключаются использованием при генерации функции SQL-сервера, возвращающей номер соединения, @@uuid) , а после ввода уже спокойно сохранять. Коллизии такой генерации PK пока (за три-четыре года эксплуатации) не встречались.

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

спасибо!
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33032263
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это и неправильно, но последние десятилетия мои приложения, в основном, получают ID до формирования новой записи на клиенте.

На псевдокоде - of_GetId ()
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33032266
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry, не туда нажал

Продолжу

На псевдоколе:
Код: plaintext
1.
2.
3.
4.
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.

Разумеется, в БД уникальность первичных ключей обеспечивается по всей БД, т.е. используется только один сиквенс, кроме каких-то специальных случаев
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33032268
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все-таки забыл :-)

Разумеется, что функция of_GetId() обращается за ID к серверу.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33032381
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно завести еще одно поле для связи в DataWindow, а поле PK не трогать. Внутри DataWindow осуществлять связь master-detail по значениям второго поля, используя для новых записей отрицательную нумерацию (в базу естественно ничего не сохраняя из этого второго поля).
А при SELECT'е заполнять его значениями из PK, в этом случае никаких коллизий произойти просто не может.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33032592
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм, у нас проблема была решена другим способом.
При открытии окна документа в базу уже добавляется запись со всеми начальными значениями и сгенеренным идентификатором. Единственное запись помегена как "неактуальная". Соответственно при вставке перечня идентификатор известен, а при нажатии на клиенте кнопки OK идет обновление существующей записи введенными данными и изменение состояния записи на актуальное. Если "OK" не нажата, то в базе остается "паразитная" неактуальная запись.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33032600
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
Локшин МаркМожно завести еще одно поле для связи в DataWindow, а поле PK не трогать. Внутри DataWindow осуществлять связь master-detail по значениям второго поля, используя для новых записей отрицательную нумерацию (в базу естественно ничего не сохраняя из этого второго поля).
А при SELECT'е заполнять его значениями из PK, в этом случае никаких коллизий произойти просто не может.
Почти так же. Новых полей не использую - пишу отрицательные значения как раз в поле PK - а в событии UpdateStart() отрицательные значения заменяю на уникальные из SEQUENS-последовательности (Oracle)
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033155
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gzПочти так же. Новых полей не использую - пишу отрицательные значения как раз в поле PK - а в событии UpdateStart() отрицательные значения заменяю на уникальные из SEQUENS-последовательности (Oracle)
Можно и так, но шанс словить ошибку при кодировании таким образом выше.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033165
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятно, спасибо за примеры.
 а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033190
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
Локшин МаркМожно и так, но шанс словить ошибку при кодировании таким образом выше.
А каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ...
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033236
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gzА каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ...
Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033279
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
Локшин МаркДопустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB.
Что-й-то плохо соображаю. Вроде бы, и при откатах работает. Может быть, имеете ввиду просто "кривые ручки" программиста ?
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033282
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyпонятно, спасибо за примеры.
 а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.
Смотря в какой Sybase СУБД. Если в ASA 9, то просто пишем в клиенте <SELECT GET_IDENTITY('TableName') >, получаем собственный зарезервированный ID, автоматом увеличивая инкримент в таблице без организации транзакции и вообще больше ни о чем не думаем :)
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033288
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк gzА каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ...
Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB.
Откаты на SEQUENS и IDENTITY не влияют, так что ошибок не будет.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033309
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS Откаты на SEQUENS и IDENTITY не влияют, так что ошибок не будет.
Не про те ошибки идет речь.
gzМожет быть, имеете ввиду просто "кривые ручки" программиста ?
Да, именно это я и пытался сказать :) Больше нюансов в реализации, а сл-но больше вероятность ошибки (программиста).
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033338
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
Локшин Марк gzМожет быть, имеете ввиду просто "кривые ручки" программиста ?
Да, именно это я и пытался сказать :) Больше нюансов в реализации, а сл-но больше вероятность ошибки (программиста).
Как раз добавление в SELECT дополнительного поля (не поля базы данных + специальным образом заполняемого) и дает дополнительные навороты.
Хотя, чего мы спорим ? У нас реализация совпала процентов на 90-95. Значит, "верным путем идем, товарищи"
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033480
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyпонятно, спасибо за примеры.
 а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.Гм... Не понял. Порядок строк обеспечивается конструкцией ORDER BY в запросе или сортировкой на клиенте.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33033604
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
PL99Гм... Не понял. Порядок строк обеспечивается конструкцией ORDER BY в запросе или сортировкой на клиенте.
Случай из жизни. Армия. Вон, розетка - какой ток течет - постоянный или переменный ? Ответ - постоянный. Вышел товарищ. А ты, меня спрашивают - понял ? Ну, говорю, постоянный - прямая, а переменный - синусоида. Нет, говорят, вышедший товарищ имел ввиду, что постоянный - это 220 вольт не больше и не меньше.
Так что PL99, не забивай себе голову, что имел ввиду товарищ
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33034090
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я имел ввиду порядок строк в таблице без order'а. то есть, добавили несколько новых записей, визуально они появились в конце datawindow, а после retrieve (=select col1, col2, ... from table1 where parent_id=xxx) -- некоторые записи могут своё место в DW изменить.. но я это не видел, передаю лишь слова.. и не могу понять, почему, ведь нет сортировки даже по первичному ключу..
 Хотя, на мой взгляд, причины генерации первичного ключа другие (нежели простое соблюдение порядка строк в DW):
1. возможность заполнять несколько master'ов с detail'ами внутри (привязка строк в detail'е до сохранения master'а).
2. на сервере средства работы с identity (автогенератором числового первичного ключа) не понравились главному разработчику (напр., потому что реализованы кривова-то или, там, требуют вызова хранимой процедуры)

 Как выяснилось, у нас именно второй случай. а при вводе нового master'а происходит тихое сохранение введённых dateil'ов для строки, потерявшей фокус ввода.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33034212
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyя имел ввиду порядок строк в таблице без order'а. то есть, добавили несколько новых записей, визуально они появились в конце datawindow, а после retrieve (=select col1, col2, ... from table1 where parent_id=xxx) -- некоторые записи могут своё место в DW изменить.. но я это не видел, передаю лишь слова.. и не могу понять, почему, ведь нет сортировки даже по первичному ключу..
Для любой реляционной операции порядок следования кортежей отношений никогда не определен.
В конкретном частном случае записи по запросу
Код: plaintext
select col1, col2, ... from table1 where parent_id=xxx
будут возвращены в порядке следования ссылок на строки table1 в parent_id.
Или в порядке физического местоположения записей записей в таблице table1 (в зависимости от селективности условия parent_id).
Но это никто и никому не обязан. Допустим, все может измениться от числа процессоров в системе
savosin_sergey на сервере средства работы с identity (автогенератором числового первичного ключа) не понравились главному разработчику
И какие же альтернативы?
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33034220
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
to savosin_sergey
Выборка строк "без ордера". В общем-то, реляционная база не гарантирует последовательность вывода строк в порядке их ввода. Хотя некоторое подобие порядка при полупустой базе может и наблюдаться.
Вопрос по сохранению сортировки при повторном вызове формы имеет иногда принципиальное значение. Можно, конечно, использовать уникальный ключ для сортировки (помучаться при этом), но лучше добавить просто поле "номер строки" в таблицу.

"Тихое сохранение" - это что-то новое. Какие-то нехорошие ассоциации. Конечно, от ошибок никто не застрахован, однако, если таких ситуаций много, бежать надо скорее от таких разработчиков.
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33035409
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркИ какие же альтернативы?
Вот алгоритм генерации нового уникального значения, применяемый у нас (в классах, работающих со связанными DW).. Правда, эта функция немного переделанная (работает лишь с одной таблицей bu_extravalues , но, жумаю, смысл будет ясен.. Переменные gnv_appl.i_step и gnv_appl.i_spid заполняются при запуске приложения.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
/***************************************************
 функция возвращает новый ПервичныйКлюч            *
для таблицы 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
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33035508
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВот алгоритм генерации нового уникального значения, применяемый у нас (в классах, работающих со связанными DW).. Правда, эта функция немного переделанная (работает лишь с одной таблицей bu_extravalues, но, жумаю, смысл будет ясен.. Переменные gnv_appl.i_step и gnv_appl.i_spid заполняются при запуске приложения.
И в чем же преимущества? Абсолютно не гарантируется никакой уникальности сгенерированных значений. Что, у одного пользователя не может быть несколько connect'ов к базе? Что достигается в результате такого извращения? Это если у вас главный разработчик такое пишет...
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33035612
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧто, у одного пользователя не может быть несколько connect'ов к базе? Что достигается в результате такого извращения?
Номер коннекшена (через который будет производиться insert) всегда уникальен, среди всех подключённых пользователей. У одного пользователя можут быт два коннекта, но с разными @@spid. Так что коллизий не наблюдается (уже больше трёх лет фурычит в минфине, там пользователей около 100, данные вводят человек 5)
...
Рейтинг: 0 / 0
генерация primary key до вставки
    #33035637
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
другими словами, у SQLCA всегда один коннект, и у него есть уникальный номер на сервере (среди всез поключений к серверу). Как этот номер узнать в oracle или в sybase-вских СУБД я не знаю. в MsSqlServer это переменная @@spid
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / генерация primary key до вставки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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