SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

"Исправление" курса валют в park счете ММ



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Submit a new program | Новые материалы, программы для сайта
View previous topic :: View next topic  
Author Message
John Doe
Модератор
Модератор


Age: 45
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Thu Oct 07, 2010 4:34 pm    Post subject: "Исправление" курса валют в park счете ММ Reply with quote

Преамбула:
Согласно ноте Note 396051 - FAQ: Parking in the logistics invoice verification имеем следующее правило:
Quote:
You can no longer change an existing exchange rate for parked invoice documents with invoice items.

As long as no invoice items exist in the invoice entry, the exchange rate in the invoice document header is determined in following sequence:

- If you fixed an exchange rate in the purchase order, this exchange rate is used for the determination of the local currency amounts.

- If you entered an exchange rate in the invoice document header, this exchange rate is used for the determination of the local currency amounts.

- If you neither fixed an exchange rate in the purchase order nor entered an exchange rate in the invoice document header, the system determines the exchange rate defined in Customizing of financial accounting valid for the posting date.

If a parked invoice document contains invoice items, the exchange rate can no longer be changed. If reference is made to a purchase order with fixed exchange rate during further processing of a parked invoice document, the fixed exchange rate is copied to the invoice document header.

То есть курс пересчитывается на дату пересчета, равную дате проводки плюс дни из условия платежа, но только до присвоения любой позиции фактуре. После этого поля валюта и курс закрываются для ввода. Изменить курс можно только после удаления всех позиций.
Короче, процедура удручает. Особенно при использовании EDI. Курс рассчитывается на дату получения IDOC, а право собственности - только после получения товара на таможне (какая-то фича законодательства).

Фабула:
Скопировать данные предварительно зарегистрированного счета в новый с указанием нужной даты проводки для корректного расчета курса и последующей проводки в FI.

Code:
*& Report  ZMMA_INVOICE_EDI_RECREATE
*&
*&---------------------------------------------------------------------*
*& EDI счет после предварительной регистрации не пересчитывает курс
*& при изменении даты проводки.
*& Решение: создавать новый счет на основе данных раннее зарегистр.,
*& но с новой датой проводки и определение курса на эту дату.
*& При успешной регистрации - предыдущий счет удаляется
*&
*& Программа использует стандартные метода БО BUS2081
*& GetDetail    BAPI_INCOMINGINVOICE_GETDETAIL
*& ParkFromData BAPI_INCOMINGINVOICE_PARK
*& DeleteSingle BAPI_INCOMINGINVOICE_DELETE
*&---------------------------------------------------------------------*

REPORT  zmma_invoice_edi_recreate.

INCLUDE <cntn01>.

DATA: invoice_edi TYPE swc_object,
      objkey TYPE swo_typeid,
      invoice_new TYPE swc_object,
      invoice_obj LIKE swotobjid.

DATA: old_headerdata      TYPE bapi_incinv_detail_header,
      old_addressdata     TYPE bapi_incinv_detail_addressdata,
      old_itemdata        TYPE TABLE OF bapi_incinv_detail_item
        WITH HEADER LINE,
      old_accountingdata  TYPE TABLE OF bapi_incinv_detail_account
        WITH HEADER LINE,
      old_glaccountdata   TYPE TABLE OF bapi_incinv_detail_gl_account
        WITH HEADER LINE,
      old_materialdata    TYPE TABLE OF bapi_incinv_detail_material
        WITH HEADER LINE,
      old_taxdata         TYPE TABLE OF bapi_incinv_detail_tax
        WITH HEADER LINE,
      old_withtaxdata     TYPE TABLE OF bapi_incinv_detail_withtax
        WITH HEADER LINE,
      old_vendoritemsplitdata   TYPE TABLE OF bapi_incinv_detail_vendorsplit
        WITH HEADER LINE,
      return          TYPE TABLE OF bapiret2.

DATA: new_headerdata      TYPE bapi_incinv_create_header,
      new_addressdata     TYPE bapi_incinv_create_addressdata,
      new_itemdata        TYPE TABLE OF bapi_incinv_create_item
        WITH HEADER LINE,
      new_accountingdata  TYPE TABLE OF bapi_incinv_create_account
        WITH HEADER LINE,
      new_glaccountdata   TYPE TABLE OF bapi_incinv_create_gl_account
        WITH HEADER LINE,
      new_materialdata    TYPE TABLE OF bapi_incinv_create_material
        WITH HEADER LINE,
      new_taxdata         TYPE TABLE OF bapi_incinv_create_tax
        WITH HEADER LINE,
      new_withtaxdata     TYPE TABLE OF bapi_incinv_create_withtax
        WITH HEADER LINE,
      new_vendoritemsplitdata   TYPE TABLE OF bapi_incinv_detail_vendorsplit
        WITH HEADER LINE.

PARAMETERS: p_belnr LIKE rbkp-belnr,
            p_gjahr LIKE rbkp-gjahr,
            p_budat LIKE rbkp-budat.

DEFINE transfer_data.
  loop at &1.
    move-corresponding &1 to &2.
    append &2.
  endloop.
END-OF-DEFINITION.

START-OF-SELECTION.
  IF p_budat IS INITIAL.
    MESSAGE 'Укажите дату для определения курса'(001) TYPE 'S'
      DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  " Создаем ключ, формируем инстанцию и проверяем на наличие объекта
  CONCATENATE p_belnr p_gjahr INTO objkey.
  swc_create_object invoice_edi 'BUS2081' objkey.
  swc_call_method invoice_edi 'ExistenceCheck' swo_%container.
  IF sy-subrc <> 0.
    MESSAGE 'Укажите корректный номер фактуры'(002) TYPE 'S'
      DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  " Считываем данные в контейнер
  swc_container old_container.
  swc_call_method invoice_edi 'GetDetail' old_container.

  " Получаем значение элементов контейнера
  swc_get_element old_container:
    'Headerdata' old_headerdata,
    'Addressdata' old_addressdata,
    'Itemdata' old_itemdata[],
    'Accountingdata' old_accountingdata[],
    'GLAccountdata' old_glaccountdata[],
    'Materialdata' old_materialdata[],
    'Taxdata' old_taxdata[],
    'Withtaxdata' old_withtaxdata[],
    'Vendoritemsplitdata' old_vendoritemsplitdata[],
    'Return' return.

  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = return.

  " Проверяем на последующие документы
  IF old_headerdata-invoice_status <> 'A'. " Предв.регистр.
    MESSAGE 'Документ недоступен для обработки'(003) TYPE 'S'
      DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  " Перекидываем данные в новый контейнер
  MOVE-CORRESPONDING:
    old_headerdata TO new_headerdata,
    old_addressdata TO new_addressdata.
  transfer_data:
    old_itemdata new_itemdata,
    old_accountingdata new_accountingdata,
    old_glaccountdata new_glaccountdata,
    old_materialdata new_materialdata,
    old_taxdata new_taxdata,
    old_withtaxdata new_withtaxdata,
    old_vendoritemsplitdata new_vendoritemsplitdata.

  CLEAR: new_headerdata-iv_category,
         new_headerdata-inv_doc_no,
         new_headerdata-exch_rate,
         new_headerdata-dsct_days1,
         new_headerdata-dsct_days2
         .
  new_headerdata-gross_amount = old_headerdata-gross_amnt.
  new_headerdata-pstng_date = p_budat.
  new_headerdata-calc_tax_ind = 'X'.

  swc_container new_container.
  swc_set_element new_container:
    'Headerdata' new_headerdata,
    'Addressdata' new_addressdata,
    'Itemdata' new_itemdata[],
    'Accountingdata' new_accountingdata[],
    'GLAccountdata' new_glaccountdata[],
    'Materialdata' new_materialdata[],
    'Withtaxdata' new_withtaxdata[],
    'Vendoritemsplitdata' new_vendoritemsplitdata[].

  " Регистрируем новый счет
  CLEAR objkey.
  swc_create_object invoice_new 'BUS2081' objkey.
  swc_call_method invoice_new 'ParkFromData' new_container.
  swc_object_to_persistent invoice_new invoice_obj.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

  swc_get_element new_container 'Return' return.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = return.

  swc_get_object_key invoice_new objkey.
  MESSAGE i251(m8) WITH objkey(10).

  " Удаляем родительский счет
  IF objkey IS NOT INITIAL.
    swc_call_method invoice_edi 'DeleteSingle' old_container.
    swc_object_to_persistent invoice_edi invoice_obj.
    swc_free_object invoice_edi.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
  ENDIF.


Данный код будет полезен также будущим воркфлошникам.
Back to top
View user's profile Send private message Blog
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Submit a new program | Новые материалы, программы для сайта All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.