Announcement

Collapse
No announcement yet.

CrystalReports: Dauerhaftes Speichern von Parameterwerten in rpt-datei

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CrystalReports: Dauerhaftes Speichern von Parameterwerten in rpt-datei

    Hallo Forum,

    ich habe mich die letzten Tage intensiv in das Thema CrystalReport sowie die ReportDocument-Klasse eingearbeitet.

    Funktioniert soweit alles, bis auf eines. Ich habe Berichte, in welchen bereits Werte in Parametern vorbelegt sind- vermutlich vom letzten Aufruf aus CrystalReports selbst (siehe auch den angehängten Screenshot bzw. die markierte Zeile beim Debuggen nach dem Load-Ereignis).

    Das ist eine feine Sache- auch ich würde gerne Parameterwerte fest in die CrystalReports-Datei selbst speichern, damit die Datei beim nächsten Aufruf die Parameterwerte der letzten Verwendung wieder anzeigt.

    Jedoch gelingt es mir bisher lediglich, einen Parameter in die aktuelle Instanz des ReportDocuments zu speichern und diesen dann über den CrystalReports-Viewer anzuzeigen.

    Speichere ich das ReportDocument (bei mir als Variable
    currentCryRepDoc bezeichnet) folgendermaßen:

    [highlight=c#]
    _currentCryRepDoc.SaveAs(_currentFile);
    // Dabei entspricht der String "_currentFile" dem korrekten Verzeichnis samt Dateiangabe
    [/highlight]

    So speichert er die gesetzten Values trotzdem nicht in die Datei.

    Auf die selbe Weise ist es zwar kein Problem, Verbindungsinformationen zur Datenquelle abzuändern oder zu speichern- das funktioniert Problemlos über die Kombination:

    [highlight=c#]
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in rptDoc.Database.Tables)
    {CrystalDecisions.Shared.TableLogOnInfo info = new CrystalDecisions.Shared.TableLogOnInfo();
    info.ConnectionInfo.ServerName = boxConnectionServer.Text.Trim();
    info.ConnectionInfo.DatabaseName = boxConnectionDatabase.Text.Trim();
    info.ConnectionInfo.UserID = boxConnectionUser.Text.Trim();
    info.ConnectionInfo.Password = boxConnectionPassword.Text.Trim();
    table.ApplyLogOnInfo(info);

    // sowie anschließend über

    _currentCryRepDoc.SaveAs(_currentFile);
    [/highlight]

    Jedoch wie gesagt keine ParameterValues. CrystalReports macht jedoch wunderbar vor, das es funktionieren kann- die Values sind zweifellos in der Datei gespeichert, da ich eine .rpt-Datei auf einem anderen PC samt den Values problemlos auslesen konnte.

    Hat jemand eine Ahnung, wie ich selbst einen Value dauerhaft abspeichern kann?

    Bisher speichere ich die Parameter über 2 Wege im aktuellen ReportDocument:

    [highlight=c#]

    // currentCryRepDoc = Variable des aktuellen ReportDocument

    _currentCryRepDoc.SetParameterValue(_choosenParame ter, boxParameterValue.Text.Trim());

    SaveDefaultParameters(_currentCryRepDoc, _choosenParameter, boxParameterValue.Text.Trim());

    // Hinter SaveDefaultParameters steckt dann diese Methode:

    private void SaveDefaultParameters(ReportDocument rprDoc, string paramName, string discretValue)
    {
    CrystalDecisions.Shared.ParameterValues currentValues = rprDoc.ParameterFields[paramName].CurrentValues;

    currentValues.Clear();
    currentValues.AddValue(discretValue);
    }

    [/highlight]

    Wie gesagt, diese Methoden speichern zwar die Parameterwerte in die aktuelle Instanz, jedoch weder die Methode SetParameterValue, noch SaveDefaultParameters speichern die Values dann auch dauerhaft in die Datei, wenn ich dann currentCryRepDoc.SaveAs(_currentFile) ausführe.

    Weiß jemand Rat? Hat jemand ähnliche Erfahrungen? Stundenlanges Googleln brachten mich nicht weiter...

    Grüße
    Stephan
    Attached Files

    "A fool with a tool is still a fool."

  • #2
    Daten in Datenbank gespeichert

    Hallo zusammen,

    wens noch interessiert:
    Ich habe die diskreten Parameterwerte nun in der Datenbank (SQL Server) gespeichert. Ich rufe beim Laden der Parameter eine Tabelle auf, in welcher die Primärschlüssel auf den vollständigen Pfad des Berichtes sowie der Parameter gelegt sind:

    [highlight=SQL]
    CREATE TABLE [dbo].[SYSTEM_CRYSTAL_REPORTS_PARAMETER](
    [REPORT] [varchar](600) NOT NULL,
    [PARAMETERNAME] [varchar](255) NOT NULL,
    [VALUE] [varchar](255) NULL,
    CONSTRAINT [PK_SYSTEM_CRYSTAL_REPORTS_PARAMETER] PRIMARY KEY CLUSTERED
    (
    [REPORT] ASC,
    [PARAMETERNAME] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    [/highlight]

    Ist zwar ne unschöne Lösung, doch durch viel INSERT/UPDATE/DELETE-Anweisungen bemerkt der Benutzer inzwischen keinen Unterschied zu meiner Wunschlösung, die ich ursprünglich angestrebt hatte (siehe oben).

    Natürlich muss meine Anwendung auch das "Verschieben" sowie das "Löschen" gesamter Berichte aus dem Dateisystem durchführen sowie registrieren und dem SQL Server vermitteln, sonst entsteht schnell Datenmüll.

    Leider konnten auch meine Kollegen und Freunde mir nicht sagen, wie man im CrystalReports-Bericht (*.rpt) selbst die Werte hinterlegt.

    Grüße
    Stephan

    "A fool with a tool is still a fool."

    Comment


    • #3
      Hallo,
      ich weiss nicht ob das das gleiche ist aber du kannst in CR Standardwerte hinterlegen wenn keine Parameter übergeben werden. Allerdings wären die dann für alle Benutzer gleich.

      Habe keinerleit .Net CR Erfahrung, habe bisher nur in CR XI direkt gearbeitet.

      Comment

      Working...
      X