[CC] ARtikel Updaten mittels RecordRef

8. März 2016 09:25

Hi,

ich habe eine Funktion UpdateItem (welcher ein RecordRef) übergeben wird. Der RecordRef ist vom Typ "Item" .
Die Funktion soll ein Item mit den neuen Werten vom recordRef updaten, was wäre ein eleganter Weg dafür?

So. z.b.?

Code:

FOR i := 1 TO PRecref.FIELDCOUNT DO BEGIN
  FldRef := PRecref.FIELDINDEX(i);
  CASE FldRef.NAME OF
    'Vendor No.': BEGIN
                    locVendNo :=FldRef.VALUE;
                  END;
    'Vendor Item No.':
                  BEGIN
                    locVendItemNo := FldRef.VALUE;
                  END;
    'Description':
                  BEGIN
                    locItemDescription :=FldRef.VALUE;
                  END;
    'Description 2':
                  BEGIN
                    locItemDescription2 :=FldRef.VALUE;
                  END;
  END;
END;
locItem.SETCURRENTKEY("Vendor No.", "Vendor Item No.");
locItem.SETRANGE("Vendor No.",locVendNo);
locItem.SETRANGE("Vendor Item No.", locVendItemNo);
IF locItem.FINDFIRST THEN
  BEGIN
    MESSAGE('Item %1 exists\ Old Description: %2 \ New Description: %3',
      locItem."No.",
      locItem.Description,
      locItemDescription
    );
      locItem.Description := locItemDescription;
      locItem."Description 2" := locItemDescription2;
      locItem.MODIFY;
  END;


Danke.

Re: [CC] ARtikel Updaten mittels RecordRef

8. März 2016 09:41

Ist es nicht zielführender, für eine Funktion namens UpdateItem auch einen Item-Record statt eines RecordRefs zu übergeben?
Alternativ kannst du mittels SETTABLE aus dem RecordRef eine Item-Recordvariable machen und so im Anschluss direkt auf die richtigen Felder zugreifen.

Re: [CC] ARtikel Updaten mittels RecordRef

8. März 2016 10:00

Natalie hat geschrieben:Ist es nicht zielführender, für eine Funktion namens UpdateItem auch einen Item-Record statt eines RecordRefs zu übergeben?
Alternativ kannst du mittels SETTABLE aus dem RecordRef eine Item-Recordvariable machen und so im Anschluss direkt auf die richtigen Felder zugreifen.


Klingt Gut. Aber habe beide Varianten nicht hinbekommen. :roll:

Hier mal der Aufruf von UpdateItem(recRef):

Code:

    IF locImportBuffer.FINDSET THEN BEGIN
      REPEAT
        ToRecRef.OPEN(ToTableNo);
        FromrecRef.GETTABLE(locImportBuffer);
       
        FOR A := 1 TO FieldCount DO BEGIN
          IF ConstValueArr[A] <> '' THEN
             Variant :=ConstValueArr[A]
          ELSE BEGIN
            IF FromrecRef.FIELDEXIST(FromFieldNoArr[A]) THEN BEGIN
                FromFieldRef := FromrecRef.FIELD(FromFieldNoArr[A]);
                Variant := FromFieldRef.VALUE;
                tempTxt := FromFieldRef.NAME;
            END;
          END;

          Str :=FORMAT(Variant);

          IF ToRecRef.FIELDEXIST(ToFieldNoArr[A]) THEN BEGIN
            ToFieldRef := ToRecRef.FIELD(ToFieldNoArr[A]);
            Field.GET(ToTableNo,ToFieldNoArr[A]);
            IF ToFieldValidateArr[A] THEN
              ToFieldRef.VALIDATE(Variant)
            ELSE
              ToFieldRef.VALUE := Variant;
          END;
        END;
       
      UpdateItem(ToRecRef);
       
       ToRecRef.CLOSE;
       UNTIL locImportBuffer.NEXT = 0;


In UpdateItem wollte ich erst : :

Code:
MyRecRef.SETTABLE(loctempItem)
IF MyRecRef.FINDSET THEN
  REPEAT
    MyRecRef.SETTABLE(loctempItem);
    loctempItem.INSERT;
  UNTIL MyRecRef.NEXT = 0;

... IF locTempItem FINDSET  ... mach was ...


Sagt mir aber TableData 0 existiert nicht, bei SETTABLE.

Wäre natürlich schön direkt auf die passenden felder zugreifen zu können statt den Umweg über Case String FeldName

Danke
Danke

Re: [CC] ARtikel Updaten mittels RecordRef

8. März 2016 10:14

elTorito hat geschrieben:Sagt mir aber TableData 0 existiert nicht, bei SETTABLE.

Jo:
Code:
MyRecRef.SETTABLE(loctempItem) <-- das gehört hier nicht hin (s.u.). Zeile löschen
IF MyRecRef
.FINDSET THEN
  REPEAT
    MyRecRef
.SETTABLE(loctempItem); <-- das hier ist richtig: MyRecRef zeigt erst hier auf einen Datensatz
    loctempItem
.INSERT; // bei dem Konstrukt hier hättest du auch direkt MyRecRef.INSERT schreiben können; macht das gleiche
                        // Ist MyRecRef Temporary=Yes? Wenn nein, dann brauchst du nicht mal das INSERT, den Datensatz gibts ja schon.
  UNTIL MyRecRef.NEXT = 0;


Ich verstehe noch immer deinen Hintergrund nicht. Musst du unbedingt mit RecRef arbeiten, weil nur dieser deiner Funktion übergeben werden kann?
Steht dieser RecRef schon auf einem aktualisierten, aber noch nicht gespeicherten Artikel-Datensatz? Wenn ja (und nur dann), SETTABLE, um mit dem Datensatz zu arbeiten bevor du ihn speicherst.
Kann er ohne Prüfungen direkt gespeichert werden, kannst du auch direkt ein RecRef.INSERT bzw. RecRef.INSERT(TRUE) absetzen.

Re: [CC] ARtikel Updaten mittels RecordRef

8. März 2016 10:59

Der Ablauf ist wie folgt:
1. Ich habe eine Tabelle "Buffer" mit Field 1 bis Field 64 als Spaltennamen.
2. Ich lese eine csv Datei ein. Spaltennamen (Field 1...) wird ersetzt durch die csv Spaltennamen
3. Es gibt eine Mapping Tabelle wo definiert wird. Spaltenname von Tabelle Buffer entspricht Spaltenname Tabelle Item
4. Anschließend will ich anhand der Mapping Tabelle die entsprechenden (eingelesenden) Spalten auf dem Artikel Updaten.

Also Table Item ist mir quasi erst in UpdateItem() bekannt, bzw. TableToNo bei meinem Mapping.

Im RecRef Record habe ich 2 (Spalten) Variablen (VendorNo und VendorItemNo) mit denen ich ein passenden Artikel erst finden muss um ggf. upzudaten.

geht nun:
Code:
IF MyRecRef.FINDFIRST THEN
  REPEAT
     MyRecRef.SETTABLE(locTempItem);
     MyRecRef.INSERT;
  UNTIL MyRecRef.NEXT =0;


Anschl. wäre dann:
Code:

locItem.SETCURRENTKEY("Vendor No.", "Vendor Item No.");
locItem.SETRANGE("Vendor No.",locTempItem."Vendor No.");
locItem.SETRANGE("Vendor Item No.", locTempItem."Vendor Item No.");
IF locItem.FINDFIRST THEN
  BEGIN
    locItemToUpdate.GET(locItem."No.");
    MESSAGE('Item %1 exists\ Old Description: %2 \ New Description: %3',
      locItem."No.",
      locItem.Description,
      locTempItem.Description
    );
      locItemToUpdate.VALIDATE(Description,locTempItem.Description);
      locItemToUpdate.VALIDATE("Description 2",locTempItem."Description 2");
      //locItemToUpdate.MODIFY;
  END;



Sperrt mir aber die Tabelle Item (bei MyRecRef) :-/ *seufz*
Zuletzt geändert von McClane am 8. März 2016 12:22, insgesamt 1-mal geändert.
Grund: Bitte keine kompletten Beiträge zitieren!