Текущее время: Ср, июл 23 2025, 22:00

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 61 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пн, июл 30 2007, 17:37 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Vadim написал(а):
Если смотреть в Debug, то все нормально... На выходе из OPEN-FI в таблице VBRK (se11) все заполнено. Но потом все равно поле обнуляется

Очень, очень похоже на то, про что говорил sibrin
- надо искать кто ещё может изменять VBRK - включите трассировку и проанализируйте результат.

_________________
"После" - не значит "вследствие"


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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
sy-uname написал(а):
надо искать кто ещё может изменять VBRK - включите трассировку и проанализируйте результат.

Если я правильно понял, при деблокировании фактуры обновляется весь документ.

Vadim написал(а):
Фактура блокирована и в OPEN-FI она тоже блокирована. Поэтому и использую дополнение IN UPDATE TASK.

Поймите, не могут два параллельных процесса изменять один и тот же документ. Результаты того процесса, который завершается первым, затираются вторым. Для того и созданы блокировки. Их нужно использовать, а не пытаться обойти.

Vadim написал(а):
К тому же в OPEN-FI не могу делать COMMIT WORK.


И не надо. Изменять vbrk нужно в рамках LUW. Можно экспортировать номер документа в глобальную память, а потом в каком-нибудь экзите, в котором vbrk доступна на изменение записать в z-поле.
Или воспользоваться грязным хаком — assign'ом в глобальную область вызывающей программы.


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

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
У меня была похожая ситуация. Хотелось апдейтить поле в bseg при проводке, но вот незадача: в одних расширениях belnr еще не был присвоен, а в других данные затирались. Вот какое нашлось решение.

Code:
FUNCTION z_xref3_00001050.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(I_XVBUP) LIKE  OFIWA-XVBUP DEFAULT 'X'
*"  TABLES
*"      T_BKP1 STRUCTURE  BKP1
*"      T_BKPF STRUCTURE  BKPF
*"      T_BSEC STRUCTURE  BSEC
*"      T_BSED STRUCTURE  BSED
*"      T_BSEG STRUCTURE  BSEG
*"      T_BSET STRUCTURE  BSET
*"      T_BSEU STRUCTURE  BSEU
*"----------------------------------------------------------------------

  DATA: bukrs TYPE bukrs.
  DATA: belnr TYPE belnr_d.
  DATA: gjahr TYPE gjahr.
  DATA: bktxt TYPE bkpf-bktxt.

  bukrs = t_bkpf-bukrs.

    CHECK belnr IS NOT INITIAL AND gjahr IS NOT INITIAL.
*-- запускаем функцию, которая определит pid текущего процесса и запустит
*-- программу, одидающую его завершения
    CALL FUNCTION 'ZUSER_FM_PREPARE'
      IN UPDATE TASK
      EXPORTING
        bukrs = bukrs
        belnr = belnr
        gjahr = gjahr
        bktxt = bktxt.
  ENDIF.
ENDFUNCTION.

FUNCTION zuser_fm_prepare.
*"----------------------------------------------------------------------
*"*"Функциональный модуль обновления:
*"
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(BUKRS) TYPE  BUKRS
*"     VALUE(BELNR) TYPE  BELNR_D
*"     VALUE(GJAHR) TYPE  GJAHR
*"     VALUE(BKTXT) TYPE  BKTXT
*"----------------------------------------------------------------------

  DATA: lt_wpinfo TYPE TABLE OF wpinfo,
        ls_wpinfo TYPE wpinfo,
        subrc TYPE sy-subrc.


* получить process id
  CALL FUNCTION 'TH_GET_OWN_WP_NO'
    IMPORTING
      subrc    = subrc
      wp_no    = ls_wpinfo-wp_no
      wp_pid   = ls_wpinfo-wp_pid
      wp_index = ls_wpinfo-wp_index
    EXCEPTIONS
      OTHERS   = 1.
  IF sy-subrc EQ 0 AND subrc EQ 0 AND
     NOT ls_wpinfo-wp_pid IS INITIAL.

    APPEND ls_wpinfo TO lt_wpinfo.

    CALL FUNCTION 'ZUSER_FM_SET'  "вызов модуля в другом диалог окне
      STARTING NEW TASK 'USER_FM'
      DESTINATION 'NONE'
      EXPORTING
        bukrs  = bukrs
        belnr  = belnr
        gjahr  = gjahr
        bktxt  = bktxt
       TABLES
        t_wpinfo = lt_wpinfo.
    .
  ENDIF.
ENDFUNCTION.

FUNCTION zuser_fm_set.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(BUKRS) TYPE  BUKRS
*"     VALUE(BELNR) TYPE  BELNR_D
*"     VALUE(GJAHR) TYPE  GJAHR
*"     VALUE(BKTXT) TYPE  BKTXT
*"  TABLES
*"      T_WPINFO STRUCTURE  WPINFO
*"----------------------------------------------------------------------
  DATA: ls_wpinfo TYPE wpinfo,
        wplist LIKE wpinfo OCCURS 0 WITH HEADER LINE,
        ls_mkpf TYPE mkpf,
        lt_mseg TYPE TABLE OF mseg,
        ls_mseg TYPE mseg,
        done(1) TYPE c.
  DATA: mode_call(1).     "работа по вызову

  LOOP AT t_wpinfo INTO ls_wpinfo.
    EXIT.
  ENDLOOP.

*-- ожидание завершения предыдущего процесса
  WHILE done IS INITIAL.
    REFRESH wplist.
    CALL FUNCTION 'TH_WPINFO'
      TABLES
        wplist     = wplist
      EXCEPTIONS
        send_error = 1
        OTHERS     = 2.
    READ TABLE wplist WITH KEY wp_pid   = ls_wpinfo-wp_pid
                                 wp_mandt = sy-mandt.
    IF wplist-wp_istatus = 2 OR sy-subrc <> 0.
      ls_wpinfo-wp_pid = sy-subrc.
      done = 'X'.                   "процесс завершен
    ENDIF.
  ENDWHILE.

  CALL FUNCTION 'ZFB02BATCH_INPUT'
    EXPORTING
      bukrs = bukrs
      belnr = belnr
      gjahr = gjahr
      bktxt = bktxt.

ENDFUNCTION.



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

Зарегистрирован:
Пн, дек 04 2006, 10:51
Сообщения: 173
Спасибо за пример, надо будет попробовать.
Но... Цель состоит в том, чтобы не только создать дополнительный документ и записать его в поле VBRK-ZZBELNR_D, но еще если не создался дополнительный документ, то и первый документ не надо создавать.


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Геннадий, а Вы не искали, сам SAP что-либо подобное использует для обновления в финансовых документах?
Скорей всего, для описанного случая Ваш вариант не сработает, я склоняюсь к варианту sibrin, но при другом использовании насколько такая технология допустима с точки зрения обработки ошибок и целосности данных?


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

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
В свое время мне этот метод тоже подсказали, как крайний вариант, когда не найдено более подходящих расширений. Мной проверено, работает, все сохраняется. Единственное, я использовал не BAPI а пакетник. Искать где используется подобное я не пробовал, ФМ 'TH_GET_OWN_WP_NO' используется мало где (в ERP2005 39 раз).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 31 2007, 08:48 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Vadim написал(а):
Но... Цель состоит в том, чтобы не только создать дополнительный документ и записать его в поле VBRK-ZZBELNR_D, но еще если не создался дополнительный документ, то и первый документ не надо создавать.

Так какие проблемы-то. Документ создаёте в отдельном процессе и ждёте его в open fi и получаете его номер. Если номера нет — ошибка. А дальше записываете VBRK-ZZBELNR_D в том же LUW вместе со всей фактурой.


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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
__Gennady написал(а):
В свое время мне этот метод тоже подсказали, как крайний вариант


Цикл ожидания "грузит" процесс: нужно wait up to 1 seconds вставить.

Ещё одно решение, как подождать окончания update-процесса, приведено здесь: http://sapboard.ru/forum/viewtopic.php?t=15449.

Интересно, какое из этих двух лучше?


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Vadim написал(а):
Фактура блокирована и в OPEN-FI она тоже блокирована. Поэтому и использую дополнение IN UPDATE TASK.
К тому же в OPEN-FI не могу делать COMMIT WORK.
Да и еще раз говорю, без WAIT UNTIL... все работает. Но надо знать результат выполнения BAPI


Пораскинув мозгам на досуге, пришел к выводу, что без WAIT UNTIL работает потому, что вам просто повезло, что асинхронный процесс выполнялся дольше, чем основной, поэтому vbrk сначала обновил первый процесс, потом асинхронный. В случае синхронизации двух сессией все произошло наоборот. Поэтому, даже без WAIT UNTIL реализация не корректна. Самый правильный вариант, который предлагает sibrin.


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

Зарегистрирован:
Пн, дек 04 2006, 10:51
Сообщения: 173
Спасибо!! Это я уже тоже понял!!! Но все равно спасибо!!! Будем пробовать!!!


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

Зарегистрирован:
Пн, дек 04 2006, 10:51
Сообщения: 173
sibrin написал:
Так какие проблемы-то. Документ создаёте в отдельном процессе и ждёте его в open fi и получаете его номер. Если номера нет — ошибка. А дальше записываете VBRK-ZZBELNR_D в том же LUW вместе со всей фактурой.


То есть выполнить обновление VBRK-ZZBELNR_D в том же OPEN-FI после завершения дополнительного процесса?? Или же обновлять уже где-нибудь в USER-EXIT ???


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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Vadim написал(а):
То есть выполнить обновление VBRK-ZZBELNR_D в том же OPEN-FI после завершения дополнительного процесса?? Или же обновлять уже где-нибудь в USER-EXIT ???

Не совсем. Самому update делать не надо. Нужно найти момент времени и цель, в которую в которой можно записать поле ZZBELNR_D.

Моментом может быть open fi, а целью - структура из глобальной области программ ниже по стеку вызвов (она может называеться xvbrk, например), которая изменяется при помощи assign.

Можно использовать законный юзер-экзит или бади для изменения заголовка фактуры, которые вызываются после open fi. Например, BADI_SD_BILLING~INVOICE_CHANGE_POST. Цель здесь - параметр FXVBRK этой бади.

Или не очень законные экзиты в момент после open fi, в которых опять же использовать assign.


Последний раз редактировалось sibrin Вт, июл 31 2007, 10:59, всего редактировалось 1 раз.

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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Vadim написал(а):
То есть выполнить обновление VBRK-ZZBELNR_D в том же OPEN-FI после завершения дополнительного процесса?? Или же обновлять уже где-нибудь в USER-EXIT ???


Если Вы не хотите "извратнуться" и написать асинхронный ФМ,
запускаемый после успешного создания фин. документа прямо в open-fi, который будет ожидать снятие блокировки с VBRK и только после этого делать Update VBRK ;-)

то конечно, искать нужный exit.


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

Зарегистрирован:
Пн, дек 04 2006, 10:51
Сообщения: 173
sibrin написал:
Можно использовать законный юзер-экзит или бади для изменения заголовка фактуры, которые вызываются после open fi. Например, BADI_SD_BILLING~INVOICE_CHANGE_POST.


Спасибо!!! Но... Ведь все уже передано в FI, и после этого уже нет никаких USER-EXITов и т.п. Они уже все отработали. Или я не прав?


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

Зарегистрирован:
Пн, дек 04 2006, 10:51
Сообщения: 173
vga написал(а):
Если Вы не хотите "извратнуться" и написать асинхронный ФМ,
запускаемый после успешного создания фин. документа прямо в open-fi, который будет ожидать снятие блокировки с VBRK и только после этого делать Update VBRK ;-)
то конечно, искать нужный exit.


В OPEN-FI запись в VBRK блокирована с самого начала и до конца.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 61 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

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


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

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


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

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