Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Insert into dependent tables with identity columns / 9 сообщений из 9, страница 1 из 1
18.02.2005, 10:41
    #32922492
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
Есть три зависимые таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
A – таблица
(
	[deposit_type_id] [int] IDENTITY ( 1 ,  1 ) NOT NULL,
	другие столбцы
)
 
B – таблица
(
	[acc_templ_id] [int] IDENTITY ( 1 ,  1 ) NOT NULL,
	[deposit_type_id] [int] NOT NULL ,
	другие столбцы
)

C – таблица
(
	[cond_templ_id] [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	[acc_templ_id] [int] NOT NULL ,
	другие столбцы
)
Соответственно, имеются три разных DataWindow, в которых находятся
данные из этих таблиц. Данные редактируются пользователем, теперь их
надо вставить (!) в таблицы. Единственное, что мне пришло в голову,
так это создать через Embedded SQL временные таблицы,
повторяющие структуру таблиц A, B, C . Далее, через процедуру в
цикле курсором делать вставку строки из временной таблицы в A , с
помощью @@IDENTITY получить значение поля deposit_type_id ,
сделать insert в B , ну и т.д. Думаю, смысл идеи ясен.

При таком подходе меня сильно удручает мысль о необходимости создания
временных таблиц в PowerBuilder и делание построчного инсерта
данных в эти таблицы. Как-то мне не очень нравится эта идея. Возможны ли
другие варианты реализации? Что посоветуете?

PowerBuilder 9.0.1 Build 7236, MS SQL Server 2000
...
Рейтинг: 0 / 0
18.02.2005, 11:00
    #32922572
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
Какие мне видятся варианты:
1. Сразу получать IDENTITY на фукнциях MSSQL через ESQL (не так часто пользователь решается нажать Cancel).
2. При добавлении новых записей в PB вставлять в IDENTITY свой минусовый счетчик и по нему вязать DETAIL, далее при сохранении в DETAIL менять минусовый код на реальный полученный.
3. Вместо IDENTITY использовать тип GUID
IMHO предложенные варианты гораздо удобнее и легче в реализации, чем предложенный Вами и самое простое использовать вариант 1 и не париться. Делать из PB времянки и построчно вставлять записи как то не очень выглядит, особенно под MSSQL.
...
Рейтинг: 0 / 0
18.02.2005, 11:08
    #32922596
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
Что мешает написать хранимую процедуру (процедуры), подключить ее к DW и реализовать сколь угодно сложную логику?

Правильно ли я понимаю фразу авторДанные редактируются пользователем, теперь их
надо вставить (!) в таблицы, что независимо от действий пользователя в таблицы происходит INSERT?
...
Рейтинг: 0 / 0
18.02.2005, 11:37
    #32922701
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
ASCRUSСразу получать IDENTITY на фукнциях MSSQL через ESQL (не так часто пользователь решается нажать Cancel)
Если я правильно понял, то ты предлагаешь следующее.
Сделать insert данных из первого DataWindow (таблица A ), потом получить IDENTITY вставленных записей с помощью Embedded SQL и запихать их в дополнительное поле в этом DataWindow . Потом, зная старый IDENTITY записи и новый, можно пробежаться по второму DataWindow (таблица B ), заменить в нем поле deposit_type_id на новое значение, полученное после insert данных в таблицу A . Далее делаем insert из DataWindow (таблица B ), при этом в DataWindow (таблица B ) должно быть поле, которое содержит старый IDENTITY , чтобы корректно связать данные с таблицей C . Ну и т.д. Так? Ну и какого типа должны быть эти DataWindow ? Откуда мне взять дополнительное поле? В таблицу пихать его - плохой тон. Делать DataWindow типа External ? Или как?..
Твой третий вариант не катит, структуру таблиц менять нельзя. Про второй, я честно говоря, не понял... В твоем первом варианте есть что-то ценное, но пока я еще его не уловил...

To PL99
Black Savage
Далее, через процедуру в цикле курсором делать вставку строки из временной таблицы в A, с
помощью @@IDENTITY получить значение поля deposit_type_id,
сделать insert в B, ну и т.д
Это все делается на стороне сервера. Т.е. из PowerBuilder я вызываю процедуру, которая находится на сервере и она уже начинает обрабатывать данные, которые были переданы во временные таблицы.

Да, всегда нужно делать insert данных. С update вопроса вообще не было бы...
...
Рейтинг: 0 / 0
18.02.2005, 11:59
    #32922783
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
Для обеспечения вызова insert вместо update самым простым вариантом будет смена статуса строки:
Код: plaintext
1.
2.
3.
4.
5.
6.
dwItemStatus l_status

l_status = dw_1.GetItemStatus(<№ строки>,  0 , Primary!)

IF l_status = DataModified! THEN
    dw_1.SetItemStatus(<№ строки>,  0 , Primary!, NewModified!)
END IF
...
Рейтинг: 0 / 0
18.02.2005, 12:12
    #32922831
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
To Andyn
Хорош тупить!
Суть проблемы в обеспечении целостности данных после инсерта.
Почитай, о чем я спрашивал то!
...
Рейтинг: 0 / 0
18.02.2005, 12:24
    #32922880
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
Ладно... Покумекали мы тут и решили сделать все несколько иначе, а то такая система получается слишком сложной, в смысле контроля целостности данных.
Вообщем, вопрос снят...
...
Рейтинг: 0 / 0
18.02.2005, 12:40
    #32922936
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
Black Savage ASCRUSСразу получать IDENTITY на фукнциях MSSQL через ESQL (не так часто пользователь решается нажать Cancel)
Если я правильно понял, то ты предлагаешь следующее.
Сделать insert данных из первого DataWindow (таблица A ), потом получить IDENTITY вставленных записей с помощью Embedded SQL и запихать их в дополнительное поле в этом DataWindow . Потом, зная старый IDENTITY записи и новый, можно пробежаться по второму DataWindow (таблица B ), заменить в нем поле deposit_type_id на новое значение, полученное после insert данных в таблицу A . Далее делаем insert из DataWindow (таблица B ), при этом в DataWindow (таблица B ) должно быть поле, которое содержит старый IDENTITY , чтобы корректно связать данные с таблицей C . Ну и т.д. Так? Ну и какого типа должны быть эти DataWindow ? Откуда мне взять дополнительное поле? В таблицу пихать его - плохой тон. Делать DataWindow типа External ? Или как?..
Твой третий вариант не катит, структуру таблиц менять нельзя. Про второй, я честно говоря, не понял... В твоем первом варианте есть что-то ценное, но пока я еще его не уловил...
Уфф - большое большое сорри. Насчет первого моего предложенного варианта - полная лажа, видимо я слишком забыл MSSQL - вариант прокатывает для ASA, но никак не катит под MSSQL, так как в нем нельзя просто так вставлять значения полей IDENTITY при вставке (если тока опцию не включать) и нет аналога ASA-шной функции GET_IDENTITY() :(

Предлагаю рассмотреть второй вариант. Смысл его в том, что ты при вставлении в DW новой записи сразу ей присваивашь в дополнительное поле (аналог ключевого) код -1, следующей -2 и т.д. В итоге ты на эти кода можешь DETAIL вешать и с существующими записями перехлеста не будет. Далее при сохранении этого DW ты в поле IDENTITY получишь правильное значение и будет достаточно пройтись по DETAIL и в FK поле поменять тот же -1 на правильное значение. Далее и его уже можно будет сохранять.

Насчет DW External для того, чтобы сделать доп. поле смысла не вижу. Это легче организовать прямо в Design SQL, типа:
Код: plaintext
1.
SELECT *, CONVERT(int, NULL) AS Psevdo_id
FROM Table

P.S. Еще раз каюсь за первый совет, видимо я удачно и полностью забыл MSSQL.
...
Рейтинг: 0 / 0
18.02.2005, 12:52
    #32922986
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert into dependent tables with identity columns
To ASCRUS
Счастливый человек, тот который об MS SQL Server может себе позволить забыть

Как я уже написал выше, решили всеже напрячь юзеро-зверей и дать им
дополнительную работу, облегчив жизнь себе. Так что, рассмотрение
предложенного тобой варианта не имеет смысла.

Спасибо всем, кто нашел в себе силы немного подумать....
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Insert into dependent tables with identity columns / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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