Hoeen Geschrieben 14. Februar 2002 Geschrieben 14. Februar 2002 Hi! Ich möchte in meinem Excel-Import Programm (importiert Excel Tabellen in eine Datenbank) Dubletten herausfiltern. Also Daten, die es in der Datenbank schon gibt, sollen nicht noch einmal reingeschrieben werden. Weiß jemand, wie ich das anstellen kann? Ich bin noch blutjunger Anfänger in Datenbank-Programmierung. Meine Idee sieht so aus. Hier die beiden wichtigen Funktionen: void TFrExport::Zuweisen() { int i; struct wert zeile; ErrorLine = 1; for (i=1; i<=16384; i++) if (GetCellData(AlphaCol2Num(CbFirma1->Text), i) != "") { zeile.Nummer = i+10000; /* plus groesste Nummer aus der export-datei (doppelte vermeiden)*/ zeile.Name_1 = GetCellData(AlphaCol2Num(CbFirma1->Text), i); zeile.Name_2 = GetCellData(AlphaCol2Num(CbFirma2->Text), i); zeile.Strasse_1 = GetCellData(AlphaCol2Num(CbStrasse1->Text), i); zeile.Strasse_2 = GetCellData(AlphaCol2Num(CbStrasse2->Text), i); zeile.PLZ = GetCellData(AlphaCol2Num(CbPLZ->Text), i); zeile.Ort = GetCellData(AlphaCol2Num(CbOrt->Text), i); zeile.Land = GetCellData(AlphaCol2Num(CbLand->Text), i); zeile.Vorwahl_Telefon_1 = GetCellData(AlphaCol2Num(CbVorTel1->Text), i); zeile.Telefon_1 = GetCellData(AlphaCol2Num(CbFon1->Text), i); zeile.Vorwahl_Telefon_2 = GetCellData(AlphaCol2Num(CbVorTel2->Text), i); zeile.Telefon_2 = GetCellData(AlphaCol2Num(CbFon2->Text), i); zeile.Vorwahl_Telefax = GetCellData(AlphaCol2Num(CbVorFax->Text), i); zeile.Telefax = GetCellData(AlphaCol2Num(CbFax->Text), i); zeile.E_Mail_1 = GetCellData(AlphaCol2Num(CbMail1->Text), i); zeile.E_Mail_2 = GetCellData(AlphaCol2Num(CbMail2->Text), i); zeile.Homepage = GetCellData(AlphaCol2Num(CbPage->Text), i); zeile.Bemerkung = GetCellData(AlphaCol2Num(CbBem->Text), i); zeile.Anrede = GetCellData(AlphaCol2Num(CbAnrede->Text), i); zeile.Vorname= GetCellData(AlphaCol2Num(CbVorname->Text), i); zeile.Nachname= GetCellData(AlphaCol2Num(CbNachname->Text), i); zeile.BemerkungPartner = GetCellData(AlphaCol2Num(CbBemPartner->Text), i); TranslateAnrede(zeile.Anrede); if (!CheckError(zeile)) { InsertIntoFile(zeile); } else { ReportError(zeile); } } } //--------------------------------------------------------------------------- bool TFrExport::CheckError(struct wert zeile) { int LandId; QrSelect->Open(); if ((LandId = TranslateLand(zeile.Land)) == -1) return true; if (QrSelect->FieldByName("name_1")->Text == zeile.Name_1) return false; return false; } //--------------------------------------------------------------------------- Das rote ist das entscheidene. Leider funzt es nicht! Habt ihr eine Idee??? Gruß Hoeen Zitieren
Klotzkopp Geschrieben 14. Februar 2002 Geschrieben 14. Februar 2002 Was heißt 'funzt nicht'? Laufzeitfehler, Compile-Fehler oder tut es nicht, was es soll? Was für ein Datentyp ist Text, und was ist Name_1? Brauchst Du vielleicht einen Copy-Constructor für die struct? Zitieren
Hoeen Geschrieben 14. Februar 2002 Autor Geschrieben 14. Februar 2002 NeNe, das Programm läuft schon, also kein Fehler, leider macht es nicht das, was es soll. Es schreibt also die doppelten Daten trotzdem in die Datenbank. Text ist glaube ich ein AnsiString, kannste aber in der Borland Hilfe gucken...kann mich aber auch vertuen. Name_1 ist eine Tabellenspalte in meiner SQL-Datenbank, in der die Daten sind, die nicht doppelt sein sollen. Zitieren
Klotzkopp Geschrieben 14. Februar 2002 Geschrieben 14. Februar 2002 Bei Name_1 wollte ich auch den Datentyp wissen, sorry, falls das falsch rüberkam. Kann ja sein, dass der Vergleichsoperater nicht das macht, was Du erwartest. Ist mir grad aufgefallen: Das rot markierte if-Statement ist komplett sinnfrei. Wenn die Bedingung erfüllt ist, gibst Du false zurück, wenn nicht, gibst Du auch false zurück. :confused: Vielleicht stimmt hier die Reihenfolge nicht? Zitieren
Hoeen Geschrieben 14. Februar 2002 Autor Geschrieben 14. Februar 2002 Is klar, da muss true hin (also beim rotmakierten if-Statement)! Habe ich nur vergessen zu ändern. Läuft aber trotzdem nicht so, wie ich möchte! Hier der SQL-Code für QrSelect: select name_1, count (name_1) c from firma group by name_1 order by c desc Hier noch meine struct: struct wert { int Nummer; AnsiString Name_1; AnsiString Name_2; AnsiString Strasse_1; AnsiString Strasse_2; AnsiString PLZ; AnsiString Ort; AnsiString Land; AnsiString Vorwahl_Telefon_1; AnsiString Telefon_1; AnsiString Vorwahl_Telefon_2; AnsiString Telefon_2; AnsiString Vorwahl_Telefax; AnsiString Telefax; AnsiString E_Mail_1; AnsiString E_Mail_2; AnsiString Homepage; AnsiString Bemerkung; AnsiString Vorname; AnsiString Nachname; AnsiString Anrede; AnsiString BemerkungPartner; }; So, das wäre dann schon fast mein kompletter Code Zitieren
Klotzkopp Geschrieben 14. Februar 2002 Geschrieben 14. Februar 2002 Ich gehe mal davon aus (und die Borland-Experten mögen mich ggf. korrigieren), dass AnsiString einen überladenen Vergleichsoperator hat. Der Vergleich wäre damit kein Problem. Aber die SQL-Abfrage liefert dir eine Row pro name_1, und Du vergleichst nur mit der ersten. Entweder musst Du mit allen Rows vergleichen (QrSelect bietet dafür wahrscheinlich einen Mechanismus, der MoveNext oder so heißt), oder Du könntest die Abfrage mit zeile.Name_1 parametrieren. Zitieren
Hoeen Geschrieben 18. Februar 2002 Autor Geschrieben 18. Februar 2002 HILFE!!! Ich habe immer noch keine Idee!!! Leider habe ich keine Ahnung, wie ich das Problem lösen kann. Ich habe noch einmal ein Stück umgeschreiben. Vielleicht kann ja nochmal jemand darüber nachdenken. Wäre voll nett!!! void TFrExport::Zuweisen() { int i, finr; struct wert zeile; ErrorLine = 1; for (i=1; i<=16384; i++) if (GetCellData(AlphaCol2Num(CbFirma1->Text), i) != "") { zeile.Nummer = i+10000; /* plus groesste Nummer aus der export-datei */ zeile.Name_1 = GetCellData(AlphaCol2Num(CbFirma1->Text), i); zeile.Name_2 = GetCellData(AlphaCol2Num(CbFirma2->Text), i); zeile.Strasse_1 = GetCellData(AlphaCol2Num(CbStrasse1->Text), i); zeile.Strasse_2 = GetCellData(AlphaCol2Num(CbStrasse2->Text), i); zeile.PLZ = GetCellData(AlphaCol2Num(CbPLZ->Text), i); zeile.Ort = GetCellData(AlphaCol2Num(CbOrt->Text), i); zeile.Land = GetCellData(AlphaCol2Num(CbLand->Text), i); zeile.Vorwahl_Telefon_1 = GetCellData(AlphaCol2Num(CbVorTel1->Text), i); zeile.Telefon_1 = GetCellData(AlphaCol2Num(CbFon1->Text), i); zeile.Vorwahl_Telefon_2 = GetCellData(AlphaCol2Num(CbVorTel2->Text), i); zeile.Telefon_2 = GetCellData(AlphaCol2Num(CbFon2->Text), i); zeile.Vorwahl_Telefax = GetCellData(AlphaCol2Num(CbVorFax->Text), i); zeile.Telefax = GetCellData(AlphaCol2Num(CbFax->Text), i); zeile.E_Mail_1 = GetCellData(AlphaCol2Num(CbMail1->Text), i); zeile.E_Mail_2 = GetCellData(AlphaCol2Num(CbMail2->Text), i); zeile.Homepage = GetCellData(AlphaCol2Num(CbPage->Text), i); zeile.Bemerkung = GetCellData(AlphaCol2Num(CbBem->Text), i); zeile.Anrede = GetCellData(AlphaCol2Num(CbAnrede->Text), i); zeile.Vorname= GetCellData(AlphaCol2Num(CbVorname->Text), i); zeile.Nachname= GetCellData(AlphaCol2Num(CbNachname->Text), i); zeile.BemerkungPartner = GetCellData(AlphaCol2Num(CbBem->Text), i); zeile.E_Mail_1Partner = GetCellData(AlphaCol2Num(CbMail1->Text), i); QrSelect->Open(); QrSelect->ParamByName("finr")->AsInteger = finr; if (QrSelect->FieldByName("name_1")->Text == GetCellData(AlphaCol2Num(CbFirma1->Text), i)){ ReportError(zeile); } else{ TranslateAnrede(zeile.Anrede); if (!CheckError(zeile)) { InsertIntoFile(zeile); } else { ReportError(zeile); } } QrSelect->Close(); } } Das blaue ist wieder das entscheidene! Danke und Gruß Hoeen Zitieren
Klotzkopp Geschrieben 18. Februar 2002 Geschrieben 18. Februar 2002 Also da fallen mir zwei Sachen auf: Erstens wird finr nirgend initialisert, zweitens kommt das ParamByName wohl vor das Open, zumindest hast Du es hier so gemacht. Zitieren
Hoeen Geschrieben 18. Februar 2002 Autor Geschrieben 18. Februar 2002 Original geschrieben von Klotzkopp zweitens kommt das ParamByName wohl vor das Open, zumindest hast Du es hier so gemacht. Naja, eigentlich ist das egal, denke ich zumindest! Leider habe ich inzwischen keine Ahnung mehr, wo ich gucken soll :confused: :confused: :confused: Naja, bin mal gespannt, wie lange wir beide hier noch diskutieren werden. Irgendwann muss es doch klappen!!! Ach ja, das FiNr ist eigentlich auch völlig unwichtig! Das habe ich rausgenommen. Das waren alles nur Tests, die ich verzweifelt getan habe! Zitieren
Hoeen Geschrieben 21. Februar 2002 Autor Geschrieben 21. Februar 2002 @klotzkopp: Es läuft endlich!!! Ich habe einfach noch eine Funktion eingebracht: //--------------------------------------------------------------------------- bool TFrExport::FindDouble (struct wert zeile) { AnsiString t; QrSelect->Open(); if (!QrSelect->IsEmpty()) do{ t = QrSelect->FieldByName("name_1")->AsString; if (t == zeile.Name_1){ QrSelect->Close(); return true; } } while (QrSelect->FindNext()); QrSelect->Close(); return false; } //--------------------------------------------------------------------------- und im hauptproggi folgendes eingetragen: TranslateAnrede(zeile.Anrede); if(CheckError(zeile)){ if (!FindDouble (zeile)){ InsertIntoFile(zeile); } ReportError(zeile); } puh, war das ein stress, aber nochmals danke für deine hilfe!!! gruß hoeen Zitieren
Klotzkopp Geschrieben 21. Februar 2002 Geschrieben 21. Februar 2002 Original geschrieben von Hoeen @klotzkopp: Es läuft endlich!!! Dann ist ja gut bool TFrExport::FindDouble (struct wert zeile)... Das würde ich noch ändern. Übergeb besser entweder nur den AnsiString mit name_1 (die anderen Felder der Struktur brauchst Du ja gar nicht), oder übergib die Referenz der Struktur. Das verhindert, dass eine Kopie der Struktur angelegt wird (wobei immerhin 21mal der Copy-Konstruktor von AnsiString aufgerufen wird) ... while (QrSelect->FindNext()); ... Dachte ich mir, dass es so was geben muss puh, war das ein stress, aber nochmals danke für deine hilfe!!! Gern geschehen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.