Document #760 ========================================================================== Enter R:BASE Data Through a WordPerfect Form ========================================================================== PRODUCT: R:BASE VERSION: 3.1 or Higher ========================================================================== CATALOG: Programming AREA : Programming ========================================================================== Patti Dauphin & Nelson Harrison, Systems Officers, Ministry of Community and Social Services, Southwestern Regional Centre, R.R. #1, Blenheim, Ontario Canada N0P1A0 You can reach them at (519) 676-5431 extension 2507/2513. The Southwestern Regional Centre is a part of the Ministry of Community and Social Services of the Ontario government. It is a facility dealing with approximately 600 physically disabled clients. We use R:BASE 4.5 to store data about routine/preventative maintenance of our physical plant operations. Currently, there are paper forms which are used for data input. To reduce data entry steps, we explored the possibility of using WordPerfect as a data entry tool. Using WordPerfect for data entry eliminates the need to hand-write a requisition form and the data entry assigned to one clerk is reduced significantly. It also reduced software costs as we did not need to buy additional units of R:BASE. A user enters all the information needed for a routine maintenance request into a table in WordPerfect. This information is then converted into an ASCII file and stored in a special directory on the network. A menu option in our R:BASE application transfers the ASCII file information into the database. Some programming is needed on both sides. There are two WordPerfect macros used and two R:BASE command files. The WordPerfect side Create a table in WordPerfect to allow data entry of all necessary information. In this table, put a lock on the fields which have field name identifiers. For data fields, place underscores to indicate the maximum length of a field. The underscores will be stripped off in R:BASE. At the top of the WordPerfect document, type in a computer identifier so that it is known exactly from what computer the data originated. This identifier must not be longer than three characters. This will differentiate file names created at the same time. **** screen shot of the WordPerfect form/table The first WordPerfect macro, named repair.wpm, is designed to: SYMBOL 183 \f "Symbol" \s 10 \h retrieve the document SYMBOL 183 \f "Symbol" \s 10 \h give the document a filename SYMBOL 183 \f "Symbol" \s 10 \h call the second macro SYMBOL 183 \f "Symbol" \s 10 \h save the document as ASCII. Ensure there is a Pause Key in the macro that when pressed, will nest into the next macro. Since the information collected from the WordPerfect table is being saved on a network drive, file names had to be unique. Include the following steps in the macro to generate unique file names. If you save the generated ASCII file to diskette you won't need to do these steps. 1. Assign Document 2 a file name by inserting the time-stamp immediately following the computer identifier in document 1, e.g. 6113:15, where 61 is the computer number and 13:15 is the time. 2. The ":" within the file name cannot be saved as part of a filename. In the macro, backspace to the ":" and replace it with another character, e.g. "_". 3. Block the filename and assign the block as a variable. 4. Save the file (document 2) as DOS text with the variable filename and add an extension. We use QQQ as the extension. Here's what our first macro, repair.wpm, looks like: File C:\WP51\REPAIR.WPM Description repair requisition {DISPLAY OFF}{Typeover} {Setup}42%2/%1/5{Enter}{Exit} {Retrieve}repair {Down}{Down}{Down}{Down}{Down}{Down}{Down} {Date/Outline}1 {Setup}423ú1,ú4{Enter}{Exit} {Tab}{PAUSE KEY}{Enter}~ {Tab}{PAUSE KEY}{Enter}~ {Tab}{PAUSE KEY}{Enter}~ {Tab}{PAUSE KEY}{Enter}~ {Tab}{PAUSE KEY}{Enter}~ {Tab}{PAUSE KEY}{Enter}~ {Tab}{PAUSE KEY}{Exit}~ {Home}{Home}{Up} {End}{Date/Outline}37:9{Enter}1 {Tab}{PAUSE KEY}{Exit}~ {Home}{Home}{Up} {End}{Date/Outline}37:9{Enter}1 {End}{Left}{Left}{Left}_{End} {Block}{Word Left} {Macro Commands}31{Enter} {NEST}copydata~ {Typeover}{Switch} {Text In/Out}11C:\WP51\{VAR 1}.QQQ{Enter} {Exit}ny {NEST}printdoc~ {;}{Print}2~ {Exit}nn {Shell}2senddata.bat{Enter}~ {Exit}nn The second macro, copydata.wpm, is designed to copy the data from the original document, document 1, into document 2. It is called from the first macro. When copying the data to document 2, ensure the proper delimiters and commas are included. In order to transfer ASCII data into R:BASE, all the data must fit on one line in Document 2. No wrap around can occur. Within the macro, format document 2 so that a smaller pitch can be used. If the data still will not fit, use a different paper size i.e. 14 x 8.5". This allows more data to fit on one line. Remember to use a pitch common to all printers. This is what our second macro, copydata.wpm, looks like: File C:\WP51\COPYDATA.WPM Description copies to doc2 {DISPLAY OFF} {Switch}{Format}170{Enter}0{Enter}{Cancel} 27nREPAIR{Enter}1{Exit}{Font}4Nprestige 20cpi{Enter}1 "{Switch}{Home}{Right}{Block}{Word Left}{Move}12{Switch}{Enter}{End}", {Switch} {Home}{Home}{Up} {Down}{Down}{Down}{Down}{Down}{Down}{Block}{End}{Move}12{Switch} {Enter}{End},{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End},"{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End}","{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End}",{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End},{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End},"{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End}","{Switch}{Tab}{Block}{Home}{Home}{Down}{Move}12{Switch}{Enter} 27nREPAIR{Enter}1{Exit}{Font}4Nprestige 20cpi{Enter}1 "{Switch}{Home}{Right}{Block}{Word Left}{Move}12{Switch}{Enter}{End}", {Switch} {Home}{Home}{Up} {Down}{Down}{Down}{Down}{Down}{Down}{Block}{End}{Move}12{Switch} {Enter}{End},{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End},"{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End}","{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End}",{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End},{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End},"{Switch}{Tab}{Block}{End}{Move}12{Switch}{Enter} {End}","{Switch}{Tab}{Block}{Home}{Home}{Down}{Move}12{Switch}{Enter} {Home}{Home}{Down}"{Left}{Left}{Del}{Switch}{Typeover} {Home}{Home} {Up} Finally, create a batch file to send the saved DOS text to the network directory and then shell out to DOS from the macro repair.wpm to execute the batch file. The process of sending the ASCII file to the network can only be done once a minute because of the way that the file name of the document is assigned. However, for us this has not been a problem since by the time the data is entered and stored on the network it takes over a minute anyway. This is what our batch file, senddata.bat, looks like: @echo off use P: \\fsrc1b\pccommon copy c:\wp51\*.qqq p:\requests use p: /d erase c:\wp51\*.qqq The R:BASE side Create a table to store the list of file names to load. We named the table Treeload and it contains these columns: FILENAME TEXT 8 file name of WordPerfect document. FILEEXT TEXT 3 file extension of WordPerfect document. FILESIZE INTEGER the size of the file FILEDATE TEXT 8 date the WordPerfect document was created. FILETIME TEXT 6 time the WordPerfect document was created. Create a table to store the loaded WordPerfect information. We use an intermediate table, Reqinfo; the data is manipulated and transferred from this table to the final data table, Routine. The final data table, Routine, has columns of data that are not entered through the WordPerfect form. The Reqinfo table in our case has the following columns: FILENAME TEXT 8 file name of WordPerfect document. REQDATE DATE requisition date. BC INTEGER budget code of department LOCATION TEXT 20 location within the department. CONTACT TEXT 20 contact name. EXTENSN# INTEGER phone extension number. PRIORCDE INTEGER priority code (how important is the requisition. ROOM# TEXT 4 room number. WORKREQ TEXT 160 work required. The R:BASE command file, ldnwreq.cmd, gets a list (directory) of all files in the REQUEST directory on the network and stores the list in the Trreload table. Moving through the Trreload table row by row with DECLARE CURSOR, each data file is loaded into the Reqinfo table. *(* Command File Name: LDNWREQ.CMD * * * * This command file loads the WordPerfect 5.1 trades requisition * * information from the Network (i.e. drive P:\REQUESTS directory).* *) SET V vdbname TEXT, vfileext TEXT, vfile TEXT SET ERROR MESSAGES OFF CLS WRITE "Loading In Repair Requisition Files .... please wait" + AT 11,13 BLINK OUTPUT allfiles.dat DIR P:\REQUESTS\*.QQQ OUTPUT SCREEN LOAD trreload FROM allfiles.dat CLS WRITE "Loading In Repair Requisition Files .... please wait" + AT 11,13 BLINK ERASE allfiles.dat DECLARE C1 CURSOR FOR SELECT filename, fileext FROM trreload OPEN C1 FETCH C1 INTO vdbname ind1, vfileext ind2 WHILE SQLCODE<>100 THEN SET VAR vfile = ("P:\REQUESTS\" + .vdbname + "." + .vfileext) LOAD reqinfo FROM .vfile AS ASCII FETCH C1 INTO vdbname ind1, vfileext ind2 ENDWH DROP CURSOR C1 DELETE ROWS FROM trreload ERASE P:\REQUESTS\*.QQQ CLEAR VAR vdbname vfileext vfile RETURN The file 2routine.cmd strips away underscores from the location and contact fields and transfers the information from the Reqinfo table to the Routine table. *(* Command File Name: 2ROUTINE.CMD * * * * transfers the information from the REQINFO table to * * the ROUTINE table and removes the underscores. * *) CLS WRITE "Transferring data .... please wait" AT 11,23 BLINK SET VAR vmonth# INT APPEND reqinfo TO routine SELECT month# INTO vmonth# FROM months WHERE currmth = "Y" UPDATE routine SET + month# = .vmonth#, + location = (SGET(location,(SLOC(location,"_")-1),1)), + contact = (SGET(contact,(SLOC(contact,"_")-1),1)), + hrlyrate = 0, jobtype = "W", status = "O", jobtime = 0, emp# = 99, + rtaskcde = "OTH" WHERE jobtype IS NULL DELETE ROWS FROM reqinfo CLEAR VAR vmonth# RETURN Note that additional columns in the Routine table are filled with default values in the UPDATE command; not all the data is entered in the WordPerfect form. In versions of R:BASE prior to 4.5 you would need to write a DECLARE CURSOR routine to remove the underscores; you could not nest the SLOC function inside the SGET function. Nesting the TEXT expressions lets you reduce many lines of code into one. WordPerfect is a trademark of and available from WordPerfect Corp., 1555 N. Technology Way, MS K1369, Orem, UT 84057-2399, 801-451-5151