Datensätze einer Tabelle (über DBGrid) exportieren / importieren?
-
@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 Tabellesind 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.
-
hmm wo finde ich infos zu diesen loader? haben eine paradox7 db drunter liegen???
-
Hallo
ich arbeite sehr viel mit Datenbanken
aber der Begriff "Loader für die Datenbanken" sagt mir nicht viel
kannst du das ein wenig weiter ausfuehren (Link)
(zB bei mySQL)MfG
Klaus
-
zum Beispiel:
-
Titanico schrieb:
hmm wo finde ich infos zu diesen loader? haben eine paradox7 db drunter liegen???
für Paradox müsste es sowas wie bei Mysql geben.
Schau aber mal nach wie Access das macht. Da gibs auch sowas. Paradox ist ja nicht so weit von Access entfernt und müsste eigentlich ähnliches ermöglichen.