:: Visual Foxpro, Foxpro for DOS
Re: видимость курсора
PaulWist

Сообщений: 14501
Дата регистрации: 01.04.2004
DmitryKn
Немного поспешил (
при редактировании дочерних таблиц постоянно ошибка 1539 триггер поломался в таблице ((

интуитивно кажется, что это связано с появлением помеченных на удаление записей.

Записи удалены в Мастер таблице или в Дочерней?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
PaulWist
Ещё добавок.
Я уже не помню деталей, но если что-то делать с таблицами (alter table, например) у которых установлены RI, то все связи "ломаются" и надо снова тыкать мышкой (кодом не правится, или я не знаю. И ещё остались смутные воспоминания, что контейнер БД надо компилировать , но это не точно )

Положа руку на сердце - используете ли RI в своей работе?
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
дочерней
Ratings: 0 negative/0 positive
Re: видимость курсора
PaulWist

Сообщений: 14501
Дата регистрации: 01.04.2004
DmitryKn

Положа руку на сердце - используете ли RI в своей работе?

ДА.

Правда было это 12 лет назад.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: видимость курсора
PaulWist

Сообщений: 14501
Дата регистрации: 01.04.2004
Какая ошибка возвращается?

Нужна последовательность действий.

Если Создаём/Редактируем документ, то первым идет сохранение "шапки", затем содержания.

Если удалять документ, то сначала сохранение содержания, потом шапки.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 16.12.22 14:57
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
PaulWist
Какая ошибка возвращается?

AERROR показывает "1539 trigger filed in out_d"
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
PaulWist
Какая ошибка возвращается?
Нужна последовательность действий.

Если Создаём/Редактируем документ, то первым идет сохранение "шапки", затем содержания.

Если удалять документ, то сначала сохранение содержания, потом шапки.

Одна процедура на все, например, в документе Счет могут быть два документа накладных, в которых есть записи. Одну накладную удаляем, вторую редактируем, все это в одном сеансе редактирования. В первом случае нужно сохранить сперва таблицу записей, потом шапку накладной, во втором - сперва шапку потом записи. Как жить?
Ratings: 0 negative/0 positive
Re: видимость курсора
PaulWist

Сообщений: 14501
Дата регистрации: 01.04.2004
DmitryKn
Одна процедура на все, например, в документе Счет могут быть два документа накладных, в которых есть записи. Одну накладную удаляем, вторую редактируем, все это в одном сеансе редактирования. В первом случае нужно сохранить сперва таблицу записей, потом шапку накладной, во втором - сперва шапку потом записи. Как жить?

Разделить, для одного одно, для другого другое.

Посмотри как ошибки в триггере отлавливать

forum.foxclub.ru

При ошибке в триггере формируется массив gaErrors(), его тоже можно "почитать".


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
Спасибо, сейчас почитаю
Ratings: 0 negative/0 positive
Re: видимость курсора
Владимир Максимов

Сообщений: 14063
Откуда: Москва
Дата регистрации: 02.09.2000
DmitryKn
Спасибо, сейчас почитаю

Сама статья вот здесь теперь

foxclub.ru
Ratings: 0 negative/0 positive
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."

и вот в моем приложении юзер может одновременно удалить накладную и править вторую, в одном сеансе редактирования. И как их разводить, ума не приложу.
Может есть пользовательские триггеры, универсальные, или хотя бы что там должно быть примерно?
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
Цитата:
может одновременно удалить накладную и править вторую, в одном сеансе редактирования
Обе (а их может быть и чуть больше, из практики - больше 4-х не встречалось) принадлежат одному Счету или Заказу, т.е. Счет шапка для накладных, каждая накладная - шапка для своего содержимого.

Или может быть можно как-то понять, в каком случае было delete, в каком update, в каком insert для каждой строки?



Исправлено 1 раз(а). Последнее : DmitryKn, 17.12.22 10:05
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
получилась такая конструкция , извините, кусок реального кода, нет сил обобщать:
Пока вроде не ругается, но это без проверки юзером.



Исправлено 2 раз(а). Последнее : DmitryKn, 17.12.22 11:07
Ratings: 0 negative/0 positive
Re: видимость курсора
Владимир Максимов

Сообщений: 14063
Откуда: Москва
Дата регистрации: 02.09.2000
DmitryKn
и вот в моем приложении юзер может одновременно удалить накладную и править вторую, в одном сеансе редактирования. И как их разводить, ума не приложу.

Опишите словами, как такое получается? Что за бизнес-процесс Вы реализуете? Не надо кода! Словами!

На всякий случай, следует разделять понятия "процесс редактирования" (внесения изменений) и "процесс сохранения сделанных изменений". Это два разных процесса, в общем случае, не связанные между собой.

Почему Вам так важно, чтобы удаление одной накладной и сохранение изменений в другой - оказались в рамках одной транзакции? Почему нельзя эти изменения сохранять по отдельности? Ну, например, удаление одной накладной выполнено успешно, а изменения в другой сохранить не удалось - такое допустимо?

DmitryKn
Может есть пользовательские триггеры, универсальные, или хотя бы что там должно быть примерно?

В статье про триггеры приведен код, который надо написать в самом начале универсального триггера, чтобы понять, какое именно событие (удаление/изменение/создание) вызвало данный триггер. А дальше уже сами определяете что именно писать в каждом конкретном случае.

Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения.
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
Цитата:
Опишите словами, как такое получается? Что за бизнес-процесс Вы реализуете? Не надо кода! Словами!
Существует форма Заказ (или Счет, как нравится больше).
Заказ - это главная шапка, главная таблица Счет, у нее есть теперь уже связанная таблица - детали, строки заказа, т.е. что именно заказали, это мы видим и редактируем в гриде, который находится на page frame page "Счет"
Когда произошла отгрузка, а она может быть частичной, т.е. их может быть несколько, на page "Отгрузка" видим и редактируем два грида - заголовок накладной, которые также являются связанной таблицей с таблицей Счет, и детали накладной, связанные с соответствующими заголовками накладных (если их несколько).
В заголовок накладной пишется дата - номер, в детали то, что фактически отгружено, и, если отдали не все, то появляется второй заголовок, т.е. накладная, пока что без номера, который содержит записи того, что должны и резервируется.
Если произошла отгрузка и опять не все, то в результате мы имеем 2 накладных с номером и одну без, т.е. три записи, каждая из которых содержит какие-то товары.
Есть еще page "Оплата", тоже связанная с таблицей Счет, но тут все прозрачно.

И вот, например, когда есть несколько накладных, с номером и без него, и есть необходимость все отгрузить в одну накладную, удаляется накладная(ые) из списка и редактируется оставшаяся. Такие случаи довольно частые, правки все в гриде, кроме главной таблицы, там контролы на форме.

На самом деле в моем посте выше , когда меняю местами tablupdat-ы записей и шапки накладной работает вроде бы все и с триггерами фокса. Но это еще на пользователях проверить нужно, невозможно предугадать все комбинации нажатий и кликов, которые могут быть выполнены.
Ratings: 0 negative/0 positive
Re: видимость курсора
of63

Сообщений: 24629
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения.

Написание фрейверков, набора команд фокса в реализации "языка фокс" - это тоже "плохая стратегия"?
Да, сложно вносить "изменения" ( а в приборах мелкого пошиба..., в т.ч самолетных, это всё не просто, преемственность...). Должна быть команда разрабов, чтобы это работало, включая Чен-а... Сложный вопрос, что нужно делать/не делать, Владимир.

Мтк, правильный путь - написание подпрограмм, все более и более уровня вложенности... Но, мтк, пользование этими "подпрограммами" вызовет проблему непонимания, и уже вызывает. Мозг человеков не безграничен, и хочет не "работы", а "отдыха", вот такой...

>> написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода
А какая хоршая стратегия? Писать простые процедуры? Вообще не писать прцедуры/подпрограммы?



Исправлено 2 раз(а). Последнее : of63, 17.12.22 22:31
Ratings: 0 negative/0 positive
Re: видимость курсора
of63

Сообщений: 24629
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() > Но это еще на пользователях проверить нужно, невозможно предугадать все комбинации нажатий и кликов, которые могут быть выполнены.
Конечно, это можно было и не проговаривать

> Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения.

Я резко против этой позиции. Только универииализация (утопично, конечно) всех прогеров, или других фоллтипов... Писать надо больше текстов, ребята, мыслей всяких...

() Покажите ваши коды...



Исправлено 2 раз(а). Последнее : of63, 18.12.22 00:56
Ratings: 0 negative/0 positive
Re: видимость курсора
Владимир Максимов

Сообщений: 14063
Откуда: Москва
Дата регистрации: 02.09.2000
DmitryKn
И вот, например, когда есть несколько накладных, с номером и без него, и есть необходимость все отгрузить в одну накладную, удаляется накладная(ые) из списка и редактируется оставшаяся. Такие случаи довольно частые, правки все в гриде, кроме главной таблицы, там контролы на форме.

Понятно. Вы хотите "все и сразу". Обычно так не делают. Каждый документ сохраняется отдельно.

Т.е. у Вас одна общая таблица в 5 режиме буферизации. Часть записей этой таблицы удаляются, часть создаются. И здесь "записи" - это отдельные документы.

У команды TableUpdate() можно указать параметр, который определит, что необходимо сбросить не весь буфер, а только одной текущей записи.

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

Да, в рамках одной транзакции можно сохранить изменения в нескольких документах, но по очереди! Сначала один документ и все его строки удаляете, затем другой документ и все его строки создаете. Но одновременно оба документа не должны сбрасывать свои изменения. В общем случае, это может привести к нарушению ссылочной целостности.

Примерно так получается. Это общая схема, чтобы показать сам принцип

Local isError
BEGIN TRANSACTION
* Сначала удаление документов
set deleted off
select ord_h
scan for (условие отбора только тех шапок, которые отображены на форме) AND deleted() AND !isError
isError = !tableUpdate(1, .t.)
endscan
if !isError
* Теперь создание и изменение
set deleted on
select ord_h
scan for (условие отбора только тех шапок, которые отображены на форме) AND !isError
isError = !tableUpdate(1, .t.)
if !isError
* Создали/изменили шапку
* Сканируем только строки по этой шапке
select ord_d
scan for ord_d.id_h = ord_h.id AND !isError
isError = !tableUpdate(1, .t.)
endscan
endif
endscan
endif
if isError
ROLLBACK
else
END TRANSACTION
endif

В принципе, можно еще использовать функции GetNextModified() и GetFldState(), чтобы уточнять буфер какой записи был изменен. Но здесь в этом нет смысла. Ведь шапка документа может и не меняться, несмотря на то, что изменили его строки. А TableUpdate() по строке, которая не менялась, вернет .t., так что ошибки не будет
Ratings: 0 negative/0 positive
Re: видимость курсора
Владимир Максимов

Сообщений: 14063
Откуда: Москва
Дата регистрации: 02.09.2000
of63
> Однако написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода. Лучше так не делать. Сложно будет потом вносить изменения.
Написание фрейверков, набора команд фокса в реализации "языка фокс" - это тоже "плохая стратегия"?

"Котлеты - отдельно, мухи - отдельно" (с)

FrameWork - это не сам код. Это некий предварительный "каркас", который позже будет наполнен "мясом" конкретного приложения. Строго говоря, FrameWork - это вообще не код. Это набор интерфейсов. Определяет внешний вид форм и последовательность вызовов методов. Некая "идея" (концепция) построения приложения

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

of63
>> написание универсальных процедур - это плохая стратегия с точки зрения последующего сопровождения кода
А какая хоршая стратегия? Писать простые процедуры? Вообще не писать прцедуры/подпрограммы?

Пример, с которого данный вопрос вообще возник. Триггер. Ты реально пишешь одну универсальную простыню кода под все 3 типа триггеров insert/update/delete сразу? Некий универсальный триггер на все случаи жизни? Физически-то это вполне возможно. И даже автоматически определить какой именно тип триггера был вызван можно. Или все-таки на каждый тип триггера пишешь отдельную прогу?
Ratings: 0 negative/0 positive
Re: видимость курсора
DmitryKn
Автор

Сообщений: 280
Дата регистрации: 06.04.2022
Владимир Максимов
...Т.е. у Вас одна общая таблица в 5 режиме буферизации...
нет, Владимир. Есть таблица Счет, есть таблица детали счета, есть таблица накладных, и есть таблица записей накладных и т.д. и все в 5 режиме. Счет - детали по ключу счет_ид, Счет - накладные по ключу счет_ид, накладная - детали накладной по ключу накл_ид.
Ну и куча других таблиц, с остатками и прочее. Проблема изначально возникала именно в связке "накладная - детали накладной" , остальное все безупречно. Разобрался с большего с RI, установил restrict, данные в порядке, только код надо было под эту идеологию поправить.
Ваш пример, на самый первый взгляд, если очень обобщенно, это аналог моего, может более гармоничный. Выпью утренний кофе и разберу, спасибо )
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 17 (Гостей: 17)

© 2000-2023 Fox Club 
Яндекс.Метрика