Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Выдача вн.ключа потомку  [new]
Leonid_B
Member

Откуда: Москва
Сообщений: 275
При сохранении данных в 2 связанных таблицах (предок-потомок), я вначале сохраняю главную таблицу, получая ее первичный ключ, затем в цикле прохожусь по datawindow (на подчиненной табл.) и присваиваю этот первичный ключ внешнему ключу, а потом update().

Есть ли другой способ? Конкретно хочется избавиться от цикла. Или это единственный способ ?
10 авг 04, 17:45    [872226]     Ответить | Цитировать Сообщить модератору
 Re: Выдача вн.ключа потомку  [new]
f45f
Member

Откуда:
Сообщений: 224
Думаю это единственный способ.

А нельзя при заполнении таблицы потомка, автоматом заполнять поле внешний ключ???
10 авг 04, 20:15    [872552]     Ответить | Цитировать Сообщить модератору
 Re: Выдача вн.ключа потомку  [new]
Ermak
Member

Откуда: Tomsk
Сообщений: 811
Вообще-то, на мой взгляд, весьма странная политика сохранения данных.
Если я правильно понимаяю, то речь идет об отношении master-detail (master-slave)?
Я обычно всегда сохраняю данные в master'e, а потом только перехожу к заполнению detail'a.
Если master сохранен, то никто не мешает воспользоваться таким свойстом dataWindow object, как Initial
DataWindow Object Property
Description

The initial value of the column in a newly inserted row.

Controls

Column controls

Syntax

PowerBuilder dot notation:

dw_control.Object.columnname.Initial

Describe and Modify argument:

"columnname.Initial { = ' initialvalue ' }"

Parameter Description
columnname A string containing the name of the column for which you want to get or set its initial property.
initialvalue A string containing the initial value of the column. Special values include:Empty — A string of length 0Null — No valueSpaces — All blanksToday — Current date, time, or date and time
11 авг 04, 06:27    [872884]     Ответить | Цитировать Сообщить модератору
 Re: Выдача вн.ключа потомку  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
автор
Вообще-то, на мой взгляд, весьма странная политика сохранения данных.

А по моему ничего странного. У меня примерно то же самое - в визарде пользователь вбивает все данные по документу и потом одной транзакцией на кнопку "Готово" они сохраняются. Соотвествующе все Detail на момент заполнения не знают ключа Master и устанавливают его на момент своей записи в БД, т.е. после того, как визард уже сохранил данные странички с Master. Для удобства я приделал к DataWindow Control функцию, которая выставляет значения по указанным полям для новых записей:
public function integer setitemfromnew (string p_columns[], any p_values[]);
// Установить значения указанных полей для всех новых 
// введенных записей

// Получаем размер массива полей
int c, i
c = UpperBound( p_Columns )

if c = 0 then
  return -1
end if

if c <> UpperBound( p_Values ) then
  return -1
end if

long rc, ri
rc = RowCount()

for ri = 1 to rc
  if GetItemStatus( ri, 0, Primary!) = NewModified! then
    for i = 1 to c
      if SetItem( ri, p_Columns[i], p_Values[i] ) = -1 then
        return -1
      end if
    next
  end if
next

return 1
end function
Теперь ее можно вызвать:
dw_1.SetItemFromNew( {'id'}, {1} )

P.S. Кстати на всякий пожарный хочу обратить внимание на одну "особенность" PB работы с autoincrement - при первой записи DW в БД он получает его значения для каждой новой записи, однако при следующей записи он его уже не перечитывает. Т.е. возникает ситуация когда например, у нас в визарде успешно сохранился Master (без сброса флагов записей), однако при сохранении Detail возникла ошибка, которая привела к откату транзакции. При повторном сохранении для Master счетчик уже перечитываться не будет, т.е. в БД запись сохраниться с новым id, а в Master останется старый, соотвествующе для Detail будет присвоен неправильный id и СУБД возбудит ошибку целостности данных (конечно же, если у Detail стоит FOREIGN KEY на Master). Так что при сохранении Master желательно так же циклом пробежаться по всем NewModified! и сбросить им поле Identity на NULL, или наследовать функцию UPDATE и дописать там код сброса Identity, чтобы это происходило автоматом.
11 авг 04, 07:31    [872905]     Ответить | Цитировать Сообщить модератору
 Re: Выдача вн.ключа потомку  [new]
ЗоринАндрей
Member

Откуда: Санкт-Петербург
Сообщений: 3004
В PFC есть Linkage Service (pfc_n_cst_dwsrv_linkage).
ИМХО, не использовать PFC есть хождение по граблям и изобретение велосипеда.
11 авг 04, 09:46    [873116]     Ответить | Цитировать Сообщить модератору
 Re: Выдача вн.ключа потомку  [new]
Leonid_B
Member

Откуда: Москва
Сообщений: 275
Ясно, значит без цикла никак...
11 авг 04, 11:49    [873645]     Ответить | Цитировать Сообщить модератору
 Re: Выдача вн.ключа потомку  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
автор
ИМХО, не использовать PFC есть хождение по граблям и изобретение велосипеда.

Если вся логика реализована на БД и клиентское приложение из себя представляет примитивный набор формочек и DW-шек, то никакого преимущества использования PFC лично я не вижу, зачем мне такая куча классов, сервисов и иерархий, проблемы с интернационализацией, их багами и совместимости версий для PB, когда можно обойтись одним десятком собственных базовых обьектов с включенными в них примитивами базовой функциональности. И из за парочки решений PFC, которые для такого приложения полезны, тащить ее всю с собой, особого смысла не имеет. В таком случае гораздо иногда полезнее просто посмотреть, как сделано у них, чтобы не наступить на грабли.
11 авг 04, 12:42    [873884]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить