AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Thema durchsuchen
Ansicht
Themen-Optionen

Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

Ein Thema von DiscMix · begonnen am 15. Feb 2005 · letzter Beitrag vom 15. Feb 2005
Antwort Antwort
Benutzerbild von DiscMix
DiscMix

Registriert seit: 9. Jan 2004
Ort: Hamburg
52 Beiträge
 
#1

Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:39
Datenbank: SQL-Server • Version: 2000 • Zugriff über: ADO
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
Gruss
Marco
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:44
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?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:52
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.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von DiscMix
DiscMix

Registriert seit: 9. Jan 2004
Ort: Hamburg
52 Beiträge
 
#4

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:53
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...
Gruss
Marco
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:55
Hallo DiscMix,

du kannst das z.B. so machen:

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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:56
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.
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!
Mit
SELECT LEFT(FaxNr , 15) AS Fax15 FROM ... geht's zwar auch, aber siehe oben.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DiscMix
DiscMix

Registriert seit: 9. Jan 2004
Ort: Hamburg
52 Beiträge
 
#7

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 15:59
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?
Gruss
Marco
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 16:07
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.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von DiscMix
DiscMix

Registriert seit: 9. Jan 2004
Ort: Hamburg
52 Beiträge
 
#9

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 16:14
@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".
Gruss
Marco
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?

  Alt 15. Feb 2005, 17:17
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.
Peter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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