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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Создание и изменение правил расчета для СПП-элемента с помощью ФМ  Тема решена
СообщениеДобавлено: Вт, окт 28 2014, 11:11 
Начинающий
Начинающий

Зарегистрирован:
Пт, авг 31 2012, 10:30
Сообщения: 5
Всем привет!

Подскажите, плиз, кто сталкивался: K_SETTLEMENT_RULE_GET подходит ли для создания правил расчета в СПП-элементе? При тестировании ФМ-ника правило не прописывается. В COBRB ввожу компоненты:
Code:
OBJNR
ANLN1
ANLN2
EXTNR
PROZS
PERBZ


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: K_SETTLEMENT_RULE_GET
СообщениеДобавлено: Вт, окт 28 2014, 12:19 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Когда-то я делал так (этот код выполняется в экзите):
Code:
*&---------------------------------------------------------------------*
*&      Form  SETTLEMENT_RULE_CREATE_PROCESS
*&---------------------------------------------------------------------*
*       Создание правила расчета для СПП-элемента
*----------------------------------------------------------------------*
FORM settlement_rule_create_process
      USING    ls_prps    TYPE prps
      CHANGING cv_subrc   TYPE sysubrc.

  TYPES:
    BEGIN OF ty_s_cobra_buf.
  INCLUDE               TYPE cobra.
  TYPES: uflag          TYPE dkobr-upd_flag,
  END OF ty_s_cobra_buf.
  TYPES:
    ty_t_cobra_buf      TYPE STANDARD TABLE OF ty_s_cobra_buf.

  TYPES:
    BEGIN OF ty_s_cobrb_buf.
  INCLUDE               TYPE cobrb.
  TYPES: uflag          TYPE dkobr-upd_flag,
  END OF ty_s_cobrb_buf.
  TYPES:
    ty_t_cobrb_buf      TYPE STANDARD TABLE OF ty_s_cobrb_buf .

  DATA:
    ls_objnr            TYPE ionrb,
    lt_objnr            TYPE STANDARD TABLE OF ionrb,
    ls_cobra            TYPE cobra,
    lt_cobra            TYPE STANDARD TABLE OF cobra,
    ls_cobrb            TYPE cobrb,
    lt_cobrb            TYPE STANDARD TABLE OF cobrb,
    ls_cobra_mem        TYPE ty_s_cobra_buf,
    lt_cobra_mem        TYPE ty_t_cobra_buf,
    ls_cobrb_mem        TYPE ty_s_cobrb_buf,
    lt_cobrb_mem        TYPE ty_t_cobrb_buf,
    ls_cobrb_ins        TYPE ty_s_cobrb_buf,
    l_pos               TYPE sytabix.
  CONSTANTS:
    c_uflag_insert      TYPE dkobr-upd_flag VALUE 'I',
    c_uflag_update      TYPE dkobr-upd_flag VALUE 'U',
    c_uflag_delete      TYPE dkobr-upd_flag VALUE 'D'.
  FIELD-SYMBOLS:
    <cobrb_mem>         TYPE ty_s_cobrb_buf.

*-----------------
* ПРЕДВАРИТЕЛЬНО ФОРМИРУЕМ СОЗДАВАЕМУЮ ПОЗИЦИЮ ДЛЯ ПРАВИЛА РАСЧЕТА

  ls_cobrb_ins-uflag = c_uflag_insert.
  ls_cobrb_ins-mandt = sy-mandt.
  ls_cobrb_ins-objnr = ls_prps-objnr.
  ls_cobrb_ins-bureg = '000'.
  ls_cobrb_ins-perbz = 'PER'.  " ПРД
  ls_cobrb_ins-prozs = '100'.
  ls_cobrb_ins-bwaer = 'UED'.
* ls_cobrb_ins-brtyp = '01'.
  ls_cobrb_ins-avorg = 'KOAO'.
  ls_cobrb_ins-konty = 'SK'.
  ls_cobrb_ins-kokrs = ls_prps-pkokr.                       "'2000'.
  ls_cobrb_ins-bukrs = ls_prps-pbukr.                       "'1000'.
  ls_cobrb_ins-urzuo = '001'.
  ls_cobrb_ins-hkont = '0091053104'.
  CONCATENATE ls_cobrb_ins-konty
              ls_cobrb_ins-bukrs
              ls_cobrb_ins-hkont INTO ls_cobrb_ins-rec_objnr1.

*-----------------
* ЗАПОЛНЯЕМ БУФЕР УЖЕ СУЩЕСТВУЮЩИМИ ПОЗИЦИЯМИ ПРАВИЛА РАСЧЕТА

  ls_objnr = ls_prps-objnr.
  APPEND ls_objnr TO lt_objnr.

  CALL FUNCTION 'K_SRULE_PRE_READ'
    EXPORTING
      i_pflege         = ' '
    TABLES
      t_sender_objnr   = lt_objnr
    EXCEPTIONS
      wrong_parameters = 1
      OTHERS           = 2.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  CALL FUNCTION 'K_SETTLEMENT_RULE_GET'
    EXPORTING
      objnr     = ls_prps-objnr
      x_all     = ' '
    TABLES
      e_cobra   = lt_cobra
      e_cobrb   = lt_cobrb
    EXCEPTIONS
      not_found = 1
      OTHERS    = 2.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

*-----------------
* ИЗВЛЕКАЕМ ИЗ БУФЕРА СУЩЕСТВУЮЩЕЕ ПРАВИЛО РАСЧЕТА

  CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'
    EXPORTING
      i_mode     = 'EX'
    EXCEPTIONS
      wrong_mode = 1
      OTHERS     = 2.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  IMPORT l_mem_cobra TO lt_cobra_mem
         l_mem_cobrb TO lt_cobrb_mem FROM MEMORY ID 'K_SRULE'.

*-----------------
* ВНОСИМ ИЗМЕНЕНИЯ В ПРАВИЛО РАСЧЕТА

* есть ли "использованная" позиция правила расчета?
  LOOP AT lt_cobrb_mem TRANSPORTING NO FIELDS
    WHERE objnr EQ ls_cobrb_ins-objnr
      AND ( NOT letja IS INITIAL OR NOT letpe IS INITIAL )
      AND uflag NE c_uflag_delete.
  ENDLOOP.
  IF sy-subrc EQ 0.
*   "использованная" позиция есть - удаляем остальные позиции
    LOOP AT lt_cobrb_mem ASSIGNING <cobrb_mem>
      WHERE objnr EQ ls_cobrb_ins-objnr
        AND ( letja IS INITIAL AND letpe IS INITIAL )
        AND uflag NE c_uflag_delete.
      IF <cobrb_mem>-uflag EQ c_uflag_insert.
        DELETE lt_cobrb_mem.
      ELSE.
        <cobrb_mem>-uflag = c_uflag_delete.
      ENDIF.
    ENDLOOP.

  ELSE.
*   "использованной" позиции нет,
*   в имеющихся позициях - оставляем только первую позиции (корректируя её, если она отличается от требуемой)
    LOOP AT lt_cobrb_mem ASSIGNING <cobrb_mem>
      WHERE objnr EQ ls_cobrb_ins-objnr
        AND uflag NE c_uflag_delete.

      ADD 1 TO l_pos.

      IF l_pos EQ 1. " -->> первую позицию оставляем (корректируя её, если надо)
        CHECK <cobrb_mem>-konty EQ ls_cobrb_ins-konty
           OR <cobrb_mem>-hkont EQ ls_cobrb_ins-hkont
           OR <cobrb_mem>-prozs EQ ls_cobrb_ins-prozs
           OR <cobrb_mem>-perbz EQ ls_cobrb_ins-perbz
           OR <cobrb_mem>-brtyp EQ ls_cobrb_ins-brtyp
           OR <cobrb_mem>-urzuo EQ ls_cobrb_ins-urzuo
           OR <cobrb_mem>-extnr EQ ls_cobrb_ins-extnr
           OR <cobrb_mem>-betrr EQ ls_cobrb_ins-betrr
           OR <cobrb_mem>-aqzif EQ ls_cobrb_ins-aqzif .

        <cobrb_mem>-konty =  ls_cobrb_ins-konty.
        <cobrb_mem>-hkont =  ls_cobrb_ins-hkont.
        <cobrb_mem>-prozs =  ls_cobrb_ins-prozs.
        <cobrb_mem>-perbz =  ls_cobrb_ins-perbz.
        <cobrb_mem>-brtyp =  ls_cobrb_ins-brtyp.
        <cobrb_mem>-urzuo =  ls_cobrb_ins-urzuo.
        <cobrb_mem>-extnr =  ls_cobrb_ins-extnr.
        <cobrb_mem>-betrr =  ls_cobrb_ins-betrr.
        <cobrb_mem>-aqzif =  ls_cobrb_ins-aqzif.
        IF <cobrb_mem>-uflag NE c_uflag_insert.
          <cobrb_mem>-uflag =  c_uflag_update.
        ENDIF.

      ELSE.       " -->> остальные позиции удаляем
        IF <cobrb_mem>-uflag EQ c_uflag_insert.
          DELETE lt_cobrb_mem.
        ELSE.
          <cobrb_mem>-uflag = c_uflag_delete.
        ENDIF.
      ENDIF.
    ENDLOOP.
    IF sy-subrc NE 0.
*     если вообще нет позиций - создаем позицию
*     порядковый номер создаваемой позиции
      LOOP AT lt_cobrb_mem INTO ls_cobrb_mem ." WHERE uflag NE 'D'.
        CHECK ls_cobrb_mem-lfdnr GT ls_cobrb_ins-lfdnr.
        ls_cobrb_ins-lfdnr = ls_cobrb_mem-lfdnr.
      ENDLOOP.
      ADD 1 TO ls_cobrb_ins-lfdnr.

*     добавляем позицию
      APPEND ls_cobrb_ins TO lt_cobrb_mem.
    ENDIF.
  ENDIF.



**проверка отсутствия в правиле расчета создаваемой позиции
* LOOP AT lt_cobrb_mem TRANSPORTING NO FIELDS
*   WHERE objnr EQ ls_cobrb_ins-objnr
*     AND hkont EQ ls_cobrb_ins-hkont
*     AND uflag NE 'D'.
* ENDLOOP.
*
* CHECK sy-subrc NE 0.
*
**порядковый номер создаваемой позиции
* LOOP AT lt_cobrb_mem INTO ls_cobrb_mem ." WHERE uflag NE 'D'.
*   CHECK ls_cobrb_mem-lfdnr GT ls_cobrb_ins-lfdnr.
*   ls_cobrb_ins-lfdnr = ls_cobrb_mem-lfdnr.
* ENDLOOP.
* ADD 1 TO ls_cobrb_ins-lfdnr.
*
**добавляем позицию
* APPEND ls_cobrb_ins TO lt_cobrb_mem.

*-----------------
* ОТПРАВЛЯЕМ ПРАВИЛО РАСЧЕТА ОБРАТНО В БУФЕР

  CALL FUNCTION 'K_SETTLEMENT_RULE_REFRESH'
    EXPORTING
      objnr = ls_prps-objnr.

  EXPORT l_mem_cobra FROM lt_cobra_mem
         l_mem_cobrb FROM lt_cobrb_mem TO MEMORY ID 'K_SRULE'.

  CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'
    EXPORTING
      i_mode     = 'IM'
    EXCEPTIONS
      wrong_mode = 1
      OTHERS     = 2.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

*-----------------
* СОХРАНЯЕМ ПРАВИЛО РАСЧЕТА
*
* CALL FUNCTION 'K_SETTLEMENT_RULE_SAVE'
*   EXPORTING
*     dialog            = 'X'
*     objnr             = ls_prps-objnr
*     i_status_update   = ' '
*   EXCEPTIONS
*     no_rule_for_objnr = 1
*     OTHERS            = 2.
* IF sy-subrc NE 0.
*   MESSAGE ID SY-MSGID TYPE 'I' NUMBER SY-MSGNO
*           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*   EXIT.
* ENDIF.

ENDFORM. " SETTLEMENT_RULE_CREATE_PROCESS


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: K_SETTLEMENT_RULE_GET
СообщениеДобавлено: Ср, окт 29 2014, 09:55 
Начинающий
Начинающий

Зарегистрирован:
Пт, авг 31 2012, 10:30
Сообщения: 5
Спасибо)


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

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


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

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


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

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