[gelöst] Text zu Record ID, aber wie?

15. Oktober 2008 09:18

Hallo!
Bei einer SQL Migration einer 5.00 SP1 Datenbank wurde mir präsentiert, dass es einige Datensätze mit einem fehlerhaften Datum (z.B. 01.04.0003 etc.) gibt. Dazu wird ja die Tabelle 104010 Incorrect Data Value. Soweit ja vermutlich bekannt, nur sind das bei mir nun mehr als 1000 Datensätze. Die möchte ich natürlich ungern per Hand alle ändern.
Da es für fast jeden fehlerhaften Datensatz ein Buchungsdatum gibt, das in Ordnung ist, würde ich gerne die Daten per Report ändern.

Und das ist dann auch mein eigentliches Problem: In der Tabelle gibt es die beiden wichtigen Felder "Table ID" und "Record ID".
Da steht dann z.B. drin (mal nicht das einfachste Beispiel):
Table ID: 5001903
Record ID: Zahlungsdatei Nr.: 94, lfd.Nr.: 70000

Kann ich mit diesen Infos den Record direkt bekommen?
Ich dachte eigentlich, dass man es so machen könnte
Code:
RecRef.OPEN("Table ID",FALSE,"Company Name");
EVALUATE(RecID,"Record ID");
RecRef.GET(RecID);


Aber das geht leider nicht, da das evaluate nicht geht. Wenn ich es ohne versuche, gehts auch nicht, weil "Record ID" Text und nicht Record ID ist :-(

Hat da jemand eine Idee?

Vielen Dank für jeden Tipp! :-)

Es grüßt,
Astrill
Zuletzt geändert von astrill am 29. Oktober 2008 12:46, insgesamt 2-mal geändert.

Re: Text zu Record ID, aber wie?

15. Oktober 2008 09:29

Welchen Datentyp hat RecID ?
und welchen Datentyp hat der Primärschlüssel? (ist der Primärschlüssel nur ein Feld?)

Re: Text zu Record ID, aber wie?

15. Oktober 2008 09:35

Die Variable RecID aus dem Beispiel ist vom Typ Record ID.

Der Primärschlüssel (also das Feld "Record ID" in der Tabelle "Incorrect Data Value") ist vom Typ Text.
Daher mein Evaluate, da ich den Text irgendwie zu Record ID umwandeln muss...
Und was da drin steht, hängt natürlich von der Tabelle ab, da steht immer der entsprechende (komplette) Primärschlüssel des Datensatzes, wo das Datum falsch ist.

Re: Text zu Record ID, aber wie?

15. Oktober 2008 11:57

der datentyp record id speichert tabellennr. und primärschlüssel, mit dem befehl RECORDID kann man ihn ausgeben lassen, du könntest dir mal ein beispiel ausgeben lassen und gucken wie recordid gespeichert wird und dann die textvariable anpassen

Re: Text zu Record ID, aber wie?

15. Oktober 2008 12:35

Hallo und danke für die Antworten soweit! Vielleicht habe ich mich unklar ausgedrückt, das was in der Tabelle unter "Record ID" steht (der String), kann ich mir nicht weiter aussuchen. Das wird durch die SQL Migration automatisch erzeugt.
Ich möchte nun diese automatisch erzeugten Daten durchlaufen und korrigieren. Doch um die entsprechenden Datensätze greifen zu können, muss ich diesen Record ID String verarbeiten können. Doch leider steht es in der Tabelle als Text und nicht als Typ Record ID. Wie also kann ich Text -> Record ID konvertieren, bzw. geht das überhaupt?

Re: Text zu Record ID, aber wie?

15. Oktober 2008 13:09

ja, ich weiß

ich habe nachgeschaut, eine RecordID ist so aufgebaut: TableName: Primärfeldwert, Primärfeldwert ... (Beispiel: Comment Line: Sachkonto), das bedeutet, du musst deinen Text ("Record ID") so aufdrösseln, dass er genau so aussieht

Re: Text zu Record ID, aber wie?

15. Oktober 2008 14:36

Table ID: 5001903
Record ID: Zahlungsdatei Nr.: 94, lfd.Nr.: 70000


Heißt das, dass deine Tabelle 5001903 den Namen Zahlungsdatei hat, und diese als PK-Felder "Nr." und "lfd. Nr."?

Re: Text zu Record ID, aber wie?

15. Oktober 2008 16:13

Hallo!
Die Texte beinhalten immer den Primärschlüssel.
Und im Falle der Tabelle 5001903 ist der Primärschlüssel aus den beiden Feldern "Zahlungsdatei Nr." und "Lfd. Nr." zusammengesetzt.

Und im speziellen hat also der Record mit den Werten "Zahlungsdatei Nr.: 94" und "Lfd. Nr.: 70000" ein falsches Datum.

Mittlerweile denk ich aber eh, dass ich wohl oder übel versuchen muss, den String irgendwie zu zerlegen, um so an die Daten zu kommen.
Blöd, dass das MS Migration-Tool das nicht irgendwie schlauer abspeichert, damit man es gleich weiterverwenden kann.

Es grüßt,
Astrill

Re: Text zu Record ID, aber wie?

15. Oktober 2008 16:35

Sehe ich auch so, den String wirst du zerlegen müssen :-(

Aber anhand der Zeichenfolge '.: ' und des/der Komma/ta ist es ja vielleicht recht einfach festzulegen, wo man eingreifen muss.

Re: Text zu Record ID, aber wie?

29. Oktober 2008 12:43

Hallo!

Für jeden, der auch nochmal dieses Prolbem hat, eine kurze Erläuterung, wie ich das nun gelöst habe.

Das Hauptproblem war ja, dass ich eine Datenbank mit sehr vielen Fehlerhaften Datumsfeldern hatte, die für die SQL-Migration geändert werden müssen.
Dafür hab ich nun ein Report geschrieben, der all diese Datumsfelder auf ein Buchungsdatum ändern, sofern dies im Datensatz verfügbar ist. Da das Buchungsdatum i.d.R. eingeschränkt ist, werden da fehlerhafte Eingaben dann abgefangen.

Anbei der Code, wie ich das gemacht habe. Die Herausforderung dabei war natürlich ein bisschen, dass man nur mit Referenzen arbeiten muss, da es ja viele verschiedene Tabellen sind.

Es grüßt,
Astrill

Code:

RecRef.OPEN("Table ID",FALSE,"Company Name");

Fields.RESET;
Fields.SETRANGE(TableNo,"Table ID");
Fields.SETRANGE(FieldName,'Posting Date');

KeyString := "Record ID";
i := 0;
i2 := 0;

IF Fields.FINDFIRST THEN BEGIN
// Werte des Primärschlüssels in KeyString-Array legen
// i gibt an, wieviele Felder es im Primärschlüssel gibt
  REPEAT
    i += 1;
    KeyString := COPYSTR(KeyString,(STRPOS(KeyString,':')+2)); //alles nach dem doppelpunkt
    CommaPos := STRPOS(KeyString,','); //nächste Komma-Position
    IF STRPOS(KeyString,',') = 0 THEN
      KeyValue[i] := KeyString
    ELSE
      KeyValue[i] := COPYSTR(KeyString,1,(CommaPos-1));
  UNTIL CommaPos = 0;
 
  KRef := RecRef.KEYINDEX(1);
  FOR i2 := 1 TO i DO BEGIN
    FRef := KRef.FIELDINDEX(i2);


    IF FORMAT(FRef.TYPE) = 'Integer' THEN BEGIN
      EVALUATE(IntValue,KeyValue[i2]);
      FRef.SETRANGE(IntValue);
    END ELSE
      FRef.SETRANGE(KeyValue[i2]);
  END;

  RecRef.FINDFIRST;

//Posting Date aus Record auslesen
  FRef := RecRef.FIELD(Fields."No.");
  PostingDate := FRef.VALUE;

  Fields.RESET;
  Fields.SETRANGE(TableNo,"Table ID");
  Fields.SETRANGE(FieldName,"Field Name");
  Fields.FINDFIRST;
  FRef := RecRef.FIELD(Fields."No.");
  FRef.VALUE(PostingDate);
  RecRef.MODIFY;



END;



RecRef.CLOSE;