Über Schleife alle Felder einer Tabelle ändern?

16. Januar 2007 10:27

Guten Morgen,

ich suche nach einer eleganten Lösung, um alle Felder einer Tabelle in einer Schleife zu bearbeiten.

Im Prinzip sollte die Prozedur so aussehen:

Für Alle Felder in Tabelle
clear(Feld);
validate(Feld);
Nächstes Feld

Hat jemand einen Tip, wie ich das realisieren kann?

16. Januar 2007 10:41

Grundsätzlich kann so etwas mit den Funktionen für RecordRef und FieldRef realisiert werden (siehe Online-Hilfe).

Jedoch gibt es diese Funktionen in Version 2.x nicht. Da müsstest du zumindest einen technischen Upgrade auf die aktuelle Version durchführen.

Du findest zu beiden Themen (RecordRef und technisches Upgrade) diverse Beiträge im Forum.

16. Januar 2007 10:45

Hi Roger,

es gibt also keine Möglichkeit solch eine Schleife in 2.x zu realisieren?

Das ist etwas arm, oder?

Man kann sich auch nicht über die ID der Felder helfen? Irgendwas?
Kann doch nicht sein, dass ich jetzt alle Felder coden muß!

16. Januar 2007 11:02

Doch, in Version 2.6 ist das leider so. Wenn du alle Felder ändern willst, musst du die einzeln bei ihrem Namen ansprechen.

Abhilfe schafft wie gesagt ein technisches Upgrade auf die aktuellste Version. Damit kann dann mittels einer Schleife und der Feldnummer das realisiert werden, was du möchtest.

16. Januar 2007 11:05

Dune hat geschrieben:Das ist etwas arm, oder?

was glaubst Du wohl, warum mittlerweile an Nav5 gearbeitet wird?
Man kann sich auch nicht über die ID der Felder helfen? Irgendwas?
genau dafür brauchst du die Befehle RecordRef und FieldRef !
Kann doch nicht sein, dass ich jetzt alle Felder coden muß!

musst du ja auch nicht, du kannst ja auch ein technisches Update machen, dann hast du auch RecordRef und FieldRef zur Verfügung.

16. Januar 2007 11:06

Ok, danke Roger.

Dann werd´ ich mir wohl mal überlegen müssen, welche Vorgehensweise mit weniger Aufwand verbunden ist.

Bis dann.

16. Januar 2007 11:09

Meiner Meinung nach empfiehlt sich ein technisches Upgrade auf jeden Fall. Der Aufwand ist verhältnismässig gering und man bekommt doch ein paar schöne Neuerungen im Bereich C/SIDE.

2.6 wird ja von Microsoft offiziell nicht mehr unterstützt. Wenn also Fehler in den Binaries vorhanden sind, kommen die nur mittels technischem Upgrade wieder raus.

Im Rahmen des Wartungsvertrages (wenn vorhanden) ist der Bezug der neuen Version kostenlos.

Re: Über Schleife alle Felder einer Tabelle ändern?

16. Januar 2007 16:00

Dune hat geschrieben:Für Alle Felder in Tabelle
clear(Feld);
validate(Feld);
Nächstes Feld

Hat jemand einen Tip, wie ich das realisieren kann?


Warum verwendet du nicht den INIT-Befehl?
Was willst du eigentlich tun, mit allen Feldern einer Tabelle?
Vielleicht versteh ich das Problem nicht?

16. Januar 2007 16:10

Für die Versionen <= 3.x fällt mir da keine einfache Methode ein.
Ab Version 3.60 kann man dies mit den Reports aus diesem Download realisieren:

[url=http://www.msdynamics.de/dload.php?action=file&file_id=55]Tabellendaten aktualisieren
Reports zum schnellen aktualisieren von Tabellendaten[/url]

16. Januar 2007 18:59

Hmm... Kenne 2.60 nicht, aber gibts/gabs da schon C/FRONT? Also die C/C++ Schnittstelle?

16. Januar 2007 19:14

Ja, C/FRONT gabs schon für 2.60,wie auch ODBC-Anbindung.

16. Januar 2007 22:58

Wäre das dann nicht was für dich Dune, wenn du da mal schaust ob du das gebrauchen kannst? Zumindest in den Versionen die ich kenne, kannst du da quasi über Referenzen arbeiten und die gewünschte Funktion implementieren (das was ab 3.70 auch innerhalb von NAV funktioniert).

17. Januar 2007 15:16

Danke für eure Aufmerksamkeit.

Im Prinzip möchte ich alle Felder eines Records (z.B. der Artikeltabelle) so einfach wie möglich bearbeiten.

Praktisches Beispiel: Artikel, die umbenannt (Nr. geändert) werden, sollen vorher über Code "geleert" werden. Also, alle Felder "clear".

Ich könnte jetzt natürlich alle Felder auflisten und mit clear() leeren, aber das wäre erstens sehr arbeitsintensiv und vor allem müßte ich den Code bei einem neuen Feld wieder pflegen.

Daher dachte ich mir, diesen Code in einer Schleife zu wiederholen. Gibt´s ja in anderen Sprachen auch einige Möglichkeiten.

Jm: was meinst du mit "Init-Befehl"? Was hast du dir vorgestellt.

SilverX: ich schau´s mir an.

17. Januar 2007 15:40

Ich weiß jetzt zwar keinen konkreten Anwendungsfall, aber:

Nehmen wir an, du möchtest Artikelnummern ändern.

Wenn du Tabellen hast, die Artikelnummer-Felder enthalten, und in diesen Feldern ist die TabelRelation auf die Tabelle Artikel gesetzt, dann wirkt sich eine einfache Umbennung deiner Artikel ohnehin automatisch auf diese Datensätze aus, ohne dass du nachträglich diese Tabellen korrigieren musst.

Vielleicht hilft dir diese Erkenntnis schon ...?

17. Januar 2007 16:20

Dune hat geschrieben:Jm: was meinst du mit "Init-Befehl"? Was hast du dir vorgestellt.

Schau doch mal in die Online-Hilfe:

Code:
INIT (Record)
Use this function to initialize a record in a C/SIDE table.

Record.INIT
Record

Data type: record

The record you want to initialize.

This function assigns default values to each field in the record. The values the system assigns in the record correspond to those defined when the table was created. If no value was assigned when the table was created, the system assigns values based on the data type, as shown in this table:

If the data type is...   The default value is...
 
Boolean      No
Option      0
Integer      0
Decimal      0.0
Date      0D (Undefined date)
Time      0T (Undefined time)
Code      '' (empty string)
Text      '' (empty string)
BigText      <Empty>
Binary      <Empty>
BLOB      <Empty>
DateFormula   '' (empty string)
TableFilter      <Empty>
BigInteger      0
Duration      0
DateTime      0DT (Undefined )
GUID      00000000-0000-0000-0000-000000000000
RecordID      <Empty>
 
Comments
The system does not initialize primary key or timestamp fields.

After the system executes this function, you can change the values in any or all of the fields before you call the INSERT function to enter the record in the table. Be sure that the fields that make up the primary key contain values that make the total primary key unique. If the primary key is not unique (record already exists), the system rejects the record.

Example
These C/AL examples show how to use the INIT function. Assume that the primary key includes the "No." field:

Scenario 1
Customer.INIT;
Customer."No." := '1120';
Customer.INSERT;

Scenario 2
Customer."No." := '1120';
Customer.INIT;
Customer.INSERT;

Since INIT does not initialize the primary key fields, the order of the statements in situation 1 and 2 is not important. Situation 1 causes the same result as situation 2.

17. Januar 2007 17:32

Ok, danke. Das ist mir schon klar, aber hilft mir nicht.
Ich muß ja trotzdem jedes Feld eingeben.

Schade, dann versuch ich´s mit den beiden anderen Vorschlägen (Upgrade, C/FRONT).

Danke an alle.