Dimensionstransfer zwischen Master-Tabellen

13. November 2006 22:35

Ich muss derzeit für ein Modul die Dimensionsfunktionalität ergänzen.
In einem konkreten Fall soll ein so genannter Serviceartikel automatisch die Dimensionen der Quell-Artikelnummer erhalten.

Beim Durchforsten des Codeunits DimensionManagement ist mir aufgefallen, dass der Standard einen Dimensionstransfer von Master-Table zu Master-Table (jeweils durch Tabelle Default Dimension) nicht vorsieht.

Meine bisherige Vorgehensweise würde wie folgt aussehen:

Im OnInsertTrigger der Tabelle Service Item (bzw. beim "Item No. OnValidate") würde ich folgende Funktionen aus dem Codeunit aufrufen:

1. DeleteDefaultDim (alle bisherigen Dimensionswerte löschen)
2. Eine neue Funktion z.B. namens MoveDefaultDimToDefaultDim nach dem Vorbild MoveDocDimToDocDim

Wer ist hier Dimensspezialist? Kann ich es "richtiger" machen?
Gibt es wider Erwarten im Standard einen solchen DefaultDimension-Transfer?

13. November 2006 23:18

Hallo Nadine,

im "OnInsert"-Trigger wäre meiner Meinung nach nicht richtig. Es könnte ja sein, dass zu diesem Zeitpunkt das Feld "Item No." noch gar nicht gefüllt ist. Ich würde deshalb im "OnValidate"-Trigger des Feldes "Item No." das ganze programmieren.

Da die Serviceartikel jedoch von Haus aus keine Dimensionen kennen, müsste noch etwas mehr programmiert werden.

Wenn du noch zwei, drei Tage Zeit hast, könnte ich dir eine etwas ausführlichere Anleitung bieten: Ich schriebe nämlich gerade an einem kleinem Tutorial genau zu diesem Thema.

Gruß, Marc

14. November 2006 09:02

*heul* Warum werde ich eigentlich permanent mit Nadine verwechselt? *g*

Speziell für Serviceartikel ist das Dim.Management - bis auf die Sache mit der Item No. - vollständig. Ich habe mich da eng an die Schulungsunterlagen und damit den Standard gehalten.
Leider betrifft die Dimeinsionsvervollständig noch viel mehr Programmteile als nur den Serviceartikel, von daher gibt es jede Menge zu tun - ich bin gespannt auf deine Anleitung!

Ich weiß nur leider nicht, ob ich noch so viel Zeit habe ...

Vielleicht eine kurze Frage vorweg:
Tabelle 37, Funktion CreateDim: Wofür arbeitet man in der dort aufrufenden Funktion GetPreviousDocDefaultDim mit dem Parameter DATABASE::Customer? Ist das nur ein Dummy für eine Tabelle, die (garantiert) keine Dimensionen hat, damit es in der dort erzeugten TempDimBuf1 (Dimensionspuffer) keine Schlüsselverletzungen o.ä. geben kann?

14. November 2006 10:31

Habe übrigens soeben erfahren, dass ich mit den Dimensionen ohnehin erst Donnerstag (frühestens) weiter machen kann.

Falls du bis dahin die Beschreibung schaffen würdest, wäre das ganz toll! :-)

16. November 2006 11:52

In der Zwischenzeit habe ich folgendes Dokument gefunden:
http://www.comsol-online.de/old/pdf/whi ... sionen.pdf

Das ist per se schon mal nicht schlecht, um einen Einstieg zu bekommen.

16. November 2006 14:06

So sieht meine Lösung jetzt aus (ich habe die Vorgehensweise aus T36 kopiert und von DocDim auf DefaultDim übertragen):

Codeunit DimensionManagement
Neue Funktionen
InsertDefaultDim(TableID : Integer;No : Code[20];VAR GlobalDim1Code : Code[20];VAR GlobalDim2Code : Code[20])

Code:
IF TempDimBuf2.FIND('-') THEN
  UpdateDefaultDim2(TableID,No,GlobalDim1Code,GlobalDim2Code);

UpdateDefaultDim2(TableID : Integer;No : Code[20];VAR GlobalDim1Code : Code[20];VAR GlobalDim2Code : Code[20])

Code:
GetGLSetup;
DefaultDim.SETRANGE("Table ID",TableID);
DefaultDim.SETRANGE("No.",No);
DefaultDim.DELETEALL;
GlobalDim1Code := '';
GlobalDim2Code := '';
IF TempDimBuf2.FIND('-') THEN BEGIN
  REPEAT
    DefaultDim.INIT;
    DefaultDim.VALIDATE("Table ID",TableID);
    DefaultDim.VALIDATE("No.",No);
    DefaultDim."Dimension Code" := TempDimBuf2."Dimension Code";
    DefaultDim."Dimension Value Code" := TempDimBuf2."Dimension Value Code";
    DefaultDim.INSERT;
    RecRef.GETTABLE(DefaultDim);
    ChangeLogMgt.LogInsertion(RecRef);
    IF DefaultDim."Dimension Code" = GLSetupShortcutDimCode[1] THEN
      GlobalDim1Code := DefaultDim."Dimension Value Code";
    IF DefaultDim."Dimension Code" = GLSetupShortcutDimCode[2] THEN
      GlobalDim2Code := DefaultDim."Dimension Value Code";
  UNTIL TempDimBuf2.NEXT = 0;
  TempDimBuf2.RESET;
  TempDimBuf2.DELETEALL;
END;


Tabelle Service Item
OnInsert
Code:
DimMgt.InsertDefaultDim(
  DATABASE::"Service Item","No.","Global Dimension 1 Code","Global Dimension 2 Code");


OnDelete
Code:
DimMgt.DeleteDefaultDim(DATABASE::"Service Item","No.");


Item No. - OnValidate
Code:
CreateDim(DATABASE::Item,"Item No.")


CreateDim(Type1 : Integer;No1 : Code[20])
Code:
SourceCodeSetup.GET;
TableID[1] := Type1;
No[1] := No1;

"Global Dimension 1 Code" := '';
"Global Dimension 2 Code" := '';
DimMgt.GetDefaultDim(
  TableID,No,SourceCodeSetup."Service Management",
  "Global Dimension 1 Code","Global Dimension 2 Code");
IF "No." <> '' THEN   
  DimMgt.UpdateDefaultDim2(
    DATABASE::"Service Item","No.","Global Dimension 1 Code","Global Dimension 2 Code");


Irgendwelche Einwände/Anmerkungen?

21. November 2006 12:04

Ist hier denn echt niemand, der sich mit Dimensionen auseinander setzt? :-(