Текущее время: Вс, авг 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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