#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 } ***********************************************