Files
CGW/CGWPRNT3.PRG
T
Jason Soltys 7905c43278 first commit
2026-07-14 00:41:31 -05:00

428 lines
11 KiB
Plaintext

#include "FiveWin.ch"
#include "report.ch"
#define MPAPDER_LETTER 1 // Letter 8 1/2 x 11 in
#define DMPAPER_LEGAL 5 // Legal 8 1/2 x 14 in
*************************************************************************
FUNCTION CGW_PRNT_FROM_FILE( WHCHORDER, OUTFILE, LPREVIEW, RPTNAME, ;
LINELIMIT, COL_LEN, PAPER, ORIENTATION, MYFONT )
LOCAL CFILE := M->_THISUSER_TEMP
LOCAL MHDC
LOCAL OPRINTER1, OPRINTER2, OPRINTER3
LOCAL CMODEL, CDOCUMENT, LUSER, LMODAL, LSELECTION
LOCAL MPRNTR
LOCAL OPRINTER, ODEVICE
LOCAL OREPORT
LOCAL RETVAL
LOCAL MDESC
LOCAL CKNAME, DATA2PRINT := ''
LOCAL FONTARR, OFONTWIDE, OFONT, OFONTBOLD, CTEXT
LOCAL FACT_W := 100, FACT_H := 100, SAVESEL := ALIAS()
DEFAULT LPREVIEW := .F.
// DEFAULT LINELIMIT := 54
DEFAULT LINELIMIT := 64
DEFAULT COL_LEN := 80
DEFAULT MYFONT := 'NORMAL'
DEFAULT ORIENTATION := 'PORTRAIT' // 3/4/2021
NET_USE('&WORKSTAT',.F.,5,'WORKSTAT')
SELECT( SAVESEL )
MDESC := WHCHORDER + ' '
IF WHCHORDER = 'REPORT'
MDESC := ALLTRIM( RPTNAME )
ELSEIF SELECT( 'ORD_MAST' ) > 0
MDESC += 'Order ' + ALLTRIM( ORD_MAST->ORDER_NUM )
ELSEIF SELECT( 'QUOTE_MAST' ) > 0
MDESC += 'Quote ' + ALLTRIM( QUOTE_MAST->ORDER_NUM )
ENDIF
DO CASE
CASE WHCHORDER = 'REPORT'
CKNAME := GETPRINTER('ReportPrinter')
FACT_W := WORKSTAT->REPT_FACW
FACT_H := WORKSTAT->REPT_FACH
PAPER := 'LETTER' // PER DARLENE 7-30-2020
ORIENTATION := 'LANDSCAPE' // PER DARLENE 7-30-2020
LINELIMIT := 36 // really no effect because the eject char is present.
// LINELIMIT := 40
// LINELIMIT := 42
CASE WHCHORDER = 'PROD'
CKNAME := GETPRINTER('ProdPrinter')
FACT_W := WORKSTAT->PROD_FACW
FACT_H := WORKSTAT->PROD_FACH
CASE WHCHORDER = 'GOLDEN'
CKNAME := GETPRINTER('GoldenPrinter')
FACT_W := WORKSTAT->GR_FACW
FACT_H := WORKSTAT->GR_FACH
CASE WHCHORDER = 'DEL'
CKNAME := GETPRINTER('DelPrinter')
FACT_W := WORKSTAT->DEL_FACW
FACT_H := WORKSTAT->DEL_FACH
CASE WHCHORDER = 'OD'
CKNAME := GETPRINTER('OrdDeskPrinter')
FACT_W := WORKSTAT->OD_FACW
FACT_H := WORKSTAT->OD_FACH
CASE WHCHORDER = 'PO'
CKNAME := GETPRINTER('InterCompPrinter')
FACT_W := WORKSTAT->IC_FACW
FACT_H := WORKSTAT->IC_FACH
CASE WHCHORDER = 'INV'
CKNAME := GETPRINTER('InvPrinter')
FACT_W := WORKSTAT->INV_FACW
FACT_H := WORKSTAT->INV_FACH
CASE WHCHORDER = 'PREBILL'
CKNAME := GETPRINTER('PreBillPrinter')
FACT_W := WORKSTAT->PRE_FACW
FACT_H := WORKSTAT->PRE_FACH
CASE WHCHORDER = 'BACKORD'
CKNAME := GETPRINTER('BackOrdPrinter')
FACT_W := WORKSTAT->BO_FACW
FACT_H := WORKSTAT->BO_FACH
CASE WHCHORDER = 'PREBILL'
CKNAME := GETPRINTER('PreBillPrinter')
FACT_W := WORKSTAT->PRE_FACW
FACT_H := WORKSTAT->PRE_FACH
CASE WHCHORDER = 'PRECOST'
CKNAME := GETPRINTER('PreCostPrinter')
FACT_W := WORKSTAT->PRE_FACW
FACT_H := WORKSTAT->PRE_FACH
CASE WHCHORDER = 'QUOTE'
CKNAME := GETPRINTER('QuotePrinter')
FACT_W := WORKSTAT->QTE_FACW
FACT_H := WORKSTAT->QTE_FACH
ENDCASE
IF FACT_W = 0
FACT_W := 100
ENDIF
IF FACT_H = 0
FACT_H := 100
ENDIF
// this is a redirected printer if it has a comma - leave it alone. 3-18-2021
// CKNAME := SUBS( CKNAME, 1, AT( ',', CKNAME )-1 )
IF FILE( CFILE )
DATA2PRINT := ALLTRIM( MEMOREAD( CFILE ) )
IF EMPTY( DATA2PRINT )
// MSGSTOP( 'No Information to Print', 'Document NOT printed' )
ELSE
ODEVICE := TPRINTER():NEW( MDESC, .F., NIL, CKNAME )
// DEFAULT IS LETTER
IF PAPER = 'LEGAL'
ODEVICE:SETPAGE( DMPAPER_LEGAL )
ELSE
// INCLUDING PAPER = 'LETTER'
ODEVICE:SETPAGE( MPAPDER_LETTER )
ENDIF
// DEFAULT IS PORTRAIT
IF ORIENTATION = 'LANDSCAPE'
ODEVICE:setlandscape()
ELSE
ODEVICE:setportrait()
ENDIF
FONTARR := CGW_SETFONT( @ODEVICE, WHCHORDER, @OREPORT, COL_LEN, NIL, FACT_W, FACT_H )
OFONT := FONTARR[1]
OFONTBOLD := FONTARR[2]
OFONTWIDE := FONTARR[3]
REPORT oReport ;
CAPTION MDESC ;
TO DEVICE ODEVICE ;
FONT oFont, OFONTBOLD, OFONTWIDE
COLUMN DATA " " SIZE COL_LEN // * Trick "Data" - we're fooling Mother
END REPORT
OREPORT:LSCREEN := LPREVIEW
oreport:cname := MDESC
oReport:nTitleUpLine := RPT_NOLINE
oReport:nTitleDnLine := RPT_NOLINE
// HALF INCH MARGINS
// oReport:Margin(.00, RPT_LEFT, RPT_INCHES)
// oReport:Margin(-.100, RPT_LEFT, RPT_INCHES)
CTEXT := MEMOREAD( ( ALLTRIM( OUTFILE ) ) )
IF WHCHORDER = 'REPORT'
oReport:Margin( 0.500, RPT_LEFT, RPT_INCHES )
oReport:Margin( 0.500, RPT_TOP, RPT_INCHES)
IF SUBS( CTEXT, 1, 2 ) = CR_LF()
CTEXT := SUBS( CTEXT, 2 )
ENDIF
ELSE
IF AT( CHR(27) + CHR(77), CTEXT ) > 0 // SET TO PICA - NOT NEEDED - THIS IS AN IMPACT PRINTER
oReport:Margin(-0.400, RPT_LEFT, RPT_INCHES)
ELSE
oReport:Margin(0.100, RPT_LEFT, RPT_INCHES)
ENDIF
// oReport:Margin(.56, RPT_TOP, RPT_INCHES)
oReport:Margin(.00, RPT_TOP, RPT_INCHES)
oReport:Margin(.00, RPT_BOTTOM, RPT_INCHES)
ENDIF
// IF AT( CHR(27) + CHR(77), CTEXT ) > 0 // SET TO PICA - NOT NEEDED - THIS IS AN IMPACT PRINTER
// oReport:Margin(-0.400, RPT_LEFT, RPT_INCHES)
// ELSE
// oReport:Margin(0.100, RPT_LEFT, RPT_INCHES)
// ENDIF
// // oReport:Margin(.56, RPT_TOP, RPT_INCHES)
// oReport:Margin(.00, RPT_TOP, RPT_INCHES)
// oReport:Margin(.00, RPT_BOTTOM, RPT_INCHES)
ACTIVATE REPORT oReport ;
ON INIT ( SayMemo(OREPORT, CTEXT, COL_LEN, LINELIMIT ), ;
OREPORT:LBREAK := .T. )
oFont:End()
OREPORT:END()
ODEVICE:setportrait()
ODEVICE:SETPAGE( MPAPDER_LETTER )
ENDIF
ENDIF
RETURN NIL
********************************************************************************************
STATIC Function SayMemo(OREPORT, cText, COL_LEN, MAXLEN )
LOCAL cLine
LOCAL nFor, nLines, nPageln
LOCAL POS1, POS2, WIDE_DATA, CLINE1, CLINE2, CLINE_WORK
IF LEN( OREPORT:ACOLS ) = 1 // 1ST TIME IN - SET COLUMN POSITIONS
AADD( OREPORT:ACOLS, 400 ) // 2
AADD( OREPORT:ACOLS, 750 ) // 3 dup delivery - 4th one
AADD( OREPORT:ACOLS, 1200 ) // 4
AADD( OREPORT:ACOLS, 1600 ) // 5
AADD( OREPORT:ACOLS, 2000 ) // 6
AADD( OREPORT:ACOLS, 2400 ) // 7
AADD( OREPORT:ACOLS, 2800 ) // 8
AADD( OREPORT:ACOLS, 3200 ) // 9
AADD( OREPORT:ACOLS, 3600 ) // 10
AADD( OREPORT:ACOLS, 4100 ) // 11
AADD( OREPORT:ACOLS, 4400 ) // 12
AADD( OREPORT:ACOLS, 4800 ) // 13
AADD( OREPORT:ACOLS, 5200 ) // 14
AADD( OREPORT:ACOLS, 5600 ) // 15
ENDIF
// cText := MEMOREAD( ( cTextfile ) )
nLines := MlCount( cText, COL_LEN ) // Original text has up to 76 chars. per line.
nPageln := 0
FOR nFor := 1 TO nLines
cLine := MemoLine( cText, COL_LEN, nFor )
IF AT( CHR(27) + CHR(77), CLINE ) > 0 // SET TO PICA - NOT NEEDED - THIS IS AN IMPACT PRINTER
CLINE := STRTRAN( CLINE, CHR(27) + CHR(77), '' )
ENDIF
// this overrides the actual line-limit - calculated in the report building.
IF AT( CHR(12), CLINE ) > 0 // EJECT
IF NFOR = NLINES ; // LAST LINE
.or. NFOR = NLINES-1 // LAST LINE
ELSE
CLINE := SUBS( CLINE, 1, AT( CHR(12), CLINE )-1 )
OUTPUT_LINE( OREPORT, CLINE )
nPageln := nPageln + 1
OREPORT:EndPage()
NPAGELN := 0
ENDIF
ELSE
OUTPUT_LINE( OREPORT, CLINE )
ENDIF
NEXT
RETURN NIL
*********************************************************
FUNCTION OUTPUT_LINE( OREPORT, CLINE )
LOCAL POS1, CLINE1, CLINE2, POS2, WIDE_DATA, CLINE_WORK
oReport:StartLine()
POS1 := AT( CHR(27) + 'W1', CLINE ) // WE FOUND AN ESCAPE SEQUENCE FOR WIDE PRINT
IF POS1 > 0
CLINE_WORK := CLINE
DO WHILE .T.
CLINE1 := SUBS( CLINE_WORK, 1, POS1-1 ) // EVERYTHING LEADING UP TO THE WIDE PRINT
CLINE2 := SUBS( CLINE_WORK, POS1+3 )
POS2 := AT( CHR(27) + 'W0', CLINE2 )
WIDE_DATA := ALLTRIM( SUBS( CLINE2, 1, POS2 - 1 ) )
// CLINE2 := ALLTRIM( SUBS( CLINE2, POS2+3 ) )
CLINE2 := SUBS( CLINE2, POS2+3 )
IF !EMPTY( CLINE1 )
OREPORT:SAY( 1, CLINE1, 1 ) // 1ST COLUMN NORMAL FONT
ENDIF
IF AT( 'DUPLICATE DEL', WIDE_DATA) > 0
OREPORT:SAY( 5, WIDE_DATA, 3 )
ELSEIF AT( 'DUPLICATE', WIDE_DATA) > 0
OREPORT:SAY( 1, WIDE_DATA, 3 )
ELSEIF VAL( WIDE_DATA ) > 0 // ORDER NUMBER
OREPORT:SAY( 3, WIDE_DATA, 3 )
ELSE
MSGSTOP( 'WIDE VALUE NOT DEFINED' )
OREPORT:SAY( 1, WIDE_DATA, 3 )
ENDIF
POS1 := AT( CHR(27) + 'W1', CLINE2 ) // WE FOUND AN ESCAPE SEQUENCE FOR WIDE PRINT
IF POS1 > 0
CLINE_WORK := CLINE2 // REMAINDER OF DATA
ELSE
IF !EMPTY( CLINE2 )
OREPORT:SAY( 11, CLINE2, 1 )
ENDIF
EXIT
ENDIF
ENDDO
ELSE
oReport:Say( 1, cLine, 1 ) // NORMAL font
ENDIF
oReport:EndLine()
RETURN NIL
/*
OREPORT:SAY( 1, '111111', 1 )
OREPORT:SAY( 2, '22222', 3 )
OREPORT:SAY( 3, '33333' , 1 )
OREPORT:SAY( 4, '44444' , 3 )
OREPORT:SAY( 5, '55555' , 1 ) // DUPLICATE DEL
OREPORT:SAY( 6, '66666' , 3 )
OREPORT:SAY( 7, '77777', 3 )
OREPORT:SAY( 8, '88888' , 1 )
OREPORT:SAY( 9, '99999' , 3 )
OREPORT:SAY( 10, 'aaaaa' , 1 )
OREPORT:SAY( 11, 'BBBBB' , 3 ) // + 20% = ORDER NUMBER AND Page 1 of 1
OREPORT:SAY( 12, 'CCCCC' , 1 )
OREPORT:SAY( 13, 'DDDDD' , 3 )
OREPORT:SAY( 14, 'EEEEE' , 1 )
OREPORT:SAY( 15, 'FFFFF' , 3 )
*/
***********************************************************************
FUNCTION CGW_SETFONT( ODEVICE, WHCHORDER, OREPORT, COL_LEN, PASS_MYFONT, FACT_W, FACT_H )
LOCAL MYFONT, OFONT, OFONTB, OFONTW // REGULAR, BOLD, WIDE
LOCAL FORCEBOLD := .F., MALTFONT
//MYFONT := 'Courier New' //** don - 01/11/02 - reactivated 4/21/2021
MYFONT := 'Lucida Sans Typewriter'
// 3-31-2021
FACT_W := FACT_W / 100
FACT_H := FACT_H / 100
DEFINE FONT oFont NAME MYFONT
DEFINE FONT oFontB NAME MYFONT BOLD
DEFINE FONT oFontW NAME MYFONT BOLD
// adjust the bold font height/width slightly.
IF WHCHORDER = 'REPORT'
// myfont is hard coded above depending on the data's width
OFONT:NCLIPPRECISION := 2
OFONT:NPITCHFAMILY := 49
OFONT:NWIDTH := 4.00
OFONT:NHEIGHT:= 12
ELSEIF MYFONT = 'Courier New'
// tiny bit too wide
oFont:nWIDTH := 6.90
oFont:nHEIGHT:= 14.00
// OK TALL / TOO WIDE
oFontW:nWIDTH := 15.00
oFontW:nHEIGHT:= 18.00
ELSE
// this is the default - MyFont is 'Lucida Sans Typewriter'
// OK TALL / TOO WIDE
oFont:nWIDTH := 7.25
oFont:nHEIGHT:= 12.00
// test logic begin
// oFont:nWIDTH := 17.25
// oFont:nHEIGHT:= 22.00
// test logic end
ENDIF
// 03/31/2021
OFONT:NWIDTH *= FACT_W
OFONT:NHEIGHT *= FACT_H
RETURN { OFONT, OFONTB, OFONTW }
***********************************************