Текущее время: Ср, июн 25 2025, 15:43

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Чего не хватает в посте?
спойлеров (чтобы скрывать куски текста) 50%     [ 1 ]
смайликов 0%  0%   [ 0 ]
актуальности 50%     [ 1 ]
скриншотов 0%  0%   [ 0 ]
всё нормально 0%  0%   [ 0 ]
не хватает того, о чём я напишу в комментарии 0%  0%   [ 0 ]
Всего голосов : 2
Автор Сообщение
 Заголовок сообщения: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице
СообщениеДобавлено: Ср, фев 03 2016, 18:02 
Начинающий
Начинающий

Зарегистрирован:
Вт, май 20 2014, 15:13
Сообщения: 8
Здравствуйте!

Подскажите, как можно изменить содержимое поля XREF2_HD в таблице BKPF без использования прямого обращения к таблице?
Я пытаюсь сделать это через ФМ FI_DOCUMENT_CHANGE, но получаю ошибки.

Версия соответствующего компонента:
SAP_FIN 617 0007 SAPK-61707INSAPFIN SAP_FIN

ФМ FI_DOCUMENT_CHANGE
Попытка №1, через bukrs+belnr+gjahr
Заполняю поля i_bukrs, i_belnr, i_gjahr, i_buzei = 1.
Получаю ошибку "FI: поле ссылки не заполнено.".

[cut]Попытка №2, через i_awtyp + i_awref + i_aworg + i_awsys, awtyp = 'BKPF'
Code:
Parameters:
  p_bukrs type bukrs default 1000,
  p_belnr type belnr_d default 5010000002,
  p_gjahr type gjahr default 2015,
  p_xref2 type xref2_hd default 1.

Data: ls_1 type ACCCHG,
      ls_bkpf type BKPF,
      lt_1 like standard table of ls_1,
      lv_aworg type ACCHD-AWORG.
ls_1-fdname = 'XREF2_HD'.
ls_1-newval = p_xref2.
Append ls_1 to lt_1.
*ls_1-fdname = 'XREF2'.
*Append ls_1 to lt_1.
Select single * from BKPF into corresponding fields of ls_bkpf
  where bukrs = p_bukrs and belnr = p_belnr and gjahr = p_gjahr.
lv_aworg = ls_bkpf-bukrs && ls_bkpf-gjahr.
Call function 'FI_DOCUMENT_CHANGE'
  exporting
   i_awtyp                    = 'BKPF'
   i_awref                    = ls_bkpf-belnr
   i_aworg                    = lv_aworg
   i_awsys                    = space
*   i_kunnr                    = ' '
*   i_lifnr                    = ''
*   i_obzei                    = ' '
   i_buzei                    = 1
*   i_bsegc                    =
*   x_lock                     = 'X'
*    i_bukrs                    = p_bukrs
*    i_belnr                    = p_belnr
*    i_gjahr                    = p_gjahr
  tables
    t_accchg                   = lt_1
  exceptions
    no_reference               = 1
    no_document                = 2
    many_documents             = 3
    wrong_input                = 4
    overwrite_creditcard       = 5
    others                     = 6
          .
If sy-subrc <> 0.
  Message e000(su) with 'ERROR' sy-subrc 'IN FI_DOCUMENT_CHANGE'.
  Return.
Endif.
[/cut]

В результате в системе разработки всё нормально, поле XREF2_HD обновляется.
В тестовой же системе выдаётся сообщение то-ли "FI: поле ссылки не заполнено.", то-ли "FI: документы бухучета не найдены."

Попытка №3, через i_awtyp + i_awref + i_aworg + i_awsys, awtyp = 'TR-TM'
В тестовой системе использую другое значение AWTYP, "TR-TM", т.к. разработка для модуля Treasury.
[cut="..."]
Code:
Data:
  ls_1 type ACCCHG,
  ls_2 type TRACT_DOCUMENT,
  lt_1 type WRFT_ACCCHG_TTY,
  lt_2 type TRACY_DOCUMENT.

  ls_1-fdname = 'XREF2_HD'.
  ls_1-newval = iv_new_xref2_hd.
  Append ls_1 to lt_1.

  Select * into corresponding fields of table lt_2
    from tract_document
    where deal_number = iv_deal_number
      and aworg = iv_aworg
    order by awref descending.
  Read table lt_2 into ls_2 index 1.

  Call function 'FI_DOCUMENT_CHANGE'
    exporting
     i_awtyp                    = 'TR-TM' "TODO см. доп.значения домена, там ФМ
     i_awref                    = ls_2-awref "0000019019
     i_aworg                    = ls_2-aworg "R12015
     i_awsys                    = space
     i_buzei                    = 1
    tables
      t_accchg                   = lt_1
            .
[/cut]

В результате ФМ ALE_MODEL_INFO_GET выдаёт NO_MODEL_INFO_FOUND.

Подозрения
Из домена AWTYP вышел на таблицу TTYP «Типы объектов для учета и отчетности», в которой содержатся такие записи:
Code:
AWTYP STRUC      FUNCTION                       REMOTE OTEXT

BKPF  BKPF_AWOBJ FI_DOCUMENT_SENDER                    Бухгалт. документ
TR-TM            TRCA_DOCUMENT_SENDER_TRTM             Финанс. менеджмент


Подозреваю, что верный вызов ФМ FI_DOCUMENT_CHANGE требует какого-то взаимодействия с этими ФМ FI_DOCUMENT_SENDER, TRCA_DOCUMENT_SENDER_TRTM (в зависимости от того, что прописано в AWTYP: BKPF или TR-TM).

Вопрос: как поменять BKPF-XREF2_HD?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице  Тема решена
СообщениеДобавлено: Ср, фев 03 2016, 20:59 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Как и многие другие в свое время сталкивался с такими вопросами. Да и на форме уже обсуждалось не раз.

Мой Вам совет, конкретно по этой ситуации, просто по старинке, маленький пакетник.

Может быть, конечно, например, если меняем что то в позиции ФАЙ дока, есть вариант, что консультант настройками повлияет на порядок экранов и пакетник слетит, тогда можно покапать в сторону FI_ITEMS_MASS_CHANGE и еще что то думать. В Вашем случае мне кажется не стоит оно этого.

P.S.

Цитата:
использования прямого обращения к таблице

Этот подход вообще забудьте.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице
СообщениеДобавлено: Чт, фев 04 2016, 08:26 
Начинающий
Начинающий

Зарегистрирован:
Вт, май 20 2014, 15:13
Сообщения: 8
Спасибо!
Эх, пакетник не подходит. Я не написал сразу — выполняться это обновление таблицы BKPF должно в модуле обновления, где пакетники (Call transaction) запрещены.
Прошу извинить, думал, что я не нашёл какой-то очевидный ФМ и что задача с ним решится легко.

Дело в том, что
1) нужно при проведении сделки через транзакцию TPM44 прописывать номер одного из создаваемых FI-документов BKPF-BELNR в поле BKPF-XREF2_HD предыдущего документа;
2) я по технологии OpenFI привязался к Publish&Subscribe событию 1050 "ПРОВОДКА ДОКУМЕНТА: RW-интерфейс", чтобы иметь заполненное поле BKPF-BELNR;
3) при обработке P&S события 1050 нужно использовать функциональные модули обновления: call function X in update task;
4) внутри таких функций оператор Call transaction запрещён.

Искал по интернету и форуму способ запустить свой код в тот момент, когда при проводке через TPM44 известен номер создаваемого документа BKPF-BELNR, но сам документ ещё не сохранён в базе данных. Нашёл только это P&S событие 1050 по технологии OpenFI. Может, есть другой путь, при котором пакетник позволителен?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице
СообщениеДобавлено: Чт, фев 04 2016, 09:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Солидарен с BESA: используйте пакетник. И не надо его засовывать в update-модуль. Вызывайте из обработчика 1050 свой ФМ с пакетниками in background task.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице
СообщениеДобавлено: Чт, фев 04 2016, 16:39 
Начинающий
Начинающий

Зарегистрирован:
Вт, май 20 2014, 15:13
Сообщения: 8
Спасибо, получилось изменить BKPF-XREF2_HD через пакетный ввод транзакции FB02, помещённый внутрь ФМ типа "Дистанционный модуль", вызываемого in background task!

Функциональный модуль Z_OPENFI_1050 вызывает модуль Z_OPEN_FI_1050_2
Code:
  lv_xref2_hd = ls_bkpf-belnr && ls_bkpf-gjahr.
  If lv_xref2_hd is initial.
    Return.
  Endif.
  Call function 'Z_OPENFI_1050_2' in background task
    exporting
      iv_bukrs        = ls_bkpf-bukrs
      iv_belnr        = ls_bkpf_memory-belnr
      iv_gjahr        = ls_bkpf-gjahr
      iv_xref2_hd     = lv_xref2_hd
      iv_mode         = 'P'
            .


ФМ Z_OPENFI_1050_2 с типом "Дистанционный модуль" содержит пакетный ввод FB02
Изображение
Code:
FUNCTION Z_OPENFI_1050_2.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(IV_BUKRS) TYPE  BKPF-BUKRS
*"     VALUE(IV_BELNR) TYPE  BKPF-BELNR
*"     VALUE(IV_GJAHR) TYPE  BKPF-GJAHR
*"     VALUE(IV_XREF2_HD) TYPE  BKPF-XREF2_HD
*"     VALUE(IV_MODE) TYPE  CHAR01 DEFAULT 'P'
*"----------------------------------------------------------------------
*iv_mode Effect
*"A"     Processing with screens displayed
*"E"     Screens displayed only if an error occurs
*"N"     Processing without screens displayed. If a breakpoint is reached in one of the called transactions, processing is terminated with sy-subrc equal to 1001.
*"P"     Processing without screens displayed. If a breakpoint is reached in one of the called transactions, the system branches to the ABAP Debugger.
*Others  As for "A".

Data:
  ls_bdc type BDCDATA,
  ls_mess type BDCMSGCOLL,
  lt_bdc type BDCDATA_TAB,
  lt_mess type TAB_BDCMSGCOLL.
  Append value #( program = 'SAPMF05L' dynpro = '0100' dynbegin = 'X' ) to lt_bdc.
  Append value #( fnam = 'BDC_CURSOR' fval = 'RF05L-BELNR' ) to lt_bdc.
  Append value #( fnam = 'BDC_OKCODE' fval = '/00' ) to lt_bdc.
  Append value #( fnam = 'RF05L-BELNR' fval = iv_belnr ) to lt_bdc.
  Append value #( fnam = 'RF05L-BUKRS' fval = iv_bukrs ) to lt_bdc.
  Append value #( fnam = 'RF05L-GJAHR' fval = iv_gjahr ) to lt_bdc.
  Append value #( program = 'SAPMF05L' dynpro = '0700' dynbegin = 'X' ) to lt_bdc.
  Append value #( fnam = 'BDC_CURSOR' fval = 'BKPF-BELNR' ) to lt_bdc.
  Append value #( fnam = 'BDC_OKCODE' fval = '=VK' ) to lt_bdc.
  Append value #( program = 'SAPMF05L' dynpro = '1710' dynbegin = 'X' ) to lt_bdc.
  Append value #( fnam = 'BDC_CURSOR' fval = 'BKPF-XREF2_HD' ) to lt_bdc.
  Append value #( fnam = 'BDC_OKCODE' fval = '=ENTR' ) to lt_bdc.
*  Append value #( fnam = 'BKPF-BKTXT' fval = '3500000000006 00002' ) to lt_bdc.
*  Append value #( fnam = 'BKPF-XBLNR' fval = '1000 001' ) to lt_bdc.
  Append value #( fnam = 'BKPF-XREF2_HD' fval = iv_xref2_hd ) to lt_bdc.
  Append value #( program = 'SAPMF05L' dynpro = '0700' dynbegin = 'X' ) to lt_bdc.
  Append value #( fnam = 'BDC_CURSOR' fval = 'BKPF-BELNR' ) to lt_bdc.
  Append value #( fnam = 'BDC_OKCODE' fval = '=AE' ) to lt_bdc.
  Call transaction 'FB02' using lt_bdc mode iv_mode messages into lt_mess.
  Loop at lt_mess into ls_bdc where msgtyp = 'E'.
    Exit.
  Endloop.
  If sy-subrc = 0.
    Rollback work.
  Endif.
ENDFUNCTION.


В результате в поле BKPF-XREF2_HD записывается значение iv_xref2_hd из интерфейса ФМ Z_OPENFI_1050_2.


Последний раз редактировалось Тимур Гудков Пт, фев 05 2016, 11:29, всего редактировалось 1 раз.

Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице
СообщениеДобавлено: Чт, фев 04 2016, 16:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
Аналогичная задача. Здесь краткое описание решения:
Обработка БО через события
В вашем случае обработчик - это ФМ с пакетником, событие - стандартное BKPF.Created, точка генерации события (если не генерится стандартно) - модуль OpenFI.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменить поле BKPF-XREF2_HD через ФМ, без прямого обращения к таблице
СообщениеДобавлено: Чт, фев 04 2016, 23:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Тимур Гудков написал(а):
Спасибо, получилось изменить BKPF-XREF2_HD через пакетный ввод транзакции FB02, помещённый внутрь ФМ типа "Дистанционный модуль", вызываемого in background task!

Мы в свое время нарвались на остановку продуктива с IN BACKGROUND TASK через событие 1050. Запустился пакетный ввод на 100 записей, один ФМ залочил запись и застрял. В остальных документах пыталась измениться та же запись. В результате все диалоговые процессы оказались заняты :roll:
Поэтому перед запуском ФМ убедитесь, что ваша транзакция вызывается в диалоговом режиме.

_________________
С уважением,
Удав.


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

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


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

Сейчас этот форум просматривают: dev403k


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

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