[Gelöst] [CC] Datenbereinigung durch alle Tabellen

27. September 2016 10:30

Moin,

also wir haben in CU 1 die Funktionen MakeText & MakeCode, die nun für jeden eingefügten Text/Code genutzt werden, um alle möglichen Bad Signs auszufiltern.
Allerdings haben wir nun noch Altlasten, in denen nun die Tabs, CRLF, usw. entfernt werden sollen - sowohl Code als auch Textfelder. Deshalb suche ich nach einer Möglichkeit diese zu erledigen, ohne eventuelle Referenzen kaputt zu machen.
Ich denke das Stichwort ist RecRef, FieldRef? Ich weiß aber nicht genau wie ich es anstellen soll, durch alle Werte in allen Tabellen zu gehen, wäre da für Hilfe dankbar.

LG
Zuletzt geändert von bennyb am 21. Oktober 2016 10:14, insgesamt 1-mal geändert.

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 10:41

Hallo,

schau dir mal das Tool an. Das ist zwar eigentlich für die Umstellung von native auf SQL-gedacht, kann aber auch wahrscheinlich für deine Prüfung eingesetzt werden.

Gruß Fiddi

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 11:04

Mir fehlen die Berechtigungen, aber ist auch nicht wirklich gewünscht etwas externes zu nutzen.
Ich finde leider keine Anleitung oder Hilfe dazu, wie ich durch alle Tabellen durcharbeiten kann, um die Zeichen zu ersetzen. Entweder ich suche falsche oder weiß auch nicht.
Danke schon mal trotzdem :)

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 11:14

Hallo,

was meinst du mit externem Tool? Das sind NAV-Objekte die dort ausgeführt werden.

Damit du den Report sinnvoll nutzen kannst, bzw. alle Tabellen überhaupt bereinigen kannst, benötigst du eine NAV Solution- Developer- Lizenz.
Die ist nötig, damit die Posten- und Belegtabellen bearbeitet werden dürfen.

Gruß Fiddi

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 12:53

Hat sich schon geklärt mit dem extern, aber geht es auch ohne die Lizenz bzw. gibt's eine Alternative?

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 12:58

aber geht es auch ohne die Lizenz bzw. gibt's eine Alternative?


nicht wirklich.

Du könntest von eurem Partner den Report so umstricken lassen, dass der Report selbst die entsprechenden Berechtigungen auf die Tabellen hat. Dann könntest du selbst, ohne eigene Berechtigung auf die Tabellen, die Daten korrigieren.

Gruß Fiddi

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 16:48

Hi,

du machst eine Schleife über die Tabelle Object, gefiltert auf Typ Table.
Pro Datensatz machst du ein RecRef.OPEN mit der Tabellenummer.
Im Anschluss in einer Schleife über RecRef laufen.
In der Schleife eine weitere Schleife über die Tabelle Field, gefiltert auf die Tabelle die du aktuell durchläufst sowie auf Feldtyp Text und Code.
FieldRef zum Datensatz und der FieldNo aus der Tabelle Field holen. Via KeyRef prüfen, dass das Feld kein PK Feld ist.
Dann pro Datensatz der Tabelle Field prüfen, ob eine Table Relation vorhanden ist (Felder RelationTableNo und RelationFieldNo).
So wird kein Rename durchgeführt und die Releationen bleiben erhalten
Tabellenrelationen gehen in deiner Version immer auf PK Felder. Wenn also kein PK Feld und keine Tabellenrelation dann Analyse, Korrektur und Update.

Hier ein Stück Beispiel-Code als Inspiration Ungetestet und ohne Gewähr.

Code:
Object.RESET;
Object.SETRANGE(Type,Object.Type::Table);
Object.SETRANGE("Company Name",'');
IF Object.FIND('-') THEN
  REPEAT
    RecRefTable.OPEN(Object.ID);
    IF RecRefTable.FIND('-') THEN
      REPEAT
        Field.RESET;
        Field.SETRANGE(TableNo,Object.ID);
        Field.SETFILTER(Type,'%1|%2',Field.Type::Text,Field.Type::Code);
        Field.SETRANGE(Class,Field.Class::Normal);
        Field.SETRANGE(Enabled,TRUE);
        IF Field.FIND('-') THEN
          REPEAT
            IsPKField := FALSE;
            KeyRefTable := RecRefTable.KEYINDEX(1);
            REPEAT
              FieldRefForKey := KeyRefTable.FIELDINDEX(i);
              IF FieldRefForKey.NUMBER = Field."No." THEN
                IsPKField := TRUE;
            UNTIL (i = KeyRefTable.FIELDCOUNT) OR IsPKField;
            IF NOT IsPKField AND (Field.RelationTableNo = 0) THEN BEGIN
              FieldRef := RecRefTable.FIELD(Field."No.");
              SearchString := FieldRef.VALUE;
              IF STRPOS(SearchString,'Whatever') <> 0 THEN BEGIN
                ConvertedString := CONVERTSTR(SearchString,'alteZeichen','neueZeichen');
                FieldRef.VALUE := ConvertedString;
                RecRefTable.MODIFY;
              END;
            END;
          UNTIL Field.NEXT = 0;
      UNTIL RecRefTable.NEXT = 0;
  UNTIL Object.NEXT = 0;

Re: [CC] Datenbereinigung durch alle Tabellen

27. September 2016 17:00

Hallo,

so etwas macht das Tool von MIBUSO, mit dem Vorteil, dass man die Daten noch bearbeiten kann.

Aber ohne Rechte auf die Tabelle läuft da nichts, also sollte dein Report noch RecRefTable.WRITEPERMISSION prüfen.

Und da bennyb wahrscheinlich keine Berechtigung hat, die Postentabellen zu ändern, bringt das ganze nicht so viel. :-(

Gruß Fiddi

Re: [CC] Datenbereinigung durch alle Tabellen

4. Oktober 2016 11:39

Danke an euch beide, ich kläre das momentan wegen der Lizenz, alternativ müsste man eben nur über die Tabellen gehen, auf die man die Berechtigung hat. Allerdings möchte ich auch versuchen PK-Felder zu ändern, dann natürlich auch die Felder in den Relationstabellen, denke da liegt auch nochmal eine größere Herausforderung.

Re: [CC] Datenbereinigung durch alle Tabellen

5. Oktober 2016 08:29

elroberto hat geschrieben:
Code:
Object.RESET;
Object.SETRANGE(Type,Object.Type::Table);
Object.SETRANGE("Company Name",'');
IF Object.FIND('-') THEN
  REPEAT
    RecRefTable.OPEN(Object.ID);
    IF RecRefTable.FIND('-') THEN
      REPEAT
        Field.RESET;
        Field.SETRANGE(TableNo,Object.ID);
        Field.SETFILTER(Type,'%1|%2',Field.Type::Text,Field.Type::Code);
        Field.SETRANGE(Class,Field.Class::Normal);
        Field.SETRANGE(Enabled,TRUE);
        IF Field.FIND('-') THEN
          REPEAT
            IsPKField := FALSE;
            KeyRefTable := RecRefTable.KEYINDEX(1);
            REPEAT
              FieldRefForKey := KeyRefTable.FIELDINDEX(i);
              IF FieldRefForKey.NUMBER = Field."No." THEN
                IsPKField := TRUE;
            UNTIL (i = KeyRefTable.FIELDCOUNT) OR IsPKField;
            IF NOT IsPKField AND (Field.RelationTableNo = 0) THEN BEGIN
              FieldRef := RecRefTable.FIELD(Field."No.");
              SearchString := FieldRef.VALUE;
              IF STRPOS(SearchString,'Whatever') <> 0 THEN BEGIN
                ConvertedString := CONVERTSTR(SearchString,'alteZeichen','neueZeichen');
                FieldRef.VALUE := ConvertedString;
                RecRefTable.MODIFY;
              END;
            END;
          UNTIL Field.NEXT = 0;
      UNTIL RecRefTable.NEXT = 0;
  UNTIL Object.NEXT = 0;



Moin nochmal, habe mit deinem Beispiel gearbeitet und festgestellt, dass das "i" vergessen wurde?
Also habe nun vor dem FIELD.FIND das i := 0 und setze es vor jedem "UNTIL (i = KeyRefTable.FIELDCOUNT)" auf i := i + 1;
Leider bekomme ich bei i := 2 z.B. den Fehler "Der Feldindex '26172432' liegt außerhalb des erlaubten Bereichs (muss im Bereich von 1 bis 1 liegen)." Finde dazu leider keine Lösung.
Bevor ich das "i" gesetzt hatte, kam dieser Fehler direkt.

Re: [Gelöst] [CC] Datenbereinigung durch alle Tabellen

8. März 2018 15:03

Hallo,

Es gibt eine Tabelle 2000000041 "Field". Hier sind alle Felder aller Tabellen gespeichert.
Wenn Du diese Tabelle verwendest geht es zum Einen viel schneller, zu Anderen sparst Du Dir die Funktion "RecRef.FIELDEXIST".
Du hast in der Tabelle auch gleich den Feldtyp und die Feldklasse.

Diese solltest Du immer verwenden, um zu prüfen, ob ein Feld existiert bevor Du dieses Feld verwendest!

Viel Spaß!