делюсь - поспелил радоваться
работает 3 раза, потом несколько раз не работает ... изменения хекоторых полей схватывает с первого раза, некоторых вообще никогда
делал так:
*запомнили момент запуска транзакции
dt1 = sy-datum.
tm1 = sy-uzeit.
...
CALL TRANSACTION 'FI02' USING bdc
MODE cmode UPDATE 'S'
MESSAGES INTO messtab.
* сразу-же ожидаем окончания асинхр.обновления
CALL FUNCTION 'ENQUEUE_EFBNKA'
EXPORTING
MODE_BNKA = 'E'
MANDT = SY-MANDT
BANKS = 'RU'
BANKL = ibnka-BANKL
* X_BANKS = ' '
* X_BANKL = ' '
* _SCOPE = '2'
_WAIT = 'X'
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
if ( sy-subrc = 0 ).
CALL FUNCTION 'DEQUEUE_EFBNKA'
EXPORTING
MODE_BNKA = 'E'
MANDT = SY-MANDT
BANKS = 'RU'
BANKL = ibnka-BANKL
* X_BANKS = ' '
* X_BANKL = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
endif.
COMMIT WORK AND WAIT.
*тут уже разбор сообщений транзакции
clear msg.
read table messtab with key MSGTYP = 'S'.
...
* по документам изменений фиксируем факт замены
clear: tcdhdr,tcdhdr[].
clear: tcdshw,tcdshw[].
concatenate sy-mandt 'RU' into objid.
concatenate objid ibnka-BANKL
into objid separated by ' '
. "мандант+RU+пробел+бик
*читаем док-ты обновления с момента проводки FI02
CALL FUNCTION 'CHANGEDOCUMENT_READ_HEADERS'
EXPORTING
* ARCHIVE_HANDLE = 0
DATE_OF_CHANGE = dt1
OBJECTCLASS = 'BANK'
OBJECTID = objid
TIME_OF_CHANGE = tm1
* USERNAME = SY-UNAME
* LOCAL_TIME = ' '
* DATE_UNTIL = '99991231'
* TIME_UNTIL = '235959'
TABLES
I_CDHDR = tcdhdr
EXCEPTIONS
NO_POSITION_FOUND = 1
WRONG_ACCESS_TO_ARCHIVE = 2
TIME_ZONE_CONVERSION_ERROR = 3
OTHERS = 4
.
describe table tcdhdr lines n.
read table tcdhdr index 1.
CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS'
EXPORTING
* ARCHIVE_HANDLE = 0
CHANGENUMBER = tcdhdr-CHANGENR
* TABLEKEY = ' '
* TABLENAME = ' '
* IMPORTING
* HEADER =
TABLES
EDITPOS = tcdshw
* EDITPOS_WITH_HEADER =
EXCEPTIONS
NO_POSITION_FOUND = 1
WRONG_ACCESS_TO_ARCHIVE = 2
OTHERS = 3
.
describe table tcdshw lines n.
if ( n = 0 ).
* нет док-тов по этому банку
else.
* анализируем, что изменилось в реквизитах
loop at tcdshw
...
дык вот в итоге транзакция всегда отрабатывает и сообщает в messtab[] что банк успешно изменен, а документы изменений всеравно не успевают в CDHDR лечь (т.е. ФМ чтения заголовков возвращает их через раз), даже несмотря на принудительный ENQUEUE
Под отладчиком ессно все ок, т.к. выполняется медленнее, и док-ты успевают записаться в CDHDR до того как будет вызван ФМ - хоть таймер млин вешай
