home *** CD-ROM | disk | FTP | other *** search
- // Tb20.prg
- //
- // 1 - M data entry. Uses TBfwaBrowse to create second tbrowse object,
- // uses automatic and persistent append mode. Good example of
- // append mode with empty scopes.
-
- // Compile with /a /m /n /w
- // Link with Tbutils, Dict
-
- #include "Inkey.ch"
- #include "Tbutils.ch"
- #include "Setcurs.ch"
-
- MEMVAR GetList
-
- #define MOVE_UP_KEY(nKey) chr(nKey) $ (chr(K_UP) + chr(K_PGUP) + chr(K_CTRL_PGUP))
-
- FUNCTION Sems
-
- LOCAL oTbrSched
- LOCAL oTbc
- LOCAL nKey
- LOCAL lExitRequested
-
- FIELD City IN Sched
- FIELD ClassName IN Classes
- FIELD Fname IN Students
- FIELD ClassId, SemId, Lname
-
- USE classes NEW
- IF !File("Classes.ntx")
- INDEX ON Classid To Classes
- ELSE
- SET INDEX TO classes
- ENDIF
-
- USE Sched NEW
- IF !File("Sched.ntx")
- INDEX ON Semid TO Sched
- ELSE
- SET INDEX TO Sched
- ENDIF
-
- USE Students NEW
- IF !File("Students.ntx")
- INDEX ON Upper(SemId + Lname + Fname) TO Students
- ELSE
- SET INDEX TO Students
- ENDIF
-
- SELECT Sched
- CLEAR SCREEN
- SET SCOREBOARD OFF
- BoxMsg(0, 0, 10, MaxCol(), "Schedule")
- oTbrSched := TBrowseDB(1, 1, 9, MaxCol() - 1)
-
- // oTbc := TBColumnNew("Class ID", {|| ClassId })
- // oTbrSched:addColumn(oTbc)
-
- // Show class name rather than just id
- oTbc := TBColumnNew("Class Name", ;
- {|| Classes -> (DbSeek(Sched -> ClassId)), ;
- Classes -> ClassName })
- oTbrSched:addColumn(oTbc)
-
- oTbc := TBColumnNew("City", {|| City })
- oTbrSched:addColumn(oTbc)
-
- oTbc := TBColumnNew("Seminar ID", {|| SemId })
- oTbrSched:addColumn(oTbc)
-
- oTbrSched:colSep := DEF_CSEP
- oTbrSched:headSep := DEF_HSEP
-
- lExitRequested := .F.
- DO WHILE !lExitRequested
- FullStabilize(oTbrSched)
- nKey := InKey(0)
- IF !StdMeth(nKey, oTbrSched)
- DO CASE
- CASE nKey == K_ESC
- lExitRequested := .T.
-
- CASE nKey == K_ENTER
- AddStudents(Sched -> SemId)
- ENDCASE
- ENDIF
- ENDDO
-
- RETURN NIL
-
-
- FUNCTION AddStudents(cSemId)
-
- LOCAL oTbrStudents
- LOCAL cSaveScr
- LOCAL nSaveSel
- LOCAL bFirst := {|| Students -> (DbSeek(cSemId)) }
- LOCAL bLast := {|| Students -> (DbSeek(INCLAST(cSemId), .T.)), ;
- Students -> (DbSkip(-1)) }
- LOCAL bFor := {|| .T. }
- LOCAL bWhile := {|| Students -> SemId == cSemId }
- LOCAL nSaveSelect := Select()
- LOCAL lExitRequested := .F.
- LOCAL nKey
- LOCAL oTbc
- LOCAL cClassname
-
- SELECT Students
-
- oTbrStudents := TBfwaBrowse(bWhile, bFor, bFirst, bLast)
-
- // Automatic apppend mode
- APPEND_MODE(oTbrStudents, .T.)
-
- oTbrStudents:nTop := 12
- oTbrStudents:nLeft := 1
- oTbrStudents:nBottom := MaxRow() - 1
- oTbrStudents:nRight := MaxCol() - 1
- oTbrStudents:colSep := DEF_CSEP
- oTbrStudents:headSep := DEF_HSEP
-
- // Make get / set blocks so we can edit them
- oTbc := TBColumnNew("Last Name", ;
- {|cLname| iif(cLname == NIL, ;
- Students -> Lname, ;
- Students -> Lname := cLname) })
- oTbrStudents:addColumn(oTbc)
-
- oTbc := TBColumnNew("First Name", ;
- {|cFname| iif(cFname == NIL, ;
- Students -> Fname, ;
- Students -> Fname := cFname) })
- oTbrStudents:addColumn(oTbc)
-
- oTbc := TBColumnNew("Telephone", ;
- {|cTel| iif(cTel == NIL, ;
- Students -> Tel, ;
- Students -> Tel := cTel) })
- oTbrStudents:addColumn(oTbc)
-
- cSaveScr := SaveScreen(11, 0, MaxRow(), MaxCol())
- Classes -> (DbSeek(Sched -> ClassId))
- BoxMsg(11, 0, MaxRow(), MaxCol(), ;
- " Students for " + Trim(Sched -> City) + " " + ;
- Trim(Classes -> Classname) + " ")
-
- DO WHILE !lExitRequested
- FullStabilize(oTbrStudents)
- nKey := InKey(0)
- IF !Stdmeth(nKey, oTbrStudents)
- DO CASE
- CASE nKey == K_ESC
- lExitRequested := .T.
-
- CASE nKey == K_INS
- oTbrStudents:goBottom()
-
- CASE nKey == K_ENTER
- StudEdit(oTbrStudents, cSemId)
-
- CASE nKey >= 32 .AND. nKey <= 255
- IF oTbrStudents:stable
- KEYBOARD chr(K_ENTER) + chr(nKey)
- ENDIF
- ENDCASE
- ENDIF
- ENDDO
-
- RestScreen(11, 0, MaxRow(), MaxCol(), cSaveScr)
- SELECT (nSaveSelect)
-
- RETURN NIL
-
-
- FUNCTION BoxMsg(nT, nL, nB, nR, cMessage)
-
- LOCAL nSpare
-
- nSpare := (nR - nL + 1) - Len(cMessage)
-
- @ nT, nL TO nB, nR
- @ nT, nL + Int(nSpare / 2) SAY cMessage
-
- RETURN NIL
-
-
- FUNCTION StudEdit(oTbrStudents, cSemId)
-
- FIELD SemId, Lname, Fname IN Students
-
- LOCAL aFvals := Array(oTbrStudents:rightVisible)
- LOCAL aCols := TbcColPos(oTbrStudents)
- LOCAL i
- LOCAL cOldKeyVal, cNewKeyVal, bFldGsb, lSaveCurs
-
- FOR i := oTbrStudents:leftVisible TO oTbrStudents:rightVisible
- aFvals[i] := Eval(oTbrStudents:getColumn(i):Block)
- @ Row(), aCols[i] GET aFvals[i]
- NEXT
-
- // cOldKeyVal := &(Indexkey())
- cOldKeyVal := Upper(SemId + Lname + Fname)
- lSaveCurs := Set(_SET_CURSOR, SC_NORMAL)
- READ
- Set(_SET_CURSOR, lSaveCurs)
- IF Updated() .AND. LastKey() != K_ESC
- IF Eof()
- APPEND BLANK
- DO WHILE NetErr()
- APPEND BLANK
- ENDDO
- // Persistent append mode ...
- // KEYBOARD Chr(K_INS) + Chr(K_ENTER)
- ELSE
- DO WHILE !Rlock()
- ENDDO
- ENDIF
-
- // Now update all fields
- FOR i := oTbrStudents:leftVisible TO oTbrStudents:rightVisible
- // tbColumn's block instance var is a get / set block
- bFldGsb := oTbrStudents:getColumn(i):block
- Eval(bFldGsb, aFvals[i])
- NEXT
- REPLACE Students -> SemId WITH Sched -> SemId
- UNLOCK
- // cNewKeyVal := &(IndexKey())
- cNewKeyVal := Upper(SemId + Lname + Fname)
- IF cOldKeyVal != cNewKeyVal
- DbStabilize(oTbrStudents)
- ELSE
- oTbrStudents:refreshCurrent()
- ENDIF
- ELSE
- oTbrStudents:refreshCurrent()
- ENDIF
-
- RETURN NIL