Szukaj…


Wprowadzenie

Instrukcja FIND służy do pobierania pojedynczego rekordu z pojedynczej tabeli. Ma pewne ograniczenia w porównaniu do FOR lub QUERY , ale jest to proste i przydatne stwierdzenie zapewniające szybki dostęp do rekordów.

ZNAJDŹ podstawowe przykłady

Prosty przykład 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.

PIERWSZY - znajdź pierwszy rekord pasujący do zapytania

NO-LOCK - nie blokuj rekordu - co oznacza, że będziemy czytać i nie zmieniać rekordu.

GDZIE - to jest zapytanie

BRAK BŁĘDU - nie zawiedź, jeśli nie ma dostępnego zapisu.

(JEŚLI) DOSTĘPNY Klient - sprawdź, czy znaleźliśmy rekord, czy nie

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.

Dostępność i zakres

Najnowsze wyszukiwanie jest zawsze tym, na którym sprawdzanie dostępności będzie działać - niepowodzenie znalezienia spowoduje, że AVAILABLE zwrot będzie fałszywy:

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

Zapis znaleziony w „main” będzie dostępny we wszystkich procedurach.

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)

Ponadto zapis znaleziony w procedurze będzie nadal dostępny po zakończeniu tej procedury.

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.

ZNAJDŹ i zablokuj

Kiedykolwiek FIND płytę można nabyć kosmyk niego.

NO-LOCK: Używany do operacji tylko do odczytu. Jeśli wykonasz FIND <record> NO-LOCK , nie możesz w żaden sposób zmodyfikować zapisu.

FIND FIRST Customer NO-LOCK NO-ERROR.

EXCLUSIVE-LOCK: Używany do aktualizacji i usuwania. Jeśli to zrobisz, będziesz „właścicielem” rekordu i nikt inny nie będzie mógł go modyfikować ani usuwać, dopóki nie skończysz. Mogą je odczytać (bez blokady), dopóki go nie usuniesz.

FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.

BLOKADA UDOSTĘPNIANIA: Unikaj za wszelką cenę. Spowoduje to szalony ból głowy.

FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.

AKTUALIZACJA zamka z NO-LOCK na EXCLUSIVE-LOCK

Możesz łatwo przejść z NO-LOCK do EXCLUSIVE-LOCK jeśli pojawiła się potrzeba modyfikacji rekordu:

FIND FIRST Customer NO-LOCK NO-ERROR. 
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.

Możesz także przejść z EXCLUSIVE-LOCK do NO-LOCK.

ZABLOKOWANE REKORDY

Ilekroć inni użytkownicy mogą uzyskać blokadę rekordu, lepiej weź pod uwagę tę możliwość. Wystąpią kolizje!

Lepiej obsłużyć to programowo za pomocą instrukcji NO-WAIT . To mówi AVM, aby po prostu zdał FIND, jeśli rekord jest zablokowany przez kogoś innego, i pozwoli ci poradzić sobie z tym problemem.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow