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


  • 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



  • danke erst mal für die beiträge, gelesen habe ich natürlich alles und hat mir sehr weitergeholfen.

    VergissEs schrieb:

    ...brauchst du nur noch die einzelnen Zeilen auseinanderlegen evtl. mit Pos SubString usw. und deinen Datenfeldern zuweisen.

    ImportList->Delimiter = ';';
    ...

    genau darin liegt das konkrete problem wie kann man sagen, nimm den string bis ein semikolon kommt und packe das mit DTManwender->TABanwender->FieldByName("")->AsString in das entsprechende feld.

    mit SubString kann ich ja nur eine feste zeichenanzahl angeben.

    also wie kann ich meine strings anhand des ; aufteilen und in meine einzelnen db-felder schreiben??????

    ps: jo habe bcb 6 prof aber delimiter zu setzten alleine reicht auch nicht, die aufteilung muss man ja trotzdem noch irgendwie machen

    danke nochmals und gruss



  • Hallo,

    also wie gesagt ich kann Delimiter nicht nachvollziehen da ich BCB 5 hab
    aber in der suchfunktion (hier im forum) hab ich dieses hier gefunden

    http://www.c-plusplus.net/forum/viewtopic.php?t=47363&highlight=delimiter

    das müsste dich weiter bringen

    falls du es aber doch mit SubString probieren willst gehe wie folgt vor:
    - zieh dir eine zeile aus der TStringList raus

    [begin]schleife bis kein ; mehr vorhanden ist in der zeile
    - suche nach den ersten vorkommenden ; mittels Pos
    - extrahiere den text bis zum ersten ; mit SubString jetzt haste ein Feld
    - lösche in der zeile den extrahierten Text evtl. mit SubString
    von der ersten position des ; bist zum Count
    [END]

    mfg
    VergissEs



  • @VergissEs
    Ich schulde dir ein Bierchen, Vielen Dank!!! 👍

    Hier der fertige Import falls jemand anders auch so was ähnliches braucht:

    void __fastcall TFORanwendersuchen::MMEimportierenClick(TObject *Sender)
    {
    //Liste ImportList deklarieren für die eingelesenen Zeilen
    TStringList *ImportList = new TStringList;
    //Liste FeldList deklarieren für die aufgetrennten Felder
    TStringList *FieldList  = new TStringList;
    
    //Trennzeichen und Texterkennungszeichen zuweisen
    FieldList->Delimiter = ';';
    FieldList->QuoteChar = '"';
    
    try
     {
     //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);
    
     //erste Zeile welche Spaltenüberschriften enthält in FieldList auftrennen
     //um zu prüfen ob die richtige Datei vorliegt
     FieldList->DelimitedText = ImportList->Strings[0];
     if (FieldList->Count == 13 && FieldList->Strings[0] == "Kennung" &&
         FieldList->Strings[1] == "Nachname" &&
         FieldList->Strings[2] == "Vorname" &&
         FieldList->Strings[3] == "Firma" &&
         FieldList->Strings[4] == "Abteilung" &&
         FieldList->Strings[5] == "Standort" &&
         FieldList->Strings[6] == "Raum" &&
         FieldList->Strings[7] == "Telefon" &&
         FieldList->Strings[8] == "Email" &&
         FieldList->Strings[9] == "Anlegedatum" &&
         FieldList->Strings[10] == "Ausscheidedatum" &&
         FieldList->Strings[11] == "Aenderungsdatum" &&
         FieldList->Strings[12] == "Inaktiv")
      {
      //löscht die erste Zeile welche die Spaltenüberschriften enthält
      ImportList->Delete(0);
      //Anzahl der Datensätze in der Import Liste sichern um später die Meldung in
      //Status Bar auszugeben
      int anzahl = ImportList->Count;
    
      for (int i = 0; i = ImportList->Count; i++)
       {
       //Den String der ImportList auftrennen und Zeilenweise in die FieldList schreiben
       FieldList->DelimitedText = ImportList->Strings[0];
    
       //zum letzten Datensatz springen
       DTManwender->TABanwender->Last();
       //Tabelle in Insert Modus bringen
       DTManwender->TABanwender->Insert();
    
       //Daten der FieldList in die einzelnen Felder schreiben
       DTManwender->TABanwender->FieldByName("Kennung")->AsString =
                                                            FieldList->Strings[0];
       DTManwender->TABanwender->FieldByName("Nachname")->AsString =
                                                            FieldList->Strings[1];
       DTManwender->TABanwender->FieldByName("Vorname")->AsString =
                                                            FieldList->Strings[2];
       DTManwender->TABanwender->FieldByName("Firma")->AsString =
                                                            FieldList->Strings[3];
       DTManwender->TABanwender->FieldByName("Abteilung")->AsString =
                                                            FieldList->Strings[4];
       DTManwender->TABanwender->FieldByName("Standort")->AsString =
                                                            FieldList->Strings[5];
       DTManwender->TABanwender->FieldByName("Raum")->AsString =
                                                            FieldList->Strings[6];
       DTManwender->TABanwender->FieldByName("Telefon")->AsString =
                                                            FieldList->Strings[7];
       DTManwender->TABanwender->FieldByName("Email")->AsString =
                                                            FieldList->Strings[8];
       DTManwender->TABanwender->FieldByName("Anlegedatum")->AsString =
                                                            FieldList->Strings[9];
       DTManwender->TABanwender->FieldByName("Ausscheidedatum")->AsString =
                                                           FieldList->Strings[10];
       DTManwender->TABanwender->FieldByName("Aenderungsdatum")->AsString =
                                                           FieldList->Strings[11];
       DTManwender->TABanwender->FieldByName("Inaktiv")->AsString =
                                                           FieldList->Strings[12];
       //Importierten Datensatz speichern
       DTManwender->TABanwender->Post();
       //erste Zeile der ImportList löschen damit die nächste Zeile in den Index 0
       //rückt um importiert zu werden
       ImportList->Delete(0);
       }
      //Meldung in Statusleiste ausgeben nachdem importiert wurde
      AnsiString t = " ";
            t = t + anzahl;
            t = t + " Datensätze importiert";
      TIMmeldungen->Enabled = true;
      STBanwender->Panels->Items[0]->Text = t;
      } //ende if Block
     else
      {
      ShowMessage("Datei konnte nicht importiert werden, Falsches Format!\n"
                  "Datei muss folgende Spalten enthalten:\n"
                  "\"Kennung\";\"Nachname\";\"Vorname\";\"Firma\";\"Abteilung\";"
                  "\"Standort\";\"Raum\";\"Telefon\";\"Email\";\"Anlegedatum\";"
                  "\"Ausscheidedatum\";\"Aenderungsdatum\";\"Inaktiv\"\n"
                  "Trennzeichen: ;\nTexterkennungszeichen: \"");
      }
     } //ende try Block
    __finally
     {
     //Stringlistenobjekte freigeben
     delete ImportList;
     delete FieldList;
     }
    }
    

    gruss Titanico



  • Schön, dass ihr es hinbekommen habt. Dann können wir uns ja mal an's Feintuning machen. 🙂

    Vorschlag für die Prüfung, ob eine gültige Datei geladen wurde:

    if (TABanwender->FieldDefList->DelimitedText == ImportList->Strings[0])
    {
      ImportList->Delete(0);
      ...
    

    Vorschlag für Zuweisung der Werte:

    // für alle Zeilen in der Datei
    for (int i = 0; i = ImportList->Count; i++)
    {
      FieldList->DelimitedText = ImportList->Strings[i];
      TABanwender->Last();   
      TABanwender->Insert(); 
    
      // für allei Einträge in einer Zeile
      for (int j = 0; j < FieldList->Count; j++)
        TABanwender->Fields->Fields[j]->AsString = FieldList->Strings[j];
    
      TABanwender->Post();
    }
    

    Ungestestet, soll dir nur als Anregung dienen.



  • danke für die tips jansen, aber ich glaube das funzt in unsrem fall nicht da wir nicht alle felder der tabelle importieren / exportieren. die tabelle hat zusätzlich noch ein memo feld, deshalb können wir diese elegantere variante nicht verwenden.

    habe in unsren bisherigen Import aber noch eine prüfung eingebaut ob der schlüssel der tabelle (Kennung) schon vorhanden ist. in diesem fall wird der Datensatz nicht importiert und es wird eine fehlermeldung gezeigt.

    falls das vielleicht auch mal wer braucht:

    void __fastcall TFORanwendersuchen::MMEimportierenClick(TObject *Sender)
    {
    //Liste ImportList deklarieren für die eingelesenen Zeilen
    TStringList *ImportList = new TStringList;
    //Liste FeldList deklarieren für die aufgetrennten Felder
    TStringList *FieldList  = new TStringList;
    
    //Trennzeichen und Texterkennungszeichen zuweisen
    FieldList->Delimiter = ';';
    FieldList->QuoteChar = '"';
    
    try
     {
     //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);
    
     //erste Zeile welche Spaltenüberschriften enthält in FieldList auftrennen
     //um zu prüfen ob die richtige Datei vorliegt
     FieldList->DelimitedText = ImportList->Strings[0];
     if (FieldList->Count == 13 && FieldList->Strings[0] == "Kennung" &&
         FieldList->Strings[1] == "Nachname" &&
         FieldList->Strings[2] == "Vorname" &&
         FieldList->Strings[3] == "Firma" &&
         FieldList->Strings[4] == "Abteilung" &&
         FieldList->Strings[5] == "Standort" &&
         FieldList->Strings[6] == "Raum" &&
         FieldList->Strings[7] == "Telefon" &&
         FieldList->Strings[8] == "Email" &&
         FieldList->Strings[9] == "Anlegedatum" &&
         FieldList->Strings[10] == "Ausscheidedatum" &&
         FieldList->Strings[11] == "Aenderungsdatum" &&
         FieldList->Strings[12] == "Inaktiv")
      {
      //löscht die erste Zeile welche die Spaltenüberschriften enthält
      ImportList->Delete(0);
      //Anzahl der Datensätze in der ImportList sichern um später die Meldung in
      //Status Bar auszugeben
      int anzahl = ImportList->Count;
    
      //Importschleife
      for (int i = 0; i = ImportList->Count; i++)
       {
       //Den String der ImportList auftrennen und Zeilenweise in die FieldList schreiben
       FieldList->DelimitedText = ImportList->Strings[0];
    
       //Tabelle nach der zu importierenden Kennung Filtern um zu prüfen ob
       //noch nicht vorhanden (dazu muss Suchtimer abgeschaltet werden)
       DTManwender->TABanwender->Filter = "Kennung = '"+FieldList->Strings[0]+"'";
       DTManwender->TABanwender->Filtered = true;
       TIManwendersuche->Enabled = false;
       //Kennung darf nicht gefunden werden damit importiert werden kann
       if (DTManwender->TABanwender->RecordCount == 0)
        {
        //Filter wieder wegnehmen und Suchtimer anschalten
        DTManwender->TABanwender->Filtered = false;
        TIManwendersuche->Enabled = true;
    
        //zum letzten Datensatz springen
        DTManwender->TABanwender->Last();
        //Tabelle in Insert Modus bringen
        DTManwender->TABanwender->Insert();
    
        //Daten der FieldList in die einzelnen Felder schreiben
        DTManwender->TABanwender->FieldByName("Kennung")->AsString =
                                                            FieldList->Strings[0];
        DTManwender->TABanwender->FieldByName("Nachname")->AsString =
                                                            FieldList->Strings[1];
        DTManwender->TABanwender->FieldByName("Vorname")->AsString =
                                                            FieldList->Strings[2];
        DTManwender->TABanwender->FieldByName("Firma")->AsString =
                                                            FieldList->Strings[3];
        DTManwender->TABanwender->FieldByName("Abteilung")->AsString =
                                                            FieldList->Strings[4];
        DTManwender->TABanwender->FieldByName("Standort")->AsString =
                                                            FieldList->Strings[5];
        DTManwender->TABanwender->FieldByName("Raum")->AsString =
                                                            FieldList->Strings[6];
        DTManwender->TABanwender->FieldByName("Telefon")->AsString =
                                                            FieldList->Strings[7];
        DTManwender->TABanwender->FieldByName("Email")->AsString =
                                                            FieldList->Strings[8];
        DTManwender->TABanwender->FieldByName("Anlegedatum")->AsString =
                                                            FieldList->Strings[9];
        DTManwender->TABanwender->FieldByName("Ausscheidedatum")->AsString =
                                                           FieldList->Strings[10];
        DTManwender->TABanwender->FieldByName("Aenderungsdatum")->AsString =
                                                           FieldList->Strings[11];
        DTManwender->TABanwender->FieldByName("Inaktiv")->AsString =
                                                           FieldList->Strings[12];
        //Importierten Datensatz speichern
        DTManwender->TABanwender->Post();
        //erste Zeile der ImportList löschen damit die nächste Zeile in den Index 0
        //rückt um importiert zu werden
        ImportList->Delete(0);
        }
       else   //falls die zu importierende Kennung bereits in Tabelle vorhanden ist
        {     //Fehlermeldung anzeigen. Filter bleibt aktiv d.h. man sieht im DBGrid
              //und in der Meldung die Kennung die bereits vorhanden ist
        ShowMessage("Import des Anwenders: "+FieldList->Strings[0]+"\n"
                    "konnte nicht durchgeführt werden!\n"
                    "Kennung ist in der Tabelle bereits vorhanden!\n");
    
        //Fehlerhafte Zeile aus der ImportList löschen damit Import-Schleife nach
        //bestätigen der ShowMessage weiter arbeiten kann
        ImportList->Delete(0);
        //Anzahl der importierten Datensätze wird vermindert da dieser ja nicht
        //importiert wurde
        anzahl--;
        }
       }  //ende Import-Schleife (for)
      //falls nur Fehlerhafte Zeilen im import waren Filter aus- und Timer wieder ein
      DTManwender->TABanwender->Filtered = false;
      TIManwendersuche->Enabled = true;
      //Meldung in Statusleiste ausgeben nachdem importiert wurde
      AnsiString t = " ";
            t = t + anzahl;
            t = t + " Datensätze importiert";
      TIMmeldungen->Enabled = true;
      STBanwender->Panels->Items[0]->Text = t;
      } //ende if Block
     else
      {
      ShowMessage("Datei konnte nicht importiert werden, Falsches Format!\n"
                  "Datei muss folgende Spalten enthalten:\n"
                  "\"Kennung\";\"Nachname\";\"Vorname\";\"Firma\";\"Abteilung\";"
                  "\"Standort\";\"Raum\";\"Telefon\";\"Email\";\"Anlegedatum\";"
                  "\"Ausscheidedatum\";\"Aenderungsdatum\";\"Inaktiv\"\n"
                  "Trennzeichen: ;\nTexterkennungszeichen: \"");
      }
     } //ende try Block
    __finally
     {
     //Stringlistenobjekte freigeben
     delete ImportList;
     delete FieldList;
     }
    }
    


  • Ich kenne ja eure genaue Aufgabenstellung nicht, bin mir aber absolut sicher, dass sich das eleganter, ohne expliziten Bezug auf die Feldnamen lösen lässt.
    Und du/ihr solltet euch das auch unbedingt noch mal durch den Kopf gehen lassen, die derzeitige Lösung ist durch besagten expliziten Bezug nämlich äusserst unflexibel. Sowohl was potentielle Änderungen an der Tabelle betrifft als auch in Hinsicht auf die allgemeine Wiederverwendbarkeit des Codes.



  • jo denke ich auch....
    sind immo aber heilfroh überhaupt so erst mal was reinzubekommen in die Tabelle

    sind grad noch dabei eine längenprüfung vor dem import einzubauen, da werden wir sicher auch wieder hilfe brauchen 😃



  • und noch einmal: es gibt dafür Loader für die Datenbanken !
    Die sind wesentlich schneller und sicherer.


Anmelden zum Antworten