AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: За рубежом > DAX auf Deutsch
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2009, 01:06   #1  
Blog bot is offline
Blog bot
Участник
 
25,631 / 848 (80) +++++++
Регистрация: 28.10.2006
jinx: Anzeige von Lagerdimensionen auf Masken
Im Standard von Microsoft Dynamics AX besteht auf jeder Maske, auf der Artikel undderen Lagerdimensionen angezeigt werden, die Möglichkeit, die Lagerdimensionen, bzw.die angezeigten Felder der Lagerdimensionen, über die Funktion "Lager-Dimensionenanzeige"entsprechend zu steuern.

Die einzelnen Elemente (Felder) der Lagerdimension können über diese Funktion ein-bzw. ausgebledet werden.

Weiterhin ist es auch möglich, durch Parametrisierung zu bestimmen, ob ein Feld einerLagerdimension eingeben werden muss (Mussfeld) oder ob überhaupt eine Eingabe möglichist.

Ein gutes Beispiel hierfür ist die Maske "Aufträge".

Wie ist es nun, wenn eine neue Maske erstellt werden soll, welche Artikelinformationund Lagerdimensionen anzeigen soll?
Wie genau muss vorgegangen werden, um die bereits an vielen Stellen im Standardverwendete Funktionalität auch für die selbst erstellte Maske bereitzustellen?

Gehen wir einmal davon aus, es wurde eine neue Tabelle erstellt, welche die Artikelnummer(ItemId) und die Lagerdimensionsnummer (InventDimId) speichert.
Für diese Tabelle soll eine Maske erstellt werden, úm dem Benutzer die Möglichkeitzu geben, Datensätze zu erfassen, zu ändern oder einfach nur anzuzeigen.

Dies könnte z.B. so aussehen:


Um nun die Funktion der Lagerdimensionensteuerung einzubauen muss zuerst die TabelleInventDim als DataSource der Maske hinzugefügt werden.
Anschließend müssen die Eigenschaften (Properties) der DataSource noch auf folgendeWerte geändert werden.

Name

InventDim

JoinSource

Haupt-Datenquelle (hier: AKUDemoTable)

LinkType

InnerJoin

DelayActive

No

InsertAtEnd

No

InsertIfEmpty

No





Nun muss eine neue ButtonGroup (Name: "Inventory") im Designzweig der Maske erstelltwerden. Diese sollte das LAbel "Lager" zugewiesen werden.
Nun noch das MenuItem "InventDimParmFixed" in diese ButtonGroup ziehen (z.B. per drag& drop aus dem AOT) und dem so erstellten MenuItemButton folgende Eigenschaftenzuweisen.

Name

InventDimParmFixed

MenuItemName

InventDimParmFixed

DataSource

Haupt-Datenquelle (hier: AKUDemoTable)





Über das MenuItem (oder genauer über den erstellten MenuItemButton) wird nun wie imStandard, die Maske "Lagerdimensionen" zu öffnen.



Allerdings öffnet sich die Maske „Lagerdimensionen“ noch nicht wie gewünscht überden MenuItemButton. Hierfür sind noch weitere Anpassungen notwendig.

Damit sich die Maske „Lagerdimensionen“ wie gewünscht öffnet muss die neue Maske dieMethode „inventDimSetupObject“ implementieren welche eine Instanz von „InventDimCtrl_Frm“zurück gibt.

Die Klasse „InventDimCtrl_Frm“, bzw. eine der von ihr abgeleiteten Klassen, steuertz.B. welche Lagerdimensionen für den aktuellen Datensatz zulässig sind oder welcheDimensionen für den aktuellen Datensatz angegeben werden müssen, damit dieser gespeichertwerden kann.

Da über die Parametrisierung der Lagersteuerungsgruppen und der Modulparameter hierfürdurchaus unterschiedliche Einstellungen gewählt werden können, sind in Dynamics AXetliche Ableitungen dieser Klasse vorhanden (jede wird für eine oder mehrere andereMasken verwendet).



Je nachdem, was für eine Funktionalität bzw. was für ein Business-Prozess erstelltwerden soll, kann entweder eine der bereits im Standard vorhandenen Klassen verwendetwerden oder es muss eine neue Klasse geschrieben werden, um die benötigte Funktionalitätzu liefern (z.B. welche Dimensionen immer angezeigt werden müssen).

Das Erstellen einer neuen Klasse, welche von „InventDimCtrl_Frm“ abgeleitet ist, ist recht einfach.

Es sollte immer die Methode „new“ überschrieben werden und mindestens die statischenMethoden „construct“ und „newFromForm“ erstellt werden.

class AKUInventDimCtrl_Frm_Demoextends InventDimCtrl_Frm
{
}


protected void new()
{
super();
}


public static AKUInventDimCtrl_Frm_Democonstruct()
{
return new AKUInventDimCtrl_Frm_Demo();
}


static AKUInventDimCtrl_Frm_DemonewFromForm(FormRun _formRun)
{
AKUInventDimCtrl_Frm_Demo inventDimCtrl = AKUInventDimCtrl_Frm_Demo::construct();
InventDimAxFormAdapter adapter = InventDimAxFormAdapter::newFromForm(_formRun);
;
inventDimCtrl.parmCallingElement(adapter);
inventDimCtrl.init();
return inventDimCtrl;
}


Weiterhin können noch andere Methoden überschrieben werden, um z.B. zu steuern, welcheFelder der Tabelle „InventDim“ beim Aufruf der Maske angezeigt werden sollen.
Weitere Informationen hierzu sind im Microsoft Dynamics AX Developer Center zu finden: http://msdn.microsoft.com/en-us/library/cc618009.aspx

NoYesmustShowGridField(fieldId _dimFieldId)
{
NoYes ret;

ret = super(_dimFieldId);
//always show InventLocationId in Grid
if(_dimfieldId == fieldnum(InventDim, InventLocationId))
{
ret = NoYes::Yes;
}

return ret;
}


Wie zuvor beschrieben muss nun die Methode „inventDimSetupObject“ auf der Maske implementiertwerden. Das diese eine Instanz von „InventDimCtrl_Frm“ zurück geben muss, ist dieseebenfalls zu erzeugen. Als erstes muss eine Objektvariable für das „InventDimCtrl_Frm“Objekt erstellt werden.

public class FormRunextends ObjectRun
{
InventDimCtrl_Frm inventDimFormSetup;
}


Anschließend kann die Methode „inventDimSetupObject“ erstellt werden.

ObjectinventDimSetupObject()
{
return inventDimFormSetup;
}


Da die Objektvariable durch diesen Quelltext noch nicht initialisiert wird, muss nochentsprechender Code zur Initialisierung geschrieben werden.

void updateDesign(InventDimFormDesignUpdatemode)
{
inventDimParm inventDimParmShow;
inventDimParm inventDimParmEnabled;
;
switch (mode)
{
case InventDimFormDesignUpdate::Init :
if (!inventDimFormSetup)
{
inventDimFormSetup = AKUInventDimCtrl_Frm_Demo::newFromForm(element);
}
inventDimFormSetup.parmSkipOnHandLookUp(true);

case InventDimFormDesignUpdate::Active :
inventDimFormSetup.formActiveSetup(
inventTable::find(AKUDemoTable.ItemId).dimGroupId);
inventDimFormSetup.formSetControls(true);
break;

case InventDimFormDesignUpdate::FieldChange :
inventDimFormSetup.formActiveSetup(
inventTable::find(AKUDemoTable.ItemId).dimGroupId);
inventDim.clearNotSelectedDim(inventDimFormSetup.parmDimParmEnabled());
inventDimFormSetup.formSetControls(true);
break;

default :
throw error(strfmt("@SYS54195",funcname()));
}
}


public void init()
{
;
super();
element.updateDesign(InventDimFormDesignUpdate::Init);
}


Da die Logik, welche durch die Methode „updateDesign“ bereit gestellt wird, mehrfachbenötigt wird, erfolgt die Initialisierung des „InventDimCtrl_Frm“ Objekts nicht direktin der „init“ Methode.

Damit die in der Maske erstellten Datensätze auch richtig gespeichert werden können,müssen nun noch einige weitere Anpassungen an den Methoden der Datenquellen vorgenommenwerden.

Datasource „AKUDemoTable“ (Hauptdatenquelle):
Hier sind die Methoden „write“, „validateWrite“ und „active“ zu überschreiben.

public void write()
{
;
ttsbegin;

AKUDemoTable.inventDimId = InventDim::findOrCreate(InventDim).inventDimId;

super();

if(AKUDemoTable.inventDimId != InventDim.inventDimId)
{
InventDim.data(InventDim::find(AKUDemoTable.inventDimId));
InventDim_ds.setCurrent();
}

ttscommit;
}
<span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
public booleanvalidateWrite()
{
boolean ret;
;
AKUDemoTable.InventDimId = inventDim::findOrCreate(InventDim).inventDimId;

ret = super();
return ret;
}

int active()
{
int ret;
;
ret = super();

element.updateDesign(InventDimFormDesignUpdate::Active);

inventDim_DS.active();

return ret;
}


> Datasource „InventDim“:
Hier müssen die Methoden „initValue“ und „write“ überschrieben werden.

public void initValue()
{
;
InventDim.data(InventDim::find(AKUDemoTable.inventDimId));

super();
}

public void write()
{
//super();
}


Hierbei muss unbedingt beachtet werden, dass der „super“ Aufruf in der „write“ Methodeder Datasource „InventDim“ auskommentiert wird, um das Speichern von falschen InventDimDatensätzen zu verhindern.

Als letzte Methode sollte nun noch die Methode „modified“ des DataSource-Field „ItemId“der Datasource „AKUDemoTable“ überschrieben werden, damit auf eine Änderung der Artikelnummerreagiert werden kann (z.B. Artikelabhängige Anzeige der Lagerdimensionen).

public void modified()
{
;
super();
element.updateDesign(InventDimFormDesignUpdate::FieldChange);
}


Somit sind alle benötigten Quelltextanpassungen durchgeführt, sodass nur noch dieFeldgruppe „InventoryDimensions“ der DataSource „InventDim“ mit in das Grid gezogenwerden muss um die Lagerdimensionen auf der Maske anzuzeigen. Optional kann dieseauch in die TabPage „Dimensions“ gezogen werden um ein standardkonformes Aussehender Maske zu erhalten.



Das vorgestellt Bespiel steht hier alsDownload bereit um die einzelnen Schritte genau ansehen/nachvollziehen zu können.
AKU_Demo_InventDimFrm.rar(2,71 KB)


Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)

More...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
jinx: Anzeige von Lagerdimensionen auf Berichten Blog bot DAX auf Deutsch 0 04.04.2009 22:05
jinx: Drag & Drop in Masken Blog bot DAX auf Deutsch 0 16.10.2007 16:10
jinx: Microsoft Dynamics AX API – Teil 2 „Erstellen von Bestellungen“ Blog bot DAX auf Deutsch 1 04.09.2007 11:46
jinx: Auf Benutzereingaben reagieren in Dialogen und DialogControls Blog bot DAX auf Deutsch 1 17.05.2007 16:50

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:20.