home *** CD-ROM | disk | FTP | other *** search
- // Gets01.prg
- //
- // Lookup function in valid clause using TBrowse objects to browse
- // a range of records
- //
- // N.B. - The TBrowse routines used in here are included in the
- // TBrowse paper's library and documented therein
-
- MEMVAR GetList
-
- #xtranslate GET_NUMBER(<cName>) ;
- => ;
- Ascan(GetList, {|o| Trim(Upper(o:name)) == <cName>})
-
- #xtranslate GET_NUMBER(<cName>, <gl>) ;
- => ;
- Ascan(<gl>, {|o| Trim(Upper(o:name)) == <cName>})
-
- #include "Inkey.ch"
-
- #define INC_LAST(c) Substr(c, 1, Len(c) - 1) + ;
- Chr(Asc(Substr(c, 1, Len(c))) + 1)
-
- FUNCTION Gets01
-
- FIELD Lname, Fname, Addr1, Addr2, Addr3, Addr4, AcBal IN Tbdbf1
-
- LOCAL cLname, cFname
- LOCAL cAddr1, cAddr2, cAddr3, cAddr4
- LOCAL nAcBal
- LOCAL nRecno
-
- USE TbDbf1
- IF !File("Tbdbf1.ntx")
- INDEX ON Upper(Lname + Fname) TO Tbdbf1
- ELSE
- SET INDEX TO Tbdbf1
- ENDIF
- CLEAR SCREEN
-
- // Get blank values of these fields
- nRecno := Recno()
-
- GOTO 0
- cLname := Lname
- cFname := Fname
- cAddr1 := Addr1
- cAddr2 := Addr2
- cAddr3 := Addr3
- cAddr4 := Addr4
- nAcBal := AcBal
- GOTO nRecno
-
- @ 10, 10 SAY " Enter Lname" GET cLname VALID {|o| Lookup(o, GetList)}
- @ 11, 10 SAY " Enter Fname" GET cFname
- @ 12, 10 SAY "Enter Address" GET cAddr1
- @ 13, 10 SAY " " GET cAddr2
- @ 14, 10 SAY " " GET cAddr3
- @ 15, 10 SAY " " GET cAddr4
- @ 16, 10 SAY " " GET nAcBal
-
- READ
-
- RETURN NIL
-
-
- #define WIN_TOP 12
- #define WIN_LEFT 30
- #define WIN_BOTTOM 20
- #define WIN_RIGHT 79
-
- FUNCTION LookUp(o, GetList)
-
- FIELD Lname, Fname, Addr1, Addr2, Addr3, Addr4, AcBal IN Tbdbf1
-
- LOCAL cSearcher := Upper(Trim(o:varGet()))
- LOCAL bFirst := {|| DbSeek(cSearcher) }
- LOCAL bLast := {|| iif(Empty(cSearcher), ;
- DbGoBottom(), ;
- (DbSeek(INC_LAST(cSearcher), .T.), ;
- DbSkip(-1))) }
-
- LOCAL bWhile := {|| Upper(Lname) = cSearcher }
- LOCAL bFor := {|| .T. }
- LOCAL oTbr := TBForWhile(bFirst, bLast, bFor, bWhile)
- LOCAL oTbc
- LOCAL cSaveScr := SaveScreen(WIN_TOP, WIN_LEFT, ;
- WIN_BOTTOM, WIN_RIGHT)
- LOCAL aKeyHandler := { ;
- { K_ENTER, {|| .T. } } ;
- }
- LOCAL nGet
-
- oTbc := TBColumnNew("Last Name", {|| Lname })
- oTbc:width := 15
- oTbr:addColumn(oTbc)
-
- oTbc := TBColumnNew("First Name", {|| Fname })
- oTbc:width := 10
- oTbr:addColumn(oTbc)
-
- oTbc := TBColumnNew("Address", {|| Addr1 })
- oTbc:width := 15
- oTbr:addColumn(oTbc)
-
- oTbc := TBColumnNew("Balance", {|| AcBal })
- oTbc:width := 15
- oTbr:addColumn(oTbc)
-
- oTbr:goTop()
- IF !Eval(bWhile)
- Alert("No Matching Records", {"OK"})
- ELSE
- @ WIN_TOP, WIN_LEFT CLEAR TO WIN_BOTTOM, WIN_RIGHT
- @ WIN_TOP, WIN_LEFT TO WIN_BOTTOM, WIN_RIGHT
- oTbr:nTop := WIN_TOP + 1
- oTbr:nLeft := WIN_LEFT + 1
- oTbr:nBottom := WIN_BOTTOM - 1
- oTbr:nRight := WIN_RIGHT - 1
-
- // Exit on Enter key
- MyBrowse2(oTbr,, aKeyHandler)
- IF LastKey() != K_ESC
- o:varPut(Lname)
- nGet := GET_NUMBER("CFNAME")
- GetList[nGet]:VarPut(Fname)
-
- nGet := GET_NUMBER("CADDR1")
- GetList[nGet]:VarPut(Addr1)
-
- nGet := GET_NUMBER("CADDR2")
- GetList[nGet]:VarPut(Addr2)
-
- nGet := GET_NUMBER("CADDR3")
- GetList[nGet]:VarPut(Addr3)
-
- nGet := GET_NUMBER("CADDR4")
- GetList[nGet]:VarPut(Addr4)
-
- nGet := GET_NUMBER("NACBAL")
- GetList[nGet]:VarPut(AcBal)
- IF Acbal < 0
- GetList[nGet]:colorSpec := "R/B,B/R"
- ELSE
- GetList[nGet]:colorSpec := "N/W,N/W"
- ENDIF
-
- ENDIF
- ENDIF
-
- RestScreen(WIN_TOP, WIN_LEFT, WIN_BOTTOM, WIN_RIGHT, cSaveScr)
-
- Aeval(GetList, {|o| o:display() })
-
- RETURN .T.
-
-
- // N.B. - These routines are included in the TBrowse paper's
- // library and documented therein
-
- // Default column separator
- #define DEF_CSEP " " + chr(179) + " "
-
- // Default heading separator
- #define DEF_HSEP chr(205) + chr(209) + chr(205)
-
- // Default footing separator
- #define DEF_FSEP chr(205) + chr(207) + chr(205)
-
- FUNCTION TBForWhile(bFirst, bLast, bFor, bWhile)
-
- LOCAL oTbr := TBrowseNew()
-
- oTbr:goTopBlock := {|| TBFwFirst(bFirst, bWhile, bFor) }
- oTbr:goBottomBlock := {|| TBFwLast(bLast, bWhile, bFor) }
- oTbr:skipBlock := {|n| TBFwSkip(n, bWhile, bFor) }
-
- oTbr:headSep := DEF_HSEP
- oTbr:footSep := DEF_FSEP
- oTbr:colSep := DEF_CSEP
-
- RETURN oTbr
-
- FUNCTION TBFwFirst(bGoFirst, bWhile, bFor)
-
- eval(bGoFirst)
- DO WHILE !eof() .AND. eval(bWhile) .AND. !eval(bFor)
- SKIP
- ENDDO
-
- IF !eval(bWhile)
- // no records match filter - could also be at eof already here
- GOTO 0
- ENDIF
-
- RETURN NIL
-
-
- FUNCTION TBFwLast(bGoLast, bWhile, bFor)
-
- eval(bGoLast)
- DO WHILE !bof() .AND. eval(bWhile) .AND. !eval(bFor)
- SKIP -1
- ENDDO
-
- IF bof() .OR. !eval(bWhile)
- // No records match scope
- GOTO 0
- ENDIF
-
- RETURN NIL
-
-
- FUNCTION TBFwSkip(nToSkip, bWhile, bFor)
-
- LOCAL nSkipped := 0, ;
- nLastValidRecNum := Recno()
-
- IF nToSkip = 0
- SKIP 0
- RETURN 0
- ENDIF
-
- IF nToSkip > 0
- DO WHILE nSkipped < nToSkip .AND. !eof() .AND. eval(bWhile)
- SKIP
- // Note the last clause here makes a big speed difference
- DO WHILE !eval(bFor) .AND. !eof() .AND. eval(bWhile)
- SKIP
- ENDDO
- IF Eval(bWhile) .AND. !eof()
- // Found a new record matching the scope
- nSkipped++
- nLastValidRecNum := Recno()
- ENDIF
- ENDDO
-
- IF eof() .OR. !eval(bWhile)
- GOTO nLastValidRecNum
- ENDIF
- ELSE
- DO WHILE nSkipped > nToSkip .AND. !bof() .AND. eval(bWhile)
- SKIP -1
- // Note the last clause here makes a big speed difference
- DO WHILE !eval(bFor) .AND. !bof() .AND. eval(bWhile)
- SKIP -1
- ENDDO
- IF Eval(bWhile) .AND. !bof()
- nSkipped--
- nLastValidRecNum := Recno()
- ENDIF
- ENDDO
- IF !eval(bWhile) .OR. bof()
- GOTO nLastValidRecNum
- ENDIF
- ENDIF
-
- RETURN nSkipped
-
- FUNCTION MyBrowse2(oTbr, aBeforepairs, aAfterPairs)
-
- LOCAL nKey
- LOCAL lExitRequested := .F.
- LOCAL nElem
-
- // set defaults for before and after keys
- aBeforePairs := iif(aBeforePairs == NIL, {}, aBeforePairs)
- aAfterpairs := iif(aAfterPairs == NIL, {}, aAfterPairs)
-
- DO WHILE !lExitRequested
- FullStabilize(oTbr)
- nKey := inkey(0)
- nElem := ascan(aBeforePairs, ;
- {|e| e[1] == nKey })
- IF nElem > 0
- lExitRequested := eval(aBeforePairs[nElem, 2], oTbr)
- ELSEIF !stdMeth(nKey, oTbr) .AND. oTbr:stable
- nElem := ascan(aAfterPairs, ;
- {|e| e[1] == nKey })
- lExitRequested := iif(nElem > 0, ;
- eval(aAfterPairs[nElem, 2], oTbr), ;
- nKey == K_ESC)
- ENDIF
- ENDDO
-
- RETURN NIL
-
- FUNCTION StdMeth(nKey, oTbr)
-
- LOCAL lKeyHandled := .T.
-
- DO CASE
- CASE nKey == K_DOWN; oTbr:down()
- CASE nKey == K_UP; oTbr:up()
- CASE nKey == K_PGDN; oTbr:pageDown()
- CASE nKey == K_PGUP; oTbr:pageUp()
- CASE nKey == K_CTRL_PGUP; oTbr:goTop()
- CASE nKey == K_CTRL_PGDN; oTbr:goBottom()
- CASE nKey == K_RIGHT; oTbr:right()
- CASE nKey == K_LEFT; oTbr:left()
- CASE nKey == K_HOME; oTbr:home()
- CASE nKey == K_END; oTbr:end()
- CASE nKey == K_CTRL_LEFT; oTbr:panLeft()
- CASE nKey == K_CTRL_RIGHT; oTbr:panRight()
- CASE nKey == K_CTRL_HOME; oTbr:panHome()
- CASE nKey == K_CTRL_END; oTbr:panEnd()
- OTHERWISE; lKeyHandled := .F.
- ENDCASE
-
- RETURN lKeyHandled
-
-
- FUNCTION FullStabilize(oTbr)
-
- DO WHILE !oTbr:stabilize()
- ENDDO
-
- RETURN NIL