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 i
- LOCAL cOldKeyVal, cNewKeyVal, bFldGsb, lSaveCurs
- LOCAL cLname := Students -> Lname, ;
- cFname := Students -> Fname, ;
- cTel := Students -> Tel
-
- LOCAL cSaveScr := SaveScreen(10, 10, 20, 70)
-
- @ 10, 10 CLEAR TO 20, 70
- @ 11, 11 TO 19, 69
- @ 13, 13 SAY " Last name" GET cLname
- @ 14, 13 SAY "First name" GET cFname
- @ 15, 13 SAY " Telephone" GET cTel
- lSaveCurs := Set(_SET_CURSOR, SC_NORMAL)
- READ
- Set(_SET_CURSOR, lSaveCurs)
- RestScreen(10, 10, 20, 70, cSaveScr)
-
- 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
-
- REPLACE Students -> Lname WITH cLname, ;
- Students -> Fname WITH cFname, ;
- Students -> Tel WITH cTel
-
- REPLACE Students -> SemId WITH Sched -> SemId
- UNLOCK
- // cNewKeyVal := &(IndexKey())
- cNewKeyVal := Upper(SemId + Lname + Fname)
- IF cOldKeyVal != cNewKeyVal
- IF Lastrec() != RecNo()
- DbStabilize(oTbrStudents)
- ELSE
- FullStabilize(oTbrStudents)
- ENDIF
- ELSE
- oTbrStudents:refreshCurrent()
- ENDIF
- ELSE
- oTbrStudents:refreshCurrent()
- ENDIF
-
- RETURN NIL