progress-4gl
Вывод FIND
Поиск…
Вступление
Оператор FIND
используется для извлечения одной записи из одной таблицы. Он имеет некоторые ограничения по сравнению с FOR
или QUERY
, но это простой и удобный вывод для быстрого доступа к записям.
НАЙТИ базовые примеры
Простой пример sports2000:
FIND FIRST Customer NO-LOCK WHERE CustNum = 1 NO-ERROR.
IF AVAILABLE Customer THEN DO:
DISPLAY Customer.NAME.
END.
ELSE DO:
MESSAGE "No record available".
END.
FIRST - найдите первую запись, соответствующую запросу
NO-LOCK - не блокируйте запись - это означает, что мы будем читать и не изменять запись.
ГДЕ - это запрос
NO-ERROR - не сбой, если нет доступных записей.
(IF) ДОСТУПНО Клиент - проверьте, не нашли ли мы запись или нет
findLoop:
REPEAT :
FIND NEXT Customer NO-LOCK WHERE NAME BEGINS "N" NO-ERROR.
IF AVAILABLE customer THEN DO:
DISPLAY Customer.NAME.
END.
ELSE DO:
LEAVE findLoop.
END.
END.
Доступность и объем
Последняя находка всегда такова, что проверка доступности будет работать против - неудовлетворительная находка сделает AVAILABLE
return false:
DEFINE TEMP-TABLE tt NO-UNDO
FIELD nr AS INTEGER.
CREATE tt.
tt.nr = 1.
CREATE tt.
tt.nr = 2.
CREATE tt.
tt.nr = 3.
DISPLAY AVAILABL tt. // yes (tt with nr = 3 is still available)
FIND FIRST tt WHERE tt.nr = 1 NO-ERROR.
DISPLAY AVAILABLE tt. //yes
FIND FIRST tt WHERE tt.nr = 2 NO-ERROR.
DISPLAY AVAILABLE tt. //yes
FIND FIRST tt WHERE tt.nr = 3 NO-ERROR.
DISPLAY AVAILABLE tt. //yes
FIND FIRST tt WHERE tt.nr = 4 NO-ERROR.
DISPLAY AVAILABLE tt. //no
Запись, найденная в «main», будет доступна в любых процедурах.
DEFINE TEMP-TABLE tt NO-UNDO
FIELD nr AS INTEGER.
PROCEDURE av:
DISPLAY AVAILABLE tt.
IF AVAILABLE tt THEN DO:
DISPLAY tt.nr.
END.
END PROCEDURE.
CREATE tt.
tt.nr = 1.
RUN av. // yes. tt.nr = 1
CREATE tt.
tt.nr = 2.
RUN av. // yes. tt.nr = 2
FIND FIRST tt WHERE tt.nr = 4 NO-ERROR.
RUN av. // no (and no tt.nr displayed)
Кроме того, запись, найденная в процедуре, по-прежнему будет доступна после выхода этой процедуры.
DEFINE TEMP-TABLE tt NO-UNDO
FIELD nr AS INTEGER.
PROCEDURE av:
FIND FIRST tt WHERE tt.nr = 1.
END PROCEDURE.
CREATE tt.
tt.nr = 1.
CREATE tt.
tt.nr = 2.
DISPLAY AVAILABLE tt WITH FRAME x1. // yes.
IF AVAILABLE tt THEN DO:
DISPLAY tt.nr WITH FRAME x1. //tt.nr = 2
END.
PAUSE.
RUN av.
DISPLAY AVAILABLE tt WITH FRAME x2. // yes.
IF AVAILABLE tt THEN DO:
DISPLAY tt.nr WITH FRAME x2. //tt.nr = 1
END.
НАЙТИ и блокировать
Всякий раз , когда вы FIND
записи вы можете aquire прядь его.
NO-LOCK: используется для операций только для чтения. Если вы сделаете FIND <record> NO-LOCK
вы никоим образом не сможете изменить запись.
FIND FIRST Customer NO-LOCK NO-ERROR.
EXCLUSIVE-LOCK: используется для обновления и удаления. Если вы сделаете это, вы будете «владеть» записью, и никто другой не сможет ее изменить или удалить, пока вы не закончите. Они могут читать его (без блокировки), пока вы его не удалили.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.
SHARE-LOCK: Избегайте любой ценой. Это вызовет безумную головную боль.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.
ОБНОВЛЕНИЕ вашей блокировки от NO-LOCK до EXCLUSIVE-LOCK
Вы можете легко перейти от NO-LOCK
к EXCLUSIVE-LOCK
если возникла необходимость в изменении записи:
FIND FIRST Customer NO-LOCK NO-ERROR.
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.
Вы можете перейти от EXCLUSIVE-LOCK к NO-LOCK.
ЗАБЛОКИРОВАННЫЕ ЗАПИСИ
Всякий раз, когда другие пользователи могут использовать блокировку записи, лучше учитывать эту возможность. Столкновения произойдут!
Лучше обращаться с этим программным путем с помощью инструкции NO-WAIT
. Это говорит AVM, чтобы просто передать FIND, если запись заблокирована кем-то другим и позволит вам справиться с этой проблемой.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR NO-WAIT.
/* Check for availability */
IF AVAILABLE Customer THEN DO:
/* Check that no lock (from somebody else) is present */
IF NOT LOCKED Customer THEN DO:
/* Do your stuff here */
END.
ELSE DO:
MESSAGE "I'm afraid somebody else has locked this record!" VIEW-AS ALERT-BOX ERROR.
END.
END.