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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.10.2008, 15:25   #1  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Импорт CSV + изменения в файле.
Доброго времени суток.

Господа, вопрос заключается в следущем.

Есть файл формата scv. В системе написана процедура импорта. Открывается и обрабатывается файл методами класса AsciiIo и построчно читается в контейнер, который и обрабатывается. Но в процессе обработки возникает необходимость изменить данные в самом файле. Например, заполнить некоторую ячейку значением "Импорт строки произведен"

Файл открывается с аттрибутом "R" -для чтения:
AsciiIo = new AsciiIo(FileSmartexSales,"R");

Есть ли какой-нибудь аттрибут, типа FOR APPEND, и можно ли как то внести нужные изменения в файл?? Если можно, то как?
Спасибо.

P.S. Прошу ногами не пинать, ибо новичек.
Старый 09.10.2008, 15:30   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
значение атрибута "w" позволяет запирывать
PS пример работы с классом можно посмотреть в AOT/System Documentation

Последний раз редактировалось ice; 09.10.2008 в 15:32.
Старый 09.10.2008, 15:33   #3  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
попробовал так, но затерлись все данные в файле.
Старый 09.10.2008, 15:35   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
попробуйте например считанные(и измененные) строчки записывать в текстовый буфер, а потом перезаписать файл
PS неуверен, но помоему есть значение аргумента "a" для добавления записей

Последний раз редактировалось ice; 09.10.2008 в 15:40.
Старый 09.10.2008, 15:43   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Не давно делал так.
Надо было ещё один столбик с данными в файл добавить.
X++:
    CommaIo         fileR;
    CommaIo         fileW;
    container       c;
    InventTable     inventTable;
    ItemId          itemId;
;
    fileR = SysDataIntegration::openFile("c:\\Node_Item_Ucp_080819.csv","R",";");
    fileW = SysDataIntegration::openFile("c:\\Node_Item_Ucp_080819_W.csv","W",";");
    c = fileR.read();
    while (fileR.status() == IO_Status::OK)
    {
        c = fileR.read();
        itemId = conpeek(c,1);
        inventTable = InventTable::find(itemId);
        if(inventTable)
            c += inventTable.NetWeight;
        else
            c+="Нет такой";
        fileW.write(c);
    }
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 09.10.2008, 16:10   #6  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от bobski Посмотреть сообщение
Например, заполнить некоторую ячейку значением "Импорт строки произведен"
...

Есть ли какой-нибудь аттрибут, типа FOR APPEND, и можно ли как то внести нужные изменения в файл?? Если можно, то как?
Так все-таки что нужно - добавлять новые записи, или модифицировать существующие? В любом случае напрямую работать с полями CSV файла Аксапта не умеет. Логично закачать данные в промежуточный буфер, в нем изменить и выгрузить через тот же Asciio или Commaio. В качестве буфера можно, например, использовать Struct.
Старый 10.10.2008, 06:20   #7  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Coolibin,
Необходимо модифицировать запись.

Благодарю, кажется начинает проясняться. Думаю, и в правду нужно обработать записи, модифицировать, и когда всё закончится снова сохранить в файле.

P.S. Ice, если открывать с атриббутом "A", то в контейнер при попытке чтения ничего не возвращается.

Последний раз редактировалось bobski; 10.10.2008 в 06:58.
Старый 10.10.2008, 10:09   #8  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Но возникла другая проблема.
Сначала запись читается в контейнер. Затем, полученный контейнер добавляется к некоторому новому контейнеру + признак новой строки. И так пока IO_Status::Ok.
После того, как цикл закончится в тот же файл забивается собранный нами контейнер. Все вроде бы правильно, но в самом файле, начиная со второй строки данные сдвигаются на ячейку вправо. Т.е. если просмотреть в текстовом виде, то начиная со второго номера перед каждой строкой стоит строковый разделитель.
Как это победить? Ничего не выходит

Вот как это делаю:
X++:
AsciiIO = new AsciiIO(FileName, "R");
AsciiIo.inRecordDelimiter('\r\n');
AsciiIo.inFieldDelimiter(';');
 
while (AsciiIo.status() == IO_Status::Ok)
{
       Data_Container = AsciiIo.read();
       ontainer_New += conins(Data_Container,conlen(Data_Container)+1,'\n');
       ...
}
 
AsciiIO = new AsciiIO(FileName, "W");
AsciiIo.OutRecordDelimiter('\r\n');
AsciiIo.OutFieldDelimiter(';');
AsciiIo.write(Data_container_New);
Старый 10.10.2008, 13:57   #9  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от bobski Посмотреть сообщение
Как это победить? Ничего не выходит

Вот как это делаю:
X++:
AsciiIO = new AsciiIO(FileName, "R");
AsciiIo.inRecordDelimiter('\r\n');
AsciiIo.inFieldDelimiter(';');
 
while (AsciiIo.status() == IO_Status::Ok)
{
       Data_Container = AsciiIo.read();
       ontainer_New += conins(Data_Container,conlen(Data_Container)+1,'\n');
       ...
}
 
AsciiIO = new AsciiIO(FileName, "W");
AsciiIo.OutRecordDelimiter('\r\n');
AsciiIo.OutFieldDelimiter(';');
AsciiIo.write(Data_container_New);
Фигня получается. Сделай как-нибудь так:
X++:
    AsciiIo.inRecordDelimiter('\r\n');
    AsciiIo.inFieldDelimiter(';');
 
    while (AsciiIo.status() == IO_Status::Ok)
    {
        Data_Container = AsciiIo.read();
        if (Data_Container != connull())
        {
            f1 = conpeek(Data_Container, 1);
            f1 = f1 + 1; // изменяем значение первого поля
            Data_Container = conPoke(Data_Container, 1, f1);
            //Вata_Сontainer_New += conins(Data_Container,conlen(Data_Container)+1,'\n');
            Data_container_New = conIns(Data_container_New, conLen(Data_container_New) + 1, Data_Container);
            //...
        }
    }
 
    AsciiIO = new AsciiIO(@"D:\TEMP\test2.csv", "W");
    AsciiIo.OutRecordDelimiter('\r\n');
    AsciiIo.OutFieldDelimiter(';');

    //AsciiIo.write(Data_container_New);
    for (i = 1; i < conlen(Data_container_New) + 1; i++)
    {
        AsciiIo.write(conpeek(Data_container_New, i));
    }
Старый 10.10.2008, 14:55   #10  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Все вроде получается, если не менять первый элемент в контейнере.
Спасибо.

Цитата:
Сообщение от coolibin Посмотреть сообщение
Фигня получается. Сделай как-нибудь так:
X++:
 ...
            f1 = conpeek(Data_Container, 1);
            f1 = f1 + 1; // изменяем значение первого поля
            Data_Container = conPoke(Data_Container, 1, f1);
 ...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Стандартный импорт данных. Обновление sparur DAX: Функционал 0 24.03.2008 19:07
C# and AX Development: Reading CSV files in AX (Axapta) Blog bot DAX Blogs 0 07.12.2007 17:30
Сводное планирование - изменения&изменения мин. Alexm DAX: Прочие вопросы 1 05.04.2005 10:43
Глюк : не сохраняются изменения в коде Logger DAX: Администрирование 2 31.01.2005 12:02
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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