for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

определить изменялась ли запись
vodaic
Автор

Сообщений: 159
Откуда: Киев, Украина
Дата: 28.12.17 12:00:23ОтветитьЦитировать
Подскажите, пож, как определить, корректировалась ли запись таблицы dbf в текущем сеансе работы с этой таблицей?
Спасибо!
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
PaulWist

Сообщений: 12803
Дата: 28.12.17 12:23:36ОтветитьЦитировать
GETFLDSTATE(cFieldName | nFieldNumber [, cTableAlias | nWorkArea])


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

Re: определить изменялась ли запись
ssa
[Модератор]

Сообщений: 11836
Откуда: Москва
Дата: 28.12.17 12:37:30ОтветитьЦитировать
vodaic
корректировалась ли запись таблицы dbf в текущем сеансе работы с этой таблицей?
И что понимается под словом "сеанс"?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive

Re: определить изменялась ли запись
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 28.12.17 13:22:02ОтветитьЦитировать
Если программа (сеанс?) никак не отмечает в записи таблички факт изменения записи, то никак не узнать. Дата/время файла таблички есть правда, и ее размер...
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
vodaic
Автор

Сообщений: 159
Откуда: Киев, Украина
Дата: 28.12.17 15:08:19ОтветитьЦитировать
ssa
vodaic
корректировалась ли запись таблицы dbf в текущем сеансе работы с этой таблицей?
И что понимается под словом "сеанс"?

Начинается "сеанс" оператором USE ... Входим в работу с таблицей. Потом таблица закрывается (USE in... или Close Tables All. Если в этом промежутке времени запись таблицы изменилась, отреагировать на такое состояние.
Вот так примерно выглядит потребность...
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
vodaic
Автор

Сообщений: 159
Откуда: Киев, Украина
Дата: 28.12.17 15:09:59ОтветитьЦитировать
PaulWist
GETFLDSTATE(cFieldName | nFieldNumber [, cTableAlias | nWorkArea])

Спасибо! Этот вариант конструктивен. Но, может еще имеются варианты?
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
Igor Korolyov

Сообщений: 30406
Дата: 28.12.17 15:24:17ОтветитьЦитировать
Этот вариант (с GETFLDSTATE, и заодно с GETNEXTMODIFIED - чтобы найти собственно изменённые записи, прежде чем смотреть какие поля там изменены) будет работать только если:
1) Таблица будет переведена в 5-й режим буферизации (сразу после открытия, к примеру).
2) До момента "проверки на изменения" данные НЕ будут сохранятся командой TABLEUPDATE().
3) Естественно, перед закрытием такую буферизованную таблицу нужно "записать" той самой командой TABLEUPDATE - проверив что она успешно отработала (некоторые правила работают только в момент "сохранения", а не в момент "ввода изменений").
Про буферизацию в хелпе написано достаточно подробно. Дополнительно надо смотреть функции CURVAL и OLDVAL - первая важна если таблица используется несколькими копиями программы (чтобы увидеть изменения сделанные другими пользователями). Вторая показывает собственно "старое значение" для указанного поля или выражения.


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
akvvohinc

Сообщений: 2663
Откуда: Москва
Дата: 28.12.17 16:37:24ОтветитьЦитировать
vodaic
Начинается "сеанс" оператором USE ... Входим в работу с таблицей. Потом таблица закрывается (USE in... или Close Tables All. Если в этом промежутке времени запись таблицы изменилась, отреагировать на такое состояние.
Осталось непонятным:
1) Что вы называете изменением записи? Изменение значения в каком-либо поле? Или любая запись в любое поле пусть даже того же самого значения? Добавление/удаление записи - это изменение?
2) О какой записи таблицы речь? О любой, то есть, хотя бы одной?
3) Интересуют физические изменения в самом файле dbf на диске или изменения, не сохраненные еще на диске, это тоже изменения?
4) В какой момент надо реагировать? Один раз после окончания сеанса? При каждом изменении записи в процессе работы с таблицей?
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
vnkor

Сообщений: 260
Дата: 29.12.17 08:00:29ОтветитьЦитировать
vodaic
Подскажите, пож, как определить, корректировалась ли запись таблицы dbf в текущем сеансе работы с этой таблицей?
А в чем, собственно, проблема?
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
spinz

Сообщений: 3495
Дата: 29.12.17 08:20:03ОтветитьЦитировать
Скажу по секрету - записи в таблице не могут меняться в принципе, они статичные. Это иллюзия, что СУБД что-то там может писать в таблицы.

Но лучше не обсуждать этот вопрос
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
vodaic
Автор

Сообщений: 159
Откуда: Киев, Украина
Дата: 29.12.17 11:27:36ОтветитьЦитировать
Igor Korolyov
Этот вариант (с GETFLDSTATE, и заодно с GETNEXTMODIFIED - чтобы найти собственно изменённые записи, прежде чем смотреть какие поля там изменены) будет работать только если:
1) Таблица будет переведена в 5-й режим буферизации (сразу после открытия, к примеру).
2) До момента "проверки на изменения" данные НЕ будут сохранятся командой TABLEUPDATE().
3) Естественно, перед закрытием такую буферизованную таблицу нужно "записать" той самой командой TABLEUPDATE - проверив что она успешно отработала (некоторые правила работают только в момент "сохранения", а не в момент "ввода изменений").
Про буферизацию в хелпе написано достаточно подробно. Дополнительно надо смотреть функции CURVAL и OLDVAL - первая важна если таблица используется несколькими копиями программы (чтобы увидеть изменения сделанные другими пользователями). Вторая показывает собственно "старое значение" для указанного поля или выражения.

Спасибо! Здесь есть чему поучиться в смысле образовавшейся надобности.
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
vodaic
Автор

Сообщений: 159
Откуда: Киев, Украина
Дата: 29.12.17 11:43:26ОтветитьЦитировать
[quote akvvohinc][quote vodaic]Начинается "сеанс" оператором USE ... Входим в работу с таблицей. Потом таблица закрывается (USE in... или Close Tables All. Если в этом промежутке времени запись таблицы изменилась, отреагировать на такое состояние.[/quote]
Осталось непонятным:
[quote]
1) Что вы называете изменением записи? Изменение значения в каком-либо поле? Или любая запись в любое поле пусть даже того же самого значения? Добавление/удаление записи - это изменение?[/quote]
Изменение значения двух-трех полей по указанию. Добавление записи - тоже изменение
[quote]
2) О какой записи таблицы речь? О любой, то есть, хотя бы одной?[/quote]
О любой изменившейся (добавленной) записи
[quote]
3) Интересуют физические изменения в самом файле dbf на диске или изменения, не сохраненные еще на диске, это тоже изменения?[/quote]
И те, и другие, если после закрытия таблицы выполненные изменения будут отражены в dbf-фвйле.

[quote]
4) В какой момент надо реагировать? Один раз после окончания сеанса? При каждом изменении записи в процессе работы с таблицей?[/quote]

Идеально было бы так. Открывается таблица. В ней производятся действия, приводящие к изменениям в некоторых подях некоторых записей. Потом, до закрытия таблицы, просматриваются ее записи и те, которые подверглись изменениям, как-то идентифицируются, например, создается файл, содержащий значение какого-то ключевого поля записи (некоторый код) и дата его изменения.
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
vodaic
Автор

Сообщений: 159
Откуда: Киев, Украина
Дата: 29.12.17 11:50:26ОтветитьЦитировать
vnkor
vodaic
Подскажите, пож, как определить, корректировалась ли запись таблицы dbf в текущем сеансе работы с этой таблицей?
А в чем, собственно, проблема?

Требуется где-то сохранить информацию о том, что такая-то запись таблицы сегодня подверглась изменениям, приемлемо вести некоторый файл изменения в записях по датам, например.
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
PaulWist

Сообщений: 12803
Дата: 29.12.17 11:54:40ОтветитьЦитировать
То есть нужен журнал изменеий?
Тогда для этих целей надо использовать триггеры на Insert, Update, Delete, куда писать лог в файл или таблицы, это дело десятое, но лучше в таблицы лога.


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

Re: определить изменялась ли запись
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 29.12.17 12:30:59ОтветитьЦитировать
> Требуется где-то сохранить информацию о том, что такая-то запись таблицы сегодня подверглась изменениям...
Перед использованием таблицы можно сделать ее копию, по окончании использования (или во время) - сравнить с копией (тривиальная програмка), не пристраивая никакие настоящие БД-шные "механизмы"...
Ratings: 1 negative/0 positive

Re: определить изменялась ли запись
Igor Korolyov

Сообщений: 30406
Дата: 29.12.17 12:31:05ОтветитьЦитировать
vodaic
Требуется где-то сохранить информацию о том, что такая-то запись таблицы сегодня подверглась изменениям, приемлемо вести некоторый файл изменения в записях по датам, например.
Тогда стоит поместить таблицы в контейнер БД (если они ещё не находятся там), и создать для таблицы триггера. Это будет работать независимо от "прикладного" кода (т.е. по сути ничего в самой программе работающей с этой таблицей менять не потребуется), и (если аккуратно написать сами эти триггера) даже при работе из других программ, в т.ч. и через ODBC/OLEDB из нефоксовых программ.
Вообще конкретно для целей аудита даже была написана специальная система FoxAudit. Я, конечно, не призываю её покупать, но изучить принцип работы и сделать своё, аналогичное - вполне хороший вариант будет.


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
Igor Korolyov

Сообщений: 30406
Дата: 29.12.17 12:31:59ОтветитьЦитировать
of63
Перед использованием таблицы можно сделать ее копию, по окончании использования (или во время) - сравнить с копией
На редкость корявый и убогий вариант, однако...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
spinz

Сообщений: 3495
Дата: 29.12.17 12:38:17ОтветитьЦитировать
Igor Korolyov
of63
Перед использованием таблицы можно сделать ее копию, по окончании использования (или во время) - сравнить с копией
На редкость корявый и убогий вариант, однако...

Тащемта copy-on-write, если говрить не о таблицах, а о страницах
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 29.12.17 12:48:50ОтветитьЦитировать
Igor Korolyov
of63
Перед использованием таблицы можно сделать ее копию, по окончании использования (или во время) - сравнить с копией
На редкость корявый и убогий вариант, однако...

> Тогда стоит поместить таблицы в контейнер БД (если они ещё не находятся там), и создать для таблицы триггера.
А твой путь прямой и светлый, ага, взять рабочую прогу с рабочими таблицами, и так побырому "поместить в конейнер БД", "создать триггера". Как в учебнике по созданию БД?
Ratings: 0 negative/0 positive

Re: определить изменялась ли запись
ssa
[Модератор]

Сообщений: 11836
Откуда: Москва
Дата: 29.12.17 13:11:18ОтветитьЦитировать
Боже мой, оказывается поместить таблицу в контейнер для кого - путь тернистый и темный. А уж с добавлением триггеров вообще хана...


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive



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

On-line: 50 Simple777 vnkor  and Guests: 48


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