Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld? (https://www.delphipraxis.net/40421-datenabgleich-quellfeld-hat-mehr-zeichen-als-zielfeld.html)

DiscMix 15. Feb 2005 15:39

Datenbank: SQL-Server • Version: 2000 • Zugriff über: ADO

Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Hallo,

ich habe ein Problem ;)
Es gibt zwei Tabellen auf dem SQL-Server.
Zwischen diesen Tabellen gibt es einen Datenabgleich.
Hier werden die Werte mit einer Insert bzw. Update Anweisung übertragen.
Es hat sich herausgestellt, dass Datensätze, in den im Quellfeld mehr Zeichen
eingetragenen sind als das Zielfeld erlaubt, nicht übergeben werden.
bsp: Quellfeld: Fax 20 Zeichen eingetragen, aber das Zielfeld Fax kann nur
15 Zeichen aufnehmen.

Frage:
Kann ich (dem SQL-Server oder Delhi) sagen, das in solchen Fällen einfach nur
die 15 Zeichen übergeben werden sollen, oder das Feld komplett nicht übergeben
werden soll, aber der Rest des Datensatzes schon.
Wenn ich das kann, WIE kann ich das machen ???

Ich kann doch nicht bei einer Tabelle mit 200 Feldern und 200.000 Datensätzen
jedes einzelne Feld daraufhin prüfen?!?!
Oder bleibt mir nichts anderes übrig?

Gruss
Marco

Sharky 15. Feb 2005 15:44

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Hai DiscMix,

der MS-SQL kennt doch sicher eine Funktion um nur die ersten 15 Zeichen eines Feldes zu verwenden. Wie sieht denn dein Update-String aus?

Jasocul 15. Feb 2005 15:52

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Ein Datenabgleich mit unterschiedlicher Tabellenstruktur?

Delphi bietet den Copy-Befehl als String-Operation an. Ich würde aber auch eine Funktion des SQL verwenden. Dann sind die Updates einfacher.

Was ist eigentlich mit den letzten Zeichen? Reduziert das nicht den Informationgehalt? Nur mal so angemerkt.

DiscMix 15. Feb 2005 15:53

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
ist gar nicht so einfach, da ich denn über stringlisten usw. aufbaue:

bsp:
Delphi-Quellcode:
...
ADOCommand1.CommandText := '';
    if (Funktion = 1) or (Funktion = 3) then
    begin //Funktion 1 = Insert
        ADOCommand1.CommandText := 'insert into Kunde ';
        ADOCommand1.CommandText := ADOCommand1.CommandText + vInsertInto51E +' VALUES ('+v;
    end;
    if Funktion = 2 then
    begin
        ADOCommand1.CommandText := 'update Kunde set';
        ADOCommand1.CommandText := ADOCommand1.CommandText + vInsertInto51E +' VALUES ('+v;
    end;
    for i := 0 to vFelder51Erstmalig.Count-1 do
    begin
      //hier wird auf das erste Sonderzeichen geachtet
      // _ = Konstante ; @ = Zordnungstabelle ; + = Abschneiden beim ersten Leerzeichen
      if copy(vFelder51Erstmalig.Strings[i],1,1) = '_' then //Hier wird die Konstante zurückgeschrieben.
        ADOCommand1.CommandText := ADOCommand1.CommandText +
        copy(vFelder51Erstmalig.Strings[i],2,length(vFelder51Erstmalig.Strings[i])-1)+v+','+v;
      if copy(vFelder51Erstmalig.Strings[i],1,1) = '+' then
        ADOCommand1.CommandText := ADOCommand1.CommandText +
        VorneAB(QueryIntervall.fieldbyname(copy(vFelder51Erstmalig.Strings[i],2,length(vFelder51Erstmalig.Strings[i])-1)).asstring)+v+','+v;

      if (copy(vFelder51Erstmalig.Strings[i],1,1) <> '_') and
        (copy(vFelder51Erstmalig.Strings[i],1,1) <> '+') then
        ADOCommand1.CommandText := ADOCommand1.CommandText +
        QueryIntervall.fieldbyname(vFelder51Erstmalig.Strings[i]).AsString+v+','+v;
    end;
    ADOCommand1.CommandText := ADOCommand1.CommandText +
    IntToStr(vYear)+v+','+v+vFirma+v+','+v+vZeichen+v+','+v+vKunde+v+')';
    try
        ADOCommand1.Execute;
...
Alles klar??? ;)
Ich glaube damit kommt ihr nicht weiter...

alcaeus 15. Feb 2005 15:55

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Hallo DiscMix,

du kannst das z.B. so machen:

SQL-Code:
Insert into TabelleNeu (Feld1, Feld2, ..., FeldN) VALUES (SELECT SUBSTRING(Feld1, 1, 15), Feld2, ..., FeldN FROM TabelleAlt)
Hier wird Feld1 auf 15 Stellen gekürzt, und das ganze läuft in einem Schritt durch. Wichtig ist, dass die Felder beides mal die gleiche Reihenfolge haben (im Query, nicht in der Tabelle)

Greetz
alcaeus

shmia 15. Feb 2005 15:56

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Zitat:

Zitat von DiscMix
Es gibt zwei Tabellen auf dem SQL-Server.
Zwischen diesen Tabellen gibt es einen Datenabgleich.
Hier werden die Werte mit einer Insert bzw. Update Anweisung übertragen.
Es hat sich herausgestellt, dass Datensätze, in den im Quellfeld mehr Zeichen
eingetragenen sind als das Zielfeld erlaubt, nicht übergeben werden.
bsp: Quellfeld: Fax 20 Zeichen eingetragen, aber das Zielfeld Fax kann nur
15 Zeichen aufnehmen.

Eine unvollständige Faxnummer (ein oder mehr Ziffern fehlen) taugt nix. :warn:
Lieber keine Faxnummer als eine Falsche!

Ich würde erst mal die max. Länge feststellen:
SQL-Code:
SELECT MAX(LEN(Fax)) AS MaximaleFaxLaenge
FROM Tabelle
Dann mit etwas Sicherheitsabstand die nötige Feldgrösse bestimmen.
Beide Fax-Felder auf die gleiche Grösse bringen. Datentyp: varchar

Problem sauber gelöst! :hello:
Mit
SQL-Code:
SELECT LEFT(FaxNr , 15) AS Fax15 FROM ...
geht's zwar auch, aber siehe oben.

DiscMix 15. Feb 2005 15:59

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
ja, substring kenne ich.
Dummerweise kann es sein, das sich die Tabellenstruktur ändert.
Eine Überprüfung der einzelenen Felder auf länge und dann den Inhalt ggf.
zu kürzen macht das ganze doch ziemlich langsam, oder?

Jasocul 15. Feb 2005 16:07

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Wenn sich die Tabellenstruktur ändern kann, solltest du das beim Datenabgleich ebenfalls anpassen und nicht einfach Infos löschen.
Dann sparst du dir die ganzen Folge-Probleme.

DiscMix 15. Feb 2005 16:14

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
@jasocul:
Wie meist du das?

Das sich die Struktur ändern kann ist klar und auch berücksichtigt.
Mir gehts mehr um den Inhalt (der Felder).
Muss ich nun jeden Inhalt auf Länge prüfen und mit dem Zielfeld
vergleichen? Oder gibt es eine bequemere Lösung?

@shmia: Das muss ja nicht unbedingt die Faxnummer sein. Es kann ja auch der
Firmenname sein, wenn da ein "GmbH" fehlt ist das "weniger schlimm".

Jasocul 15. Feb 2005 17:17

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
 
Etwas ausführlicher was ich meine:
Einen Datenabgleich macht man idR um gleiche Datenbestände zu haben.
Am Server A hole ich mir die Daten und bringe diese zum Server B.

Nun stelle ich fest, dass Die Felder einer Tabelle auf Server A vergrößert wurden. Demnach kann es passieren, dass ich den Feldinhalt nicht vollständig in die zugehörige Tabelle auf Server B bekomme. Die Folge ist, dass die Daten unvollständig übertragen werden.

Jetzt stellt sich die Frage, was man machen sollte.

Ich würde also vor dem Einspielen der Daten auf Server B prüfen, ob eine Tabellenänderung vorliegt. Diese Änderung würde ich dann auf Server B ebenfalls durchführen.
Danach können die Daten ohne Verlust übertragen werden.

Ein Datenabgleich mit Datenverlust finde ich irgendwie sinnlos.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz