Fehlerhafte str2con Funktion unter AX 2009

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:

static void str2conBug(Args _args)
{
    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:

static void str2conReplacement(Args _args)
{
    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));
    }
}
Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2009

 
 

 

 
 
 
Beiträge des aktuellen Monats
November 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
252627282930 
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
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