|
|
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
Решил пересмотреть свои взгляды на организацию редактирования документов. Например, мы хотим сделать окно ввода накладной: Вариант 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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 13:05 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
вариант один довольно привычен для работы. к третей таблице можно обратиться на событии updateend() -- и обновить в ней всё, что надо.. если изменится поле t2.m, то в таблицу t3 надо предварительно добавить соответствующую строку. или она, строка, в t3 уже есть? тогда можно воспользоваться событием itemchanged для обновления полей t3.propX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 13:36 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
Insert, Update, Delete делать используя отдельные процедуры которые необходимо указать из пункта меню Rows -> Stored Procedure Update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 13:40 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
2 Mykola: надо же, никогда не пользовался этой настройкой (storend procedures update). так проще триггер написать.. или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 13:53 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyв t3 уже есть? Есть Itemchanged - вариант. Но это все из класса "ручного синхронизирования". Хочется более универсально, наследуемо, и чтоб само.))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 14:15 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
MykolaInsert, Update, Delete делать используя отдельные процедуры которые необходимо указать из пункта меню Rows -> Stored Procedure Update К сожалению, в ПБ6 такого еще не было. Хотя такой метод мне видится достаточно мощным, при организации всей бизнес логики на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 14:17 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 21:52 |
|
||
|
Редактирование документа
|
|||
|---|---|---|---|
|
#18+
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, но это гораздо приятнее, чем переехавшие в другой документ строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2005, 20:39 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=33097278&tid=1338321]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 369ms |

| 0 / 0 |
