2010-11-18 8 views
0

Der folgende folgende Code stammt aus einer Winforms-Anwendung, die bei einem Schaltflächenereignis eine Instanz von Geschäftsobjekten 6.5 öffnet, den Bericht aktualisiert und die Daten im Bericht anschließend in eine CSV-Datei ablegt. und beendet dann die Geschäftsobjektinstanz.Statische Klassen und die COM-Bibliothek von Business Objects

Das erste Mal, dass ich den Code es funktioniert perfekt laufen, aber wenn ich es laufen wieder erhalte ich eine Ausnahme auf der Linie

boApp.LoginAs(userName, Password, false, null); 

Die Ausnahme ‚Ungültige Objekt‘ geworfen ist.

Ich gehe davon aus, dass dies auf die Tatsache zurückzuführen ist, dass boApp nicht neu initialisiert wurde, und dass es mein Mangel an Wissen in Bezug auf statische Klassen ist, dass das Problem ist.

Der Aufruf der Methode ist folgende:

BO_Control.RefreshBusinessObjects(boReportsFolder, boExportsFolder, boReportName, exportFileName, startDate, endDate); 

und dies ist die BO_Control Klasse

static class BO_Control 
{ 

    static busobj.Application boApp = new busobj.Application(); 
    static busobj.Document testDoc; 


    public static void RefreshBusinessObjects(string reportFolder, string exportFolder ,string boReportName, string exportFileName, string startDate, string endDate)  
    { 


     DateTime BoStart = DateTime.Now; 

     boApp.LoginAs(userName, Password, false, null); 

     boApp.Interactive = false; 
     boApp.Visible = false; 

     GetData(reportFolder, boReportName, startDate, endDate); 
     ExportData(exportFolder, exportFileName); 

     Console.WriteLine("BO_Export took {0} seconds.", DateTime.Now.Subtract(BoStart)); 

     boApp.Quit();   
    } 

    static busobj.Document GetData(string reportFolder, string reportName, string startDate, string endDate) 
    { 
     Console.WriteLine(reportFolder + reportName); 
     testDoc = (busobj.Document)boApp.Documents.Open(reportFolder + reportName, true, false, null, null); 

     //Report Start Date 
     testDoc.Variables[1].Value = startDate; 
     //Report End Date 
     testDoc.Variables[2].Value = endDate; 
     //Area. Needs to be a semi-colon delimited string 
     testDoc.Variables[3].Value = "L;B;H;"; 

     testDoc.Refresh(); 

     return testDoc; 

    } 

    static void ExportData(string exportFolder, string exportFileName) 
    { 
     testDoc.Reports.get_Item(1).ExportAsText(exportFolder + exportFileName); 
     //2 = DoNotSaveChanges 
     testDoc.Close(2); 
    } 

} 

Antwort

0

ich die Instantiierung des BOApp in die RefreshBusinessObjects Methode bewegt und das schien den Trick zu tun

0

Ich benutze auch diesen Login-Code, es funktioniert, aber es muss auf die OK-Schaltfläche von BO Login Diaglog klicken. Gibt es Methoden, die diesen Schritt überspringen können?

+0

Blimey, das ist eine Explosion aus der Vergangenheit. Diese Zeile sollte gesetzt werden, wodurch alle Interaktionen der Business-Objekte abgeschaltet werden boApp.Interactive = false; Stellen Sie auch sicher, dass der Benutzername und das Passwort in der boApp.LoginAs (userName, Password, false, null) korrekt sind; Methode? – MrBliz

+0

Ich denke, dass mein Benutzername & Pwd Recht haben, pls sehe meinen Code über den untenstehenden Link, und wenn ich den OK-Button von BO Login Diaglog, wird die BO-App wie gewohnt [klicken Sie hier für Code] (http: // www.forumtopics.com/busobj/viewtopic.php?t=219784&sid=027f230af85e9b74e8fccff138288724) – user1994358

+0

Ich wünschte, ich könnte Ihnen weiter helfen, aber ich habe nicht mehr Zugriff auf Business-Objekte 6.5, um es zu testen. – MrBliz