AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenkonvertierung

Ein Thema von StefanG · begonnen am 11. Okt 2006 · letzter Beitrag vom 11. Okt 2006
Antwort Antwort
StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#1

Datenkonvertierung

  Alt 11. Okt 2006, 09:38
Hi zusammen,

im Zuge einer Datenkonvertierung muss ich die Werte eines Schlüsselfeldes ändern.
Im Original sehen die ID's so aus :

Code:
3T471864200003NQ00OC
Ich muss diese jetzt so umwandeln dass sie nur noch aus Zahlen besteht.
Jedes einzelne Zeichen durchzulaufen und ggf. einen Buchstaben durch dessen Ascii Wert zu ersetzen
funktioniert aber nicht, da das Resultat größer als ein Standard Integer werden würde.

Weiss jemand spontan eine bessere Methode?

Wichtig ist nur, dass beim Umwandeln ein Integer rauskommt, der eben auch nur beim Umwandeln von EINEM (und nicht mehreren) Strings zustande kommen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Datenkonvertierung

  Alt 11. Okt 2006, 09:43
Wie du schon Richtig rausgefunden hast ist das Ergebniss >> High(integer)

Ich da du bestimmt auch Rückwärts gehen willst bringt dir das so eh nichts, da du ja in der Integer Zahl nachher nicht mehr weist welch Zahlen dann jeweils zu einem Char zusammengefasst werden müssen.

Ich denke daher wirst du mit einem Array of Byte oder so rechnen müssen.

Also

3T471864200003NQ00OC

->

3,ord(t),4,7,1,8,6,42,0,0,0,0,3,ord(n),ord(q),0,0, 0,ord(c)

wenn du das wieder als Reinen Zahlenstring haben willst brauchst du ja nur die Einzelemente wieder in nen Stirng schreiben.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#3

Re: Datenkonvertierung

  Alt 11. Okt 2006, 09:46
Ich brauche die resultierende Zahl nie wieder in den Ursprungsstring zurückrechnen.

Ich brauche einfach nur statt dem String einen Integer...der eben auch in einen Int passt.
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Datenkonvertierung

  Alt 11. Okt 2006, 09:50
Da du aber definitiv Mehr Strings Bilden Kannst wie du Integer Werte Hast geht das nicht.

Weil du ja nach einer Disjunkten Form suchst kannst du Maximal High(integer) viele strings nehmen. Spätestens dann wirde der High(integer) +1 String wieder auf eine int Zahl Abgebildet werden die es schon mal gegeben hat.

[Edit]

Vielleicht erkläuterst du genauer was du mit diesen Zahlen Vorhast, dann finden wir vielleicht einen Anderen Weg
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#5

Re: Datenkonvertierung

  Alt 11. Okt 2006, 09:56
also :

Die Werte sind Schlüsselfelder in einer Datenbank, d.h. in der Tabelle Kunden hat ein Kunde die KundenNr
3T471864200003NQ00OC.

In anderen Tabellen mit Ansprechpartnern, Telefonnummern, Adressen etc wird die Beziehung zu diesem Kunden eben immer über diese KundenNr hergestellt.

Alle Datensätze dieser Tabellen sollen nun in eine neue Datenbank übernommen werden. Allerdings hat das Feld KundenNr in der neuen Datenbank den Typ INTEGER sodass wir die alten Werte nicht einfach übernehmen können. Es muss also irgendein Weg her einen Eindeutigen Int zu bekommen
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Datenkonvertierung

  Alt 11. Okt 2006, 10:03
Ok da ich davon ausgehe das ihr nicht mehr als 2^32 Viele Kunden Habt sollte es tatsächlich Möglich sein.

Was du brauchst ist eine Sogenante "Hash" Function die dir diese Strings entsprechend Umrechnet.

Das Problem ist aber das du diese Optimal ( also für alle Kunden Disjunkt ) mehr oder weniger nur duch Probieren raus bekommen kannst. Auser deine Bisherigen Kundennummern sind nach einem Bestimmten Muster aufgebaut. Wenn dem So wäre könntest du das Muster zur unterscheidung ausnutzen. Sind alle Kundennummern ohne Muster erstellt wird es schwieriger.

Da würde ich fast sagen du testest es aus, oder ...

Wie wäre es wenn du ein Array nimmst , das Array hat den Typ String. Die Postion des Array gibt dann deinen neuen Integer

Du gehst beim Umstellen jedesmal den ganezn Array durch. Findest du den Teilstring dann hast du mit dem Index deinen Integer, wenn nicht dann nimmst den String als Letzes Element auf und hast dann ebenfalls dessen index als Nummer.

Zugegeben es ist nicht gerade Effizient, aber da du die Datenbank ja wohl nur 1 mal zusammenschmeist kommt es ja nicht direkt auf die Laufzeit an.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Datenkonvertierung

  Alt 11. Okt 2006, 10:25
Du kannst aber auch zunächst alle Tabellen zunächst um den Int-ID erweitern und diesen dann einfach füllen. Dabei gehst Du von der Kundentabelle aus. Bei allen anderen Tabellen machst Du dann einen Lookup über den alten Key in den Kundensatz und holst Dir von dort die neue INT-ID.

Beispiel:
ALTER TABLE KUNDEN ADD ID integer Dann die Werte in KUNDEN setzen.

Schließich neues Feld in die anderen Tabellen einfügen und über den alten Key suchen und ersetzen:
SQL-Code:
ALTER TABLE LIEFERSCHEINE ADD KUNDEN_ID integer
UPDATE LIEFERSCHEINE L
SET L.KUNDEN_ID = K.ID
FROM L INNER JOIN KUNDEN K
   WHERE K.KUNDENNR = L.KUNDENNR
Zum Schluss kannst Du die nicht mehr benötigten KUNDENNR noch aus den Tabellen droppen.

Syntax habe ich nicht getestet...
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Datenkonvertierung

  Alt 11. Okt 2006, 10:40
Hallo Stefan,

was du vorhast nennt sich Schlüsseltransformation. Dazu wird in den betroffenen Tabellen jedem zu transformierenden Schlüssel (pk, fk) per ALTER TABLE ADD COLUMN ein neues Schlüsselfeld zur Seite gestellt. Anschließend werden die neuen primary keys gebildet. Wenn der primary key der Tabelle in der aufnehmenden Datenbank vom System (AUTOINC, IDENTITY) bereit gestellt wird, dann genügt das Importieren um das neue Schlüsselfeld zu initialisieren. Sind alle PK-Felder initialisiert, dann können die FK-Felder (foreign key) transformiert werden. Wenn die alten Schlüssel mit CODE und die neuen mit ID bezeichnet sind, dann funktioniert das so:

UPDATE abc SET xyz_id = (SELECT id FROM xyz i where i.code = abc.xyz_code) Grüße vom marabu


@Union: Habe zu lange zum Tippen gebraucht - trotzdem nochmal mit anderen Worten, damit es nicht für die Katze war...
  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:25 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