[Gelöst] Import von 6.02 Dimensionen

31. Juli 2013 13:48

Guten Tag werte Community,

ich hab aktuell wieder einen Kunden zwischen der ein neues System mit NAV 2013 aufgesetzt bekommt, der Mutterkonzern aber 6.02 verwendet.
Dabei müssen wir Sachposten, Debitorenposten etc. sowie Buch.-Blattzeilen vom Mutterkonzern importieren.
In meinem XML-Port für die Sachposten übergebe ich als eingerückte Tabelle auch die Dimension Value Tabelle für den aktuellen Posten.

Hierbei knackt es wenn ich der Buch.-Blattzeile - die ich aus den Sachposten erstellen soll - das entsprechende Dimension Set verpassen will.
Im vorhinein fülle ich mit den Dimension Value Zeilen eine temporäre Tabelle (Dimension Set Entry):
Code:
TempDimSetEntry.INIT;
TempDimSetEntry.VALIDATE("Dimension Code", Dimensioncode);
TempDimSetEntry.VALIDATE("Dimension Value Code", Dimension_Value_Code);
TempDimSetEntry.INSERT;


Wenn ich danach meine Dimension Set ID haben möchte wird jedoch immer die Set ID weiter hochgezählt, statt mir die richtige ID wiederzugeben.
Danach bekomme ich beim nächsten Datensatz (mit den identischen Dimension Value Entries) folgenden Error:

'Dimensionsatzposten' ist bereits vorhanden. Identifizierende Felder und Wert:
Dimensionssatz-ID='159',Dimensionscode='DEBITORENGRUPPE'

Laut Debugger entsteht der Error in der Zeile, in der ich der Buch.-Blattzeile die Set ID übergebe.

Code:
IF TempDimSetEntry.FINDSET THEN BEGIN
  DimensionSetID := DimensionMgt.GetDimensionSetID(TempDimSetEntry);
  REPEAT
    IF NOT DimSetEntry.GET(DimensionSetID) THEN BEGIN
      DimSetEntry.INIT;
      DimSetEntry."Dimension Set ID" := DimensionSetID;
      DimSetEntry."Dimension Code" := TempDimSetEntry."Dimension Code";
      DimSetEntry."Dimension Value Code" := TempDimSetEntry."Dimension Value Code";
      DimSetEntry.INSERT;
    END;
  UNTIL TempDimSetEntry.NEXT = 0;
  GenJnlLine."Dimension Set ID" := DimensionSetID;
END;

GenJnlLine.INSERT(TRUE);


Leider blick ich auch nach Stunden nicht bei diesem Problem durch und hoffe, dass jemand hier sich besser mit den neuen Dimensionen auskennt.
Ich freue mich über jede konstruktive Antwort.

MfG
Sipa

//EDIT:
Fast vergessen: Nachdem die neue Buch.-Blattzeile angelegt wird (OnAfterInitRecord) leere ich natürlich auch die TempDimSetEntry-Tabelle vollkommen.
Zuletzt geändert von Sipa am 31. Juli 2013 16:26, insgesamt 1-mal geändert.

Re: Import von 6.02 Dimensionen

31. Juli 2013 13:58

Hast du dich bei deinem Vorgehen am Standard orientiert? Siehe viewtopic.php?p=85163#p85163.

PS: bei temporären Records bitte keine VALIDATEs ausführen (mehr Infos hier)- macht der Standard in CU 408 übrigens auch nicht:
Code:
IF TempDimBuf2.FINDSET THEN BEGIN
  REPEAT
    DimVal
.GET(TempDimBuf2."Dimension Code",TempDimBuf2."Dimension Value Code");
    TempDimSetEntry."Dimension Code" := TempDimBuf2."Dimension Code";
    TempDimSetEntry."Dimension Value Code" := TempDimBuf2."Dimension Value Code";
    TempDimSetEntry."Dimension Value ID" := DimVal."Dimension Value ID";
    TempDimSetEntry.INSERT;
  UNTIL TempDimBuf2.NEXT = 0;
  NewDimSetID := GetDimensionSetID(TempDimSetEntry);
END; 

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:03

Hallo Natalie,

ok das mit den Triggern temporärer Records ist schnell verstanden und geändert, jedoch bleiben Fragen offen:

1. Mit dem Dimensionsbuffer habe ich bisher noch nicht gearbeitet. Ist dieser von Nöten, wenn ich die nötigen Dimensionswerte habe und die Dimensionen im 2013er System angelegt sind?
2. GetDimensionSetID(TempDimSetEntry) wirft anscheinend nicht die richtige Set ID aus obwohl dieses Set bereits besteht bzw. es ist mir nicht möglich den zurückgegebenen Wert der Buch.-Blattzeile zuzuweisen. Ich meine damit: Ist das clearen der temporären Tabelle falsch oder was muss ich machen?

Mir fehlt leider massiv der Durchblick wo ich einen Fehler mache.

MfG
Sipa

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:15

Ist das Feld "Dimension Value ID" in der Dimension Value Tabelle vernünftig "gepflegt"? Wenn das nicht eindeutig ist, kommt er mit der Findung/Erzeugung von neuen Dim Set IDs nicht klar.

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:18

Sipa hat geschrieben:1. Mit dem Dimensionsbuffer habe ich bisher noch nicht gearbeitet. Ist dieser von Nöten, wenn ich die nötigen Dimensionswerte habe und die Dimensionen im 2013er System angelegt sind?

Nein, und damit wollte ich dich auch eigentlich nicht verwirren :roll: . Der Quelltext diente mehr dazu, dir das Befüllen von TempDimSetEntry ohne Trigger und mit dem anschließende NewDimSetID := GetDimensionSetID(TempDimSetEntry); zu "beweisen".

2. GetDimensionSetID(TempDimSetEntry) wirft anscheinend nicht die richtige Set ID aus obwohl dieses Set bereits besteht

GetDimensionSetID kann nur dann die "richtige" ID zurückliefern, wenn deine vorherigen Dimension Sets bereits in der Datenbank gespeichert sind. Ist das bei dir auch wirklich der Fall?

Übrigens, um einen temporären Record komplett zu leeren, musst du verwenden:
Code:
DeinTempRec.RESET;
DeinTempRec.DELETEALL; 

Nur INIT oder CLEAR leert nur die Felder des Datensatzes, auf den gerade gezeigt wird. Die anderen bleiben so, wie sie waren ... Kann gut der Fehlergrund bei dir sein.

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:40

Natalie hat geschrieben:GetDimensionSetID kann nur dann die "richtige" ID zurückliefern, wenn deine vorherigen Dimension Sets bereits in der Datenbank gespeichert sind. Ist das bei dir auch wirklich der Fall?

Da liegt gaube ich mein Verständnis Problem: Kann ich ein DimensonSet "einfügen" ohne eine SetID?
Deswegen habe ich sogesehen immer ein Set in die temporäre Tabelle importiert. Somit konnte ich eben an die Codeunit ein Set geben, mit dem Sie arbeiten soll und wenn diese dann alles überprüft hat die ID zurückgibt (falls ein solches Set bereits vorhanden ist) oder eben eine neue ID wenn ich das Set einfügen muss.
Da diese Sets direkt noch nicht bestehen, aber die Dimensionen und Dimensionswerte muss ich ja die SetID von NAV kriegen. Bei nem Haufen posten werden ja diverse Sets ja wohl mehr als einmal vorkommen.
Doch nach den Gedanken denke ich mein Code ist sauber - was er ja anscheinend nicht ist. :-(

Natalie hat geschrieben:Übrigens, um einen temporären Record komplett zu leeren, musst du verwenden:
Code:
DeinTempRec.RESET;
DeinTempRec.DELETEALL; 

Nur INIT oder CLEAR leert nur die Felder des Datensatzes, auf den gerade gezeigt wird. Die anderen bleiben so, wie sie waren ... Kann gut der Fehlergrund bei dir sein.

Die Wortwahl war mein Fehler: Genau so mache ich's bereits ^^''

MfG
Sipa

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:46

Wenn Du die Dimension Values in NAV 2013 nicht richtig importierst, geht die Dimension Set Funktionalität nicht. Dimension VALUE ID in der Tabelle Dimension Value.

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:56

Hallo JanGD,

das Problem ist, das diese aber vorhanden sind.Somit müssten sie doch auch erkannt werden können, oder nicht?
Beziehungsweise versuchen wir von Anfang an: Die Dimension Value Entries können nur in Dimension Sets existieren korrekt?
Das würde bedeuten ich kann diese nur als ganzes Set einfügen und somit muss ich erst alle Entry-Zeilen einfügen, danach mir von Navision die Set ID geben lassen und dann diese endgültig zusammen mit der Set ID einfügen.

Doch da knallt es ja bei dem GenJournalLine.INSERT, was ich einfach nicht verstehen kann.
Denn wenn ein Dimension Set vorhanden ist und ich der Journal Line dessen ID gebe wird dadurch doch kein zweites Set eingefügt.

MfG
Sipa

Re: Import von 6.02 Dimensionen

31. Juli 2013 15:57

Sipa hat geschrieben:Da liegt gaube ich mein Verständnis Problem: Kann ich ein DimensonSet "einfügen" ohne eine SetID?

In die echte Tabelle? Nein, auf keinen Fall. Dann lieber mit einer überflüssig oft angelegten als keiner.

Aber was mir erst jetzt nochmal auffällt:
Du brauchst deine temp. Dim Set Entries nicht in die echte Tabelle schieben - das macht die Funktion GetDimensionSetID nämlich bereits.

Also sollte das so funktionieren:
  • Einträge in TempDimSetEntry erzeugen
  • DimSetID := DimMgt.GetDimensionSetID(TempDimSetEntry);
Fertig!
Du kannst die DimSetID nun nutzen, um diese in deiner Buch.-Blattzeile zu speichern.

Re: Import von 6.02 Dimensionen

31. Juli 2013 16:04

Die Dimension Value Entries können nur in Dimension Sets existieren korrekt?


Ich denke Nein.
Die Tabelle "Dimension Value" existiert genauso wie in 2009 mit einer kleinen Erweiterung, dem Feld "Dimension Value ID". In Dimension Sets können nur Dimensionen zusammengefasst werden, die auch korrekt in der Dimension Value stehen.

Gruß, Fiddi

Re: Import von 6.02 Dimensionen

31. Juli 2013 16:14

Also sollte das so funktionieren:

Einträge in TempDimSetEntry erzeugen
DimSetID := DimMgt.GetDimensionSetID(TempDimSetEntry);

Fertig!
Du kannst die DimSetID nun nutzen, um diese in deiner Buch.-Blattzeile zu speichern.


AAAAAAAAAAAAACHSOOOOOOOOOOO! :D
Das ist garantiert das Problem, da ich dann natürlich doppelte Einträge erstelle.
Ich werde's gleich direkt testen und Feedback geben.

Mfg
Sipa

Re: [Gelöst] Import von 6.02 Dimensionen

31. Juli 2013 16:30

Meine Güte Natalie,

demnächst muss ich dir eine Medailie oder einen Pokal zukommen lassen. Danke! :lol:
Das "echte" Einfügen war das Problem!

Dimensions-Node im XML: Dimension_Value_Code(OnAfterAssign Variable)
Code:
TempDimSetEntry.INIT;
TempDimSetEntry."Dimension Code" := Dimensioncode;
TempDimSetEntry."Dimension Value Code" := Dimension_Value_Code;
DimVal.GET(Dimensioncode,Dimension_Value_Code);
TempDimSetEntry."Dimension Value ID" := DimVal."Dimension Value ID";
TempDimSetEntry.INSERT;


Sachkonten-Node im XML: Import (OnBeforeInsertRecord)
Code:
IF TempDimSetEntry.FINDSET THEN
  DimensionSetID := DimensionMgt.GetDimensionSetID(TempDimSetEntry);

GenJnlLine."Dimension Set ID" := DimensionSetID;

Re: [Gelöst] Import von 6.02 Dimensionen

31. Juli 2013 16:35

Oh, vielen Dank ;-)

Sipa hat geschrieben:
Code:
IF TempDimSetEntry.FINDSET THEN
  DimensionSetID := DimensionMgt.GetDimensionSetID(TempDimSetEntry);

GenJnlLine."Dimension Set ID" := DimensionSetID;

Ich hoffe, DimensionSetID ist eine lokale oder anderweitig initialisierte Variable, für den Fall, dass TempDimSetEntry mal doch leer ist?

Oder so:
Code:
IF TempDimSetEntry.FINDSET THEN BEGIN
  DimensionSetID := DimensionMgt.GetDimensionSetID(TempDimSetEntry);

  GenJnlLine."Dimension Set ID" := DimensionSetID;
END;

Re: [Gelöst] Import von 6.02 Dimensionen

31. Juli 2013 16:39

Ja sie wird vorher immer auf leer gesetzt. Sicher ist sicher^^