Автор Тема: Работа с замещениями FI  (Прочитано 50088 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 780
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Работа с замещениями FI
« : Январь 28, 2009, 03:16:21 pm »
Учиться таки типа лучше на практике... как говорил т.Ленин, а он знал что делал. Так что в общем будем считать, что надо при проводке инвентаризационных разниц, в позицию документа FI,. которая формируется для оцениваемых материалов, например записать номер документа инвентаризации. Так как документы FI будут уже третьими в цепочке документов при инвентаризации, а могут и не быть, то значит, делать такую операцию надо из документа FI, а как.. ну замещения FI, наверное самое оно для такого решения. Опять же, тут рассмотрю именно эту задачу, а не в целом как работать с замещениями, хотя конечно как для начала, что такое замещения и с чем их есть, ну можете использовать. Кстати, как по мне, то рассматриваемое замещение с использованием программы пользователя будет более сложным в написании, чем другие виды замещений, типа константа или присвоение поле-поле. А теперь поехали  ^-^

1. С чего начать работу с замещениями для программы пользователя или вообще с любыми другими видами? Я тут подумал, наверное с того, что сначала не плохо бы проверить какие поля можно замещать в вашей системе, потому что не все, к чему имеется доступ, можно замещать. Для этого идем в табличку GB01, рисунок GB01-1.png, там задаем следующие параметры:
  • BOOLCLASS = 9, если проверяем возможность замещения полей для позиций документа FI или 8 -  если требуется замещать поля в заголовке документа.
  • CLASSTYPE = S, типа показать замещаемые поля
Далее увеличиваем количество записей в поле максимальное количество совпадений, ну 2000 должно хватить и выполняем выборку данных. Получим нечто похожее, как на рисунке GB01-2.png. В общем это фактически список полей таблицы BSEG, теперь можно найти по имени требующее замещения поле.
Цитировать
(Как узнать техническое имя поля? Надеюсь тот кто будет выполнять действия по этой инструкции, все таки более-менее будет подкован в этом вопросе, а иначе ну не надо оно вам)
Далее смотрим на признак в поле BEXCLUDE. Если там ничего не стоит, значит поле можно замещать, а вот если там стоит значение Х, то это значит что SAP, считает, что данное поле не рекомендуется к замещению пользователем, например поле текста позиции документа BSEG -SGTXT разрешено к замещению, а вот счет главной книги BSEG-HKONT нет. Вообще-то конечно SAP нам иногда не указ и ну очень иногда хочется сделать замещение поля того счета главной книги, ну если подходить с головой к тому что вы делаете и отдавать отчет, то очень даже можно сделать такое замещение, а вот поля суммы, я вам очень сильно не рекомендую замещать. Для этого нужно сбросить признак Х, в поле BEXCLUDE, напротив замещаемого поля. Если это не сделать, то после вызова замещения, система вернет все значения полей со статусом BEXCLUDE = "Х", на значения которые поля содержали до вызова вашего замещения.
Смену поля можно сделать любым из описанных ниже способов:
  • В ручном режиме, используя ключ отладчика /h для выбранной записи, через транзакуцию SE11/SE16.
  • Использовать метод описанный по данной ссылке You are not allowed to view links. Register or Login, спасибо №1 за наводки, явки, адреса и пароли.
  • Использовать небольшую программку, текст которой приведен ниже.
  • UPD - спасибо гостю fdu4 Использовать ракурс ведения транзакция SE11 имя ракурса VWTYGB01. Данный вариант похоже является самым оптимальными и простым для использования.
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YXXX_CHANGE_GB01
*&
*&---------------------------------------------------------------------*
*& Программка для установки метки возможности замещения
*&---------------------------------------------------------------------*
REPORT  yxxx_change_gb01..
TABLES: gb01.

PARAMETERS: p_bc LIKE gb01-boolclass DEFAULT '009' OBLIGATORY,
            p_ct LIKE gb01-classtype DEFAULT 'S' OBLIGATORY,
            p_tab LIKE gb01-bcltab OBLIGATORY,
            p_field LIKE gb01-bclfield OBLIGATORY.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_excl LIKE gb01-bexclude DEFAULT space.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_commit(1) TYPE c DEFAULT space.

SELECT * FROM gb01
WHERE boolclass = p_bc AND
      classtype = p_ct AND
      bcltab = p_tab AND
      bclfield = p_field.
  WRITE: / gb01-boolclass, gb01-classtype, gb01-bcltab NO-GAP, '-' NO-GAP, gb01-bclfield.
  WRITE: 'Текущее значение BEXCLUDE', gb01-bexclude.
  IF p_commit = 'X'.
    gb01-bexclude = p_excl.
    MODIFY gb01.
    WRITE: 'Значение изменено:', p_excl.
  ENDIF.
ENDSELECT.
IF sy-subrc = 0.
  IF p_commit = 'X'. COMMIT WORK. ELSE. ROLLBACK WORK. ENDIF.
ELSE.
  WRITE: / 'Данные не найдены, проверьте параметеры запуска'.
ENDIF.
    В общем результатом будет то, что желаемое поле будет разрешено к замещению в системе. Теперь надо перегенерировать программы обработки замещений, чтобы они узнали о том, что появились новые поля для замещения. Если этого не сделать, то замещение работать не будет. Для этого нужно через транзакцию SE38, выполнить программу RGUGBR00 - Генерация ABAP-кодировки для проверок/замещений/правил. Причем если измененную запись в таблице GB01 можно перенести транспортом в продуктивную систему, то программу генерации данных для замещения, желательно выполнить в каждой системе куда будет переноситься транспорт вашего замещения. Выполнять программу надо для области FI, можно для всех моментов и галочки ставим все, как на рисунке RGUGBR00.png. Если  в замещениях нет синтаксических ошибок, то генерация должна пройти без проблем. По крайней мере если никто  до вас ничего не трогал, то опять же ошибок генерации вы получить не должны, зато теперь система знает, что было добавлено новое поле замещения. Опять же если, если поле изначально позволяет выполнять свое замещение, то запускать генерацию не нужно. Например поле BSEG-SGTXT может быть замещено изначально.

    Продолжение следует  ;)
    « Последнее редактирование: Июль 20, 2010, 02:57:17 pm от Uukrul »

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #1 : Январь 28, 2009, 04:51:36 pm »
    2. Создание программы замещения. Как и user-exits замещение это фактически abap-программа в которой вы должны написать логику определения данных замещения, однако в отличии от экзитов, в которых сразу вставлен инклуд начинающийся на Z* с замещениями все работает немного по другому.
    • Во-первых, программа замещения указывается в настройке для прикладной области, причем прикладные области системой определены заранее.
    • Во-вторых, SAP предлагает вам шаблон программы, который вы должны скопировать в свою программу начинающуюся на Z*, после чего для для нужной вам прикладной области заменить стандартную программу на вновь вам созданную.
    • В-третьих все замещения для прикладной области живут в одной программе, т.е. если  для прикладной обалсти уже стоит программа начинающаяся на Z*, то это значит, что кто-то уже использует замещения в вашей системе, и вы должны будете вставить код замещения в эту уже существующую программу, ну и само собой код должен быть как минимум без синтаксических ошибок, а иначе вы завалите работу всех замещений для прикладной области.

    И так, идем в настройку системы: SPRO: Финансы - Специальные регистры - Основные параметры настройки - Программы пользователя - Ведение пользовательских программ, зависящих от манданта. Для версии 4.6 и ниже, возможно путь будет немного другим, но где-то в районе настройки спец-регистров. Пример для ECC 6.0 на рисунке GBLS-1.png. Если зайти в настройку, для замещения документов FI на уровне заголовка и позиции, нас будет интересовать строка прикладной области = GBLS. Если замещения не использовались, то там будет стоять программа RGGBS000. Считаем что так и есть, поэтому копируем эту программу например в свою с именем ZGGBS000. Копируем только текст этой программы без инклудов, т.е. только текст этой   программы, для этого в SE38 вводим имя этой программы и выбираем копирование Ctrl+F5. После чего вставляем имя своей программы для прикладной области, как на рисунке GBLS-2.png. Как минимум после этого выполняем сохранение. При сохранении у вас спросят имя запроса для транспорта изменений и система выполнить синтаксическую проверку заданной вами программы. Если ошибок не обнаружено и генерация кода пройдет успешно, то система позволит вам сохранить изменения. В нашем случае вроде как программа свежая, мы в нее своими ручками не лезли, так что теоретически все будет сохранено без проблем. Затем идем в изменение программы и добавляем свою подпрограмму замещения. Имя подпрограммы можно использовать любое, длина имени 4 символа. По стандарту имена начинаются на U*, традиция хорошая можно ее продолжить. Для этого надо в программе ZGGBS000, найти подпрограмму
    Код: You are not allowed to view links. Register or Login
    *----------------------------------------------------------------------*
    *       FORM GET_EXIT_TITLES                                           *
    *----------------------------------------------------------------------*
    *       returns name and title of all available standard-exits         *
    *       every exit in this formpool has to be added to this form       *
    *----------------------------------------------------------------------*
    *  -->  EXIT_TAB  table with exit-name and exit-titles                 *
    *                 structure: NAME(5), PARAM(1), TITEL(60)
    *----------------------------------------------------------------------*
    FORM GET_EXIT_TITLES TABLES ETAB.
    И где-то в конце этой процедурки, но перед командами:
    Код: You are not allowed to view links. Register or Login
      REFRESH ETAB.
      LOOP AT EXITS.
        ETAB = EXITS.
        APPEND ETAB.
      ENDLOOP.
    Вставить свой код вида:
    Код: You are not allowed to view links. Register or Login
      EXITS-NAME  = 'U777.
      EXITS-PARAM = C_EXIT_PARAM_NONE.
      EXITS-TITLE = TEXT-777.
      APPEND EXITS.
    Где U777 - имя нашего замещения, кстати не должно пересекаться с уже существующим именем. Ну вместо TEXT-777 можно просто написать комментарий, но кошерно будет сделать именно так, через текстовую переменную. Потом двойной клик мышью на TEXT-777 и в открывшемся окне вводим текст комментария. Кстати, для вставки своего кода нужно стать курсором мыши в требуемую позицию программы и нажать кнопку вверху редактора "Вставить", так как это будет модификация специальной программы и система оформит вставку с комментариями запроса в котором создано замещение.
    Затем нужно перейти ниже по тексту программы и создать свою подпрограмму с именем U777, типа так:
    Код: You are not allowed to view links. Register or Login
    *{   INSERT         &$&$&$&$                                          1
    *---------------------------------------------------------------------*
    *       FORM U777                                                     *
    *---------------------------------------------------------------------*
    *       Моя прогрмма замещения                                        *
    *---------------------------------------------------------------------*
    FORM U777.

    ENDFORM.
    *
    *}   INSERT
    Само собой вставка тоже оформляется через модификацию. Теперь сохраняем все это произведение искусства и генерируем текст программы. Если вы сделали все правильно, то ошибок генерации быть не должно. Само замещение будем писать позже, а пока займемся следующим шагом оформлением вызова замещения.
    Хотя еще можете, для проверки работы в дальнейшем, вставить в подпрограмму оператор прерывания BREAK-POINT. А пока запоминаем имя программки ZGGBS000, она нам понадобиться в дальнейшем и имя своей подпрограммы U777  ;).
    У меня программа стала выглядеть где-то так как в блоке кода ниже. Опять же не надо копировать этот текст ни в коем случае себе, так как он является уникальным для системы где создан.
    Код: You are not allowed to view links. Register or Login
    REPORT ZGGBS800.
    *---------------------------------------------------------------------*
    *                                                                     *
    *   Substitutions: EXIT-Formpool for Uxxx-Exits                       *
    *                                                                     *
    *   This formpool is used by SAP for testing purposes only.           *
    *                                                                     *
    *   In the US IDES example, we are using form U901 as a user exit to  *
    *   populate the correct function area on documents where WBS         *
    *   elements are posted.                                              *
    *---------------------------------------------------------------------*
    INCLUDE FGBBGD00.              "Standard data types

    TABLES: CSKS,
            GLU1,
            BKPF,
            BSEG,
            ACCIT,
            ACCHD,
    *{   INSERT         IDTK911943                                        1
            fila_valsup,
            zzprctr,
            COBL,
            PRPS.                                          "for form U901
    *       zzper.
    TYPE-POOLS: GB002.

    * ...  Global constant definitioin for function area substitution .... *
    * ...  Order number ranges ........................................... *
     DATA: RANGE1_FROM LIKE ACCIT-AUFNR VALUE '000100000000',
           RANGE1_TO   LIKE RANGE1_FROM VALUE '000999999999',
           RANGE2_FROM LIKE RANGE1_FROM VALUE '9A0000000000',
           RANGE2_TO   LIKE RANGE1_FROM VALUE '9ZZZZZZZZZZZ',
           RANGE3_FROM LIKE RANGE1_FROM VALUE 'A',
           RANGE3_TO   LIKE RANGE1_FROM VALUE 'AZZZZZZZZZZZ'.

    * ... Function area values ........................................... *
     DATA: BEGIN OF FAREA,
             PROD_DEVIATION LIKE ACCIT-FKBER VALUE '0100',
             SALES_COSTS    LIKE ACCIT-FKBER VALUE '0300',
             ADMIN_COSTS    LIKE ACCIT-FKBER VALUE '0400',
             R_AND_D_COSTS  LIKE ACCIT-FKBER VALUE '0500',
           END   OF FAREA.


    *----------------------------------------------------------------------*
    *       FORM GET_EXIT_TITLES                                           *
    *----------------------------------------------------------------------*
    *       returns name and title of all available standard-exits         *
    *       every exit in this formpool has to be added to this form       *
    *----------------------------------------------------------------------*
    *  -->  EXIT_TAB  table with exit-name and exit-titles                 *
    *                 structure: NAME(5), PARAM(1), TITEL(60)
    *----------------------------------------------------------------------*
    FORM GET_EXIT_TITLES TABLES ETAB.

      DATA: BEGIN OF EXITS OCCURS 50,
              NAME(5)   TYPE C,
              PARAM     LIKE C_EXIT_PARAM_NONE,
              TITLE(60) TYPE C,
            END OF EXITS.

      EXITS-NAME  = 'U100'.
      EXITS-PARAM = C_EXIT_PARAM_NONE.
      EXITS-TITLE = TEXT-100.             "Cost center from CSKS
      APPEND EXITS.

      EXITS-NAME  = 'U901'.
      EXITS-PARAM = C_EXIT_PARAM_NONE.
      EXITS-TITLE = TEXT-100.             "Cost center from CSKS
      APPEND EXITS.

      EXITS-NAME  = 'U101'.
      EXITS-PARAM = C_EXIT_PARAM_FIELD.
      EXITS-TITLE = TEXT-101.             "Cost center from CSKS
      APPEND EXITS.

      EXITS-NAME  = 'U102'.
      EXITS-PARAM = C_EXIT_PARAM_CLASS.
      EXITS-TITLE = TEXT-102.             "Sum is used for the reference.
      APPEND EXITS.

      EXITS-NAME  = 'UFBER'.
      EXITS-PARAM = C_EXIT_PARAM_NONE.
      EXITS-TITLE = TEXT-103.             "FKBER substitution
      APPEND EXITS.

      EXITS-NAME  = 'U150'.
      EXITS-PARAM = C_EXIT_PARAM_FIELD.
      EXITS-TITLE = TEXT-150.             "Personalnummer von ZZPER
      APPEND EXITS.
    *{   INSERT         IDTK911943                                        1
    Exits-Name = 'UGAI'.
    EXITS-PARAM = C_EXIT_PARAM_none.
    EXITS-TITLE = TEXT-170.
    Append exits.
    *
    *}   INSERT

      EXITS-NAME  = 'U990'.
      EXITS-PARAM = C_EXIT_PARAM_NONE.
      EXITS-TITLE = TEXT-990.          "FKBER validation.
      APPEND EXITS.

       EXITS-NAME  = 'U995'.
      EXITS-PARAM = C_EXIT_PARAM_FIELD.
      EXITS-TITLE = TEXT-995.             "Profit Center aus Tabelle ZZPRCTR
      APPEND EXITS.
    *{   INSERT         KI6K900136       
    *                                1
    * Мое замещение для примера!!!!
    *
      EXITS-NAME  = 'U777'.
      EXITS-PARAM = C_EXIT_PARAM_FIELD.
      EXITS-TITLE = TEXT-777.
      APPEND EXITS.

    *}   INSERT


      REFRESH ETAB.
      LOOP AT EXITS.
        ETAB = EXITS.
        APPEND ETAB.
      ENDLOOP.

    ENDFORM.

    *{   INSERT         KI6K900136                                        1
    *---------------------------------------------------------------------*
    *       FORM U777                                                     *
    *---------------------------------------------------------------------*
    *       Моя прогрмма замещения                                        *
    *---------------------------------------------------------------------*
    FORM U777.
      break-point.
    ENDFORM.
    *
    *}   INSERT

    * eject
    *---------------------------------------------------------------------*
    *       FORM U100                                                     *
    *---------------------------------------------------------------------*
    *       Reads the cost-center from the CSKS table .                   *
    *---------------------------------------------------------------------*
    FORM U100.

      SELECT * FROM CSKS
                WHERE KOSTL EQ COBL-KOSTL
                  AND KOKRS EQ COBL-KOKRS.
        IF CSKS-DATBI >= SY-DATUM AND
           CSKS-DATAB <= SY-DATUM.

          MOVE CSKS-ABTEI TO COBL-KOSTL.

        ENDIF.
      ENDSELECT.

    ENDFORM.

    * eject
    *---------------------------------------------------------------------*
    *       FORM U101                                                     *
    *---------------------------------------------------------------------*
    *       Reads the cost-center from the CSKS table for accounting      *
    *       area '0001'.                                                  *
    *       This exit uses a parameter for the cost_center so it can      *
    *       be used irrespective of the table used in the callup point.   *
    *---------------------------------------------------------------------*
    FORM U101 USING COST_CENTER.

      SELECT * FROM CSKS
                WHERE KOSTL EQ COST_CENTER
                  AND KOKRS EQ '0001'.
        IF CSKS-DATBI >= SY-DATUM AND
           CSKS-DATAB <= SY-DATUM.

          MOVE CSKS-ABTEI TO COST_CENTER .

        ENDIF.
      ENDSELECT.

    ENDFORM.

    * eject
    *---------------------------------------------------------------------*
    *       FORM U102                                                     *
    *---------------------------------------------------------------------*
    *       Inserts the sum of the posting into the reference field.      *
    *       This exit can be used in FI for the complete document.        *
    *       The complete data is passed in one parameter.                 *
    *---------------------------------------------------------------------*
    FORM U102 USING BOOL_DATA TYPE GB002_015.
    DATA: SUM(10) TYPE C.

        LOOP AT BOOL_DATA-BSEG INTO BSEG
                        WHERE    SHKZG = 'S'.
           ADD BSEG-DMBTR TO SUM.
        ENDLOOP.

        BOOL_DATA-BKPF-XBLNR = TEXT-001.
        REPLACE '&' WITH SUM INTO BOOL_DATA-BKPF-XBLNR.

    ENDFORM.

    * eject
    *---------------------------------------------------------------------*
    *       FORM UFBER                                                    *
    *---------------------------------------------------------------------*
    *       Assigns a value to the FKBER field corresponding to the       *
    *       cost center type or the  order type, respectively.            *
    *       The rules are defined as follows:                             *
    *                                                                     *
    *          Cost Center Type     Order Type     Function area          *
    *                                                                     *
    *   (1)         1,2           0800, 0850, 0860     0100 prod. dev.    *
    *                             0100, 0150, 0400                        *
    *                             0450, 0600, 0650                        *
    *                             1000, 9A0                               *
    *   (2)          3            all profitablity     0200 sales costs   *
    *                             segments                                *
    *   (3)         4,5                                0400 admin costs   *
    *   (4)          6                                 0500 R&D costs     *
    *---------------------------------------------------------------------*
    FORM UFBER.

     DATA: CC_TYPE12(1)  TYPE N VALUE 1,
           CC_TYPE3      LIKE CC_TYPE12 VALUE 2,
           CC_TYPE45     LIKE CC_TYPE12 VALUE 3,
           CC_TYPE6      LIKE CC_TYPE12 VALUE 4.

     DATA: B_RESULT LIKE D_BOOL.


    * ... First case ..................................................... *
    * ... Cost center is type 1 or 2  OR ................................. *
    * ... Order type is in a certain range ............................... *
      PERFORM CHECK_KOSTL_TYPE  USING    ACCIT-KOSTL
                                         CC_TYPE12
                                CHANGING B_RESULT.

      IF B_RESULT <> B_TRUE.        "=> value found, thus check order number
        PERFORM CHECK_AUFTRAGS_NUMMER  USING ACCIT-AUFNR
                                    CHANGING B_RESULT.
      ENDIF.

      IF B_RESULT = B_TRUE.                    "=> value found
        ACCIT-FKBER = FAREA-PROD_DEVIATION.
        EXIT.
      ENDIF.

    * ... Second case..................................................... *
    * ... Cost center is type 3 OR ....................................... *
    * ... All profitability segments ..................................... *
      PERFORM CHECK_KOSTL_TYPE  USING    ACCIT-KOSTL
                                         CC_TYPE3
                                CHANGING B_RESULT.

      IF B_RESULT = B_TRUE OR                  "=> value found OR
         NOT ( ACCIT-PAOBJNR IS INITIAL ).     "   profit. object filled
    * IF B_RESULT = B_TRUE.                   "changed for GM demo, Zimmerer
         ACCIT-FKBER = FAREA-SALES_COSTS.
        EXIT.
      ENDIF.

    * ... Third case ..................................................... *
    * ... Cost center is type 4 or 5 ..................................... *
      PERFORM CHECK_KOSTL_TYPE  USING    ACCIT-KOSTL
                                         CC_TYPE45
                                CHANGING B_RESULT.

      IF B_RESULT = B_TRUE.                    "=> value found
        ACCIT-FKBER = FAREA-ADMIN_COSTS.
        EXIT.
      ENDIF.

    * ... Fourth case .................................................... *
    * ... Cost center is type 6 .......................................... *
      PERFORM CHECK_KOSTL_TYPE  USING    ACCIT-KOSTL
                                         CC_TYPE6
                                CHANGING B_RESULT.

      IF B_RESULT = B_TRUE.                    "=> value found
        ACCIT-FKBER = FAREA-R_AND_D_COSTS.
        EXIT.
      ENDIF.


    ENDFORM.


    *----------------------------------------------------------------------*
    *       FORM CHECK_KOSTL_TYPE                                          *
    *----------------------------------------------------------------------*
    *       Looks if the cost center is of a given type.
    *       For each new cost center, you have to add new
    *       "P_FIELD_VALUE <> field_value"-line into the
    *       coding for the corresponding cost center type.
    *----------------------------------------------------------------------*
    *  -->  P_FIELD_VALUE  Value of the cost center to look up             *
    *  -->  P_CC_TYPE      Type of the cost center set manager structure   *
    *  <--  P_RESULT       B_TRUE = Value found in set                     *
    *----------------------------------------------------------------------*
    FORM CHECK_KOSTL_TYPE   USING VALUE(P_FIELD_VALUE)
                                  VALUE(P_CC_TYPE)
                         CHANGING P_RESULT.

     DATA: CC_TYPE12(1)  TYPE N VALUE 1,
           CC_TYPE3      LIKE CC_TYPE12 VALUE 2,
           CC_TYPE45     LIKE CC_TYPE12 VALUE 3,
           CC_TYPE6      LIKE CC_TYPE12 VALUE 4.


       P_RESULT = B_TRUE.

    * ... Look up the value in the corresponding to the given type ....... *
      CASE P_CC_TYPE.
        WHEN CC_TYPE12.
          CHECK P_FIELD_VALUE <> '0000004200' AND
                P_FIELD_VALUE <> '0000004205' AND
                P_FIELD_VALUE <> '0000004210' AND
                P_FIELD_VALUE <> '0000004220' AND
                P_FIELD_VALUE <> '0000004230' AND
                P_FIELD_VALUE <> '0000004240' AND
                P_FIELD_VALUE <> '0000004250' AND
                P_FIELD_VALUE <> '0000004255' AND
                P_FIELD_VALUE <> '0000004260' AND
                P_FIELD_VALUE <> '0000004270' AND
                P_FIELD_VALUE <> '0000004275' AND
                P_FIELD_VALUE <> '0000004276' AND
                P_FIELD_VALUE <> '0000004277' AND
                P_FIELD_VALUE <> '0000004278' AND
                P_FIELD_VALUE <> '0000004279' AND
                P_FIELD_VALUE <> '0000004280' AND
                P_FIELD_VALUE <> '0000004290' AND
                P_FIELD_VALUE <> '0000004295' AND
                P_FIELD_VALUE <> '0000004296' AND
                P_FIELD_VALUE <> '0000004400' AND
                P_FIELD_VALUE <> '2-4200    ' AND
                P_FIELD_VALUE <> '2-4210    ' AND
                P_FIELD_VALUE <> '21-4200   ' AND
                P_FIELD_VALUE <> '21-4210   ' AND         "Type 1
                P_FIELD_VALUE <> '0000004100' AND
                P_FIELD_VALUE <> '0000004110' AND
                P_FIELD_VALUE <> '0000004120' AND
                P_FIELD_VALUE <> '0000004130' AND
                P_FIELD_VALUE <> '0000004300' AND
                P_FIELD_VALUE <> '2-4100    ' AND
                P_FIELD_VALUE <> '2-4210    ' AND
                P_FIELD_VALUE <> '21-4200   ' AND
                P_FIELD_VALUE <> '21-4210   '.
        WHEN CC_TYPE3.
          CHECK P_FIELD_VALUE <> '0000003100' AND
                P_FIELD_VALUE <> '0000003110' AND
                P_FIELD_VALUE <> '0000003120' AND
                P_FIELD_VALUE <> '0000003130' AND
                P_FIELD_VALUE <> '0000003140' AND
                P_FIELD_VALUE <> '0000003150' AND
                P_FIELD_VALUE <> '0000003200' AND
                P_FIELD_VALUE <> '2-3100    ' AND
                P_FIELD_VALUE <> '2-3110    ' AND
                P_FIELD_VALUE <> '2-3200    ' AND
                P_FIELD_VALUE <> '21-3100   ' AND
                P_FIELD_VALUE <> '21-3110   '.
        WHEN CC_TYPE45.
          CHECK P_FIELD_VALUE <> '0000001000' AND
                P_FIELD_VALUE <> '0000001200' AND
                P_FIELD_VALUE <> '0000001210' AND
                P_FIELD_VALUE <> '0000001220' AND
                P_FIELD_VALUE <> '0000001230' AND
                P_FIELD_VALUE <> '0000002100' AND
                P_FIELD_VALUE <> '0000002200' AND
                P_FIELD_VALUE <> '0000002300' AND
                P_FIELD_VALUE <> '2-1000    ' AND
                P_FIELD_VALUE <> '2-1200    ' AND
                P_FIELD_VALUE <> '2-1210    ' AND
                P_FIELD_VALUE <> '2-1220    ' AND
                P_FIELD_VALUE <> '2-1230    ' AND
                P_FIELD_VALUE <> '2-2100    ' AND
                P_FIELD_VALUE <> '2-2200    ' AND
                P_FIELD_VALUE <> '2-2300    ' AND         "Type 4
                P_FIELD_VALUE <> '0000001110' AND
                P_FIELD_VALUE <> '2-1110    '.            "Type 5
        WHEN CC_TYPE6.
          CHECK P_FIELD_VALUE <> '0000004500'.
      ENDCASE.

    * ... When NO check was false => not of requested cost center type ... *
      P_RESULT = B_FALSE.

    ENDFORM.         "CHECK_KOSTL_TYPE

    *----------------------------------------------------------------------*
    *       FORM CHECK_AUFTRAGS_NUMMER                                     *
    *----------------------------------------------------------------------*
    *       Looks if a given order number is in a center interval.
    *       The interval represents certain order types.
    *
    *       Number range             Order type
    *       ------------             ----------
    *       '000100..'-'000999..'    0100, 0150, 0400, 0450, 0600, 0650
    *                                0800, 0850
    *       '9A'      -'9ZZ..'       9A00
    *       'A'       -'AZZ..'       1000
    *----------------------------------------------------------------------*
    *  -->  P_AUFNR        Number of the order                             *
    *  <--  P_RESULT       B_TRUE = Value found in set                     *
    *----------------------------------------------------------------------*
    FORM CHECK_AUFTRAGS_NUMMER  USING VALUE(P_AUFNR) LIKE ACCIT-AUFNR
                             CHANGING P_RESULT.

       P_RESULT = B_FALSE.

    *... Check if order number is in range1 .............................. *
        IF P_AUFNR BETWEEN RANGE1_FROM
                   AND     RANGE1_TO.
          P_RESULT = B_TRUE.
          EXIT.
        ENDIF.

    *... Check if order number is in range2 .............................. *
        IF P_AUFNR BETWEEN RANGE2_FROM
                   AND     RANGE2_TO.
          P_RESULT = B_TRUE.
          EXIT.
        ENDIF.

    *... Check if order number is in range3 .............................. *
        IF P_AUFNR BETWEEN RANGE3_FROM
                   AND     RANGE3_TO.
          P_RESULT = B_TRUE.
          EXIT.
        ENDIF.


    ENDFORM.              "CHECK_AUFTRAGS_NUMMER

    *---------------------------------------------------------------------*
    *        Form U901                                                    *
    *---------------------------------------------------------------------*
    *  This form is used in the US IDES example to populate the  correct  *
    *  functional area  on a document when WBS elements are posted to.    *
    *  First, we make sure thta the project is not a statistical project. *
    *  If it passes that check, then we read the project type and assign  *
    *  a functional area.                                                 *
    *                                                                     *
    *---------------------------------------------------------------------*

    FORM U901.

    SELECT * FROM PRPS
               WHERE PSPNR EQ ACCIT-PS_PSP_PNR.
      IF PRPS-XSTAT EQ ' '.
       IF PRPS-PRART EQ '01'.
        MOVE '0600' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ '02'.
       MOVE '0500' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ '03'.
       MOVE '0400' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ '04'.
       MOVE '0100' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ '05'.
       MOVE '0600' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ '06'.
       MOVE '0100' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ '08'.
       MOVE '0300' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ 'CP'.
       MOVE '0100' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ 'CQ'.
       MOVE '0100' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ 'IP'.
       MOVE '0600' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ 'PM'.
       MOVE '0100' TO ACCIT-FKBER.

      ELSEIF PRPS-PRART EQ 'SP'.
       MOVE '0100' TO ACCIT-FKBER.

    ENDIF.
    ENDIF.
    ENDSELECT.
    ENDFORM.

    *---------------------------------------------------------------------*
    *       FORM U990                                                     *
    *---------------------------------------------------------------------*
    *       Check whether ACCIT-FKBER is space.                           *
    *       If result is true: ACCIT-FKBER = '0990'                       *
    *       additionaly a warning appears.                                *
    *---------------------------------------------------------------------*
    FORM U990.
    check ACCIT-FKBER = '0990'.
    message id 'Z_BPACC' TYPE 'I' Number '005'.
    ENDFORM.

    *  * ------------------------------------------------------.
    *  *       form u150
    *  *
    *  *       reads the personnel number from table zzper
    *  *-------------------------------------------------------.
    *  form u150 using pernum.
    *  clear pernum.
    *    select * from zzper
    *              where subuser  eq syst-uname.
    *              move zzper-subper to pernum.
    *
    *            endselect.
    *
    *  endform.

     FORM U995 USING BSEG-MATNR.

       SELECT * FROM ZZPRCTR
                WHERE ZZKONTO EQ BSEG-HKONT.
        MOVE ZZPRCTR-ZZSUBPRCTR TO BSEG-PRCTR.

       ENDSELECT.

      ENDFORM.


    *---------------------------------------------------------------------*
    *      FORM UGAI                                                      *
    *---------------------------------------------------------------------*
    *       Inserts the sum of the posting into the reference field.      *
    *       This exit can be used in FI for the complete document.        *
    *       The complete data is passed in one parameter.                 *
    *---------------------------------------------------------------------*
    *---------------------------------------------------------------------*
    *       FORM UGAI                                                     *
    *---------------------------------------------------------------------*
    *         *
    *---------------------------------------------------------------------*
    FORM UGAI.


    clear: fila_valsup-value.


    fila_valsup-value = fila_valsup-field20+4(12).

    ENDFORM.
    *
    *}   INSERT
    Продолжение следует  :P
    « Последнее редактирование: Январь 28, 2009, 04:54:21 pm от Uukrul »

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #2 : Январь 29, 2009, 04:42:48 pm »
    3. Теперь собственно говоря займемся самим замещением. В общем виде замещение FI не обязательно должно приводить к написанию программы замещения... очень часто само замещение может выступать как проверка на допустимость операции, например можно просто без всякого программирования написать замещение вида, что если будет использоваться счет затрат ХХХ, то контировка должна быть обязательно только на МВЗ с кодом ZZZ, при этом если это условие не соблюдается, то выдать сообщение пользователю и запретить проводку документа. Это все можно сделать используя редактор замещений без кодирования на ABAP,

    Для работы редактора замещения нужно перейти в настройку SPRO: Финансы - Бухгалтерия дебиторов и кредиторов - Бизнес-операции - Проводка по альтернативному контрольному счету - Прочие операции особой главной книги - Выполнение и проверка настройки для документа - Замещение в бухгалтерских документах,  ну или прямой вызов транзакции OBBH (так как для версий младше 6.0 путь может быть другой). После вызова настройки вы попадете в таблицу как на картинке OBBH-1.png, в зависимости от количества БЕ или данные в таблицы будут разные. Основное правило - замещения работают и настраиваются для балансовой единицы. В принципе если две БЕ работают по одинаковым правилам, то для них можно и нужно использовать один код замещения. Если для вашей БЕ в списке уже присвоен какой-то код замещения, тогда вы должны использовать уже созданный код, так как возможно, что группа FI уже использует замещения в своих целях, вы в принципе должны будете добавить свой шаг в уже созданный код замещения. Если замещения для БЕ не использовались, то нажмите кнопку "Новые записи" затем введите код БЕ и выберите момент замещения, так как мы вроде как замещаем поле BSEG-SGTXT, то это строка документа FI, значит нас интересует замещение на уровне позиции документа. Вообще если исходить из рисунка OBBH-2.png то часто будут интересовать моменты 0001 - заголовок документа, 0002 - позиция документа и 0003 - весь документ полностью, при этом если нужно использовать моменты 1 и 2 то вы должны будете добавить 2 записи в таблицу. В общем выбираем момент 0002 для позиции документа и затем нажимаем ввод. Внизу система сообщит что выбрана одна запись. Теперь нужно создать код замещения, в поле замещение. В данном поле работает вызов допустимых значений ввода по F4 и система вам предложит выбрать значение из уже введенных кодов замещений, которые присвоены другим БЕ. В нашем случае для БЕ 2000, создаем свой код. Для этого вводим любой текст, например MYEXT после чего делаем мышью двойной клим на введеном имени, в проитвном случае если вы нажмете ввод, то система выдаст ошибку типа замещение не существует. При клике мышью, вам будет предложено создать новое замещение, пример на рисунке OBBH-3.png. Подтверждаем желание создать новое замещение и попадаем в редактор замещений.

    Фух... еще кусок написано  ;)

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #3 : Январь 29, 2009, 05:00:05 pm »
    4. Редактор замещений выглядит достаточно серьезно, пацаны поработали, им спасибо, но особо сложного при работе с ним нет, как видно на рисунке OBBH-4.png новый код замещения MYEXT, для момента позиция документа добавлен в дерево замещений, в котором уже присутствуют другие коды для момента 0002. Один из кодов REG_SUB я раскрыл, видно что в нем уже существует 5 этапов. Фактически этам это отдельный шаг проверки для строки документа. На каждом шаге вы можете менять любой из допустимых полей позиции документа. При этом учтите, что если на каком-то шаге с большим порядковым номером относительно вашего этапа, будет изменение того же поля что и меняете вы, то само собой система сохранит последнее изменение, при этом вам как пользователю, ничего не будет сообщено о том, что поле было переопределено несколько раз на разных этапах. Так что если вы сделали свой этап, а там этих этапов целый вагон, желательно пройтись по всем и посмотреть, а не использует ли уже кто-то, тоже самое поле для каких-то своих целей, что и вы, а то мало ли, начальник до вас что-то написал, вы поломаете или чуть заденете, а оно надо потом выгребать  ;D? В данном случае замещение новое, так что этап будет только наш. Для примера желательно бы конечно назвать наше замещение слева от дерева замещений, например "Замещение MM-IV". Теперь надо добавить свой шаг в замещение. Вопрос почему в дереве оно называется "Этап", а кнопка на панели инструментов называется "Шаг", наверное к переводчикам, но чтобы создать этап замещения, надо нажать кнопку "Шаг". Система выведет экран, рисунок OBBH-5.png, со списком полей которые можно замещать. В принципе можно выбрать первое пустое значение, т.е. типа хотим создать только экзит без привязки к полям, что замещать решим по ходу дальше, но в данном случае, мы знаем что хотим замещать текст позиции документа, поэтому, выберем ниже по списку, позицию BSEG-SGTXT и нажмем ОК. Система спросит какой тип операции замещения для поля мы хотим использовать. Пример на рисунке OBBH-6.png. Как видим вариантов 3:
    • Константа, т.е. всегда полю будет присваиваться какое-то определенное значение. Не думайте, что это бесполезный вариант, на самом деле как раз, очень часто используется присвоение именно констант, это делается путем создания разных этапов, для каждого этапа определяется свое условие срабатывания, например от вида документа и соответственно, можно создать как бы набор постоянных присвоений в зависимости от какого-то конечного набора правил. Для поля текст позиции, оно не надо, но вот к примеру какие-то объекты контировки типа МВЗ/СПП-элементы/Финансовые позиции, очень часто именно так и замещают, в автоматическом режиме.
    • Программа пользователя. Кстати, вот те два самые первые шага, как раз и были подготовкой для работы замещения через программу пользователя.
    • Присвоение поле-поле, позволяет копирвоать значение из любого поля документа в замещаемое поле, например можно сделать при определенных условиях копирование поля текст заголовка в поле текста позиции. В данном случае выбираем "программа пользователя" и система вставляет значение в наше замещение первый этап, рисунок OBBH-7.png
    Для начала неплохо бы дать имя этапу, опять же это не обязательно, но очень кошерно, да и потом мало ли склероз нападет, а так все ходы записаны и от комментированы. Называем это дело "Проводка документа инвентаризации" и переходим к шагу сформирования предпосылки и написания самого замещения.

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #4 : Январь 29, 2009, 05:11:50 pm »
    5. Предпосылка, фактически это фильтр, по которому будет вызываться ваша программа замещения. Можно вообще работать без всяких предпосылок, но тогда учтите, что любая проводка документа FI, будет попадать в ваше замещение и вам, во-первых, потребуется рисовать сложную логику фильтрации, чтобы отбирать только интересующие позиции, а во-вторых, а оно вам надо... не знаю как где, но 50 000 документов FI в месяц это даже не очень много :-) а есть системы, где их за сотни тысяч проводится, а вы уверены что сделали все правильно? В общем лучше сделать правильную предпосылку, а уже на уровне программы дописать то, что не получится сделать с помощью редактора предпосылок.
    Переходим на ветку дерева "Предпосылка". Справа будет открыто окно создания предпосылки + визуальный редактор которым можно сделать почти все, а если не все, то всегда можно переключиться на режим эксперта, по меню: "Параметры настройки" - "Экспертный режим" и ввести условия на языке, где-то похожем на ABAP, но учтите что это не совсем ABAP, так что синтаксис все таки надо поучить в документации, но это уже не тема данного описания. В общем, внешний вид как на рисунке OBBH-8.png, где суть работы заключается в том, что выбирается структура и поле структуры затем операция с этим полем. Операция, обычно это сравнение выбранного поля с чем-то и т.д. Для работы предложены три структуры, это заголовок документа, позиции документа и системная структура словаря SYST (абаперам наверное объяснять не надо, остальные могут зайти в SE11 и посмотреть на поля и описание, а вообще найдите абапера и он за пивом все объяснит это более доступно). Теперь вернемся к фильтру, что надо фильтровать и как, ну предлагаю начать с исследования документа инвентаризации (вроде как замещение договорились делать для таких типов документов). Порядок формирования документов в системе в принципе следующий: Документ инвентаризации - Документа материала ММ - Финансовый документ FI, значит начинать надо с документа инвентаризации. Для примера нашел документ как на рисунке MI06.png. Как видим после подсчета был проведен уже документ материала 4900031463, перейдем к просмотру документа материала, рисунок MB03.png. От документа материала можно перейти к документам FI, пример на рисунке FB03.png. Из данного документа можно сказать, что фильтр будет следующим:
    • Вид документа нас будет интересовать WI - Документ инвенатризации. Однако этого мало, так как в принципе, если человек в FI ошибется, то может случайно провести в ручном режиме такой документ.
    • Ссылочная операция MKPF - Ее мы тоже включив в фильтр, так как это значит, что документ проведен как ссылочный к операции из ММ.
    • Код транзакции MI07? Не знаю, если у вас используется только стандарт и ведомости не проводятся программно (тогда код транзакции может быть другой), то можно включить и код транзакции. В данном случае я код транзакции включу в фильтр.
    Вот по этим трем параметрам заголовка документа и построим сейчас фильтр. Вообще-то конечно для получения полной картины, желательно проанализировать не один документ инвентаризации, а десяток другой, да и еще просмотреть другие документы, которые порождаются в системе, чтобы быть точно уверенным что ваш фильтр будет отбирать только то, что вам нужно, а не сотни других документов, которые оказывается тоже попадают под заданные параметры фильтра. ::)

    И так возвращаемся в конструктор предпосылок. Все поля, которые мы отобрали для фильтра находятся в заголовке документа. Значит нам нужна из трех структур именно таблица заголовка. Как видим "Структура BKPF" - Заголовок документа для бухгалтерии, то что нам и нужно, рисунок OBBH-9.png. Делаем двойной клик мышью на имени структуры BKPF и вы попадете в просмотр полей заголовка документа FI. Наши поля выделены на рисунке OBBH-10.png и ниже по списку, еще есть поле кода транзакции. Теперь двойной клик мышью на поле BKPF-BLART - Вид документа, и поле будет скопировано в верхний экран, рисунок OBBH-11.png. Затем кликаете мышью на знаке равно справа от списка полей и в окне ввода условия появится фраза: "Вид документа =", рисунок OBBH-12.png, после чего у вас к выбору из кнопок справа доступными будут кнопки "Константа" и "Комментарий". Комментировать нам вроде как нечего, а вот константу мы вроде как знаем, это код вида документа "WI", поэтому выбираем кнопку "Константа" и в появившемся окне или выбираем или вводим код WI, после чего жмем ОК, и в результате должны получить нечто похожее на рисунке OBBH-13.png. Аналогично добавим ограничения на два других поля. Между полями операция в качество условия соединения операция AND, т.е. когда совпадут все три условия, фильтр вернет что предпосылка сработала и вызовет нашу программу замещения. Общий результат должен быть как на рисунке OBBH-14.png. Обратите внимание, что если вы все правильно сделали, то статус должен быть в виде зеленого светофора.

    Примечание: Кстати, кнопка информации рядом со статусом, выдает краткую справку по вводу форумул для написания предпосылок.

    Вах  ::)

    Примечание: Код транзакции при проводке разниц со ссылкой на документы инвентаризации MI07 (на рисунках стоит MI10, это инвентаризация без ссылки)
    « Последнее редактирование: Январь 30, 2009, 04:10:34 pm от Uukrul »

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #5 : Январь 29, 2009, 05:21:32 pm »
    6. "Замещения" - это таки то что будет вызвано в результате срабатывания фильтра, точнее если предпосылка будет выполнена, то система перейдет к ветке замещения и или выполнит нашу программу или выдаст сообщение и т.д. Так как мы выбрали, что замещением будет программа пользователя, то экран будет представлен как на рисунке OBBH-15.png. Вся задача на этом экране, будет только в том, чтобы задать имя нашей подпрограммы замещения. Так как подпрограмма нами уже создана, то нажав в поле "ПользПрограмма" кнопку допустимых значений F4, в появившемся окне находим свой код U777 или вводим его руками. После чего сохраняем все это художество. Само собой спросят запрос для переноса. Затем возвращаемся из экрана конструктора в таблицу БЕ, рисунок OBBH-16.png (или по F3 несколько раз или Shift+F3), и активируем замещение путем задания статуса = 1, в поле "СтепАктивир". В принципе, там может быть еще значение 2 - активировано без пакетного ввода, т.е. при выполнении пакетных вводов наша предпосылка никогда не будет выполняться.
    Теперь уже окончательно все сохраняем и на этом все. Замещение работает и вызывается. Для этого можно провести документ инвентаризации и какой-то простой отпуск или перемещение материала. Мы попадем в точку останова, только при проводке инвентаризационных разниц (можете это проверить у себя в системах).
    А на следующем шаге уже займемся собственно абаперством, будем писать код, который и должен собственно говоря сформировать строку замещения для поля BSEG-SGTXT.

    О, конец уже виден  :P

    Примечание: Так как на шаге 4, мы выбрали конкретное поле, рисунок OBBH-5.PNG, то нам нужно модифицировать подпрограмму U777, путем добавления параметра p_SGTXT, т.е. теперь подпрограмма должна выглядеть как:
    Код: You are not allowed to view links. Register or Login
    *{   INSERT         &$&$&$&$                                          1
    *---------------------------------------------------------------------*
    *       FORM U777                                                     *
    *---------------------------------------------------------------------*
    *       Моя прогрмма замещения                                        *
    *---------------------------------------------------------------------*
    FORM U777 USING p_sgtxt.

    ENDFORM.
    *
    *}   INSERT
    Если этого не сделать то в момент проводки инвентаризационных разниц, будет получен дамп, типа не соответствия количества вызываемых параметров. Ну и собственно надо же нам сказать, что мы замещаем и каким значением. Типизация параметра не важна, так как похоже оно через FIELD-SYMBOLS общается, поэтому присвоение значения в p_sgtxt, на выходе понимается системой. Кстати, если бы мы не указали значение BSEG-SGTXT, тогда параметр указывать было бы не нужно, ну а значение присваивать напрямую в структуру BSEG-SGTXT, которая доступна как глобальная для подпрограммы U777.

    Список всех доступных структур для подпрограммы u777 во время работы можно посмотреть в заголовке текста программы ZGGBS000, например у меня это следующие структуры:
    Код: You are not allowed to view links. Register or Login
    TABLES: CSKS,
            GLU1,
            BKPF,
            BSEG,
            ACCIT,
            ACCHD,
    *{   INSERT         IDTK911943                                        1
            fila_valsup,
            zzprctr,
            COBL,
            PRPS.                                          "for form U901
    *       zzper.
    TYPE-POOLS: GB002.
    « Последнее редактирование: Январь 30, 2009, 04:22:05 pm от Uukrul »

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #6 : Январь 30, 2009, 04:57:15 pm »
    7. И так переходим к самому написанию подпрограммы U777. В текущий момент программа выглядит как:
    Код: You are not allowed to view links. Register or Login
    FORM U777 using p_SGTXT.
        break-point.
    ENDFORM.
    Наша задача теперь присвоить строке комментария позиции документа FI номер документа инвентаризации. Делается это через доступы к переменным документа инвентаризации используя технику работы с FIELD-SYMBOLS. В принципе Dmitry, грозится сделать небольшую справку по работе с данным функционалом, я ограничусь просто небольшими комментариями по тексту программы именно для данного момента.
    Список доступных структур в подпрограмме U777 приведен выше и как видно в этом списке отсутствует вообще какое-либо упоминание о документах инвентаризации, жаль конечно но можно попробовать достать эти данные. Я предлагаю делать это так:
    Код: You are not allowed to view links. Register or Login
    FORM u777 USING p_sgtxt.
      DATA: ls_ikpf LIKE ikpf.
      FIELD-SYMBOLS: <fs_ikpf> TYPE ANY.

      BREAK-POINT. 

      ASSIGN ('(SAPMM07I)IKPF') TO <fs_ikpf>.
      CHECK sy-subrc = 0.
      ls_ikpf = <fs_ikpf>.
      p_sgtxt = ls_ikpf-iblnr.

      UNASSIGN <fs_ikpf>.
    ENDFORM.                                                    "U777
    Т.е. что получается, так как все работает по цепочке: Документ инвентаризации – Документ материала – Документа FI, то значит, пока транзакция не будет завершена, все данные программ отвечающих за документ материала, документ инвентаризации, с большой вероятностью находятся в памяти, а это значит, что к ним можно попробовать получить доступ. Возможно, кто-то назовет это дыркой в изоляции данных, но я назову это большим благом для разработчика.
    Имя главной программы инвентаризации можно получить просмотрел имя программы к транзакции MI07. Для этого заходим в транзакцию SE93 и там вводим код MI07 и кнопку «Просмотреть», рисунок SE93.png, как видим имя программы SAPMM07I. Теперь, надо узнать, какие структуры нам нужны, т.е. найти глобальные переменные этой программы, в которых находится номер документа инвентаризации. Я нашел имя структуры через отладчик, времени заняло это пару минут. Отладка транзакции MI07 с экрана 701. Но на само деле часто имена глобальных структур совпадают с именами таблиц где хранятся документы порождаемые транзакцией. Таблица заголовка документа инвентаризации это IKPF, так что другой метод это поискать имя этой таблицы по тексту программы. Иногда может оказаться, что таблица будет, например MSEG, а структура будет называться XMSEG. Дальше делаем проводку документа инвентаризационных разниц и попадаем в отладку. Переходим в отладчике к полую ввода просмотра значений переменных и там вводим в скобках имя программы и далее имя структуры, пример на рисунке ABAP.png. Кстати, если мы не правильно нашли структуру, то будет выведена ошибка, если же структура доступна, то система покажет значения находящие в этой структуре. В данном случае это то что нам надо, а дальше используя технику работы с ссылками получаем ссылку на эту структуру. Проверяем удалось ли это сделать, если удалось присваиваем ссылку внутренней переменной того же типа что и структура и дальше просто присваиваем в p_sgtxt номер документа инвентаризации. Задача решена, в позиции текста документа FI, будет находится - номер документа инвентаризации. Пример на рисунке 4900000000.png
    Правда при таком коде, все позиции будут содержать номер документа инвентаризации. Возможно, мы захотим, чтобы только позиция документа с уровня счета доход от инвентаризации. Ну тут все просто надо проверить, нет не счет главной книги, а вид операции к позиции. Для счета запаса это будет BSX, а для счета дохода GBB, т.е. можно было бы вставить первой строкой процедуры, что то типа, CHECK BSEG- KTOSL = ‘GBB’ и в таком случае номер документа инвентаризации был бы только во второй строке проводки.

    Типа все  ::) вопросы и комментарий приветсвуются

    Оффлайн Dmitriy

    • SAP ECC 6.0
    • Moderator
    • Newbie
    • *****
    • Сообщений: 380
    • Репутация: +0/-0
    • Пол: Мужской
    • Embracive Fire
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    Re: Работа с замещениями FI
    « Ответ #7 : Январь 30, 2009, 05:55:15 pm »
    Красавчег, ну что тут еще скажешь, ликбез, однако. Все не осилил, но пока бегло пробежал. Так, на вскидку, активней рекомендую использовать предпосылки замещений, а то иногда достаточно комические случаи с ними (замещениями) бывали. ;)

    Оффлайн Паганель

    • Я НЕ ЗАНИМАЮСЬ SAP
    • Administrator
    • Full Member
    • *****
    • Сообщений: 1 367
    • Репутация: +20/-0
    • Пол: Мужской
    • https://noteifyapp.com
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • MacPlus Software
    Re: Работа с замещениями FI
    « Ответ #8 : Январь 30, 2009, 08:08:21 pm »
    респект господину Уукрулу, спасибо большое .... таких материалов, нигде не встречал, ни в рускоязычном ни в англоязычном нете, так сказать концетранция многолетнего опыта ....

    спасибо большое .....

    P.S. тоже не осилил, но решил обязательно пропрбывать, и сделать что бы понять ...
    You are not allowed to view links. Register or Login
    You are not allowed to view links. Register or Login
    You are not allowed to view links. Register or Login
    You are not allowed to view links. Register or Login

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #9 : Февраль 04, 2009, 10:43:55 am »
    Кстати, тут справка по "Проверки, замещения и правила", расписаны операции сравнения и т.д. что большой плюс, на русском... хотя некоторые переводы при чтении заставили задуматься, что они имеют в виду:

    You are not allowed to view links. Register or Login

    Guricio

    • Гость
    Re: Работа с замещениями FI
    « Ответ #10 : Май 05, 2010, 04:46:12 pm »
    Большое Спасибо. Все получилось.  :)

    fdu4

    • Гость
    Re: Работа с замещениями FI
    « Ответ #11 : Июль 20, 2010, 02:35:22 pm »
    You are not allowed to view links. Register or Login
    Большое Спасибо. Все получилось.  :)

    Госпада, с 2003 года есть ракурс ведения для таблицы GB01, можно не шаманить, а стандартными средствами снимать галки и активировать поля :)  VWTYGB01 - пользуйтесь!

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #12 : Июль 20, 2010, 02:53:28 pm »
    You are not allowed to view links. Register or Login
    Госпада, с 2003 года есть ракурс ведения для таблицы GB01, можно не шаманить, а стандартными средствами снимать галки и активировать поля :)  VWTYGB01 - пользуйтесь!
    Ну тоже вариант, спасибо, сейчас подправим описание...

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #13 : Сентябрь 15, 2010, 07:29:14 pm »
    Оформил все одним файлом, условия распространения те же :-) оперативность переноса замечаний из форума в файл будет не частой.

    Оффлайн SKD1980

    • Newbie
    • *
    • Сообщений: 24
    • Репутация: +6/-0
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    Re: Работа с замещениями FI
    « Ответ #14 : Август 14, 2012, 07:34:54 am »
    Большое спасибо! Очень-очень помог Ваш материал.

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 780
    • Репутация: +47/-0
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    Re: Работа с замещениями FI
    « Ответ #15 : Август 14, 2012, 10:27:43 am »
    You are not allowed to view links. Register or Login
    Большое спасибо! Очень-очень помог Ваш материал.
    Ага не давече как вчера сам им воспользовался 8)