Datensätze einer Tabelle (über DBGrid) exportieren / importieren?



  • Bitte gleich letzten Beitrag anschauen da steht das Problem, Danke!

    Hallo ich mal wieder,
    bitte nicht schlagen in der Suche habe ich nichts gefunden.

    Wie könnte man es denn lösen die in einem DBGrid angezeigten Datensätze einer zugrundeliegenden Paradox7 Tabelle in eine Datei (Text oder Trennzeichen getrennt oder am besten direkt Excel) zu exportieren bzw. davon zu importieren (am idealsten mit der Option Anhängen bzw. ersetzen)

    Wie ein Open / Save Dialog Funktioniert ist klar, aber wie komm ich an die im DBGrid angezeigten Datensätze ran um sie zu exportieren / importieren?


  • Mod

    Hallo

    dein DBGrid ist nur eine Anzeige deiner Datenbank

    Zugriff ueber (hoffentlich sio richtig)

    DBGRrid->DataSource->....->FieldByName....

    Schau mal (F1) in die Hilfe des Builder (gibt da ein gutes Beispiel)

    MfG
    Klaus



  • danke für den tipp leider kann ich immer noch keinen ansatz finden..



  • Du könntest die angezeigten Daten in Variablen speichern, das ganze dann über einen save dialog speichern. Für Excel geht es glaube ich, es als .xls Tabelle zuspeichern und die Daten kommagetrennt in die Datei zu schreiben, bin aber net sicher



  • Titanico,

    die Funktionen/properties, die Dir weiterhelfen könnten heißen "FieldByName" (schon erwähnt), "First", "Next" und "Eof" und gehören alle zu Deinem TDataSet-Nachkommen (z.B. TTable).



  • habe diesen beitrag in den FAQ für ein StringGrid gefunden

    http://www.c-plusplus.net/forum/viewtopic.php?t=39159

    wie könnte man Jansen´s lösung nu für ein DBGrid verwenden wäre dankbar für nen lösungsansatz.

    sorry bin totaler newbie und steh grad voll aufm schlauch 😕 😞 😕 😞



  • StringGrid und DBGrid haben bis auf das Aussehen nichts mit einander gemein, deshalb lässt sich der Ansatz der FAQ-Lösung beim DBGrid nicht anwenden.

    Wie schon gesagt, das DBGrid ist nur ein "Fenster" zu den Datensätzen in der jeweiligen Datenquelle, das StringGrid hingegen verwaltet die darin angezeigten Daten selbst.



  • hmm schade.. hätte mir das so einfach erhofft..
    wenn mir jemand bissl auf die sprünge helfen könnte wie die o.g. eigenschaften/methoden zum export/import richtig anwenden kann wäre ich super dankbar...

    Gruss



  • Hallo,

    ich würde Export/Import über eine CSV Datei machen.
    Infos über das Format findest du hier:
    http://www.wotsit.org/search.asp?s=database

    Über das DBGrid kommst du nicht an die Daten ran,
    wie schon von Jansen erwähnt wurde.

    So jetzt überleg mal woher den deine Daten kommen....
    JA genau, von dem Tabel bzw. Query das wiederum auf die DB zugreift.

    So und wenn man jetzt mal in der Hilfe schaut bei tabel/query, fällt einen
    auf, das es wie schon oben erwähnt wurde, das es ein FieldByName("DBFeld")->As.... gibt.

    So jetzt Springt man zum ersten Datensatz mit table/query->First();
    um auch sicherzugehen das beim Export auch vom ersten Datensatz begonnen wird.

    Man nehme jetzt evtl. eine while schleife und setzt den Abbruch auf table/query->Eof

    und natürlich nicht vergessen auch ein table/query->Next(); in der while Schleife einzubauen, sonnst kannste sehr sehr lange warten 😋

    und in dieser Schleife klapperst du jetzt alle Datensätze ab und speicherst deine Feldinhalte per FieldByName in die CSV Datei. (Tip: nehm eine TStringList >> siehe Hilfe)

    und übers Import reden wir wenn du den Export hast 😉 also step by step

    mfg
    VergissEs


  • Mod

    Hallo

    in deinem TDBGrid in OnDblClick
    schreib einfach

    TDataSet *pDS = DataSource....->DataSet;

    aSearch = pDS->Fields->Fields[0]->AsString;
    oder greif statt auf Fields auf FieldByName zu

    ansonsten (F1) Taste (wie schonmal gesagt)
    und
    versuch doch mal etwas rum
    (ausprobieren hat noch keinem (selten) etwas getan

    MfG
    Klaus



  • jo danke für die tipps...
    rumprobieren tu ich schon seit stunden nur als anfänger kann man da sehr schnell verzweifeln und wenn man nicht weiter kommt bringts ja auch nix...

    also für ein paar zeilen quelltext wäre ich imme rnoch dankbar 🙄

    ich versprech dann auch heute nicht mehr zu nerven 😃



  • Hallo,

    zeig mal deinen Quelltext, am besten die Stelle an der du scheiderst !

    mfg
    VergissEs



  • Hallo

    Wir haben nun dank der Hilfe,eine Lösung für den Export die uns zufriedenstellt.

    void __fastcall TFORanwendersuchen::BTNexportClick(TObject *Sender)
    {
    TStringList *ExportList = new TStringList; // Liste deklarieren
       	try{
               //Stringliste benutzen
               DTManwender->TABanwender->First();
    
               do
                {
                AnsiString s=DTManwender->TABanwender->FieldByName("Kennung")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Nachname")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Vorname")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Firma")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Abteilung")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Standort")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Raum")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Telefon")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Email")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Anlegedatum")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Ausscheidedatum")->AsString;
                s=s+";"+DTManwender->TABanwender->FieldByName("Inaktiv")->AsString;
                ExportList->Add(s);
    
                DTManwender->TABanwender->Next();
                }
    
               while (!DTManwender->TABanwender->Eof);
               SAVexport->InitialDir = "c:\\";
               SAVexport->Filter = "Comma Separated Values (*.csv)|*.csv";
               if (SAVexport->Execute())
               ExportList->SaveToFile(SAVexport->FileName);
       	   }
       	__finally
               {
               delete ExportList; // Stringlistenobjekt freigeben
    
       	   }
    
    }
    

    Wir haben ein wenig mit Excel herumprobiert und mit dem Semikolon als Trennzeichen wird alles korrekt eingelesen.
    Eine kleine Frage hätten wir noch:

    Wir haben beim Speichern angegeben das die Datei als .csv gespeichert werden soll. Wenn wir den Speicherdialog öffnen und einen Namen eingeben wird auch der Filter csv korrekt angezeigt.Wenn ich aber einen Dateinamen eingebe ohne Dateiendung fügt mir der Speicherdialog keine Dateiendung an.Und Excel bringt beim Öffnen erst mal den Assistenten zur Erkennung.
    Wenn die Dateierweiterung beim Speichern angegeben wird,funktiert es einwandfrei.
    haben wir einen Fehler gemacht oder muss man immer die Dateierweiterung beim Speichern von Hand eingeben?

    Danke im vorraus

    Titanico und sein verzweifelter Kollege 🙂

    PS:

    VergissEs schrieb:

    **und übers Import reden wir wenn du den Export hast 😉 also step by step

    mfg
    VergissEs**

    🤡 🤡 🤡



  • Hallo,

    schau dir mal DefaultExt an beim SaveDialog das müsste deine Frage beantworten.

    Kleine Anmerkungen zu der CSV Datei:
    - In der ersten Zeile sollten die Feldnamen deklariert werden, damit später die Feldzuordung überprüft werden kann.
    - Ihr müsst noch überprüfen bei den exportierten Datensätzen ob sich nicht im Text ein ; versteckt, fall ja, evtl. grob Fahrlässig rauslöschen oder den Text in Anführungzeichen stopfen wie es zB. die Excel CSV-Exportfunktion macht, das wiedrum muss natürlich bei der Importfunktion berücksichtigt werden.

    mfg
    VergissEs



  • So wie gesagt, die export Funktion haben wir fertig, hier nochmal falls es wen interessiert wie diese ausschaut:

    void __fastcall TFORanwendersuchen::MMEexportierenClick(TObject *Sender)
    {
    //Liste ExportList deklarieren
    TStringList *ExportList = new TStringList;
    
    //in erste Zeile der Liste die Spaltenüberschriften schreiben
    AnsiString s = "Kennung;Nachname;Vorname;Firma;Abteilung;Standort;Raum;";
           s = s + "Telefon;Email;Anlegedatum;Ausscheidedatum;Inaktiv";
    ExportList->Add(s);
    
    try
     {
     //zum ersten Datensatz springen
     DTManwender->TABanwender->First();
     do
      {
      //alle Datensätze der Tabelle bis Eof mit ; getrennt in die Liste schreiben
      AnsiString s = DTManwender->TABanwender->FieldByName("Kennung")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Nachname")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Vorname")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Firma")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Abteilung")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Standort")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Raum")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Telefon")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Email")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Anlegedatum")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Ausscheidedatum")->AsString;
       s = s + ";" + DTManwender->TABanwender->FieldByName("Inaktiv")->AsString;
      ExportList->Add(s);
      DTManwender->TABanwender->Next();
      }
     while (!DTManwender->TABanwender->Eof);
    
     //Save-Dialog einstellen und die Liste entsprechend FileName als csv speichern
     SAVexport->InitialDir = "c:\\";
     SAVexport->Filter = "Comma Separated Values (*.csv)|*.csv";
     SAVexport->DefaultExt = "csv";
     if (SAVexport->Execute())
      ExportList->SaveToFile(SAVexport->FileName);
     }
    __finally
     {
     //Stringlistenobjekt freigeben
     delete ExportList;
     }
    }
    

    Jetzt sind wir dran die Import Funktion dafür zu erstellen und scheitern daran die Strings die in unserer definierten ImportList stehen in die einzelnen Felder der Tabelle zu schreiben, also das was im do Block passieren soll (siehe Kommentar im Quelltext):

    void __fastcall TFORanwendersuchen::MMEimportierenClick(TObject *Sender)
    {
    //Liste ImportList deklarieren
    TStringList *ImportList = new TStringList;
    
    try
     {
     //zum letzten Datensatz springen
     DTManwender->TABanwender->Last();
    
     //Open-Dialog einstellen und die Liste entsprechend FileName als csv laden
     OPNimport->InitialDir = "c:\\";
     OPNimport->Filter = "Comma Separated Values (*.csv)|*.csv";
     OPNimport->DefaultExt = "csv";
     if (OPNimport->Execute())
      ImportList->LoadFromFile(OPNimport->FileName);
    
     //löscht die erste Zeile die Spaltenüberschriften enthält
     ImportList->Delete(0);
    
     //weist c die Anzahl der Zeilen der ImportList zu
     int c = ImportList->Count;
     int i = 0;
    
     //funzt das so??
     ImportList->Delimiter = ';';
    
     do
      {
      //versetzt die Tabelle jedesmal beim Bearbeiten einer Zeile in den Insert-Mode
      DTManwender->TABanwender->Insert();
    
      //????????wie können wir hier die Strings in der ImportList die jetzt so
      //drinstehen:
      //<Kennung>;<Nachname>;<Vorname>;Firma usw...
      //in unsere Felder der Tabelle schreiben:
      //DTManwender->TABanwender->FieldByName("Kennung")->AsString = ??????
      //DTManwender->TABanwender->FieldByName("Nachname")->AsString = ??????
      //DTManwender->TABanwender->FieldByName("Vorname")->AsString = ??????
    
      //Importierte Zeile speichern
      DTManwender->TABanwender->Post();
      c--;
      //nächste Zeile der ImportListe
      ImportList->Strings[i+1];
      }
     while (c > 0);
    
     }
    __finally
     {
     //Stringlistenobjekt freigeben
     delete ImportList;
     }
    }
    

    Flehend um Hilfe bittend Titanico und sein Klassenkollege 😕



  • muss leider nochmal um hilfe für obiges problem bitten...
    kommen einfach nicht weiter (siehe letzter Beitrag), jede hilfe wilkommen.. danke

    ----------
    titanico@web.de



  • ähm,

    es gibt für die meisten Datenbanken einen Loader, der solche Dateien einliest und in eine Tablle schmeisst...

    Mit welcher Datenbank arbeitest du ?


  • Mod

    Hallo

    meinen Beitrag hast du gelesen und verstanden, sowie ausprobiert
    So funktioniert es unabhaengig welche DB du verwendest
    Hat dabei irgenwas nicht funktioniert
    oder liest du solche Posts nicht 😕 😞

    MfG
    Klaus



  • @ KlausB,

    ich habe jetzt deine Beiträge gelesen aber nix von deiner gerad erwähnten
    "unabhaengige Funktion" gefunden ? 😕

    mfg
    VergissEs


  • Mod

    Hallo

    TDataSet *pDS = DataSource....->DataSet;
    aSearch = pDS->Fields->Fields[0]->AsString;

    hast du also schon versucht oder 😕

    und was war das Ergebnis

    MfG
    Klaus



  • @Klaus,

    KlausB schrieb:

    hast du also schon versucht oder 😕

    und was war das Ergebnis

    ich brauche es nicht zu versuchen da Titanico das Problem hat,
    und der greift mit
    DTManwender->TABanwender->FieldByName("")->AsString darauf zu.
    Ich Frage mich zwar immernoch was das jetzt mit seinen neuen Problem zu tun hat (import der csv, also zeilen parsen.) aber was soll's.

    @Titanico
    du hast doch in der ersten CSV Zeile die Feldnamen stehen (die du im Code rauslöscht). Vergleiche erst ob diese Zeile mit der exportierten ersten Zeile übereinstimmt (soll eine kleine Überprüfung werden, nicht das dein Benutzer eine andere CSV importiert und somit Datenmüll in deiner DB ist)
    falls dieses Zutrifft brauchst du nur noch die einzelnen Zeilen auseinanderlegen evtl. mit Pos SubString usw. und deinen Datenfeldern zuweisen.

    ImportList->Delimiter = ';';
    ist glaub ich erst bei BCB 6.0 dabei ka hab nur 5.0 Prof evtl. gehts damit einfacher.

    mfg
    VergissEs


Anmelden zum Antworten