On Fri, 29 Oct 2004 14:07:56 -0700, you wrote:

>From the documentation:
>
>READU dyn.array.var FROM [file.var,] record.ID.expr [LOCKED statements]
>[ON ERROR statements] {THEN statements [END] | ELSE statements [END]}
>
>Am I reading this right?  When I READU I can either have a THEN or an
>ELSE, but not both?  (That it does not compile with both tends to
>confirm that...) 
>
>At the moment I think I need both. :/ And I need to do the same thing in
>either case, so I ended up with:
>
>READU R.XBWU FROM F.XBWU, X.ONE.ID LOCKED
>   CRT 'XBWU RECORD IS LOCKED, IGNORE IT'
>END THEN
>   X.LOCKED = '1'
>END ;*END READU
>
>IF X.LOCKED = '1' THEN
>   CRT 'OBTAINED LOCK ON XBWU RECORD'
>   R.XBWU<XBWU.ASURITE> = X.ASURITE
>   WRITE R.XBWU TO F.XBWU, X.ONE.ID ON ERROR
>      IF STATUS() = 10 THEN 
>         ;* Either the ASURITE or USER.ID is duplicated
>         X.ERROR = X.DUPLICATE.ON.WRITE
>      END ;* IF STATUS
>   END ;* END WRITE
>END ;* IF X.LOCKED
>
>Suggestions for improvement are welcome!

I don't know if this is an improvement, (actually I know that the
GOTO's in it will offend some people), but here's a snippet of code I
lifted directly from a routine that's heavily used in a Universe
multi-user environment:


ATTEMPTS = 0
READ.NAFILE.DB:
READU D.NAFILE.DB FROM F.NAFILE.DB, K.NAFILE.DB LOCKED
         ATTEMPTS += 1
         IF ATTEMPTS LT 50 THEN          ; *  About 20 Mins, (21:15)
            CRT CLR22DOWN: "NAFILE.DB ": K.NAFILE.DB:
            CRT " locked by ": STATUS(): ", (pausing before retry [":
ATTEMPTS: "]).":
            CALL !SLEEP$(ATTEMPTS*1000)
            CRT CLR22DOWN:
            GOTO READ.NAFILE.DB:
         END ELSE
            ERROR.MSG = "Record locked and consequently skipped"
            CALL @WSEQ("*** ERROR *** ": K.NAFILE.DB, F.RPT.1)
            CALL @WSEQ("              ": ERROR.MSG, F.RPT.1)
            CALL @WSEQ("              ": RAW.LINE, F.RPT.1)
            CALL @WSEQ(" ", F.RPT.1)
            CNT.LOCKED += 1
            GOTO NEXT.INPUT.LINE:
         END
      END THEN
         NULL
      END ELSE
         ERROR.MSG = "Record apparently deleted from database."
         CALL @WSEQ("*** ERROR *** ": K.NAFILE.DB, F.RPT.1)
         CALL @WSEQ("              ": ERROR.MSG, F.RPT.1)
         CALL @WSEQ("              ": RAW.LINE, F.RPT.1)
         CALL @WSEQ(" ", F.RPT.1)
         RELEASE F.NAFILE.DB, K.NAFILE.DB
         CNT.ABNORMAL += 1
         GOTO NEXT.INPUT.LINE:
      END


-- 
Allen Egerton
[EMAIL PROTECTED]
-------
u2-users mailing list
[EMAIL PROTECTED]
To unsubscribe please visit http://listserver.u2ug.org/

Reply via email to