Vor fast zwei Jahren habe ich schon einmal über die Funktion/Methode str2con und deren Unzulänglichkeiten in älteren Versionen von Dynamixs AX geschrieben. Leider musste ich vor kurzem feststellen, daß diese Funktion in AX 2009 auch nicht so zuverlässig ist, wie ich sie mir wünschen würde.
Sind nämlich im zu zerteilenden String rein numerische Werte enthalten, die größer oder gleich 2^31 (=2147483648) sind, kann AX diese Werte nicht mehr korrekt verarbeiten.
Nachstehend ein Job, der dieses Fehlverhalten demonstriert:
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.
Mehr dazu
Vor fast zwei Jahren habe ich schon einmal über die Funktion/Methode str2con und deren Unzulänglichkeiten in älteren Versionen von Dynamixs AX geschrieben. Leider musste ich vor kurzem feststellen, daß diese Funktion in AX 2009 auch nicht so zuverlässig ist, wie ich sie mir wünschen würde.
Sind nämlich im zu zerteilenden String rein numerische Werte enthalten, die größer oder gleich 2^31 (=2147483648) sind, kann AX diese Werte nicht mehr korrekt verarbeiten.
Nachstehend ein Job, der dieses Fehlverhalten demonstriert:
{
container con;
str myStr;
int i;
;
myStr += "Dynamics" + ";";
myStr += "Ax 2009" + ";";
myStr += "str2con" + ";";
myStr += "does" + ";";
myStr += "not work with" + ";";
myStr += "numeric values greater" + ";";
myStr += "than" + ";";
myStr += "2 ^ 31." + ";";
myStr += "Example:" + ";";
myStr += "2147483648" + ";"; // does not work
myStr += "(=2^31)" + ";";
myStr += " " + ";";
myStr += "Example:" + ";";
myStr += "5432167890" + ";"; // does not work
myStr += "(>2^31)";
con = str2con(myStr, ";");
for(i=1;i<=conLen(con);i++)
{
info(conPeek(con, i));
}
}
Mir blieb also nichts anderes übrig, als mir einen Ersatz für die Funktion str2con zu schreiben:
{
container con;
str myStr;
int i;
container str2con(str _inputStr, str 2 _delimiter = ";")
{
int delimiterPos = 0;
int lastDelimiterPos = 0;
container retCon;
do
{
lastDelimiterPos = delimiterPos;
delimiterPos = strFind(_inputStr, _delimiter, delimiterPos+1, strLen(_inputStr));
if(delimiterPos == 0 && lastDelimiterPos == 0)
{// delimiter was not found in inputstring
retCon += _inputStr;
break;
}
if(delimiterPos == 0 && lastDelimiterPos == strLen(_inputStr))
{// last element is empty, ex. "Dynamics;"
retCon += (substr(_inputStr,lastDelimiterPos+1,strLen(_inputStr)));
break;
}
if(delimiterPos == 0 && lastDelimiterPos != strLen(_inputStr))
{
retCon += (substr(_inputStr,lastDelimiterPos+1,strLen(_inputStr)));
break;
}
retCon += (subStr(_inputStr, lastDelimiterPos+1, delimiterPos - lastDelimiterPos - 1));
}
while (delimiterPos > 0);
return retCon;
}
;
myStr += "Dynamics" + ";";
myStr += "Ax 2009" + ";";
myStr += "str2con Replacement" + ";";
myStr += "which" + ";";
myStr += "works fine also with" + ";";
myStr += "numeric values greater" + ";";
myStr += "than" + ";";
myStr += "2 ^ 31." + ";";
myStr += "Example:" + ";";
myStr += "2147483648";
con = str2con(myStr);
for(i=1;i<=conLen(con);i++)
{
info(conPeek(con, i));
}
}