21.10.2015, 20:43 | #1 |
Участник
|
Обращаюсь опять к коллективному разуму. Ребята, подскажите, плиз, слепой где собака порылась?
Имеется датапорт, который импортирует данные из csv-файла в таблицы Нава (одна - список неких объектов, другая- комментарии к ним). Вот фрагмент кода тригера OnAfterImportRecord (!!!! выделена строка, на которой вылетает ошибка конвертации из текста в текст - превышение допустимой длины) Код: IF (gtx_Bemerk <> '') THEN BEGIN BemerkTxt := DELCHR(gtx_Bemerk,'<>',' '); WHILE STRLEN(BemerkTxt) > 0 DO BEGIN BindeStrich := STRPOS(BemerkTxt,'_'); IF BindeStrich > 0 THEN BemTxt := COPYSTR(BemerkTxt,1,BindeStrich-1); ELSE BemTxt := COPYSTR(BemerkTxt,1); ... lrec_T50014.INIT; lrec_T50014.Tabellenname := lrec_T50014.Tabellenname::Fremdinstrumente; lrec_T50014."Debitor-Nr." := "Debitor-Nr."; lrec_T50014."Instrument-Nr." := "Lfd. Nr"; lrec_T50014."Zeilennr." := какое-то значение lrec_T50014.Bemerkung := BemTxt; lrec_T50014.INSERT; IF STRLEN(BemerkTxt) > 0 THEN BemerkTxt := DELCHR(COPYSTR(BemerkTxt,BindeStrich+1),'<>',' '); // !!!!! на этой строке вылетает ошибка END; END; Смысл сего фрагмента: текст, считанный в переменную gmx_Bemerk, нужно поделить на строки и занести каждую отдельно в таблицу комментариев (у нас это Т50014). Признаком конца строки является знак _ csv-файл проверен: считываемое в переменную gmx_Bemerk значение не превышает 1024 символа (самое длинное - 1018) Файл содержит порядка 5тыс. строк. Более 2тыс. строк обрабатываются, а на 2тыс. какой-то вылетает эта ошибка. Вот оригинальный текст_ который записан в файле: 26.09.95 Erf_07.01.15 gest.v. FU_30.01.15 gest.v. SL_01.03.15 gest.v. SL_02.03.15 gest.v. SL_05.03.15 gest.v. SL_06.03.15 gest.v. SL_15.03.15 gest.v. FU_09.03.15 gest.v. SL_18.03.15 gest.v. SL_24.04.15 gest.v. SL_11.05.15 gest.v. FU_27.05.15 gest.v. SL_28.05.15 gest.v. SL_02.06.15 gest.v. SL_03.06.15 gest.v. SL_09.06.15 gest.v. SL_10.06.15 gest.v. SL_11.06.15 gest.v. SL_22.06.15 gest.v. SL_07.07.15 gest.v. SL_08.07.15 gest.v. SL_08.07.15 gest.v. SL_17.08.15 gest.v. FU_18.08.15 gest.v. FU_19.08.15 gest.v. FU_13.08.15 gest.v. SL_27.08.15 gest.v. FU_ А вот, что пишется в сообщении об ошибке: Überlauf bei der Typkonvertierung von Text to Text. 07.01.15 gest.v. FU_30.01.15 gest.v. SL_01.03.15 gest.v. SL_02.03.15 gest.v. SL_05.03.15 gest.v. SL_06.03.15 gest.v. SL_15.03.15 gest.v. FU_09.03.15 gest.v. SL_18.03.15 gest.v. SL_24.04.15 gest.v. SL_11.05.15 gest.v. FU_27.05.15 gest.v. SL_28.05.15 gest.v. SL_02.06.15 gest.v. SL_03.06.1507.01.15 gest.v. FU_30.01.15 gest.v. SL_01.03.15 gest.v. SL_02.03.15 gest.v. SL_05.03.15 gest.v. SL_06.03.15 gest.v. SL_15.03.15 gest.v. FU_09.03.15 gest.v. SL_18.03.15 gest.v. SL_24.04.15 gest.v. SL_11.05.15 gest.v. FU_27.05.15 gest.v. SL_28.05.15 gest.1507.01.15 gest.v. FU_30.01.15 gest.v. SL_01.03.15 gest.v. SL_02.03.15 gest.v. SL_05.03.15 gest.v. SL_06.03.15 gest.v. SL_15.03.15 gest.v. FU_09.03.15 gest.v. SL_18.03.15 gest.v. SL_24.04.15 gest.v. SL_11.05.15 gest.v. FU_27.05.15 gest.v. SL_28.05.15 gest.v. SL_02.06.15 gest.v. SL_03.06.15 gest.v. SL_09.06.15 gest.v. SL_10.06.15 gest.v. SL_11.06.15 gest.v. SL_22.06.15 gest.v. SL_07.07.15 gest.v. SL_08.07.15 gest.v. SL_08.07.15 gest.v. SL_17.08.15 gest.v. FU_18.08.15 gest.v. FU_ Как видим - фигня полная! т.е. первый раз цикл отрабатывает корректно: первая строка комментариев (26.09.95 Erf) определяется правильно и удаляется из текста, а потом строка преобразуется по непонятному алгоритму (в нее вставляется дважды ее же фрагмент). |
|
21.10.2015, 20:50 | #2 |
Участник
|
Поковырялась я с этой проблемной строчкой и опытным путем установилось следующее:
функция DELCHR работает как-то странно. Как только я ее удалила (осталось только BemerkTxt := COPYSTR(BemerkTxt,BindeStrich+1); ), всё сразу поехало. Кто-нить сталкивался с подобными |
|
22.10.2015, 13:38 | #3 |
Участник
|
Цитата:
Вместо: Код: IF STRLEN(BemerkTxt) > 0 THEN BemerkTxt := DELCHR(COPYSTR(BemerkTxt,BindeStrich+1),'<>',' '); Код: IF STRLEN(BemerkTxt) > 0 THEN BEGIN BemerkTxt := COPYSTR(BemerkTxt,BindeStrich+1); BemerkTxt := DELCHR(BemerkTxt,'<>',' '); END; Копайтесь в вашем алгоритме. |
|
22.10.2015, 13:50 | #4 |
Участник
|
Цитата:
Но в данном случае стоило мне убрать DELCHR и оставить только COPYSTR (см. мое второе сообщение),как ошибка пропала. Отсюда я и сделала вывод, что глюк порождается именно DELCHR'ом. По моемУ представлению, если функция вызывается внутри другой функции, то сначала должна вычисляться внутренняя, а потом "внешняя". Или я неправильно думаю? Знак _ тут вообще не при делах. Это всего лишь условный символ, по которому я режу строки на кусочки. |
|
22.10.2015, 14:15 | #5 |
Участник
|
Думаете то вы правильно, только выводов из раздумий не делаете. Чтобы установить 100% что конкретно вызывает ошибку, я и предложил вам разделить вызов внутренней и внешней функций, до тех пор пока вы этого не сделаете, всё останется в стадии предположений.
|
|
27.10.2015, 11:56 | #6 |
Участник
|
Цитата:
этот код работает: Код: IF STRLEN(BemerkTxt) > 0 THEN BEGIN BemerkTxt := COPYSTR(BemerkTxt,BindeStrich+1); BemerkTxt := DELCHR(BemerkTxt,'<>',' '); END; Код: IF STRLEN(BemerkTxt) > 0 THEN BemerkTxt := DELCHR(COPYSTR(BemerkTxt,BindeStrich+1),'<>',' '); |
|
28.10.2015, 11:59 | #7 |
Участник
|
Без отладки и стека будет тяжело разобраться. Может и вправду нашли глюк NAV и где-то переполнение происходит. И на старуху бывает проруха)
|
|