28.01.2008, 12:57 | #1 |
Участник
|
Вот такая ситуация:
Мне надо загрузить в таблицу данные с 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 |
Участник
|
Посмотри дебаггером, что хранится в переменной Buffer в строке:
s:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1); Доп.вопрос: Почему не используешь датапорт? |
|
28.01.2008, 13:22 | #3 |
Участник
|
STRPOS(Buffer,';') возвращает ноль. Нет точки с запятой видимо в строке Buffer.
|
|
29.01.2008, 03:37 | #4 |
Участник
|
В строке buffer везде стоит вроде точка запятая.
Этот цикл читает по строкам. Теперь надо чтоб эти строки разделяло и загружало в поле таблиц |
|
29.01.2008, 09:41 | #5 |
Участник
|
|
|
29.01.2008, 09:48 | #6 |
Участник
|
Прмерно так:
[Header] ‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;....... ‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;....... [body] ‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;....... ‡ Є §;9;Џђ.‡-00077;9;?‚ЂЌЋ‚ Ђ.;....примерно так выглядит загружаемый файл Мне надо обработчик сделать чтобы поля отделяло смотря ";" |
|
29.01.2008, 10:11 | #7 |
MCTS
|
Ваш код у меня работает.
Переменные 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 |
Участник
|
все равно не работает сделал вот так, ка и вы
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 |
Участник
|
Несмотря на то, что в строке все время гарантированно есть необходимое число точек с запятой я бы обработал ситуацию, когда по каким-либо причинам точка с запятой не нашлась ... То есть взял бы под IF строку STRPOS(Buffer,';')
|
|
29.01.2008, 11:00 | #10 |
MCTS
|
В функции Explode значение переменной buffer скорее всего равно '' (Пустая строка).
Решить эту проблему можно как минимум двумя способами: 1. В окне C/AL locals, на закладке parameters напротив строки Buffer нужно установить флаг в поле VAR. 2. Переменную buffer объявить как глобальную. Тогда в функцию Explode значение переменной buffer передавать не нужно (в окне C/AL locals, на закладке parameters удалить строку Buffer). |
|
29.01.2008, 11:04 | #11 |
Участник
|
Цитата:
FOR i:=1 TO Number DO BEGIN s2:=COPYSTR(Buffer,1,STRPOS(Buffer,';')-1); Buffer:=COPYSTR(Buffer,STRPOS(Buffer,';')+1); END; галочку в Var то поставил. все равно дает ошибку |
|
29.01.2008, 11:11 | #12 |
MCTS
|
Кстати, 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 |
Участник
|
ОООООООО!!!!!!!!
Спасибо!!!!!!!!!!!!!! Читает!!!!!!!!!!!!!!! Большой РЕСПЕКТ!!!!!!!!!!!!! Если что напишу!!!!!!!!!!!!!!!!!! |
|
29.01.2008, 11:25 | #14 |
Участник
|
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 |
|