Here some code with example of passing parameter even in batch-mode tocrystal. In this sample you have only character type param and dateparam (with a /). Th best way is to pass only text param for all you're.rpt, because u must pass the param with the good type. In thi ssampleu've scode sample to connect all subreprort (imagine u've multipledatabase then u've to modify the code, i've just write how access tosubreprort).
PROCEDURE peditcrystal :
/*------------------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
------------------------------------------------------------------------------*/
DEFINE INPUT PARAMETER pc-fichier ASCHARACTER NO-UNDO. /* Nom physique de l'etat crystal report */
DEFINE INPUT PARAMETERpc-param AS CHARACTER NO-UNDO. /*Liste des paramètres enentrée */
DEFINE INPUT PARAMETER pc-servername AS CHARACTER NO-UNDO. /* Nom du service ODBC utilisé */
DEFINE INPUT PARAMETER pc-dbname AS CHARACTER NO-UNDO. /* Nom physique de la base */
DEFINE INPUT PARAMETER pc-userid AS CHARACTER NO-UNDO. /* Nom Utilisateur */
DEFINE INPUT PARAMETER pc-password AS CHARACTER NO-UNDO. /* Mot de passe */
DEFINE INPUT PARAMETER pc-drivername AS CHARACTER NO-UNDO. /* Port de l'imprimante sur lequel editer */
DEFINE INPUT PARAMETER pc-printername AS CHARACTER NO-UNDO. /* Port de l'imprimante sur lequel editer */
DEFINE INPUT PARAMETER pc-printerport AS CHARACTER NO-UNDO. /* Port de l'imprimante sur lequel editer */
DEFINE INPUT PARAMETER pc-typedt ASCHARACTER NO-UNDO. /* I : intéractif avec demande des paramètres, B :Batch avec les paramètres passés en paramètres */
DEFINE INPUT PARAMETER pi-landscape AS INTEGER NO-UNDO. /* 1 : Portrait, 2 : Paysage */
DEFINE INPUT PARAMETER pc-export ASCHARACTER NO-UNDO. /* Si renseigné génération de l'état dans un fichier*/
DEFINE INPUT PARAMETER pc-format ASCHARACTER NO-UNDO. /* FORMAT DU FICHIER GENERE UTILISE UNIQUEMENT SIpc-export <> "" */
DEFINE OUTPUT PARAMETERpl-ok ASLOGICAL NO-UNDO. /* Edition réalisée oui/non */
DEFINE VARIABLE ch-CRapplication AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRExportOptions AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRreport AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRparams AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRparflds AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRsection AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRReportObject AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE ch-CRSubReport AS COM-HANDLE NO-UNDO.
DEFINE VARIABLEi AS INTEGER NO-UNDO.
DEFINE VARIABLEj AS INTEGER NO-UNDO.
DEFINE VARIABLEk AS INTEGER NO-UNDO.
DEFINE VARIABLE i-nbparam AS INTEGER NO-UNDO.
DEFINE VARIABLE c-CRYSTAL-REPORT AS CHARACTER NO-UNDO.
DEFINE VARIABLE l-CRYSTAL-REPORT AS LOGICAL NO-UNDO.
DEFINE VARIABLEd-date AS DATE NO-UNDO.
DEFINE VARIABLE c-tblname AS CHARACTER NO-UNDO.
DEFINE VARIABLE l-erreur AS LOGICAL NO-UNDO.
DEFINE VARIABLE c-erreur AS CHARACTER NO-UNDO.
DEFINE VARIABLE c-dbnamespe AS CHARACTER NO-UNDO. /* Nom physique de la base spécifique*/
DEFINE VARIABLE c-useridspe AS CHARACTER NO-UNDO. /* Nom Utilisateur de la base spécifique*/
DEFINE VARIABLE c-passwordspe AS CHARACTER NO-UNDO. /* Mot de passe de la base spécifique */
DEFINE VARIABLE c-lstbl AS CHARACTER NO-UNDO.
DEFINE VARIABLE l-tblspe AS LOGICAL NO-UNDO.
DEFINE VARIABLE l-tblstd AS LOGICAL NO-UNDO.
DEFINE VARIABLE i-crsys AS INTEGER NO-UNDO INITIAL 1.
DEFINE VARIABLE i-crtext AS INTEGER NO-UNDO INITIAL 2.
DEFINE VARIABLE i-crline AS INTEGER NO-UNDO INITIAL 3.
DEFINE VARIABLE i-crbox AS INTEGER NO-UNDO INITIAL 4.
DEFINE VARIABLE i-crsubreport AS INTEGER NO-UNDO INITIAL 5.
ASSIGN
i-nbparam = NUM-ENTRIES(pc-param,"|":U).
EDITION:
DO:
FILE-INFO:FILE-NAME = pc-fichier.
IF FILE-INFO:FULL-PATHNAME = "" OR
FILE-INFO:FULL-PATHNAME = ? THEN
DO:
MESSAGE "Fichier état introuvable".
ASSIGN pl-ok = FALSE.
LEAVE EDITION.
END.
/* Initialisation liaison OLE */
CREATE "CrystalRuntime.Application.9" ch-CRapplication NO-ERROR.
IF ERROR-STATUS:ERROR = TRUE THEN
DO:
MESSAGE "Crystal report non disponible sur ce poste".
ASSIGN pl-ok = FALSE.
LEAVE EDITION.
END.
CREATE "CrystalRuntime.Report.9" ch-CRreport NO-ERROR.
IF ERROR-STATUS:ERROR = TRUE THEN
DO:
MESSAGE "Crystal report non disponible sur ce poste".
ASSIGN pl-ok = FALSE.
LEAVE EDITION.
END.
/* Ouverture de l'état */
ch-CRreport = ch-CRapplication:OpenReport(pc-fichier) NO-ERROR.
IF ERROR-STATUS:ERROR THEN
DO:
MESSAGE "Erreur lors de l'ouverture de l'état".
ASSIGN pl-ok = FALSE.
LEAVE EDITION.
END.
/* Connexion */
DO i = 1 TO ch-CRreport

ATABASE:tables:COUNT:
ch-CRreport

atabase:Tables(i):SetLogOnInfo(pc-servername,pc-dbname,pc-userid,pc-password).
END.
/* CONNEXION DES TABLES DES SOUS ETATS */
DO i = 1 TO ch-CRreport:Sections:COUNT:
ASSIGN ch-CRsection = ch-CRreport:Sections:ITEM(i).
DO j = 1 TO ch-CRsection:reportObjects:COUNT:
ch-CRReportObject = ch-CRsection:ReportObjects:ITEM(j).
IFch-CRReportObject:kind <> i-crsubreport THEN NEXT. /* Ne prendreque les sous etats */
ASSIGN ch-CRSubReport = ch-CRReportObject:OpenSubreport.
/* Connexion des bases et tables liées aux sous états */
DO k = 1 TO ch-CRSubReport

ATABASE:tables:COUNT:
ch-CRSubReport

atabase:Tables(k):SetLogOnInfo(pc-servername,pc-dbname,pc-userid,pc-password).
END.
END.
END.
/* Si edition en batch on récupère les paramètres passés */
IF pc-typedt = "B":U THEN
DO:
/* Ne pas afficher la boîte de dialogue de paramètres */
ch-CRreport:EnableParameterPrompting = FALSE.
/* Initialisation des paramètres */
ch-CRparams = ch-CRreport

arameterFields.
/* Test du nombre de paramètres */
IF i-nbparam <> ch-CRparams:Count THEN
DO:
MESSAGE "incohérence du nombre de paramètres pour l'état".
ASSIGN pl-ok = FALSE.
LEAVE EDITION.
END.
/* Remise à blanc des paramètres */
DO i = 1 TO ch-CRparams:Count:
ch-CRparflds = ch-CRparams:Item(i).
NO-RETURN-VALUE ch-CRparflds:ClearCurrentValueAndRange().
END.
/* Affectation des paramètres */
DO i = 1 TO i-nbparam:
ch-CRparflds = ch-CRparams:Item(i).
ASSIGN d-date = DATE(ENTRY(i,pc-param,"|":U)) NO-ERROR.
IFERROR-STATUS:ERROR = FALSE AND INDEX(ENTRY(i,pc-param,"|":U),"/":U)<> 0 THEN
DO:
NO-RETURN-VALUEch-CRparflds:AddCurrentValue(DATE(ENTRY(i,pc-param,"|":U))).
END.
ELSE
DO:
NO-RETURN-VALUE ch-CRparflds:AddCurrentValue(ENTRY(i,pc-param,"|":U)).
END.
END.
END.
IF pc-export = "" THEN
DO:
/* Lancement choix imprimante si pas encore d'imprimante sélectionnée */
IF pc-drivername = "":U OR
pc-drivername = ? OR
pc-printername = "":U OR
pc-printername = ? OR
pc-printerport = "":U OR
pc-printerport = ? THEN
DO:
SYSTEM-DIALOG PRINTER-SETUP.
ASSIGN
pc-drivername = SESSION

RINTER-NAME
pc-printername = SESSION

RINTER-NAME
pc-printerport = SESSION

RINTER-PORT.
END.
ch-CRreport:SelectPrinter(pc-drivername,pc-printername,pc-printerport).
ASSIGN
ch-CRreport

aperOrientation = pi-landscape
ch-CRreport

aperSource = pi-landscape.
ch-CRreport

rintOutEx(FALSE,1,FALSE,,,pc-printerport).
END.
ELSE
DO:
ch-CRExportOptions = ch-CRreport:ExportOptions.
ch-CRExportOptions

estinationType = "1".
ch-CRExportOptions:FormatType = pc-format.
ch-CRExportOptions

iskFileName = pc-export.
ch-CRreport:EXPORT(FALSE).
END.
RELEASE OBJECT ch-CRSubReport NO-ERROR.
RELEASE OBJECT ch-CRReportObject NO-ERROR.
RELEASE OBJECT ch-CRsection NO-ERROR.
RELEASE OBJECT ch-CRparflds NO-ERROR.
RELEASE OBJECT ch-CRparams NO-ERROR.
RELEASE OBJECT ch-CRExportOptions NO-ERROR.
RELEASE OBJECT ch-CRreport NO-ERROR.
RELEASE OBJECT ch-CRapplication NO-ERROR.
ASSIGN pl-ok = TRUE.
END.
END PROCEDURE.
hope it's help