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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.01.2004, 11:15   #1  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
Post Импорт из текстового файла - один их вариантов.
Была поставлена задача осуществить импорт из системы клиент-банк (КБ) платежных поручений. КБ для обмена с внешними системами предоставляет текстовый файл примерно в таком виде:
Поле 1 = 111
Поле 2 = 444
Поле 3 = 555
Кон
Поле 1 = 888
Поле 2 = 777
Поле 3 = 999
Кон
Для осуществления сего за основу для работы с текстовым файлом взял класс AsciiIo. В качестве примера взял класс CustInPaymCH_DebitDirect. Открытие для чтения файла:
Старый 13.01.2004, 11:25   #2  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
Извините нечаянно отправил недописанное сообщение
boolean openFile()
{
boolean ret = false;
;
aSCIIFile = new AsciiIo(filename, 'r');

if (aSCIIFile)
{
if (aSCIIFile.status())
{
throw error("@SYS52680");
}
aSCIIFile.inFieldDelimiter('\r\n');
aSCIIFile.inRecordDelimiter('\r\n');
ret = true;
}
return ret;
}
Параметры \r\n надо обязательно проставить, при условии, если вы не хотите вводит разделители полей и записей. Если не проставишь то чтение строки будет происходить до первого пробела. Далее происходит чтение файла в память. Сдела это так:
if (aSCIIFile)
{
while (aSCIIFile.Status() == IO_Status::Ok)
{
memoryFile = conins(memoryFile, fileCountFile, aSCIIFile.read());
fileCountFile++;
}
}
Каждый элемент контейнера - это строка файла. Потом перемещаясь по контейнеру, вы фактически пермещатесь по строкам файла. Ну и наконец в цикле возможна обработка строк стандарными функциями Ax, например subStr итд. Единственная оговорка, что при вставки записи вполне понадобиться измнение номерной серии программно. Я делал это так:
Мое поле = NumberSeq::newGetNumFromCode("Моя серия", true, false).num();
За совет спасибо форуму.
Описание классов, отвечающих за работу с текстовыми файлами в Ax можно найти:
http://axapta.mazzy.ru/hints/textfile/
Старый 13.01.2004, 12:03   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
А почему Вы решили не использовать "Кон\r\n" в качестве inRecordDelimeter?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 13.01.2004, 12:17   #4  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
А как же тогда поля разделять...?.Тем более нужно не всю строку, а подстроку...
Поле 1 = 111
Из этой строки нужно 111.
Старый 13.01.2004, 13:18   #5  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Секундочку, за разделение полей отвечает inFieldDelimeter. Вот вам маленький Job. Попробуйте почитать Ваш файл с его помощью. Потом подставьте Ваше значение для inRecordDelimeter и почувствуйте разницу
PHP код:
{
    
#define.FileName("C:\\Max\\Axapta\\Temp\\test.txt")

    
CommaIO     file;
    
container   line;
    
int         recNum;
    
str         linePart;

    
file = new CommaIO(#FileName, "R");

    
if (file) {
        if (
file.status()) {
            throw 
error("@SYS52680");
        }
        
file.inFieldDelimiter("\r\n");
        
file.inRecordDelimiter("Кон\r\n");

        
setPrefix(#FileName);
        
recNum 0;
        while (
file.status() == IO_Status::Ok) {
            
line file.read();
            if (
conlen(line)) {
                
recNum ++;
                
setprefix("Record " int2str(recNum));
                for (
linePart ""conlen(line); line condel(line11)) {
                    
linePart conpeek(line1);
                    
info(linePart);
                }
            }
        }
    }

__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 13.01.2004, 16:31   #6  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
Thumbs up
Получилось не плохо. Это более оптимальный вариант. Я делал разделение записей уже потом при сканировании в цикле контейнера со строками. "Кон" в файле встречается через определенное количество строк. У меня это 27. Если счетчик цикла был равен 27, то это признак конца записи. Он увеличивается опять на 27. В общем я понял, что Ваш вариант намного удобней. Просто немного не понял механизм с делиметрами.
Спасибо большое.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
импорт текст.файла во временную таблицу fialka DAX: Программирование 5 07.02.2007 15:42
Импорт данных из текстового файла mvf DAX: Программирование 17 18.04.2005 16:02
Импорт данных из XML файла Sanek DAX: Программирование 0 01.04.2005 17:56
Импорт из текстового файла YVAS DAX: Программирование 8 08.04.2004 16:44
импорт из текстового файла ea DAX: Администрирование 1 05.06.2003 20:19

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

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

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