Текущее время: Вт, июн 24 2025, 21:29

Часовой пояс: 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 часа


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

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


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

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