progress-4gl
ZNAJDŹ oświadczenie
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.