2009-11-24 5 views
0

Есть ли способ заставить контейнер хранить все значения в виде строк? Я использую str2con для разделения текстовых строк на контейнеры. Каждый раз, когда появляется поле с числами, оно сохраняется как int, что не является большой проблемой. Большая проблема заключается в том, что строка чисел превышает целочисленный размер, а число становится чем-то другим.Axapta: целое число контейнера силы, которое должно быть сохранено в виде строки

Рассмотрим следующие строки:

"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) 

Любые предложения о том, как обойти это?

Благодаря

ответ

1

Вы можете увидеть, как Microsoft реализован str2con глядя на метод Global.str2con. Чтобы метод не добавлял целые числа в контейнер, сделайте копию метода и просто закомментируйте три строки в подфункции add2Ret, которые проверяют, является ли строка только цифрами. Вероятно, вы не хотите изменять существующую функцию str2con, так как другие части системы могут зависеть от целых чисел, являющихся целыми числами при вызове этого метода.

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; 
} 

Или вы могли бы добавить более сложную логику, чтобы проверить длину строки и использовать только str2int, если строка может возможную подгонку в целое число.

+0

Спасибо! Работала отлично ... после осознания того, что глобальный класс не в G, а в нижней части списка. ;) – Brad

1

Вот альтернативная реализация:

#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

Global :: str2con_RU() Я использовал это несколько раз, я полагаю, что большинство сред есть этот метод.

ledgerCon = str2con_RU (ledgerDimStr, # sep);

// или

ledgerCon = Global :: str2con_RU (ledgerDimStr, # Сентябрь);

 Смежные вопросы

  • Нет связанных вопросов^_^