2009-11-24 15 views
0

Existe-t-il un moyen de forcer un conteneur à stocker toutes les valeurs en tant que chaînes? J'utilise str2con pour diviser les chaînes de texte en conteneurs. Chaque fois qu'un champ avec des nombres n'apparaît, il est stocké comme un int, ce qui n'est pas un gros problème. Ce qui est un gros problème, c'est quand la chaîne de nombres dépasse la taille de l'entier et le nombre devient quelque chose de différent.Axapta: forcer le conteneur entier à être stocké sous forme de chaîne

Tenir compte des chaînes suivantes:

"Text1,Text2"  Container becomes: str "Text1", str "Text2" 
"1111111111,Text" Container becomes: int 1111111111, str "Text" 
"8888888888,Text" Container becomes: int -961633963, str "Text" (THIS IS BAD) 

Toutes les suggestions sur la façon de contourner ce problème?

Merci

Répondre

1

Vous pouvez voir comment str2con Microsoft mis en œuvre en regardant la méthode Global.str2con. Pour empêcher la méthode d'ajouter des entiers à un conteneur, faites une copie de la méthode et mettez en commentaire les trois lignes de la sous-fonction add2Ret qui vérifie si la chaîne est uniquement composée de chiffres. Vous ne voulez probablement pas modifier la fonction str2con existante, car d'autres parties du système peuvent dépendre des entiers qui sont réellement des entiers lors de l'appel de cette méthode.

void add2Ret(str _current) 
{ 
    // v-artemt, 26 Jul 2004, PS#: 1741 
//remove next three lines so only integers will be added as strings not integers 
// if (match('<:d+>', _current)) 
//  ret += str2int(_current); 
// else 
     ret += _current; 
} 

Ou vous pouvez ajouter une logique plus complexe pour vérifier la longueur de la chaîne et utiliser uniquement str2int si la chaîne pourrait ajustement possible dans un nombre entier.

+0

Merci! Travaillé parfaitement ... après avoir réalisé que la classe Global n'est pas dans le G, mais au bas de la liste. ;) – Brad

1

Voici implémentation alternative:

#define.Comma(",") 

static container str2con_alt(str _string, str _separator = #Comma, boolean _ignoreNearSeparator = false) 
{ 
    container con = connull(); 
    int  pos, oldPos = 1; 
    str  tmpStr; 

    do 
    { 
     pos = strscan(_string, _separator, pos ? pos + strlen(_separator) : 1, strlen(_string)); 
     tmpStr = substr(_string, oldPos, pos ? pos - oldPos : strlen(_string) + 1 - oldPos); 

     if (tmpStr || ! _ignoreNearSeparator) 
     { 
     con += tmpStr; 
     } 

     oldPos = pos + strlen(_separator); 
    } 
    while (pos); 

    return con; 
} 
0

mondiale :: str2con_RU() Je l'ai utilisé cette quelques fois, je crois que la plupart des environnements ont cette méthode.

ledgerCon = str2con_RU (ledgerDimStr, # sep);

// ou

ledgerCon = global :: str2con_RU (ledgerDimStr, # septembre);