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 ItemOnInsert
- 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?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.