Feldinhalte löschen

31. Mai 2013 10:56

Hallo zusammen,

ich habe die Aufgabe bekommen, einen Report zu schreiben, der in einer Table bestimmte Feldinhalte löschen soll.
die Felder mit einer "Field No." von 5000000..6000000 -> in diesen Feldern müssen die Feldinhalte gelöscht werden.
Alle anderen Datensätze sollen bleiben.
und das muss ich in über 100 Tabellen in über 50 Mandanten durchführen. :-x

Hat jemand vielleicht eine elegante Lösung für mich?

Re: Feldinhalte löschen

31. Mai 2013 11:04

Mit RecordRef, FieldRef kann man die Felder finden und mit der Companytabelle und CHANGECOMPANY alle Mandanten abarbeiten.

Re: Feldinhalte löschen

31. Mai 2013 11:05

Da hilft Dir bestimmt die Tabelle Field weiter.

Re: Feldinhalte löschen

31. Mai 2013 11:26

Danke für die schnelle Antwort
recref und fieldref habe ich noch nie benutzt (solange kenne ich navision ja auch gar nicht), kannst du mir vielleicht ein "beispielcode" zeigen?

Re: Feldinhalte löschen

31. Mai 2013 11:39

avsar92 hat geschrieben:Danke für die schnelle Antwort
recref und fieldref habe ich noch nie benutzt (solange kenne ich navision ja auch gar nicht), kannst du mir vielleicht ein "beispielcode" zeigen?

Zum Einarbeiten ist hier ein Beispiel. Den Mandantenwechsel kann man alternativ zu CHANGECOMPANY auch als Parameter übergeben, siehe hier bei MSDN.

Re: Feldinhalte löschen

31. Mai 2013 17:41

Zur Vorgehensweise:

Ich würde an deiner Stelle eine Form nehmen, welche die Tabellen in der Objekttabelle anzeigt.

SourceTableView: WHERE(Objektart=CONST(Table),Objekt ID=FILTER(<1000000000))

Ein Button bauen der "Delete Fields" heißt.

Im C/AL Code eine Delete-Funktion ausprogrammieren mit

Code:
MARKEDONLY(TRUE);

IF FINDSET THEN REPEAT // nur die in der Form markierten Tabellen durchlaufen
  IF _Company.FINDSET THEN REPEAT
    _RecRef
.OPEN("Object ID",FALSE, _Company.Name); // Tabelle in allen Mandanten durchlaufen 
    IF _RecRef.FINDSET THEN REPEAT
      CLEAR
(_FieldCounter);
      WHILE (_FieldCounter < _RecRef.FIELDCOUNT) DO BEGIN
        _FieldCounter 
:= _FieldCounter + 1; //FieldIndex hochzählen
        _FieldRef := _RecRef.FIELDINDEX(_FieldCounter);
        IF (_FieldRef.NUMBER >= 5000000) AND (_FieldRef.NUMBER <= 6000000) THEN CLEAR(_FieldRef.VALUE);
      END;
      _RecRef.MODIFY(FALSE);
    UNTIL _RecRef.NEXT = 0;
    COMMIT;
    _RecRef.CLOSE;
    CLEAR(_FieldRef);
    CLEAR(_RecRef);
  UNTIL _Company.NEXT = 0;
UNTIL NEXT = 0; 


Sieh es als detaillierten Pseudocode an.
Habe es nicht getestet und ging nur durch meinen Kopf-Compiler.

Natürlich alles in einer Testdatenbank erst sehr augiebig testen.

P.S.: Bei CLEAR(FieldRef.Value) bin ich mir nicht sicher ob das klappt.
Im schlimmsten Fall musst du für jeden _FieldRef.TYPE eine Löschroutine schreiben.

Code:
CASE FORMAT(_FieldRef.TYPE) OF 
  
'Text' : _FieldRef.VALUE := '';
  'Code' : _FieldRef.VALUE := '';
  'Time' : _FieldRef.VALUE := 0T;
  'Date' : _FieldRef.VALUE := 0D;
  'DateTime' : _FieldRef.VALUE := 0DT;
  'Boolean' : _FieldRef.VALUE := FALSE;
  'Decimal' : _FieldRef.VALUE := 0;
  'Integer' : _FieldRef.VALUE := 0;
END; 

usw.

mfg,
winfy
Zuletzt geändert von winfy am 31. Juli 2013 15:25, insgesamt 1-mal geändert.

Re: Feldinhalte löschen

20. Juni 2013 15:39

danke, hat soweit ganz gut geklappt :)

Re: Feldinhalte löschen

20. Juni 2013 16:04

avsar92 hat geschrieben:Hallo zusammen,

ich habe die Aufgabe bekommen, einen Report zu schreiben, der in einer Table bestimmte Feldinhalte löschen soll.
die Felder mit einer "Field No." von 5000000..6000000 -> in diesen Feldern müssen die Feldinhalte gelöscht werden.
Alle anderen Datensätze sollen bleiben.
und das muss ich in über 100 Tabellen in über 50 Mandanten durchführen. :-x

Hat jemand vielleicht eine elegante Lösung für mich?


http://www.navision24.de

edit