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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2015, 20:43   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Обращаюсь опять к коллективному разуму. Ребята, подскажите, плиз, слепой где собака порылась?
Имеется датапорт, который импортирует данные из 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;
gtx_Bemerk - одно из полей датапорта. BemerkTxt - переменная. Обе текстовые длиной 1024.
Смысл сего фрагмента: текст, считанный в переменную 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  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Поковырялась я с этой проблемной строчкой и опытным путем установилось следующее:
функция DELCHR работает как-то странно. Как только я ее удалила (осталось только BemerkTxt := COPYSTR(BemerkTxt,BindeStrich+1); ), всё сразу поехало.

Кто-нить сталкивался с подобными глю фичами?
Старый 22.10.2015, 13:38   #3  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Поковырялась я с этой проблемной строчкой и опытным путем установилось следующее:
функция DELCHR работает как-то странно. Как только я ее удалила (осталось только BemerkTxt := COPYSTR(BemerkTxt,BindeStrich+1); ), всё сразу поехало.

Кто-нить сталкивался с подобными глю фичами?
Прежде чем обвинять DELCHR() в глюке, разбейте вашу проблемную строчку для чистоты эксперимента на две.
Вместо:

Код:
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;
Держу пари, что ошибка вылетит теперь на первой строчке с COPYSTR(). Здесь если что и глючит, так это ваш алгоритм чтения и разбивания строки, тем более сами же написали: Признаком конца строки является знак _
Копайтесь в вашем алгоритме.
Старый 22.10.2015, 13:50   #4  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
Держу пари, что ошибка вылетит теперь на первой строчке с COPYSTR(). Здесь если что и глючит, так это ваш алгоритм чтения и разбивания строки, тем более сами же написали: Признаком конца строки является знак _
Копайтесь в вашем алгоритме.
Я не отрицаю, что косяков могла и я наделать, и что моя логика не всегда совпадает с навижнской
Но в данном случае стоило мне убрать DELCHR и оставить только COPYSTR (см. мое второе сообщение),как ошибка пропала. Отсюда я и сделала вывод, что глюк порождается именно DELCHR'ом.
По моемУ представлению, если функция вызывается внутри другой функции, то сначала должна вычисляться внутренняя, а потом "внешняя". Или я неправильно думаю?

Знак _ тут вообще не при делах. Это всего лишь условный символ, по которому я режу строки на кусочки.
Старый 22.10.2015, 14:15   #5  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
По моемУ представлению, если функция вызывается внутри другой функции, то сначала должна вычисляться внутренняя, а потом "внешняя". Или я неправильно думаю?
Думаете то вы правильно, только выводов из раздумий не делаете. Чтобы установить 100% что конкретно вызывает ошибку, я и предложил вам разделить вызов внутренней и внешней функций, до тех пор пока вы этого не сделаете, всё останется в стадии предположений.
Старый 27.10.2015, 11:56   #6  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
Думаете то вы правильно, только выводов из раздумий не делаете. Чтобы установить 100% что конкретно вызывает ошибку, я и предложил вам разделить вызов внутренней и внешней функций, до тех пор пока вы этого не сделаете, всё останется в стадии предположений.
По Вашему совету прокрутила я вариант, Вами предложеный. Получила следующие результаты:

этот код работает:
Код:
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  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Без отладки и стека будет тяжело разобраться. Может и вправду нашли глюк NAV и где-то переполнение происходит. И на старуху бывает проруха)
 


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

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

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