powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Редактирование документа
8 сообщений из 8, страница 1 из 1
Редактирование документа
    #33097125
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил пересмотреть свои взгляды на организацию редактирования документов.
Например, мы хотим сделать окно ввода накладной:
Вариант 1
На окне ставим два ДВ, одно шапка, другое наполнение. Все изменения в БД делаются при помощи этих ДВ. Данные вводятся непосредственно в эти ДВ.
Вариант 2
На окне ставим два ДВ, одно шапка, другое наполнение. Данные вводятся только в шапку-ДВ, для изменения позиций вызываем другое окно (модальное, с фрееформ ДВ), в котором пользователь модифицирует выбранную позицию.
Изменения шапки в БД поступают из шапки-ДВ, изменения наполнения накладной делаются из ДВ модального окна.
...
Вариант N

Вопрос к первому варианту: Допустим Т1 - таблица с шапками накладных, Т2 - наполнение накладных, Т3 некая таблица связанная с Т2. В позиции накладной отображается инфо из Т2 и несколько полей из Т3.
селект такой
select t2.id,t2.m,t3.prop1,t3.prop2
from t2 inner join t3 on t2.m=t3.m
Обновление в БД делаем в таблицу Т2, только поле m.
Как сделать обновление полей prop1 и prop2, если поле m вводят руками или выбирают из dropdown listbox/datawindow?
Какие пути обновления БД с двумя ДВ и обеспечения синхронности значений идентификатора (m) и связанных полей в наполнении накладной?
Вопрос ко второму варианту:
Тут вообще непонятно, как обеспечивать эту синхронность, то ли вызывать ReselectRow для отредактированной позиции в модальном окне, то ли ручками обновлять данные в полях. Но тут следующие проблемы: а если нужно менять поле "кол-во", тогда придется делать это через это же модальное окно "редактирование позиции" - неудобно. Невозможно отменить работу в накладной, как в первом случае. Позиция накладной будет обновлятся из ДВ модального окна при выходе из него.
Вопрос с варианту N: Какой он, этот вариант N?
...
Рейтинг: 0 / 0
Редактирование документа
    #33097212
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант один довольно привычен для работы. к третей таблице можно обратиться на событии updateend() -- и обновить в ней всё, что надо..

если изменится поле t2.m, то в таблицу t3 надо предварительно добавить соответствующую строку. или она, строка, в t3 уже есть? тогда можно воспользоваться событием itemchanged для обновления полей t3.propX
...
Рейтинг: 0 / 0
Редактирование документа
    #33097229
Mykola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insert, Update, Delete делать используя отдельные процедуры
которые необходимо указать из пункта меню Rows -> Stored Procedure Update
...
Рейтинг: 0 / 0
Редактирование документа
    #33097278
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Mykola:
надо же, никогда не пользовался этой настройкой (storend procedures update). так проще триггер написать.. или нет?
...
Рейтинг: 0 / 0
Редактирование документа
    #33097368
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyв t3 уже есть?
Есть
Itemchanged - вариант. Но это все из класса "ручного синхронизирования".
Хочется более универсально, наследуемо, и чтоб само.)))
...
Рейтинг: 0 / 0
Редактирование документа
    #33097380
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MykolaInsert, Update, Delete делать используя отдельные процедуры
которые необходимо указать из пункта меню Rows -> Stored Procedure Update
К сожалению, в ПБ6 такого еще не было. Хотя такой метод мне видится достаточно мощным, при организации всей бизнес логики на сервере.
...
Рейтинг: 0 / 0
Редактирование документа
    #33098434
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer...Вопрос к первому варианту: Допустим Т1 - таблица с шапками накладных, Т2 - наполнение накладных, Т3 некая таблица связанная с Т2. В позиции накладной отображается инфо из Т2 и несколько полей из Т3.
селект такой
select t2.id,t2.m,t3.prop1,t3.prop2
from t2 inner join t3 on t2.m=t3.m
Обновление в БД делаем в таблицу Т2, только поле m.
Как сделать обновление полей prop1 и prop2, если поле m вводят руками или выбирают из dropdown listbox/datawindow?
Какие пути обновления БД с двумя ДВ и обеспечения синхронности значений идентификатора (m) и связанных полей в наполнении накладной?C этой проблемой легко справляется pfc Datawindow multitable service.
iLLerВопрос ко второму варианту:
Тут вообще непонятно, как обеспечивать эту синхронность, то ли вызывать ReselectRow для отредактированной позиции в модальном окне, то ли ручками обновлять данные в полях. Но тут следующие проблемы: а если нужно менять поле "кол-во", тогда придется делать это через это же модальное окно "редактирование позиции" - неудобно.Количество, вообще-то, можно изменять и не поднимая модального окна - нам ведь ничего не мешает обновлять DW? содержащее строки документа?
iLLerНевозможно отменить работу в накладной, как в первом случае. Позиция накладной будет обновлятся из ДВ модального окна при выходе из него.Все возможно, хотя, конечно, для этого придется использовать длинные транзакции, что плохо, особенно в случае, когда Вы используете блокировочник.
iLLer MykolaInsert, Update, Delete делать используя отдельные процедуры
которые необходимо указать из пункта меню Rows -> Stored Procedure UpdateК сожалению, в ПБ6 такого еще не было. Хотя такой метод мне видится достаточно мощным, при организации всей бизнес логики на сервере.В ранних версиях эта функциональность легко эмулируется перехватом события sqlpreview.
...
Рейтинг: 0 / 0
Редактирование документа
    #33101197
dp_tnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PL99 iLLer...Вопрос к первому варианту: Допустим Т1 - таблица с шапками накладных, Т2 - наполнение накладных, Т3 некая таблица связанная с Т2. В позиции накладной отображается инфо из Т2 и несколько полей из Т3.
селект такой
select t2.id,t2.m,t3.prop1,t3.prop2
from t2 inner join t3 on t2.m=t3.m
Обновление в БД делаем в таблицу Т2, только поле m.
Как сделать обновление полей prop1 и prop2, если поле m вводят руками или выбирают из dropdown listbox/datawindow?
Какие пути обновления БД с двумя ДВ и обеспечения синхронности значений идентификатора (m) и связанных полей в наполнении накладной?C этой проблемой легко справляется pfc Datawindow multitable service.


multitable service справится только с обновлением, но ведь до этого строки нужно еще и вставить. А с insert multitable service не дружит совершенно.

Можно еще применить для варианта ввода 1 linkage service. Но тут тоже полно подводных камней:

Во-первых, очень плохо организована синхронизация ключей. Если в заголовочной таблице использовать суррогатный автоинкрементный ключ (а почему бы его и не использовать?), то нужны дополнительные танцы с бубном, чтобы строки с товарами эти самые ключи получили.

Мы применили такую технологию - на клиенте вводить в накладную строки не даем до тех пор, пока заголовочная запись не будет сохранение и не получит свой ID. Это, конечно, разрывает транзакцию ввода документа, как единого целого, но позволяет в сервере проверять валидность многочисленных реквизитов документа (что, в нашем случае, гораздо важнее).

Во-вторых, если для detail datawindow использовать стиль связи retrieve (а он тут смотрится вполне естественно), иногда происходили странные вещи. Синхронизация detail datawindow происходит по событию смены строки в главном dw. Мы столкнулись, что при определенных условиях это событие не триггерилось.

Например, в мастер окне поставлен фильтр и осталась 1 строка.
Потом мы меняем условия отбора данных (переключаемся в другой отчетный период) и без снятия фильтра делаем retrieve, в результате которого в буфер попадает только 1 строка.
В этом случае иногда события rowfocuschange() и...ing() не происходят и можно лицезреть новый заголовок документа со старыми строками.

Вылечили принудительным retrieve дочернего dw в случае retrieve в мастере под фильтром. Это иногда дает лишнее чтение в дочернем dw, но это гораздо приятнее, чем переехавшие в другой документ строки.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Редактирование документа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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