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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.01.2008, 12:57   #1  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
Вот такая ситуация:
Мне надо загрузить в таблицу данные с txt файла для этого сделал:

f.TEXTMODE(TRUE);
f.OPEN(CommonDlgMgt.GetPath + CommonDlgMgt.GetFileName);
f.CREATEINSTREAM(StreamInObj);
i := 1;
WHILE NOT (StreamInObj.EOS()) DO
BEGIN
StreamInObj.READTEXT(buffer);

s:=Explode(buffer,2); //это второе поле из файла
rsHeader."Sell-to Customer No." := s; //присудил этому полю второе поле из буфера

MESSAGE('Line No. %1 %2', i , buffer);
i:=i+1;
END;
f.CLOSE();
END;
END;

А обработка строки такое::
Функция Explode

FOR i:=1 TO Number DO BEGIN
s:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1);
Buffer:=COPYSTR(Buffer,STRPOS(Buffer,';')+1);
END;

вот тут какая то ошибка при загрузке выходит ошибка :
Значение COPYCTR параметра 3 находится за пределами разрешенного интервала
текущее значение -1
Разоешенный интервал от 0...235346457
Старый 28.01.2008, 13:20   #2  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Посмотри дебаггером, что хранится в переменной Buffer в строке:

s:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1);

Доп.вопрос: Почему не используешь датапорт?
Старый 28.01.2008, 13:22   #3  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
STRPOS(Buffer,';') возвращает ноль. Нет точки с запятой видимо в строке Buffer.
Старый 29.01.2008, 03:37   #4  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
В строке buffer везде стоит вроде точка запятая.
Этот цикл читает по строкам. Теперь надо чтоб эти строки разделяло и загружало в поле таблиц
Старый 29.01.2008, 09:41   #5  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Blade85 Посмотреть сообщение
В строке buffer везде стоит вроде точка запятая.
Этот цикл читает по строкам. Теперь надо чтоб эти строки разделяло и загружало в поле таблиц
А сколько полей в загружаемом файле? Number или Number + 1?
Старый 29.01.2008, 09:48   #6  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
Прмерно так:
[Header]
‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;.......
‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;.......
[body]
‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;.......
‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;....примерно так выглядит загружаемый файл
Мне надо обработчик сделать
чтобы поля отделяло смотря ";"
Старый 29.01.2008, 10:11   #7  
apanko is offline
apanko
MCTS
MCBMSS
Лучший по профессии 2009
 
1,164 / 139 (7) +++++
Регистрация: 24.02.2005
Ваш код у меня работает.

Переменные i, s, buffer используются одновременно в двух функциях. Я правильно понял, что i и s локальные в каждой, а у буфера стоит флаг VAR?


Код:
f_main()
f.TEXTMODE(TRUE);
f.OPEN('C:\111.txt');
f.CREATEINSTREAM(StreamInObj);
i := 1;
WHILE NOT (StreamInObj.EOS()) DO BEGIN
  StreamInObj.READTEXT(buffer);

  s:=Explode(buffer,2); //второе поле
  
  MESSAGE('Line No. %1 %2', i , s);  //показать второе поле
  i+=1;
END;
f.CLOSE();

Explode(VAR buffer : Text[1024];number : Integer) s2 : Text[1024]
FOR t:=1 TO Number DO BEGIN
  s2:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1);
  Buffer:=COPYSTR(Buffer,STRPOS(Buffer,';')+1);
END;
Старый 29.01.2008, 10:41   #8  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
все равно не работает сделал вот так, ка и вы

IF CommonDlgMgt.OpenFileEx('Îòêðûòèå ýëåêòðîííîé íàêëàäíîé','',TextFilter,1) THEN BEGIN
IF NOT FILE.EXISTS(CommonDlgMgt.GetPath + CommonDlgMgt.GetFileName) THEN
MESSAGE('Ôàéë ' + CommonDlgMgt.GetFileName + ' íå íàéäåí!')
ELSE BEGIN
f.TEXTMODE(TRUE);
f.OPEN(CommonDlgMgt.GetPath + CommonDlgMgt.GetFileName);
f.CREATEINSTREAM(StreamInObj);
i := 1;
WHILE NOT (StreamInObj.EOS()) DO
BEGIN
StreamInObj.READTEXT(buffer);
s2:=Explode(buffer,2);
MESSAGE('Line No. %1 %2', i , s2); //ïîêàçàòü âòîðîå ïîëå
i := i + 1;
END;
f.CLOSE();
END;
END;


Explode(Buffer : Text[1024];Number : Integer) s2 : Text[1024]
FOR i:=1 TO Number DO BEGIN
s2:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1);
Buffer:=COPYSTR(Buffer,STRPOS(Buffer,';')+1);
END;

может неправильно открываю файл?
Старый 29.01.2008, 10:51   #9  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Несмотря на то, что в строке все время гарантированно есть необходимое число точек с запятой я бы обработал ситуацию, когда по каким-либо причинам точка с запятой не нашлась ... То есть взял бы под IF строку STRPOS(Buffer,';')
Старый 29.01.2008, 11:00   #10  
apanko is offline
apanko
MCTS
MCBMSS
Лучший по профессии 2009
 
1,164 / 139 (7) +++++
Регистрация: 24.02.2005
В функции Explode значение переменной buffer скорее всего равно '' (Пустая строка).

Решить эту проблему можно как минимум двумя способами:
1. В окне C/AL locals, на закладке parameters напротив строки Buffer нужно установить флаг в поле VAR.

2. Переменную buffer объявить как глобальную. Тогда в функцию Explode значение переменной buffer передавать не нужно (в окне C/AL locals, на закладке parameters удалить строку Buffer).
Старый 29.01.2008, 11:04   #11  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
Цитата:
Сообщение от romeo Посмотреть сообщение
Несмотря на то, что в строке все время гарантированно есть необходимое число точек с запятой я бы обработал ситуацию, когда по каким-либо причинам точка с запятой не нашлась ... То есть взял бы под IF строку STRPOS(Buffer,';')
а по конкретнее покажите такой код


FOR i:=1 TO Number DO BEGIN

s2:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1);
Buffer:=COPYSTR(Buffer,STRPOS(Buffer,';')+1);
END;


Цитата:
Сообщение от apanko Посмотреть сообщение
В функции Эксплоде. Поставьте флаг VAR=Да у переменной Buffer.

Или сделайте Буффер глобальным и вообще в функцию Эксплоде ее не передавайте.

А то буффер в эксплоде пустой. Можете проверить.
галочку в Var то поставил. все равно дает ошибку
Старый 29.01.2008, 11:11   #12  
apanko is offline
apanko
MCTS
MCBMSS
Лучший по профессии 2009
 
1,164 / 139 (7) +++++
Регистрация: 24.02.2005
Кстати, romeo прав на 100%

Не во всех строках у вас стоит символ ; например его нет в строках [header] и [body].

Код:
IF STRPOS(Buffer,';')>0 THEN
  FOR i:=1 TO Number DO BEGIN

	s2:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1);
	Buffer:=COPYSTR(Buffer,STRPOS(Buffer,';')+1);
  END;
Старый 29.01.2008, 11:12   #13  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
ОООООООО!!!!!!!!
Спасибо!!!!!!!!!!!!!!
Читает!!!!!!!!!!!!!!! Большой РЕСПЕКТ!!!!!!!!!!!!!
Если что напишу!!!!!!!!!!!!!!!!!!
Старый 29.01.2008, 11:25   #14  
Blade85 is offline
Blade85
Участник
 
13 / 10 (1) +
Регистрация: 28.01.2008
IF CommonDlgMgt.OpenFileEx('Îòêðûòèå ýëåêòðîííîé íàêëàäíîé','',TextFilter,1) THEN BEGIN
IF NOT FILE.EXISTS(CommonDlgMgt.GetPath + CommonDlgMgt.GetFileName) THEN
MESSAGE('Ôàéë ' + CommonDlgMgt.GetFileName + ' íå íàéäåí!')
ELSE BEGIN
f.TEXTMODE(TRUE);
f.OPEN(CommonDlgMgt.GetPath + CommonDlgMgt.GetFileName);
f.CREATEINSTREAM(StreamInObj);
i := 1;
WHILE NOT (StreamInObj.EOS()) DO
BEGIN
StreamInObj.READTEXT(buffer);
IF buffer='[Header]' THEN
BEGIN
s2:=Explode(buffer,2);
MESSAGE('Line No. %1 %2', i , s2); //ïîêàçàòü âòîðîå ïîëå
i := i + 1;
END;
END;
f.CLOSE();
END;
END;

Такое условие не принимает???
Я хочу так если Header то загружало в таблицу №1
Если Body то в таблицу №2
 


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

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

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