Drucken eines externen PDF aus AX2009 mit Hilfe des Adobe Readers.
static void printPDF(str _filePath, PrintJobSettings _printJobSettings = new PrintJobSettings() )
{
PrintJobSettings printJobSettings;
str adobeExe;
str adobeParm;
Set permissionSet;
;
permissionSet = new Set(Types::Class);
permissionSet.add( new InteropPermission(InteropKind::ClrInterop) );
CodeAccessPermission::assertMultiple( permissionSet );
if (System.IO.File::Exists(_filePath))
{
//get Adobe Reader executable
adobeExe = WinAPI::findExecutable(_filePath);
adobeParm = strFmt('/n /t "%1" "%2" "%3" "%4"',
_filePath,
printJobSettings.printerPrinterName(),
printJobSettings.printerDriverName(),
printJobSettings.printerPortName());
winAPI::shellExecute(adobeExe, adobeParm);
}
CodeAccessPermission::revertAssert();
}
Adobe Commandline Arguments:
http://www.robvanderwoude.com/commandlineswitches.php#Acrobat
Developers blog on the topics Microsoft Dynamics AX. For versions AX2012 and AX2009.
Mittwoch, 18. Dezember 2013
Donnerstag, 7. November 2013
WinApi::CreateDirectoryPath verursacht Fehler bei Verwendung von UNC Pfaden
Bei der Umstellung der Version Kontrolle
von relativen Pfaden hin zu UNC Pfaden musste ich feststellen das die Methode
WINAPI::CreateDirectoryPath nicht mit UNC Pfaden arbeiten kann. Es wird folgender Fehlermeldung ausgegeben:
"ClrObject static method invocation error"
Es hat eine Weile gedauert aber dann bin
ich auf eine funktionierende Lösung gestoßen.
//
Verifyes or creates Path
static client public boolean createDirectoryPath(FilePath _path)
{
int ptr;
;
_path = strLRTrim(_path);
if (substr(_path,strlen(_path),1) != '\\') // Adding backslash gives a more simple while-loop!
{
_path += '\\';
}
//enables creation of UNC paths, by detecting which folder already exists (backwards).
ptr = strLen(_path);
ptr = strfind(_path, '\\', ptr, -ptr);
while(!WinAPI::folderExists(substr(_path,1,ptr)))
{
ptr = strfind(_path, '\\', ptr -1 , -ptr);
}
while (ptr)
{
WinAPI::createDirectory(substr(_path, 1, ptr));
if (!WinAPI::folderExists(substr(_path, 1, ptr)))
{
break;
}
ptr = strfind(_path, '\\', ptr + 1, strlen(_path));
}
return WinAPI::folderExists(_path);
}
static client public boolean createDirectoryPath(FilePath _path)
{
int ptr;
;
_path = strLRTrim(_path);
if (substr(_path,strlen(_path),1) != '\\') // Adding backslash gives a more simple while-loop!
{
_path += '\\';
}
//enables creation of UNC paths, by detecting which folder already exists (backwards).
ptr = strLen(_path);
ptr = strfind(_path, '\\', ptr, -ptr);
while(!WinAPI::folderExists(substr(_path,1,ptr)))
{
ptr = strfind(_path, '\\', ptr -1 , -ptr);
}
while (ptr)
{
WinAPI::createDirectory(substr(_path, 1, ptr));
if (!WinAPI::folderExists(substr(_path, 1, ptr)))
{
break;
}
ptr = strfind(_path, '\\', ptr + 1, strlen(_path));
}
return WinAPI::folderExists(_path);
}
Verwendung von Team Foundation Server 2012 als Versionskontrolle für AX 2009
Grundsätzlich kann man für die Installation und Integration
die Step by Step Anleitung aus folgenden Blog verwenden http://blog.enhancealm.com.au/2011/03/08/dynamics-ax-development-using-tfs-2010/.
Das Vorgehen für TFS2010 ist auf TFS2012 übertragbar.
Problematischer stellte sich die Integration in unserer
Multi Developer Umgebung da. Wir verwenden für die Entwicklung von AX2009, Citrix
Clients. Über die der jeweilige Entwickler auf den AOS zugreift. AX2009 kennt
standardmäßig nur einen Speicherort für das lokale Repository. Um für jeden Entwickler
ein lokales Repository zu verwenden musste die AX Klasse SysVersionControlParameters angepasst werden, um eine eigenes Repository
mit der Benutzerkennung zu erstellen.
#SysVersionControl
SysVersionControlParameters parameter;
;
SysVersionControlParameters parameter;
;
parameter.selectForUpdate(_forupdate);
select firstonly parameter
index Key
where parameter.Key == 0;
select firstonly parameter
index Key
where parameter.Key == 0;
if(parameter)
{
if(parameter.VCSType == SysVersionControlType::SysVersionControlTfs)
{
parameter.RepositoryFolder = strFmt("%1_%2",parameter.RepositoryFolder,curUserId());
new InteropPermission( InteropKind::ClrInterop ).assert();
if(!WinApi::pathExists(parameter.RepositoryFolder))
{
WinApi::createDirectoryPath(parameter.RepositoryFolder);
info('Nur für Entwickler:\r\nBitte Repository manuell synchronisieren');
}
}
}
.
.
.
{
if(parameter.VCSType == SysVersionControlType::SysVersionControlTfs)
{
parameter.RepositoryFolder = strFmt("%1_%2",parameter.RepositoryFolder,curUserId());
new InteropPermission( InteropKind::ClrInterop ).assert();
if(!WinApi::pathExists(parameter.RepositoryFolder))
{
WinApi::createDirectoryPath(parameter.RepositoryFolder);
info('Nur für Entwickler:\r\nBitte Repository manuell synchronisieren');
}
}
}
.
.
.
Bei der Angabe des Repository für die AX Versions Kontrolle
Parameters wird nun nur der Pfad zum Basisordner für alle Entwickler Repository
angegeben werden.
Samstag, 10. August 2013
Beheben von Timeout Problemen bei Skriptausführung
Bei der Verarbeitung von Querys oder Aufruf von Methoden im AX, die ein längere Laufzeit haben. kann es vorkommen das der Timeout des WebParts überschritten wird. Um dies zu verhindern kann man den Timeout beim betreffenden WebControls erhöht werden.
using System.Web.UI;
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager scripts = ScriptManager.GetCurrent(this.Page);
if (scripts != null)
{
scripts.AsyncPostBackTimeout = 600;
}
}
In diesem Source Beispiel wird der Postback Timeout vom 600 Sekunden erhöht, der Standardwert ist 90 Sekunden.
Verwendung von AX Labels im Enterprise Portal
Neben der durch Feldbezeichnungen und Feldgruppen automatisch durchgeführte Label Nutzung, können im Enterprise Portal einzelne Labes aus den Label Dateien genutzt werden. Hierfür muss die jeweilige LabelId bekannt sein und die jeweiligen Label Dateien auf dem AOS-Server ausgeliefert sein.
Grundsätzlich gibt es zwei Möglichkeiten auf die Labels innerhalb des Enterprise Portals zuzugreifen. Zum einen über das ASP .NET-Markup oder aus dem Source des jeweiligen Web oder auch User Controls.
ASP .NET-Markup
Sie können Labels von Microsoft Dynamics AX in der Markup für eines Web oder User Controls verwenden.
Der um für das Label nun das jeweiligen Lokalisierten Label aus AX zu verwenden. Kann das folgt ASP.NET-Markup verwendet werden.
Source Code
Microsoft Dynamics AX Label können auch in Source des Web oder des User Controls verwendet werden. Hier für wird die Labels Klasse das dem Namespace Microsoft.Dynamics.Framework.Portal.UI benötigt. Diese stellt die Methode GetLabel zum auslesen des AX Labels zur Verfügung.
siehe auch AX 2009 EP Development CookBook
Grundsätzlich gibt es zwei Möglichkeiten auf die Labels innerhalb des Enterprise Portals zuzugreifen. Zum einen über das ASP .NET-Markup oder aus dem Source des jeweiligen Web oder auch User Controls.
ASP .NET-Markup
Sie können Labels von Microsoft Dynamics AX in der Markup für eines Web oder User Controls verwenden.
<%$label:@SYS1234%>
Der um für das Label nun das jeweiligen Lokalisierten Label aus AX zu verwenden. Kann das folgt ASP.NET-Markup verwendet werden.
<asp:Label ID="Label1" runat="server" Text="<%$axlabel:@SYS1234%>"></asp:Label>
Source Code
Microsoft Dynamics AX Label können auch in Source des Web oder des User Controls verwendet werden. Hier für wird die Labels Klasse das dem Namespace Microsoft.Dynamics.Framework.Portal.UI benötigt. Diese stellt die Methode GetLabel zum auslesen des AX Labels zur Verfügung.
this.PageDefinition.pageTitle = Labels.GetLabel("@SYS131104");
siehe auch AX 2009 EP Development CookBook
Abonnieren
Posts (Atom)