Fixing “Operation is not valid due to the current state of the object” when using SSRS ReportViewer in ASP.Net MVC

So I’ve included the SSRS ReportView control within my ASP.Net MVC application. So far so good. Just displaying the report works fine after struggeling with the dimensions of the iframe and the ReportViewer control itself.

But after a more complex drill-through report was display and then clicking the actions caused the famous error “Operation is not valid due to the current state of the object” (which in this case has nothing to do with resource limits due to security patches). Switching from asynchronous (AJAX) to classic postback did not help either.

It was a long day and the obvious was not that obvious anymore. I used the following code within the Page_Load event to configure the report:

protected void Page_Load(object sender, EventArgs e)
{
  string reportName = Page.RouteData.Values["reportName"] as String;
  string reportPath = Page.RouteData.Values["reportPath"] as String;
  string sizeType = Page.RouteData.Values["sizeType"] as String;
  bool withToolbar = Boolean.Parse(Page.RouteData.Values["withToolbar"] as String);
 
  theReportViewer.ServerReport.ReportServerUrl = new Uri("http://example.org");
  theReportViewer.ServerReport.ReportPath = String.Format("/{1}/{0}", reportName, reportPath);
}

After analysing logfiles and event logs I was nearly giving up when finally realizing that a click within the report causes a postback. But everytime the page loads I resetted the report. *sigh* The “fix” is simple and straightforward and should have been written in the first place.

protected void Page_Load(object sender, EventArgs e)
{
  if (!this.Page.IsPostBack)
  {
    string reportName = Page.RouteData.Values["reportName"] as String;
    string reportPath = Page.RouteData.Values["reportPath"] as String;
    string sizeType = Page.RouteData.Values["sizeType"] as String;
    bool withToolbar = Boolean.Parse(Page.RouteData.Values["withToolbar"] as String);
 
    theReportViewer.ServerReport.ReportServerUrl = new Uri("http://example.org");
    theReportViewer.ServerReport.ReportPath = String.Format("/{1}/{0}", reportName, reportPath);
  }
}

Now drill-through and navigation inside the reports is no problem at all.

Discoverer 9i unter Windows 7 (32 Bit) installieren

Eine Installation von Oracle Discoverer 9i (End-User) unter Windows 7 (32 Bit) ist wie folgt möglich:

1.) Kopieren der Installationsdateien in einen Lokalen Ordner. (Kein Netzlaufwerk!!!)

2.) Kompatibilitätsmodul (Eigenschaften) der setup.exe (…\install\win32\…) auf “XP – Service Pack 3″ setzten und übernehmen.

3.) setup.exe ausführen und Installation wie gewohnt durchführen.

Bei mir hat die Installation funktioniert. Leider kommt beim starten ein Hinweis das die Registry nicht aktualisiert werden kann. Das ist aber kein Problem.

Notwendige Patchs können nach dem oben beschriebenen Verfahren ebenfalls installiert werden.

Mehrsprachigkeit in Berichten SSRS

Allgemein/Vorgabe

Unsere Kunden wollten, dass deren Belege (Angebot, Lieferschein, …) in unterschiedlichen Sprachen gedruckt werden können. Die Sprache sollte von außen, dem Modul (Angebot, Lieferschein, …), vorgegeben werden. Unser Ziel war, möglichst nur einen Beleg pro Modul zu verwenden.

Lösung

Wir haben die Funktion “lookup” verwendet.  Die Funktion ist als Ausdruck/Expression “=lookup(“invoice.Artikelnummer”, Fields!rep_key.Value, Fields!rep_label.Value, “DS_Localization”)” in einem Textfeld eingebunden. Damit die Funktion den richtigen Wert liefert muss auf der Datenbank eine Übersetzungstabelle vorhanden sein. Diese Tabelle muss anschließend als DataSet im Bericht eingebunden sein. Im DataSet wird anhand der Where-Bedingung die Sprache selektiert. Diese muss demnach als Parameter mit übergeben werden.

In diesem Fall liefert der “lookup” die Übersetzung dür das Feld “invoice.Artikelnummer” zurück. Die Felder “rep_key” und “rep_label” kommen aus der eingebundenen Tabelle (DataSet “DS_Localization”)

Tabelle

rep_key (Schlüssel)
rep_label (Bezeichnung; Text der gedruckt wird)
rep_local (Sprachschlüssel; EN, DE, FR, …)

forms60 OS_ERROR

Bei meiner letzten Installation von Forms6i unter Windows 7 (64-Bit) gab es plötzlich den Fehler forms60 OS_ERROR. Abhilfe schaft hier die Reuzierung des PATH-Eintrages. Dieser war für eine Form6i Installation zu lang. Am besten auf ca. 800 Zeichen kürzen, vorher sichern(!) und dann noch mal die Installation starten. Dann sollte es funktionieren. Anschließend können die evtl. entfernten PATH-Einträge wieder hinzugefügt werden.

SEPA und das Problem der Prüfziffern bei Hauptkonten

Eine Prüfziffer nach dem Verfahren Modulo 97 zu berrechnen sollte nicht schwer sein. Hierfür gibt es im internet ausreichend Anleitungen.

Was aber oft nicht bedacht wird, ist, das es in Deutschland bei einigen Banken (z.B. Commerzbaank, Deutsche Bank, …) sogennante Hauptkonten gibt. Diese Hauptkonten enden mit einer doppel Null “00”. Hat aber nichts mit dem “Geheimdienst Ihrer Majestät” zu tun. Das Hauptkonto kann bei einer Transaktion mit oder ohne “00” angesprochen werden. Bei der Ermittlung einer richtigen IBAN kommt aber als Prüfziffer der gleiche Wert raus. Also das Konto 7896543 und 789654300 liefert die gleiche Prüfziffer. Aber nur wenn die Ermittlung über eine Bank läuft. Wird die Ermittlung über ein eigenes Programm gesteuert werden für beide Konten unterschiedliche Prüfziffern gebildet. Das ist zwar mathematisch richtig aber in diesem Fall logisch falsch. Eine 100% Lösung bei der Berechnung gibt es nicht.

Viel Erfolg bei einer SEPA Umstellung.