Dynamics AX Blog - Dynamics AX 2012 - Beiträge vom Juni 2013

RSS-Feed dieser Version
AX 2012: SysOperation-Framework: Security-Hinweis
26.06.2013Microsoft Dynamics AX (Axapta)
Wenn man in einer Service-Klasse das Attribute SysEntryPointAttribute auf True gesetzt hat (wie ich dies beispielsweise in diesem Blog-Beitrag getan habe), darf man nicht vergessen, die jeweilige Methode in den Knoten Permissions > Server Methods eines Security-Privileges einzufügen. Nur das Hinzufügen des MenuItems der jeweiligen Controller-Klasse reicht nicht aus! Sonst kann der Benutzer unter Umständen zwar den Dialog der Funktion aufrufen, diese dann aber nicht starten. Weiters sollte man beachten, daß man Tabellen, die von dieser Klasse verwendet/befüllt werden gleichermassen über ein Privilege berechtigt. |
Modal Form in Dynamics AX erstellen/aufrufenUm in Dynamics AX ein Formular modal aufzurufen, kann man folgendes Code-Fragment aus der clicked()-Methode einer Schaltfläche (Button) verwenden: void clicked() { FormRun formRun; Args args = new Args(); super(); args.name(formStr(MyFormName)); args.record(SalesLine); formRun = classFactory::formRunClassOnClient(Args); formRun.init(); formRun.run(); If (!formRun.closed()) { formRun.wait(true); } } Auf diese Art & Weise kann man praktisch jedes Formular als modales - also als ein Formular öffnen, welches erst geschlossen werden muss, bevor mit der Anwendung weitergearbeitet werden kann - öffnen. |
Word-Dokument per Code erstellen II
14.06.2013Microsoft Dynamics AX (Axapta)
static void CreateWordFile(Args _args)
{ COM wordApplication; COM wordDocuments; COM wordDocument; COM wordRange; COM wordSelection; COM wordStyles; #define.Heading1(-2) #define.Heading2(-3) #define.Heading3(-4) #define.Heading4(-5) #define.Heading5(-6) void insertHeader(str _str, int _level) { COM wordStyle; wordSelection = wordApplication.selection(); switch( _level ) { case 1: wordStyle = wordStyles.item(#Heading1); break; case 2: wordStyle = wordStyles.item(#Heading2); break; case 3: wordStyle = wordStyles.item(#Heading3); break; case 4: wordStyle = wordStyles.item(#Heading4); break; case 5: wordStyle = wordStyles.item(#Heading5); break; default: wordStyle = wordStyles.item(#Heading3); } wordSelection.style(wordStyle); wordSelection.TypeText(_str); wordSelection.TypeParagraph(); } wordApplication = new COM("word.application"); wordApplication.visible(TRUE); wordDocuments = wordApplication.Documents(); wordDocument = wordDocuments.add(); wordDocument.saveas(@"c:\temp\LoremIpsum.doc"); wordDocument.activate(); wordStyles = wordDocument.styles(); wordRange = wordDocument.range(0,0); // Let's go insertHeader("Lorem ipsum", 1); wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"); wordSelection.TypeParagraph(); insertHeader("Lorem ipsum", 2); wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"); wordSelection.TypeParagraph(); wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut"); wordSelection.TypeParagraph(); // Finish wordDocument.save(); wordDocument.close(); wordApplication.quit(); } So sieht das Word-Dokument aus, daß mit obigem Code erstellt wurde: |
AX 2012: LedgerDimension generieren
12.06.2013Microsoft Dynamics AX (Axapta)
Die folgende Methode erstellt eine sog. LedgerDimension (EDT RecId) unter Verwendung des angebenen Hauptkontos und der angegebenen Finanzdimension. static recid createLedgerDimensionRecId() { AccountNum accountNum = '60000'; str 255 dimensionValue = '300'; Name DimensionName = 'Kostenstelle'; MainAccount MainAccount; LedgerDimensionAccount LedgerDimensionAccount; DimensionAttributeValue DimensionAttributeValue; DimensionAttribute DimensionAttribute; dimensionAttributeValueSetStorage dimensionAttributeValueSetStorage; dimensionDefault dimensionDefault; DimensionAttribute = DimensionAttribute::findByName(DimensionName); if (dimensionValue) { DimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute, dimensionValue, false, true); if (!DimensionAttributeValue) { throw error(strFmt("@SYS24602", "@SYS13911", dimensionValue)); } } // Konto MainAccount = MainAccount::findByMainAccountId(accountNum); if(MainAccount) { LedgerDimensionAccount = DimensionDefaultingEngine::getLedgerDimensionFromAccountAndDim( MainAccount.RecId, DimensionHierarchy::getAccountStructure(MainAccount.RecId)); if( !LedgerDimensionAccount) { throw error("LedgerDimensionAccount konnte nicht ermittelt werden."); } } // Konto und Dimension verbinden if (DimensionAttributeValue && LedgerDimensionAccount) { dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage(); if(dimensionAttribute) { dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, dimensionValue, false, true); dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue); } dimensionDefault = dimensionAttributeValueSetStorage.save(); LedgerDimensionAccount = DimensionDefaultingService::serviceCreateLedgerDimension(LedgerDimensionAccount, dimensionDefault); } return LedgerDimensionAccount; } Wichtig: Die Methode prüft nicht, ob es die Dimension gibt, d.h. werden ungültige Werte für DimensionName oder DimensionValue angegeben, bricht die Methode mir einer Fehlermeldung ab. |
|
|
|
|
|
|
Im folgenden eine kurze Anleitung, wie man eine Tabelle um ein Feld erweitert, in welchem ein verschlüsseltes Passwort gespeichert werden kann.
{
CryptoBlob cryptoBlob = connull();
;
cryptoBlob = DEV_Parameters::find().ServerPassword;
if (cryptoBlob != connull())
return cryptoblob2str(WinapiServer::cryptUnProtectData(cryptoBlob));
else
return '';
}
{
CryptoBlob cryptoBlob = connull();
;
if (_set && _pwd != 'xxxxxxxx')
{
cryptoBlob = WinapiServer::cryptProtectData(str2cryptoblob(_pwd));
DEV_Parameters.ServerPassword = cryptoBlob;
DEV_Parameters.update();
}
if (DEV_Parameters.ServerPassword != connull())
{
return 'xxxxxxxx';
}
else
{
return '';
}
}