Export von Daten aus DB



  • Hi zusammen, in meinem letzten Projekt hab ich gemerkt wenn man einfach mal druaf los proggt kann man unter Umständen nachher ganz schön ärgern weil man es doch anders hätte machen sollen. Drum frag ich mal euch, was ihr denn in meiner Situation am sinnigsten fändet.

    ALSO: Ich hab ein kleines Programm mit dem ich mir Daten aus ner DB nach bestimmten Kriterien schön darstellen kann. Jetzt habe ich die Aufgabe, wenn man sich dann seine Daten gefiltert hat ... dann soll das ganze exportiert werden. So und jetzt bin ich recht frei in meiner Entscheidung vorgeschlagen wurde mir aber noch das in ein .csv zu schreiben um danach evtl. wenn nötig als user die csv in Excel o.ä. zu importieren.
    Meine Idee war aber das direkt in ein Excelfile zu kopieren. Was ist besser, bzw. gibt es noch bessere Ideen?
    Kann ich wenn ich über den ODBC-Treiber in Excel schreibe zur Laufzeit eine Arbeitsmappe an einem bestimmten Ort (vom user gewählt) anlegen und dort dann hinein schreiben oder muss ich wirklich im ODBC-Treiber eine Arbeitsmappe wählen die dann quasi ne Temp ist und die dann an gewünschten Ort mit gewünschtem Namen kopieren? (wäre ja doof!)

    Für Ideen Tips und Tricks dank ich euch jetzt schon mal.



  • Mag sein, dass ich jetzt mit Kanonen auf Spatzen schieße, aber wie wäre es mit:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dtsprog/dtspscrobj_3xr9.asp

    So per Klicki-klicki kann man mal eben das Ergebnis eines Query in eine Exceltabelle stecken, ist total einfach - nur leider hab ich KEINE Ahnung, wie man das von einem Programm aus macht, aber in der Einleitung steht was von VC++. 😉



  • öhm hört sich gut aber sehr komplex an, hab sehr bangel, dass ich das pack! 😞 Mit Kanonen auf Spatzen schießen ist immer gut! Wird sich hier außer mir keiner beschweren! 🙂



  • Das einfachste ist sicherlich die CSV-Datei. 🙂

    Falls du rausfindest, wie das Excelformat aussieht, wäre das natürlich auch nicht schlecht - aber da weiß ich nicht wirklich, wo man suchen soll. Hab nur das Stichwort XML im Hinterkopf und keine Ahnung wie ich darauf komme und ob es hilft. 😕



  • 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 [] ??


Anmelden zum Antworten