Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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?

Geschrieben

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 :)

Geschrieben

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.

Geschrieben

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

Geschrieben
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!

Geschrieben

@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

Geschrieben
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 :)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...