Re: видимость курсора | |
---|---|
PaulWist Сообщений: 14501 Дата регистрации: 01.04.2004 |
Записи удалены в Мастер таблице или в Дочерней? ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
Положа руку на сердце - используете ли RI в своей работе? ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
дочерней
![]() |
Re: видимость курсора | |
---|---|
PaulWist Сообщений: 14501 Дата регистрации: 01.04.2004 |
ДА. Правда было это 12 лет назад. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) ![]() |
Re: видимость курсора | |
---|---|
PaulWist Сообщений: 14501 Дата регистрации: 01.04.2004 |
Какая ошибка возвращается?
Нужна последовательность действий. Если Создаём/Редактируем документ, то первым идет сохранение "шапки", затем содержания. Если удалять документ, то сначала сохранение содержания, потом шапки. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) Исправлено 1 раз(а). Последнее : PaulWist, 16.12.22 14:57 ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
AERROR показывает "1539 trigger filed in out_d" ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
Одна процедура на все, например, в документе Счет могут быть два документа накладных, в которых есть записи. Одну накладную удаляем, вторую редактируем, все это в одном сеансе редактирования. В первом случае нужно сохранить сперва таблицу записей, потом шапку накладной, во втором - сперва шапку потом записи. Как жить? ![]() |
Re: видимость курсора | |
---|---|
PaulWist Сообщений: 14501 Дата регистрации: 01.04.2004 |
Разделить, для одного одно, для другого другое. Посмотри как ошибки в триггере отлавливать forum.foxclub.ru При ошибке в триггере формируется массив gaErrors(), его тоже можно "почитать". ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
Спасибо, сейчас почитаю
![]() |
Re: видимость курсора | |
---|---|
Владимир Максимов Сообщений: 14063 Откуда: Москва Дата регистрации: 02.09.2000 |
|
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
Спасибо за наводки.
Пока уперся в то, что, как и сказал PaulWist необходимо соблюдение последовательности. Иначе то ошибка триггера insert, то delete, gaErrors(1.1) = -1, пишет или "Insert restrict rule violated" или "Delete restrict rule violated", было и "Illegal recursion in rule evaluation." и вот в моем приложении юзер может одновременно удалить накладную и править вторую, в одном сеансе редактирования. И как их разводить, ума не приложу. Может есть пользовательские триггеры, универсальные, или хотя бы что там должно быть примерно? ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
Цитата:Обе (а их может быть и чуть больше, из практики - больше 4-х не встречалось) принадлежат одному Счету или Заказу, т.е. Счет шапка для накладных, каждая накладная - шапка для своего содержимого. Или может быть можно как-то понять, в каком случае было delete, в каком update, в каком insert для каждой строки? Исправлено 1 раз(а). Последнее : DmitryKn, 17.12.22 10:05 ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
|
Re: видимость курсора | |
---|---|
Владимир Максимов Сообщений: 14063 Откуда: Москва Дата регистрации: 02.09.2000 |
Опишите словами, как такое получается? Что за бизнес-процесс Вы реализуете? Не надо кода! Словами! На всякий случай, следует разделять понятия "процесс редактирования" (внесения изменений) и "процесс сохранения сделанных изменений". Это два разных процесса, в общем случае, не связанные между собой. Почему Вам так важно, чтобы удаление одной накладной и сохранение изменений в другой - оказались в рамках одной транзакции? Почему нельзя эти изменения сохранять по отдельности? Ну, например, удаление одной накладной выполнено успешно, а изменения в другой сохранить не удалось - такое допустимо?
В статье про триггеры приведен код, который надо написать в самом начале универсального триггера, чтобы понять, какое именно событие (удаление/изменение/создание) вызвало данный триггер. А дальше уже сами определяете что именно писать в каждом конкретном случае. Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения. ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
Цитата:Существует форма Заказ (или Счет, как нравится больше). Заказ - это главная шапка, главная таблица Счет, у нее есть теперь уже связанная таблица - детали, строки заказа, т.е. что именно заказали, это мы видим и редактируем в гриде, который находится на page frame page "Счет" Когда произошла отгрузка, а она может быть частичной, т.е. их может быть несколько, на page "Отгрузка" видим и редактируем два грида - заголовок накладной, которые также являются связанной таблицей с таблицей Счет, и детали накладной, связанные с соответствующими заголовками накладных (если их несколько). В заголовок накладной пишется дата - номер, в детали то, что фактически отгружено, и, если отдали не все, то появляется второй заголовок, т.е. накладная, пока что без номера, который содержит записи того, что должны и резервируется. Если произошла отгрузка и опять не все, то в результате мы имеем 2 накладных с номером и одну без, т.е. три записи, каждая из которых содержит какие-то товары. Есть еще page "Оплата", тоже связанная с таблицей Счет, но тут все прозрачно. И вот, например, когда есть несколько накладных, с номером и без него, и есть необходимость все отгрузить в одну накладную, удаляется накладная(ые) из списка и редактируется оставшаяся. Такие случаи довольно частые, правки все в гриде, кроме главной таблицы, там контролы на форме. На самом деле в моем посте выше , когда меняю местами tablupdat-ы записей и шапки накладной работает вроде бы все и с триггерами фокса. Но это еще на пользователях проверить нужно, невозможно предугадать все комбинации нажатий и кликов, которые могут быть выполнены. ![]() |
Re: видимость курсора | |
---|---|
of63 Сообщений: 24629 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения.
Написание фрейверков, набора команд фокса в реализации "языка фокс" - это тоже "плохая стратегия"? Да, сложно вносить "изменения" ( а в приборах мелкого пошиба..., в т.ч самолетных, это всё не просто, преемственность...). Должна быть команда разрабов, чтобы это работало, включая Чен-а... Сложный вопрос, что нужно делать/не делать, Владимир. Мтк, правильный путь - написание подпрограмм, все более и более уровня вложенности... Но, мтк, пользование этими "подпрограммами" вызовет проблему непонимания, и уже вызывает. Мозг человеков не безграничен, и хочет не "работы", а "отдыха", вот такой... >> написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода А какая хоршая стратегия? Писать простые процедуры? Вообще не писать прцедуры/подпрограммы? Исправлено 2 раз(а). Последнее : of63, 17.12.22 22:31 ![]() |
Re: видимость курсора | |
---|---|
of63 Сообщений: 24629 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
() > Но это еще на пользователях проверить нужно, невозможно предугадать все комбинации нажатий и кликов, которые могут быть выполнены.
Конечно, это можно было и не проговаривать > Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения. Я резко против этой позиции. Только универииализация (утопично, конечно) всех прогеров, или других фоллтипов... Писать надо больше текстов, ребята, мыслей всяких... () Покажите ваши коды... Исправлено 2 раз(а). Последнее : of63, 18.12.22 00:56 ![]() |
Re: видимость курсора | |
---|---|
Владимир Максимов Сообщений: 14063 Откуда: Москва Дата регистрации: 02.09.2000 |
Понятно. Вы хотите "все и сразу". Обычно так не делают. Каждый документ сохраняется отдельно. Т.е. у Вас одна общая таблица в 5 режиме буферизации. Часть записей этой таблицы удаляются, часть создаются. И здесь "записи" - это отдельные документы. У команды TableUpdate() можно указать параметр, который определит, что необходимо сбросить не весь буфер, а только одной текущей записи. Т.е. общая идея процесса сохранения должна быть такая: изменения в каждом документе (у Вас - накладная) сохраняются отдельно, а не в куче с другими. Да, в рамках одной транзакции можно сохранить изменения в нескольких документах, но по очереди! Сначала один документ и все его строки удаляете, затем другой документ и все его строки создаете. Но одновременно оба документа не должны сбрасывать свои изменения. В общем случае, это может привести к нарушению ссылочной целостности. Примерно так получается. Это общая схема, чтобы показать сам принцип
В принципе, можно еще использовать функции GetNextModified() и GetFldState(), чтобы уточнять буфер какой записи был изменен. Но здесь в этом нет смысла. Ведь шапка документа может и не меняться, несмотря на то, что изменили его строки. А TableUpdate() по строке, которая не менялась, вернет .t., так что ошибки не будет ![]() |
Re: видимость курсора | |
---|---|
Владимир Максимов Сообщений: 14063 Откуда: Москва Дата регистрации: 02.09.2000 |
"Котлеты - отдельно, мухи - отдельно" (с) FrameWork - это не сам код. Это некий предварительный "каркас", который позже будет наполнен "мясом" конкретного приложения. Строго говоря, FrameWork - это вообще не код. Это набор интерфейсов. Определяет внешний вид форм и последовательность вызовов методов. Некая "идея" (концепция) построения приложения Просто разработчики FoxPro - это некие универсалы, которые и сами FrameWork под себя создают и сами прогу на этом FrameWork пишут. Как следствие, очень много из того, что надо было бы оставить в коде тихо и незаметно переносится во FrameWork, хотя быть там не должно.
Пример, с которого данный вопрос вообще возник. Триггер. Ты реально пишешь одну универсальную простыню кода под все 3 типа триггеров insert/update/delete сразу? Некий универсальный триггер на все случаи жизни? Физически-то это вполне возможно. И даже автоматически определить какой именно тип триггера был вызван можно. Или все-таки на каждый тип триггера пишешь отдельную прогу? ![]() |
Re: видимость курсора | |
---|---|
DmitryKn Автор Сообщений: 280 Дата регистрации: 06.04.2022 |
нет, Владимир. Есть таблица Счет, есть таблица детали счета, есть таблица накладных, и есть таблица записей накладных и т.д. и все в 5 режиме. Счет - детали по ключу счет_ид, Счет - накладные по ключу счет_ид, накладная - детали накладной по ключу накл_ид. Ну и куча других таблиц, с остатками и прочее. Проблема изначально возникала именно в связке "накладная - детали накладной" , остальное все безупречно. Разобрался с большего с RI, установил restrict, данные в порядке, только код надо было под эту идеологию поправить. Ваш пример, на самый первый взгляд, если очень обобщенно, это аналог моего, может более гармоничный. Выпью утренний кофе и разберу, спасибо ) ![]() |
© 2000-2023 Fox Club  |