Поиск…


Вступление

Оператор 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.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow