Question Crystal Report COM-HANDLE

Hello,

I have a function that extract a report by Crystal Report and export it in pdf.
I'm looking for way to close the Crystal Report before killing the object.
There is my sample code:
Code:
DEFINE INPUT  PARAMETER rptNumenr AS CHARACTER   NO-UNDO.
DEFINE INPUT  PARAMETER rptChemin AS CHARACTER   NO-UNDO.
DEFINE INPUT  PARAMETER typChemin AS INTEGER     NO-UNDO.
DEFINE INPUT  PARAMETER pdfChemin AS CHARACTER   NO-UNDO.
DEFINE INPUT  PARAMETER visualisation AS LOGICAL     NO-UNDO.

{vignal/CRExportDestinationType.i}
{vignal/CRExportFormatType.i}

DEFINE VARIABLE crAppn      AS COM-HANDLE . /* Application Crystal Report */
DEFINE VARIABLE crReport    AS COM-HANDLE . /* Rapport Crystal */
DEFINE VARIABLE crExportOptions AS COM-HANDLE. /* Paramètre d'export */
DEFINE VARIABLE crSection   AS COM-HANDLE.
DEFINE VARIABLE crSubReport AS COM-HANDLE.
DEFINE VARIABLE crObject    AS COM-HANDLE.
DEFINE VARIABLE crParam     AS COM-HANDLE.
DEFINE VARIABLE crSubParam  AS COM-HANDLE.
DEFINE VARIABLE crParamFld  AS COM-HANDLE.

/* paramétre de connexion */
/*  base standard */
DEFINE VARIABLE cSrvBas AS CHARACTER   NO-UNDO.
DEFINE VARIABLE cUseBas AS CHARACTER   NO-UNDO.
DEFINE VARIABLE cPwdBas AS CHARACTER   NO-UNDO.
/*  base spé */
DEFINE VARIABLE cSrvSpe AS CHARACTER   NO-UNDO.
DEFINE VARIABLE cUseSpe AS CHARACTER   NO-UNDO.
DEFINE VARIABLE cPwdSpe AS CHARACTER   NO-UNDO.
DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE j AS INTEGER     NO-UNDO.
DEFINE VARIABLE cmpt AS INTEGER     NO-UNDO.

/* récupération du chemin */
CASE typChemin :
    WHEN 1 THEN DO:
        FIND VCHEMIN WHERE VCHEMIN.checod = rptChemin NO-LOCK NO-ERROR.
        rptChemin = VCHEMIN.cheche .
    END.
    WHEN 3 THEN DO:
        FIND SYSPGM WHERE SYSPGM.pgmnom = rptChemin NO-LOCK NO-ERROR.
        rptChemin = SYSPGM.pgmchemin + SYSPGM.pgmnom.
    END.
END.


FIND FIRST SYSENV WHERE SYSENV.envcod = "CRYSTAL-REPORT":U NO-LOCK NO-ERROR. /* Paramètre de connection */
ASSIGN  /* Récupération des valeurs de la SYSENV */
    cSrvBas = ENTRY(1,SYSENV.envtxt,"|":U)
    cUseBas = ENTRY(2,SYSENV.envtxt,"|":U)
    cPwdBas = ENTRY(3,SYSENV.envtxt,"|":U).
IF NUM-ENTRIES(SYSENV.envtxt, "|":U) = 6 THEN ASSIGN /* Base spé */
    cSrvSpe = ENTRY(4,SYSENV.envtxt,"|":U)
    cUseSpe = ENTRY(5,SYSENV.envtxt,"|":U)
    cPwdSpe = ENTRY(6,SYSENV.envtxt,"|":U).

/* Création de l'application dans le com-handle */
CREATE "CrystalRunTime.Application" crAppn NO-ERROR.
/* Attribution du rapport à exploiter */
crReport = crAppn:OpenReport(rptChemin) NO-ERROR.

 /* Paramétrage de connexion de chaque table */
DO cmpt = 1 TO crReport:DATABASE:tables:COUNT:

    IF SUBSTRING(crReport:DATABASE:tables(cmpt):NAME, 1, 1) = "S":U THEN /* Si table lié à silv-exp */
        crReport:DATABASE:Tables(cmpt):ConnectionProperties("Password":U) = cPwdBas.
    ELSE ASSIGN
        crReport:DATABASE:Tables(cmpt):ConnectionProperties("Password":U) = cPwdSpe .
END.

crReport:DiscardSavedData.
crParam = crReport:ParameterFields.
DO cmpt = 1 TO NUM-ENTRIES(rptNumenr):
    crParamFld = crParam:ITEM(cmpt).
    NO-RETURN-VALUE crParamFld:AddCurrentValue(ENTRY(cmpt,rptNumenr)) .
END.
/*crReport:ParameterFields:GetItemByName("iddoc":U):AddCurrentValue(ENTRY(1,rptNumenr)) . /* On donne le numéro de doc a récupérer */*/

IF NUM-ENTRIES(rptNumenr) > 1 THEN /* Si présence de paramètre supplémentaire, on les ajoutes */
    DO cmpt = 3 TO NUM-ENTRIES(rptNumenr) :
       crReport:ParameterFields:GetItemByName("param":U + STRING(cmpt - 2)):AddCurrentValue(ENTRY(cmpt,rptNumenr)) .
    END.

DO i = 1 TO crReport:Sections:COUNT :
    crSection = crReport:Sections:ITEM(i) .
    DO j = 1 TO crSection:reportObjects:COUNT :
        crObject = crSection:reportObjects:ITEM(j).
        IF crObject:kind = 5 THEN DO:
            crSubReport = crObject:OpenSubreport .
            DO cmpt = 1 TO crSubReport:DATABASE:tables:COUNT:
                IF SUBSTRING(crSubReport:DATABASE:tables(cmpt):NAME, 1, 1) = "S":U THEN /* Si table lié à silv-exp */
                    crSubReport:DATABASE:Tables(cmpt):ConnectionProperties("Password":U) = cPwdBas.
                ELSE ASSIGN
                    crSubReport:DATABASE:Tables(cmpt):ConnectionProperties("Password":U) = cPwdSpe.
            END.
            crSubReport:DiscardSavedData.
            crSubParam = crSubReport:ParameterFields.
            DO cmpt = 1 TO NUM-ENTRIES(rptNumenr):
                crParamFld = crSubParam:ITEM(cmpt).
                IF NUM-ENTRIES(crParamFld:NAME,'.':U) = 1 THEN
                    NO-RETURN-VALUE crParamFld:AddCurrentValue(ENTRY(cmpt,rptNumenr)) .
            END.
            
        END.
        
    END.
END.

                                      
ASSIGN
    crExportOptions = crReport:ExportOptions
    crExportOptions:DiskFileName = pdfChemin
    crExportOptions:DestinationType = {&crEDTDiskFile}
    crExportOptions:FormatType = {&crEFTPortableDocFormat}
    crExportOptions:PDFExportAllPages = TRUE   .
                                      
crReport:DisplayprogressDialog = FALSE.

crReport:EXPORT(FALSE) .


IF VALID-HANDLE(crSubReport) THEN RELEASE OBJECT crSubReport .
IF VALID-HANDLE(crObject) THEN RELEASE OBJECT crObject .
IF VALID-HANDLE(crParamFld) THEN RELEASE OBJECT crParamFld .
IF VALID-HANDLE(crSection) THEN RELEASE OBJECT crSection .
IF VALID-HANDLE(crSubParam) THEN RELEASE OBJECT crSubParam .
IF VALID-HANDLE(crParam) THEN RELEASE OBJECT crParam .
IF VALID-HANDLE(crExportOptions) THEN RELEASE OBJECT crExportOptions.
IF VALID-HANDLE(crReport) THEN RELEASE OBJECT crReport.
IF VALID-HANDLE(crAppn) THEN RELEASE OBJECT crAppn.

ASSIGN
   crExportOptions = ?
   crReport = ?
   crAppn = ? .

Do you know how to do it?

Best Regards,
 
If I understand correctly the DELETE OBJECT should do the tricks, but it seems that the SQL connection open by the report is still active.
Have someone already solved that ?
 

Cecil

19+ years progress programming and still learning.
Is there a method to close the report i.e. crReport:CloseReport() or crReport:Close() ?

Is there a developer API guide we can view/download?
 
Top