AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2007, 12:06   #1  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
! контейнер: += трагедия вставки пустой строки.
предлагаю вашему вниманию очередную бочину в энджине аксапты (ax3sp2):
демонстрирует его следующий джобик: кодирует строку в штрих код с попутной вставкой пустой строки в контейнер.
X++:
#define.bug(0)
#define.showstep(1)
#define.str2code("123")

static void Job144(Args _args)
{
container   ret1;
str         cret;
int         clen;
int         i;

// кодирует barcode
str  encode(str _string)
{
    DLLFunction         _BC_Code128;
    DLL                 _barcodeDLL;
    str                 barcodeStr;
;
    try
    {
        _barcodeDLL = new DLL('Bcfont32');
    } catch(Exception::Internal)
    {
        info("barcodeDLL error!!!");
        return '';
    }
    _BC_Code128 = new DLLFunction(_barcodeDLL,'BC_Code128');
    _BC_Code128.returns(ExtTypes::STRING);
    _BC_Code128.arg(ExtTypes::STRING);
    barcodeStr = _BC_Code128.call(_string);
    _barcodeDLL = null;
    _BC_Code128 = null;
    return barcodeStr;
}

;
    try
    {
        cret =  encode(#str2code);
        info("до вставки в контейнер : '"+cret+"'");
        for(i=1;i<10;i++)
        {
            #if.bug(1)
                ret1 += "";
            #endif
            #if.bug(0)
                ret1 = conins(ret1,conlen(ret1)+1,"");
            #endif
            #if.showstep(1)
                cret =  encode(#str2code);
                info(strfmt("вставка %1, строка: '%2', баркод: '%3'",i,#str2code,cret));
            #endif
        }
        cret =  encode(#str2code);
    }
    catch
    {
        info("catch !!!");
    }

    info("после вставки в контейнер : '"+cret+"'");
}
В джобике проверяю как отрабатывает вызов dll функции после разных методов вставки в контейнер: ret1 += "" и ret1 = conins(ret1,conlen(ret1)+1,"")

для начала ставим #define.bug(0) -> происходит 10 вставок в контейнер с помощью conins + 10 удачных кодирований.
теперь ставим #define.bug(1) -> происходит 10 вставок в контейнер оператором += и 10 кодирований из которых 3 правильно, остальные нет.
для чистоты эксперимента можно исключить вызов кодирования в каждой итерации #define.showstep(0).
(совсем забыл, после того как контейнер "уложит" вызов ф-ции кодирования, функция уже нормально не отработает - перезапуск клиента). Т.е. нарушение каких то внутренних структур на лицо.

Вывод: не использовать для контейнера оператор +=<str>

PPS: вывод оказался не верным, что не может не радовать - базовые операторы таки работают нормально.
__________________
--- SHiSHok

Последний раз редактировалось SHiSHok; 06.06.2007 в 16:24. Причина: более понятно написал
Теги
bstr, lpstr, баг, штрихкод

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Цветные строки в Grid Sergo DAX: База знаний и проекты 14 19.04.2012 10:02
контейнер: '+=' vs 'conins' небольшое исследование SHiSHok DAX: Программирование 6 18.02.2010 15:58
При повторном вызове linkActive проваливается в validateWrite(Строки общего журнала ГК) Lemming DAX: Программирование 6 25.10.2007 13:50
При создании строки в закупке статус строки становится "Отменено" AlexUnik DAX: Функционал 4 27.09.2004 16:05
Функция "Удалить строки" Oks DAX: Функционал 1 03.07.2002 18:09
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:53.