On AX2012 CU9 or later, if found it on CU10 for example, if you got this error, you can RUN this scripts. Is an update script of CU9, the entity name is a new field inserted on this version.
ReleaseUpdateDB63_DMF releaseUpdateDB63_DMF = new ReleaseUpdateDB63_DMF();
releaseUpdateDB63_DMF.updateEntityType();
Or, more simple, you can delete all entities, when you reopen the entities form all entities will be created. I know, you don't belive me, but it works.
venerdì 11 marzo 2016
lunedì 7 marzo 2016
CODE: Check Security Key via X++ in AX2009
this script you can check if a user has permission for a particular security key by code.
SecurityKeySet securityKeys;
Boolean fullAccess;
;
securityKeys = new SecurityKeySet();
securityKeys.loadUserRights(curuserid());
fullAccess = securityKeys.access(securitykeynum("xxxxxxxxxxxxxxx")) == AccessType::Delete;
info(fullAccess ? "1" : "0");
SecurityKeySet securityKeys;
Boolean fullAccess;
;
securityKeys = new SecurityKeySet();
securityKeys.loadUserRights(curuserid());
fullAccess = securityKeys.access(securitykeynum("xxxxxxxxxxxxxxx")) == AccessType::Delete;
info(fullAccess ? "1" : "0");
lunedì 22 febbraio 2016
HOWTO: Set translation of label on fly by code
Use this script to set the value and comment of an existing label only if this label not exist in a particolar language. You can use it on fly by code whitout use of developer tool.
In my case i can set more than 200+ labels traduction in a couple of minutes.
void modifyLabel(LabelId _labelId, str _srcLanguage, str _trgLanguace, str _trgString, str _trgComment = '')
{
SysLabel srcLang = new SysLabel(_srcLanguage);
SysLabel trgLang = new SysLabel(_trgLanguace);
;
_labelId = "@" + _labelId;
if (!srcLang.exists(_labelId) || !srcLang.extractString(_labelId))
{
warning(strfmt("L'etichetta %1 non esiste nella lingua %2", _labelId, srcLang.languageId()));
return;
}
if (trgLang.exists(_labelId) && trgLang.extractString(_labelId))
{
warning(strfmt("L'etichetta %1 esiste già nella lingua %2 con il valore %3", _labelId, trgLang.languageId(), trgLang.extractString(_labelId)));
return;
}
cnt += trgLang.modify(_labelId, _trgString, _trgComment ? _trgComment : srcLang.extractComment(_labelId));
info(strFmt("Modificata etichetta %1 e impostato il testo %2 in lingua %2", _labelId, _trgString));
}
This script can semplify the same action but in more than one language, example in my case the traduction of en-us and en-gb is the same.
void modifyLabelMultipleLanguagese(LabelId _labelId, str _srcLanguage, container _trgLanguaces, str _trgString, str _trgComment = '')
{
int i;
str trgLanguace;
;
for(i=1;i<=conlen(_trgLanguaces);i++)
{
trgLanguace = conpeek(_trgLanguaces, i);
modifyLabel(_labelId, _srcLanguage, trgLanguace, _trgString, _trgComment);
}
}
In my case i can set more than 200+ labels traduction in a couple of minutes.
void modifyLabel(LabelId _labelId, str _srcLanguage, str _trgLanguace, str _trgString, str _trgComment = '')
{
SysLabel srcLang = new SysLabel(_srcLanguage);
SysLabel trgLang = new SysLabel(_trgLanguace);
;
_labelId = "@" + _labelId;
if (!srcLang.exists(_labelId) || !srcLang.extractString(_labelId))
{
warning(strfmt("L'etichetta %1 non esiste nella lingua %2", _labelId, srcLang.languageId()));
return;
}
if (trgLang.exists(_labelId) && trgLang.extractString(_labelId))
{
warning(strfmt("L'etichetta %1 esiste già nella lingua %2 con il valore %3", _labelId, trgLang.languageId(), trgLang.extractString(_labelId)));
return;
}
cnt += trgLang.modify(_labelId, _trgString, _trgComment ? _trgComment : srcLang.extractComment(_labelId));
info(strFmt("Modificata etichetta %1 e impostato il testo %2 in lingua %2", _labelId, _trgString));
}
This script can semplify the same action but in more than one language, example in my case the traduction of en-us and en-gb is the same.
void modifyLabelMultipleLanguagese(LabelId _labelId, str _srcLanguage, container _trgLanguaces, str _trgString, str _trgComment = '')
{
int i;
str trgLanguace;
;
for(i=1;i<=conlen(_trgLanguaces);i++)
{
trgLanguace = conpeek(_trgLanguaces, i);
modifyLabel(_labelId, _srcLanguage, trgLanguace, _trgString, _trgComment);
}
}
venerdì 12 febbraio 2016
HOWTO: Get error details from INFOLOG by code
You can use this code for getting che last error from INFO LOG.
I tested this code in all situations, using prefix and other conditions, and it works fine.
In the past i found some other scripts to do that, but i some situations does not work.
int i;
container infoLogCon;
container infoLogItem;
Exception infoLogItemExceptionType;
str infoLogItemMessage;
str strInfoLogMessage;
;
try
{
infologCon = infolog.copy(1, infolog.line());
for(i = infolog.line() + 1; i > 1; i--)
{
infoLogItem = conpeek(infologCon, i);
infoLogItemExceptionType = conpeek(infoLogItem, 1);
infoLogItemMessage = conpeek(infoLogItem, 2);
if (infoLogItemExceptionType == Exception::Error)
{
strInfoLogMessage = infoLogItemMessage;
strInfoLogMessage = strreplace(strInfoLogMessage, '\t', ' - ');
break;
}
}
if (!strInfoLogMessage)
strInfoLogMessage = "Errore non definito";
}
catch
{
strInfoLogMessage = "Errore sconosciuto";
}
strInfoLogMessage = strltrim(strrtrim(strInfoLogMessage));
I tested this code in all situations, using prefix and other conditions, and it works fine.
In the past i found some other scripts to do that, but i some situations does not work.
int i;
container infoLogCon;
container infoLogItem;
Exception infoLogItemExceptionType;
str infoLogItemMessage;
str strInfoLogMessage;
;
try
{
infologCon = infolog.copy(1, infolog.line());
for(i = infolog.line() + 1; i > 1; i--)
{
infoLogItem = conpeek(infologCon, i);
infoLogItemExceptionType = conpeek(infoLogItem, 1);
infoLogItemMessage = conpeek(infoLogItem, 2);
if (infoLogItemExceptionType == Exception::Error)
{
strInfoLogMessage = infoLogItemMessage;
strInfoLogMessage = strreplace(strInfoLogMessage, '\t', ' - ');
break;
}
}
if (!strInfoLogMessage)
strInfoLogMessage = "Errore non definito";
}
catch
{
strInfoLogMessage = "Errore sconosciuto";
}
strInfoLogMessage = strltrim(strrtrim(strInfoLogMessage));
lunedì 1 febbraio 2016
HOWTO: [AX2009] Update PURCHQTY of a PURCHLINE
Use this script for update the purchase quantity of a purchline
ttsbegin;
_pLine.PurchQty = q;
PurchLine::modifyPurchQty(_pLine, InventDim::find(_pLine.InventDimId), avoidBox);
InventMovement::bufferSetRemainQty(_pLine);
_pLine.update();
ttscommit;
ttsbegin;
_pLine.PurchQty = q;
PurchLine::modifyPurchQty(_pLine, InventDim::find(_pLine.InventDimId), avoidBox);
InventMovement::bufferSetRemainQty(_pLine);
_pLine.update();
ttscommit;
venerdì 20 novembre 2015
X++: Find a shared project by name
This code allow you to search a project by name
ProjectListNode projectListNode;
TreeNodeIterator treeNodeIterator;
TreeNode treeNode;
str projectName;
;
projectName = "*xxx*";
projectListNode = SysTreeNode::getSharedProject();
treeNodeIterator = projectListNode.AOTiterator();
treeNode = treeNodeIterator.next();
while(treeNode)
{
if (treeNode.AOTname() like projectName)
info(treeNode.AOTname());
treeNode = treeNodeIterator.next();
}
ProjectListNode projectListNode;
TreeNodeIterator treeNodeIterator;
TreeNode treeNode;
str projectName;
;
projectName = "*xxx*";
projectListNode = SysTreeNode::getSharedProject();
treeNodeIterator = projectListNode.AOTiterator();
treeNode = treeNodeIterator.next();
while(treeNode)
{
if (treeNode.AOTname() like projectName)
info(treeNode.AOTname());
treeNode = treeNodeIterator.next();
}
mercoledì 11 novembre 2015
HOWTO: Turning off the Synchronize Database form on Dynamics AX 2012
It is possible that the Synchronize Database form is now showing up unexpectedly during some of your scripts, if so you can programmatically set it on or off using the SysSqlSync ShowSysSqlSync global cache setting, here is a job that will turn off the form and automatically synchronize:
static void ShowSysSqlSync(Args _args)
{
SysGlobalCache gc;
str owner = 'SysSqlSync';
str key = 'ShowSysSqlSync';
boolean showEnabled = false; //set to true to enable.
;
gc = appl.globalCache();
gc.set(owner, key, showEnabled);
info(strfmt('Show SqlSync: %1', gc.get(owner, key)));
}
Check more info on: http://blogs.msdn.com/b/daxis/archive/2009/04/26/synchronization-enhancements-in-dynamics-ax-2009.aspx
Iscriviti a:
Post (Atom)
AX 2012: The request was aborted: Could not create SSL/TLS secure channel
The error you're encountering, "The request was aborted: Could not create SSL/TLS secure channel," can occur due to various re...
-
When your code run on CIL remember to set to null any enumerator of Sets or Maps before made a change on it. If the enumerator is not restor...
-
The error you're encountering, "The request was aborted: Could not create SSL/TLS secure channel," can occur due to various re...
-
NumberSeq numberSeq; InventTransferTable inventTransferTable; InventTransferLine inventTransferLine; InventDim inventDim; ; ttsbegin; ...