powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите обработать ошибку.
14 сообщений из 14, страница 1 из 1
Помогите обработать ошибку.
    #32490027
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В процедуре (myProc(), допустим) идет запись в свободную таблицу. В этой таблице есть поле RecDate d. Помогите сделать так, чтобы при возникновении любой ошибки в теле процедуры происходило удаление всех записей у кот. RecDate = date() (т.е. удаление всех записей за сегодняшний день), и немедленный выход из процедуры с выдачей сообщения.
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32490213
null
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А фокс какой ?
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32490218
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP5
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32490296
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странное желание, однако.
Ну если тебе это надо,
напиши в начале процедуры myProc()
On Error Delete For RecDate = date()
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32491031
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On Error Delete For RecDate = date()
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32491038
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
On Error Delete For RecDate = date()

Спасибо. Но, как я понимаю, после того как будет обработана ошибка по On Error управление перейдет к следующей строке стоящей следом за строкой в кот. произошла ошибка. А как сделать, чтобы еще и происходил немедленный выход из процедуры?
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32491156
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А как сделать, чтобы еще и происходил немедленный выход из процедуры?
Вместо On Error Delete For RecDate = date()
Поставь On Error DO MyError
Где в процедуре MyError удалишь все записи и перейдешь в процедуру более высокого уровня, что то вроде:

PROCEDURE MyError
ON ERROR
Delete For RecDate = date()
RETURN TO <процедура вызвашшая ту, в которой произошла ошибка>
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32491299
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень похоже, что Вам надо использовать буферизацию таблиц - откат можно сделать по всем записям, введенным после последнего сохранения... Мне кажется это будет проще...
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32491354
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Вам надо использовать буферизацию таблиц 

Я думал, что это приминимо только к таблицам БД, а не к свободным таблицам?
Все равно мне очень интересно, так как никогда этим не пользовался.
Можно на примере. Допустим, в процедуре MyProc() идет запись в таблицу:
procedure MyProc()
use tb1 alias mytb1 in 0
use tb2 alias mytb2 in 0
select mytb1
scan
if запись удовлетворяет условию
insert into mytb2;
values(...)
...
** Допустим, в этом месте на какой-то записи происходит ошибка
endscan
endproc
Конечно, все это очень упрощенно но все таки.
Так как мне использовать эту буферизацию с этим откатом?
Т.е. если можно рассмотреть 2 варианта:
1) Если произошла ошибка, то все ранее добавленные записи не должны были б добавляться?
2)Если произошла ошибка, то все ранее добавленные записи остаются, кроме последней, той на которой произошла ошибка?
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32491949
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Я думал, что это приминимо только к таблицам БД, а не к свободным таблицам?
К любым
Для вашего примера:

procedure MyProc()
use tb1 alias mytb1 in 0
use tb2 alias mytb2 in 0

SET MULTILOCKS ON
=CURSORSETPROP('Buffering',5, 'mytb2') &&оптимистическая буфферизация таблицы

select mytb1

ON ERROR DO MyError

scan
if запись удовлетворяет условию
insert into mytb2;
values(...)
...
* Допустим, в этом месте на какой-то записи происходит ошибка
endscan
IF .not.TABLEUPDATE(.t., .t., 'mytb2')
* ошибка сброса в буфер
=TABLEREVERT(.t., 'mytb2')
ENDIF
endproc

PROCEDURE MyError
ON ERROR
IF <условия удаления всего>
=TABLEREVERT(.t., 'mytb2')
ELSE
SELECT mytb2
DELETE

IF .not.TABLEUPDATE(.t., .t., 'mytb2')
* ошибка сброса в буфер
=TABLEREVERT(.t., 'mytb2')
ENDIF

ENDIF

RETURN TO MAIN
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32492052
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Burn объясните, если не сложно, зачем этот кусок кода
используется два раза, в каждой процедуре? (особо не пойму зачем в MyError)
Код: plaintext
1.
2.
3.
IF .not.TABLEUPDATE(.t., .t., 'mytb2') 
* ошибка сброса в буфер 
=TABLEREVERT(.t., 'mytb2') 
ENDIF 
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32492324
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AlexFV
так все-таки, что тебе надо
1)удалить ВСЕ записи, созданные ЗА сегодняшний ДЕНЬ,
или
2)только записи, которые были созданы ЗА ВРЕМЯ
данного вызова MyProc() ?

Если 1 вар., то буферизация тебе не поможет.
используй то, что предложил Burn в первый раз:
PROCEDURE MyError
ON ERROR
Delete For RecDate = date()
RETURN TO <процедура вызвашшая ту, в которой произошла ошибка>

Если 2 вар., то поясню за Burn'a , зачем
IF .not.TABLEUPDATE(.t., .t., 'mytb2') используется в MyError() :
Ведь, при возникновении ошибки в MyProc() происходит
"немедленный выход из процедуры" и значит
IF .not.TABLEUPDATE(.t., .t., 'mytb2')
находящийся в конце MyProc() не отработает.
Поэтому помещаем его еще раз в самой MyError()
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32492357
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, все понятно. А насчет:
Код: plaintext
1.
2.
3.
4.
5.
to AlexFV 
так все-таки, что тебе надо 
>1)удалить ВСЕ записи, созданные ЗА сегодняшний ДЕНЬ, 
или 
>2)только записи, которые были созданы ЗА ВРЕМЯ 
данного вызова MyProc() ? 


Дело в том, что MyProc() больше одного раза в день не может выполняться.
Еще раз, спасибо.
...
Рейтинг: 0 / 0
Помогите обработать ошибку.
    #32492903
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, andrew_Pr все уже объяснил, синкс:)
Конечно, по уму надобы такие куски выносить в отдельную процедуру, но не хотелось загромаждать пример...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите обработать ошибку.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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