* xBase Data file export utility.
* dumpdbf.prg - Andrew Bedno - 1993.10.11
* Replace occurrences of ??? with appropriate specifics.
* ************************** MAIN **************************
* Initialize
CLEAR ALL
SET PROCEDURE TO dumpdbf
PUBLIC cfg_dbf, cfg_txt
PUBLIC firstfld, firstrec, err_msg, dflt_dbf
PUBLIC reccnt, recttl
SET TALK OFF
ON ESCAPE DO esc_trap
ON ERROR DO err_trap
SET SCOREBOARD OFF
SET STATUS OFF
SET EXCLUSIVE OFF
SET DELETED OFF
@ 0, 0 CLEAR
@ 0, 0 SAY 'DUMPDBF: Version 1.00 1993.10.11 AIB'
* Set a default dump database here.
STORE '???' TO cfg_dbf
STORE cfg_dbf + '.ASC' TO cfg_txt
* Process the file.
@ 1, 0 CLEAR
@ 1, 0 SAY 'Dumping .' + cfg_dbf + '.DBF'
@ 2, 0 SAY ' to .' + cfg_txt
@ 3, 0 SAY '(Press <ESCAPE> to interrupt.)'
@ 4, 0 SAY ''
DO cont_msg
@ 5, 0 SAY ''
DO dbf_open
DO txt_open
DO out_file
DO dbf_close
STORE 'closing dump file' TO err_msg
DO txt_close
DO end_prog
RETURN
* ************************** UTILITIES **************************
* End program.
PROCEDURE end_prog
DO cont_msg
QUIT
RETURN
* Handle errors.
PROCEDURE err_trap
DO txt_close
@ 14, 0 SAY 'Error ' + err_msg + '.'
@ 15, 0 SAY 'Program terminated!'
@ 16, 0 SAY ''
DO end_prog
RETURN
* Handle <ESC>
PROCEDURE esc_trap
STORE '- User interrupt' TO err_msg
DO err_trap
RETURN
* Wait for user keypress.
PROCEDURE cont_msg
@ 22, 0 CLEAR
@ 22, 0 SAY 'Press any key to continue . . .'
WAIT ''
@ 22, 0 CLEAR
RETURN
* Close all files.
PROCEDURE dbf_close
STORE 'closing database' TO err_msg
SET EXCLUSIVE OFF
CLOSE ALL
RETURN
* Open the database.
PROCEDURE dbf_open
PRIVATE d_o_name
STORE 'opening database' TO err_msg
STORE cfg_dbf TO d_o_name
USE &d_o_name ALIAS SOURCE
GOTO TOP
RELEASE d_o_name
STORE 'Y' TO firstrec
RETURN
* Close the text output file.
PROCEDURE txt_close
SET ALTERNATE OFF
CLOSE ALTERNATE
SET ALTERNATE TO
* SET CONSOLE ON
RETURN
* Open the text output file.
PROCEDURE txt_open
STORE 'opening dump file' TO err_msg
IF FILE(cfg_txt)
DELETE FILE &cfg_txt
ENDIF
SET ALTERNATE TO &cfg_txt
SET ALTERNATE ON
SET CONSOLE OFF
RETURN
* Output a delimiter if needed.
PROCEDURE out_dlm
IF firstfld = 'Y'
IF firstrec = 'N'
? ''
ENDIF
ELSE
?? '|'
ENDIF
STORE 'N' TO firstfld
STORE 'N' TO firstrec
RETURN
* Output a left justified string in a space padded field.
PROCEDURE out_str
PARAMETERS os_in, os_size
PRIVATE os_trim, os_out
DO out_dlm
STORE RTRIM(TRIM( os_in )) TO os_trim
IF LEN( os_trim ) > os_size
STORE SUBSTR( os_trim, 1, os_size ) TO os_trim
ENDIF
STORE os_trim + SPACE( os_size - LEN( os_trim ) ) TO os_out
?? os_out
RELEASE os_trim, os_out
RETURN
* Output a right justified number in a zero padded field.
PROCEDURE out_num
PARAMETERS on_in, on_size, on_dec
PRIVATE on_str, on_trim, on_out, on_sgn
DO out_dlm
IF on_dec > 0
STORE on_size + 1 TO on_size
ENDIF
STORE '+' TO on_sgn
IF on_in < 0
STORE '-' TO on_sgn
STORE 0 - on_in TO on_in
ENDIF
STORE STR( on_in, on_size, on_dec ) TO on_str
STORE RTRIM(TRIM( on_str )) TO on_trim
STORE on_sgn + REPLICATE( '0', on_size - LEN( on_trim ) ) + on_trim TO on_out
?? on_out
RELEASE on_str, on_trim, on_out, on_sgn
RETURN
* Output a date in YYYYMMDD format
PROCEDURE out_date
PARAMETERS od_in
PRIVATE od_out
DO out_dlm
STORE TRIM(RTRIM(STR(YEAR(od_in)))) + ;
TRIM(RTRIM(STR(MONTH(od_in)))) + ;
TRIM(RTRIM(STR(DAY(od_in)))) TO od_out
?? od_out
RELEASE od_out
RETURN
* Output a whole record.
PROCEDURE out_rec
* Put one line here for each field in the database.
* Use out_str, out_num or out_date, depending on the field type.
* Sample: output string ??? in a ??? wide field.
DO out_str WITH SOURCE->???, ???
* Sample: output number ??? in a ??? wide field with ??? decimal places.
DO out_num WITH SOURCE->???, ???, ???
* Sample: output date ??? in an eight character wide field.
DO out_date WITH SOURCE->???
RETURN
* Process the export.
PROCEDURE out_file
STORE 'processing export' TO err_msg
@ 9, 0 SAY 'Exporting . . .'
STORE 0 TO reccnt
STORE RECCOUNT() TO recttl
DO WHILE (.NOT. EOF())
STORE reccnt + 1 TO reccnt
@10, 0 SAY 'Record ' + STR(reccnt) + ' of ' + STR(recttl)
@11, 0 SAY ''
STORE 'Y' TO firstfld
DO out_rec
SKIP 1
ENDDO
@ 20, 0 CLEAR
@ 20, 0 SAY 'Done!'
RETURN