Dear Experts,
I am having an issue with directly printing the report (without loading the preview) in CR 9. I am using VFP to programmatically call the report to be printed in printer directly without any prompt message or dialog boxes.
When I had to change the report to cater a sub report, I found that my code is not working. Do we have to call printout methos seperately for sub reports too?
Following is my VFP code
PARAMETERS aCreport,aCfile,par1,par2,par3,par4,par5,par6,par7,par8,par9,par10,par11,par12,par13,par14,par15,par16,par17,par18,par19,par20,par21,par22,par23,par24,par25,par26,par27,par28,par29,par30
RELEASE goForm
PUBLIC goForm, lnRecordPrinted
lnRecordPrinted=0
DECLARE INTEGER CreateDC IN WIN32API ;
INTEGER lpszDriver, ;
STRING @ lpszDevice, ;
INTEGER lpszOutput, ;
INTEGER lpInitData
LOCAL nRptlen, nTbllen
nRptlen=ALEN(aCreport,1)
nTbllen=ALEN(aCfile,1)
DECLARE aCreport(nRptlen,1), aCfile(nTbllen,2)
goForm = CREATEOBJECT("form1")
IF TYPE('goForm') = 'O' AND !ISNULL(goForm)
goForm.RELEASE()
ELSE
??CHR(7)
MESSAGEBOX("Can not create form", 16, _SCREEN.CAPTION)
ENDIF
DEFINE CLASS form1 AS FORM
ICON = SYS(5)+"\Global\bmps\ds.ico"
NAME = "Form1"
WINDOWTYPE = 1 && Modal
WINDOWSTATE = 2
LOCKSCREEN=.T.
CAPTION=""
ADD OBJECT olecontrol1 AS OLECONTROL WITH ;
NAME = "oleCRViewer", ;
OLECLASS = 'CRviewer9.CRviewer.9.2'
*----------------------------------------------
PROCEDURE INIT
LOCAL cr AS crViewer.crViewer
oCrystal = CREATEOBJECT("CrystalRuntime.Application.9")
LOCAL cMCrysRepo,cSCrysRepo,cCrysFile,cRpt,cTbl,cModuleNo,nRptlen,nTbllen
PUBLIC cMCrysRepPath,oReport
cModuleNo=IIF(!EMPTY(pModuleNo),ALLTRIM(pModuleNo)+"\","")
nRptlen=ALEN(aCreport,1)
nTbllen=ALEN(aCfile,1)
NOTE : Report Count
IF nRptlen>0
NOTE : Main Report
cRpt=aCreport(1) && First Report Must Be The Main Crystal rpt
IF !EMPTY(cRpt) AND VARTYPE(cRpt)="C"
cMCrysRepo = ga.cCrystalPath+"\"+cModuleNo+ALLTRIM(cRpt)+".rpt"
NOTE : If required build in the rpt into the exe
A=FILETOSTR(cMCrysRepo) && Read the file in the EXE to a memory variable
=STRTOFILE(A,cMCrysRepo) && Copy the variable back to a "real" file on the local drive
NOTE : Coping Main Report tables to fox2x
oReport =oCrystal.OpenReport(cMCrysRepo)
IF oReport.HasSavedData
oReport.DiscardSavedData()
ENDIF
lFirst=.T.
ntblseq=0
FOR i=1 TO nTbllen
IF aCfile(i,1)=cRpt
cTbl=UPPER(aCfile(i,2))
IF !EMPTY(cTbl) AND VARTYPE(cTbl)="C"
ntblseq=ntblseq+1
IF lFirst && Main table name will be same as report
cCrysFile = ga.cCrystalPath+"\"+cModuleNo+ALLTRIM(cRpt)+".dbf"
lFirst=.F.
ELSE
cCrysFile = ga.cCrystalPath+"\"+cModuleNo+ALLTRIM(cTbl)+".dbf"
ENDIF
SELECT &cTbl
GO TOP
COPY TO &cCrysFile TYPE FOX2X
NOTE : Support to change report table path dynamically. Always set the table property in the Crystal "Same as Report".
oReport.DATABASE.TABLES.ITEM(ntblseq).SetTableLocation(cCrysFile,JUSTSTEM(cCrysFile),"")
ENDIF
ENDIF
ENDFOR
IF nRptlen>1
NOTE : Sub Report
FOR i=2 TO nRptlen
cRpt=aCreport(i)
IF !EMPTY(cRpt) AND VARTYPE(cRpt)="C"
cSCrysRepo = ALLTRIM(cRpt)
NOTE : Coping Sub Report tables to fox2x
oSReport =oReport.OpenSubreport(cSCrysRepo)
IF oSReport.HasSavedData
oSReport.DiscardSavedData()
ENDIF
lFirst=.T.
ntblseq=0
FOR j=1 TO nTbllen
IF aCfile(j,1)=cRpt
cTbl=UPPER(aCfile(j,2))
IF !EMPTY(cTbl) AND VARTYPE(cTbl)="C"
ntblseq=ntblseq+1
IF lFirst && Sub Report table name will be same as report
cCrysFile = ga.cCrystalPath+"\"+cModuleNo+ALLTRIM(cRpt)+".dbf"
lFirst=.F.
ELSE
cCrysFile = ga.cCrystalPath+"\"+cModuleNo+ALLTRIM(cTbl)+".dbf"
ENDIF
SELECT &cTbl
GO TOP
COPY TO &cCrysFile TYPE FOX2X
NOTE : Support to change report table path dynamically. Always set the table property in the Crystal "Same as Report".
oSReport.DATABASE.TABLES.ITEM(ntblseq).SetTableLocation(cCrysFile,JUSTSTEM(cCrysFile),"")
ENDIF
ENDIF
ENDFOR
ENDIF
ENDFOR
ENDIF
ELSE
NOTE : Main Report not defined properly
cMCrysRepo=""
ENDIF
ELSE
NOTE : Main Report not defined properly
cMCrysRepo=""
ENDIF
NOTE : Used to check whether rpt exist before displaying report
cMCrysRepPath=cMCrysRepo
oReport.EnableParameterPrompting=.F.
ocParm = oReport.ParameterFields()
oParm1 = ocParm.ITEM(1)
oParm1.SetCurrentValue(par1)
oParm2 = ocParm.ITEM(2)
oParm2.SetCurrentValue(par2)
oParm3 = ocParm.ITEM(3)
oParm3.SetCurrentValue(par3)
oParm4 = ocParm.ITEM(4)
oParm4.SetCurrentValue(par4)
oParm5 = ocParm.ITEM(5)
oParm5.SetCurrentValue(par5)
oParm6 = ocParm.ITEM(6)
oParm6.SetCurrentValue(par6)
oParm7 = ocParm.ITEM(7)
oParm7.SetCurrentValue(par7)
oParm8 = ocParm.ITEM(8)
oParm8.SetCurrentValue(par8)
oParm9 = ocParm.ITEM(9)
oParm9.SetCurrentValue(par9)
oParm10 = ocParm.ITEM(10)
oParm10.SetCurrentValue(par10)
oParm11 = ocParm.ITEM(11)
oParm11.SetCurrentValue(par11)
oParm12 = ocParm.ITEM(12)
oParm12.SetCurrentValue(par12)
oParm13 = ocParm.ITEM(13)
oParm13.SetCurrentValue(par13)
oParm14 = ocParm.ITEM(14)
oParm14.SetCurrentValue(par14)
oParm15 = ocParm.ITEM(15)
oParm15.SetCurrentValue(par15)
oParm16 = ocParm.ITEM(16)
oParm16.SetCurrentValue(par16)
oParm17 = ocParm.ITEM(17)
oParm17.SetCurrentValue(par17)
oParm18 = ocParm.ITEM(18)
oParm18.SetCurrentValue(par18)
oParm19 = ocParm.ITEM(19)
oParm19.SetCurrentValue(par19)
oParm20 = ocParm.ITEM(20)
oParm20.SetCurrentValue(par20)
oParm21 = ocParm.ITEM(21)
oParm21.SetCurrentValue(par21)
oParm22 = ocParm.ITEM(22)
oParm22.SetCurrentValue(par22)
oParm23 = ocParm.ITEM(23)
oParm23.SetCurrentValue(par23)
oParm24 = ocParm.ITEM(24)
oParm24.SetCurrentValue(par24)
oParm25 = ocParm.ITEM(25)
oParm25.SetCurrentValue(par25)
oParm26 = ocParm.ITEM(26)
oParm26.SetCurrentValue(par26)
oParm27 = ocParm.ITEM(27)
oParm27.SetCurrentValue(par27)
oParm28 = ocParm.ITEM(28)
oParm28.SetCurrentValue(par28)
oParm29 = ocParm.ITEM(29)
oParm29.SetCurrentValue(par29)
oParm30 = ocParm.ITEM(30)
oParm30.SetCurrentValue(par30)
* SK 20072016
lcPrinter = SET("Printer",2)
lnHDC = CreateDC(0,lcPrinter,0,0)
oReport.PrinterSetup(lnHDC)
oReport.PrintOut()
* oReport.PrintOut(.F.)
* SK Ends
lnRecordPrinted=oReport.PrintingStatus.NumberOfRecordPrinted
ENDPROC
PROCEDURE ERROR
LPARAMETERS nError, cMethod, nLine
IF nError != 1440
DODEFAULT()
ENDIF
ENDPROC
PROCEDURE UNLOAD
RELEASE cMCrysRepPath,oReport
RETURN lnRecordPrinted
ENDPROC
PROCEDURE ACTIVATE
WAIT CLEAR
IF !FILE(cMCrysRepPath)
WAIT WINDOW "Print Report Not Define Properly.................." NOWAIT
THISFORM.RELEASE
ENDIF
ENDPROC
ENDDEFINE
**************************************************