Текущее время: Вс, авг 03 2025, 17:10

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Как обработать ошибки генерируемые EDI_DATA_INCOMING (xml->idoc)
СообщениеДобавлено: Вт, июн 19 2007, 16:53 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Добрый день!
Программка в цикле использует функцию EDI_DATA_INCOMING чтобы считать файлы xml и преобразовать их в idoc-и.
Но незадача - если наткнется на ошибочный xml - вылетает напрочь с дампом - данная функция генерирует неперехватываетмое исключение - message type X.
Как бы так сделать чтоб после сбоя пропускать сбойные файлы и продолжать процесс до конца

Вообще эту систему считывания idoc не очень понимаю, может там вообще все неправильно сделано, судя по форумам такой проблемы ни у кого не было, и в документации по EDI/IDOC тоже совсем о другом говорится

Thanks in advance


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 19 2007, 17:08 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Я там нашел это место в функции, где можно перехватить, но что-ли писать свою 'невылетающую' ZEDI_DATA_INCOMING?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 19 2007, 18:12 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
А если асинхронный вызов попробовать?
CALL FUNCTION func STARTING NEW TASK taskname
... PERFORMING form ON END OF TASK .


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 21 2007, 09:23 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Спасибо
Что то я пробовал запустить асинхронно но не могу разобраться с синтаксисом
а можно какой нибудь пример простой?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 21 2007, 10:22 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Как темплайт, что-то типа такого:

Code:
DATA: g_finished.

CLEAR g_finished.
CALL FUNCTION 'EDI_DATA_INCOMING'
     IMPORTING
       ...
     STARTING NEW TASK 'TIMER'
     DESTINATION 'NONE'
     PERFORMING
       on_timer ON END OF TASK
     EXPORTING
       ...
     EXCEPTIONS
       ...
     .

IF sy-subrc IS INITIAL.
  DO 10 TIMES.      " waiting 10 seconds
    WAIT UP TO 1 SECONDS.
    IF NOT g_finished IS INITIAL.
      EXIT.
    ENDIF.
  ENDDO.
ENDIF.

IF NOT g_finished IS INITIAL.
* finished OK
...
ENDIF.

********************************************************
* receive result from asinhronous function
FORM on_timer
  USING taskname.
  RECEIVE RESULTS FROM FUNCTION 'EDI_DATA_INCOMING'.
g_finished = 'X'.
ENDFORM.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 21 2007, 13:22 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Вызвал асинхронно
Теперь при кривом файле вылетает на RECEIVE RESULTS FROM FUNCTION 'EDI_DATA_INCOMING'.
А по другому результат не узнать
наверное

ндаа ...тут надо подумать


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 21 2007, 13:45 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
А если вообще закомментировать RECEIVE RESULTS ?
ФМ же ничего не возвращает.
Или поэксериментируйте с параметрами этого оператора:
4. ... EXCEPTIONS except1 = rc1 ... exceptn = rcn


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 21 2007, 15:36 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
vga написал(а):
А если вообще закомментировать RECEIVE RESULTS ?
ФМ же ничего не возвращает.
Или поэксериментируйте с параметрами этого оператора:
4. ... EXCEPTIONS except1 = rc1 ... exceptn = rcn

да вообще штука полезная, можно попробовать
только жаль что все молчком выполняет - хоть бы subrc возвращала

Так или иначе спасибо за идею


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 03 2007, 19:17 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Проблему эту решил
но теперь возникла новая - что-то съехало в настройках
теперь считывает XML очень медленно.

Визуально по SM50 видно,
если раньше возникали сразу несколько процессов считывания, у них появлялась 'RFC' в Прич., теперь же видно только один процесс (поле Прич всегда пустое) и вводится в час по чайной ложке - очень медленно.

При том что в Dev все идет нормально,
в продуктиве вот так тормозит (на тех же программах)
Не случалось ли у вас подобного?
Где бы порыться - тут видимо что-то из BASIS настроек


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 05 2007, 16:18 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Это тоже исправили, оказалось раздулась таблица edidc - контрольные записи IDOC. 99% времени программа делала неоптимальный Select извлечения из нее последней записи (до 15 сек уходило на каждом IDOC).
Когда оптимизировал селект - все заработало как надо

А вообще нем мог бы кто-нибудь объяснить - RFC функции выполняются асинхронно?
Такое впечатление что вызов ФМ EDI_DATA_INCOMING не ждет завершения своей обработки - в цикле возникает lots of параллельных процессов обработки IDOC, и соответственно сессий в СУБД. Хотя как - непонятно
Или может я не так понял?

Вот схемка программы
----------- Cut --------------
LOOP AT t.

* Фактическая обработка XML - здесь может произойти исключение (аварийное завершение с дампом)
CALL FUNCTION 'EDI_DATA_INCOMING'
EXPORTING pathname = t-pathname
port = 'ZOUT'
EXCEPTIONS OTHERS = 1.

* Считываем IDOC с наибольшим номером (последний созданный)
CLEAR: docnum, edidc.
SELECT MAX( docnum ) FROM edidc INTO docnum.
SELECT SINGLE * FROM edidc WHERE ( edidc~docnum = docnum ).

ENDLOOP.
---------- Cut ---------------


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB