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
रिटर्न को झूठा बना देगी:
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
"मुख्य" में पाया गया एक रिकॉर्ड किसी भी प्रक्रिया में उपलब्ध होगा।
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 और लॉकिंग
जब भी आप FIND
एक रिकार्ड आप इसके बारे में एक ताला प्राप्त कर सकते हैं।
NO-LOCK: केवल संचालन के लिए उपयोग किया जाता है। यदि आप एक FIND <record> NO-LOCK
करते हैं तो आप किसी भी तरह से रिकॉर्ड को संशोधित नहीं कर सकते।
FIND FIRST Customer NO-LOCK NO-ERROR.
EXCLUSIVE-LOCK: अपडेट और डिलीट के लिए उपयोग किया जाता है। यदि आप ऐसा करते हैं तो आप रिकॉर्ड को "खुद" बना लेंगे और जब तक आप इसे पूरा नहीं करेंगे तब तक कोई भी इसे संशोधित या हटा नहीं सकता है। जब तक आप इसे हटा नहीं देते वे इसे (बिना लॉक के) पढ़ सकते हैं।
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.
शेयर-लॉक: हर कीमत पर बचें। इससे सिर में दर्द होगा।
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.