Export von Daten aus DB



  • hier würde ich danach suchen! 😉

    Aber ehrlich gesagt weiß ich deshalb noch nicht wirklich mehr! Ich denk ich werd es über die ODBC machen. Da muss dann halt ein XLs immer bestehen, in das ich was rein schreib und wenn der User dann nen Pfad wählt kopiere ich es dort hin! 😞



  • Polofreak schrieb:

    hier würde ich danach suchen! 😉

    Wow, die Seite ist TOP! 👍 😮 👍



  • die Seite war Anfängerglück *gg*
    Aber ich hba was nettes gefunden!

    CDatabase database;
      CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // exactly the same name as in the ODBC-Manager
      CString sExcelFile = "c:\\demo.xls";                // Filename and path for the file to be created
      CString sSql;
    
      TRY
      {
        // Build the creation string for access without DSN
    
        sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
                    sDriver, sExcelFile, sExcelFile);
    
        // Create the database (i.e. Excel sheet)
        if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
        {
          // Create table structure
          sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
          database.ExecuteSQL(sSql);
    
          // Insert data
          sSql = "INSERT INTO demo (Name,Age) VALUES ('Bruno Brutalinsky',45)";
          database.ExecuteSQL(sSql);
    
          sSql = "INSERT INTO demo (Name,Age) VALUES ('Fritz Pappenheimer',30)";
          database.ExecuteSQL(sSql);
    
          sSql = "INSERT INTO demo (Name,Age) VALUES ('Hella Wahnsinn',28)";
          database.ExecuteSQL(sSql);
        }      
    
        // Close database
        database.Close();
      }
      CATCH_ALL(e)
      {
        TRACE1("Driver not installed: %s",sDriver);
      }
      END_CATCH_ALL;
    

    Das geht sogar! So wie es aussieht kann ich da via SQL-Befehle direkt Sachen rein kloppen! Werd mal ein wenig damit rum spielen!



  • Hm also das da oben geht schon recht gut, jetzt hab ich das ganze mal ein wenig umgestellt und eine Schleife mit rein gepackt und so. Aber jetzt gibt es wieder Probleme! Hier erstmal Code: (nach OpenEx der Rest ist gleich geblieben!)

    // Create table structure
    		sSql = "CREATE TABLE Exportiert (ID NUMBER,Auftragsnummer TEXT, ArtikelNummer TEXT, Revisionsindex NUMBER, Pruefernummer NUMBER,
     Motornummer TEXT, Zaehler NUMBER, Kommando TEXT)";
    		database.ExecuteSQL(sSql);
    
    		// Insert data
    
    		MoveFirst();
    
    		while(!IsEOF())
    		{
    /* hier kannlts*/		sSql.Format("INSERT INTO Exportiert (ID ,Auftragsnummer , ArtikelNummer , Revisionsindex , Pruefernummer , Motornummer ,
     Zaehler , Kommando ) VALUES (%d,\'%s\',\'%s\',%d,%d,\'%s\',%d,\'%s\')",m_ID, m_AuftragNummer, m_ArtikelNummer, m_RevisionsIndex ,
     m_PrueferNr , m_MotorNummer , m_Zaehler , m_Kommando);
    			database.ExecuteSQL(sSql);
    			MoveNext();
    		}
    

    Ich hatte das mit weniger Variablen, und da ging es so geht es aber nicht!

    ---------------------------
    Unbenannt - ACRSQL: ACRSQL.exe - Fehler in Anwendung
    ---------------------------
    Die Anweisung in "0x10217cd3" verweist auf Speicher in "0xc413c848". Der Vorgang

    "read" konnte nicht auf dem Speicher durchgeführt werden.

    Klicken Sie auf "OK", um das Programm zu beenden.
    Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
    ---------------------------
    OK Abbrechen
    ---------------------------

    Die letzte Zeile in die ich komme ist diese:

    VERIFY(_vstprintf(m_pchData, lpszFormat, argListSave) <= GetAllocLength());
    

    Was muss ich anders machen?
    BZW gibt es nicht sowas wie:

    INSERT INTO Exportiert Select bla bla from Tabelle.meines SQL-Servers
    

    Exportiert ist ja quasi ne andere DB naja es ist eigentlich Excel aber ich behandel es ja wie ne DB! Wenn ich also einfach Select * from dbo.TRWErgebnisse mache, dann weiß er ja nicht wo der Server steht, Login ...
    Ne Idee? Überhaupt verstanden?
    Danke schon mal.



  • Ich vermute, du brauchst eine CDatabase-Instanz für Excel.
    Zusätzlich zu der, die du für MS-SQL ja schon hast.

    Dann ist der ganze Verbindungskram ja erledigt. 🙂



  • ?? Ja und dann? Ich hab doch eine Instanz!

    CDatabase database;
    	CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";	// exactly the same name as in the ODBC-Manager
    	CString sExcelFile = "D:\\Export.xls";				// Filename and path for the file to be created
    	CString sSql;
    
    	TRY
    	{
    	// Build the creation string for access without DSN
    
    	sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
    				sDriver, sExcelFile, sExcelFile);
    
    	// Create the database (i.e. Excel sheet)
    	if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
    


  • Sorry!

    Dann müßte das funktionieren...
    Geh doch mal im Callstack nach oben, wo in _deinem_ Quellcode bist du, wenns knallt?
    Lässt dich da was erkennen?



  • beim .Format schau nochmal vorne ich habs rein editiert. Kann Format nicht so viel formatieren oder so? 😞



  • Was haben die Variablen für einen Typ und was steht laut Debugger drin?

    Ich habe schon gezählt, ob du mehr Formatangaben als Variablen hast, aber das ist nicht der Fall.
    Eine Mengenbegrenzung bei Format ist mir noch nicht aufgefallen. 😕



  • hab mal step bei Step Variablen raus genommen und wieder eingefügt und habe festegestellt dass meine Artikelnummer wohl ärger macht!
    Da steht z.B. das hier drin

    ACR-1-R 1 1 M27c

    was ich aber noch viel viel komischer finde, es steht bullshit drin! ich mach
    format("blabla %d", m_Zaehler) wenn ich jetzt debugge und mir die Variablen anschau, dann steht der richtige wert drin, dennoch steht im obigen Beispiel im formatierten String "blabla 0" drin (m_Zaehler ist aber nicht 0) ich kopier mir jetzt momentan alles lokal in Variablen und setz dann die lokalen ein, dann geht es! Das kann doch nicht sein! Ich hab mich schon schier tot gelacht!



  • Komisch. 😕
    Aber jetzt gehts?



  • naja es geht einigermaßen, aber die Artikelnummer sollte da schon auch mit rein! Ich denk da wird es noch mehr Probleme geben wenn ich das so mache. Denn wie sende ich meinen EEPROM? Timestamp?? und und und hast du ne Ahnung wie ich das mit der direkten Insert into from other DB hinbekommen könnte? Ich muss doch irgendwie auch daten über 2 DBs joinen können also sollte ich doch auch selecten können über 2 DBs! das muss gehen!

    Das Problem mit dem format, schau dir das mal hier an.



  • Alles neu erstellen? 😕
    Sowas ist unnormal. Was ist m_Zaehler für ein Typ? Ein long?

    Häng die Artikelnummer schlimmstenfalls per Zeichenkettenaddition rein. Aber eigentlich sollte auch das gehen. Ist doch normalerweise egal, was in einem String steht... 😕



  • double	m_Zaehler;
    

    Das mit der Artikelnummer ist mir völlig unbegreiflich! Ich weiß nicht ob da die DB ein Tab rein macht oder so. aber ich mein ich kann es ja in einen lokalen String kopieren. wie meinst du als Zeichenkette anhängen?? als char[]??

    Rebuild all bringt übrigens auch nichts!

    P.S.: Ich wär grad schier durchgedreht! Ich hab zwar ne Spalte Artikelnr erzeugen lassen aber nichts rein geschrieben. Ich schau in das Excelfile rein und es steht was drin! Ich hab gedacht ich geh die Wand hoch!
    Dann ist mir aber aufgefallen, dass die Motornummer so groß war dass es nur so aussah, es war aber auch genau an der Linie wo sonst der Strich ich Leerzeichen drin. Aber eigentlich kann der doch dann nicht einfach über mehrere Felder schreiben. Aber das ist ja ganz egal!



  • Ein double, die Null ist ein Rundungsfehler. 🙄
    Die Erklärung gibts irgendwo, hat was damit zu tun, wie doubles gespeichert werden.

    doubles musst du mit %f statt %d formatieren. Oder nimm einen long zum zählen - wieso zählst du überhaupt mit einer Kommazahl? 😕



  • aaaaaaaaaaahhhh

    warum ich mit double zähle kann ich dir nicht sagen, das sind alles die Datentypen wie sie auch in der DB stehen! Da hab ich nichts mit zu tun!

    Und das mit der Zeichenkette? char [] ??



  • Nö, CString.

    CString str1 = "Hallo";
    CString str2 = "Welt";
    CString str3 = str1 + " " str2;
    


  • OK sorry stand glaub aufm schlauch. Wenn ich es so mache, dann bringt er zwar kein Fehler beim formaten, aber beim schreiben ins File. dann führt er den Befehl gar nicht zu ende durch. Naja dann schieb ich das mal nach hinten vielleicht ergibt sich ja was.

    Aber ich hätte noch ne andere Frage wie mache ich ne meldung while working? Ich wollte einfach nen dialog erzeugen und wenn er fertig ist mit worken den Dialog destroyen aber wenn ich den dialog modale dann geht er mir gar nicht erst in meine export FKT bis ich aus dem Fenster zurück komm.

    Hast mir was schönes??



  • Naja, die Alternative ist ein nicht-modaler Dialog. Den machst du mit Create. 🙂
    Oder du schreibst einfach bevor es los geht

    CWaitCursor csr;
    

    und der User kriegt ne Sanduhr. 😃



  • 👍 so solls sein!
    Aber wenn wir grad schon am spinnen sind ( also ich halt) ich hätte gern nen Dialog in dem ich den Status in ner Progressbar darstelle (da es doch schon mal ein paar minuten gehen kann, bis 40000 Datensätze bei 156 Splaten konvertiert sind.)
    Was meinst du? schaff ICH sowas? Als Info ich counte ja eh schon immer die Teile, von dem her müsste ich das ja leicht errechnen können. Frage ist nur wie bekomme ich den Dialog mit der Progressbar in den Vordergrund, ohne dass es meinen Export blockiert??

    Dank dir, bist echt klasse!


Anmelden zum Antworten