Archivo

Posts Tagged ‘Moneda’

Error RW022 en BAPI_ACC_DOCUMENT_POST o BAPI_ACC_DOCUMENT_CHECK

Caso: Al ejecutar la BAPI BAPI_ACC_DOCUMENT_CHECK o la BAPI_ACC_DOCUMENT_POST se genera el error RW022 “Interfase RW: Saldo en moneda de transacción” y el monto de diferencia es de un monto mínimo (ejemplo, 1 o 2 pesos chilenos –CLP-). También aparece como cabecera el error RW609: Error en el documento: BKPFF ….


Solución:
Luego de dar varias vueltas al tema y dado que estaba trabajando con una moneda distinta a la moneda de la sociedad, el problema era al traspasar los valores al campo AMT_DOCCUR. Utilicé entonces la BAPI_CURRENCY_CONV_TO_EXTERNAL y funcionó OK.

CALL FUNCTION ‘BAPI_CURRENCY_CONV_TO_EXTERNAL’
EXPORTING
currency = wa_currencyamount-currency
amount_internal = wa_datos-monto_prov
IMPORTING
amount_external = wa_currencyamount-amt_doccur.

Va el código:

DATA: wa_documentheader TYPE bapiache09,
      it_accountgl      TYPE STANDARD TABLE OF bapiacgl09,
      wa_accountgl      TYPE bapiacgl09,
      it_currencyamount TYPE STANDARD TABLE OF bapiaccr09,
      wa_currencyamount TYPE bapiaccr09,
      it_return         TYPE STANDARD TABLE OF bapiret2,
      wa_return         TYPE bapiret2,
      lw_error          TYPE ty_error,
      lv_posnr_acc      TYPE posnr_acc,
      wa_datos          TYPE ty_datos,
      lv_gl_account     TYPE hkont,
      lv_importe        TYPE bapidoccur.
 
* Clear de tablas internas
REFRESH: it_accountgl,
         it_currencyamount,
         it_return.
 
* Cabecera del documento
CLEAR: wa_documentheader.
MOVE sy-uname                TO wa_documentheader-username.   " Usuario
MOVE p_bukrs                 TO wa_documentheader-comp_code.  " Sociedad
MOVE pa_stida                TO wa_documentheader-doc_date.   " Fecha del documento
MOVE p_fecha_doc             TO wa_documentheader-pstng_date. " Fecha de contabilización
MOVE 'AB'                    TO wa_documentheader-doc_type.   " Tipo de documento
MOVE p_texto_periodo         TO wa_documentheader-header_txt. " Texto cabecera documento
MOVE 'RFBU'                  TO wa_documentheader-bus_act.    " Operación empresarial
 
lv_posnr_acc = '0000000000'.                                  " Inicializo la Posición
* GL Account 001
CLEAR: lv_importe.
LOOP AT pt_datos INTO wa_datos.
 
  CLEAR : wa_accountgl, wa_currencyamount.
  ADD 1 TO lv_posnr_acc.
  MOVE lv_posnr_acc              TO wa_accountgl-itemno_acc.  " Line Item No
 
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = pa_gast          " Cuenta de gasto
    IMPORTING
      output = lv_gl_account.
 
  MOVE lv_gl_account             TO wa_accountgl-gl_account.  " Cuenta contable - G/L Account
  MOVE p_texto_periodo           TO wa_accountgl-item_text.   " Texto del ítem
  MOVE p_bukrs                   TO wa_accountgl-comp_code.   " Sociedad
  MOVE wa_datos-gsber            TO wa_accountgl-bus_area.    " División
  MOVE wa_datos-kostl            TO wa_accountgl-costcenter.  " Centro de costo = CeBe
  wa_accountgl-acct_type = 'S'.
  APPEND wa_accountgl TO it_accountgl.
 
* Fill Currency Line item
  MOVE lv_posnr_acc              TO wa_currencyamount-itemno_acc.  " Line Item No
* curr_type ==>  00  Moneda del documento /// curr_type ==>  10  Moneda de sociedad
  MOVE '00'                      TO wa_currencyamount-curr_type.  " Currency Type
  MOVE p_moneda                  TO wa_currencyamount-currency .  " Moneda
 
*      wa_currencyamount-amt_doccur = wa_datos-monto_prov.           " Aquí estaba el error, para CLP no funcionaba
  CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
    EXPORTING
      currency        = wa_currencyamount-currency
      amount_internal = wa_datos-monto_prov
    IMPORTING
      amount_external = wa_currencyamount-amt_doccur.
 
  ADD wa_currencyamount-amt_doccur TO lv_importe.                " MOD Q_EPURICELLI - 21.04.2016 -
  APPEND wa_currencyamount TO it_currencyamount.
ENDLOOP.
 
* GL Account 002
CLEAR : wa_accountgl, wa_currencyamount.
 
ADD 1 TO lv_posnr_acc.
MOVE lv_posnr_acc              TO wa_accountgl-itemno_acc.  " Line Item No
 
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = pa_prov          " Cuenta de provisión
  IMPORTING
    output = lv_gl_account.
 
MOVE lv_gl_account             TO wa_accountgl-gl_account.  " Cuenta contable - G/L Account
MOVE p_bukrs                   TO wa_accountgl-comp_code.   " Sociedad
MOVE 'Prov.incobrables'        TO wa_accountgl-item_text.   " Texto del ítem
wa_accountgl-acct_type = 'S'.
APPEND wa_accountgl TO it_accountgl.
 
* Fill Currency Line item
MOVE lv_posnr_acc              TO wa_currencyamount-itemno_acc.  " Line Item No
* curr_type ==>  00  Moneda del documento // curr_type ==>  10  Moneda de sociedad
MOVE '00'                      TO wa_currencyamount-curr_type.   " Currency Type
MOVE p_moneda                  TO wa_currencyamount-currency .   " Moneda
lv_importe = lv_importe * -1.
MOVE  lv_importe               TO wa_currencyamount-amt_doccur. " Monto
APPEND wa_currencyamount TO it_currencyamount.
 
* Llamado a la BAPI MODO TEST
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
  EXPORTING
    documentheader = wa_documentheader
  TABLES
    accountgl      = it_accountgl
    currencyamount = it_currencyamount
    return         = it_return.
 
LOOP AT it_return INTO wa_return WHERE type = 'E'.
  p_error = 'X'.
  CONCATENATE 'E' wa_return-id wa_return-number INTO lw_error-error.
  lw_error-mensaje = wa_return-message.
  APPEND lw_error TO pt_error.
ENDLOOP.
Anuncio publicitario

Obtener Tipo de cambio con BAPI_EXCHANGERATE_GETDETAIL

Caso: se desea obtener el tipo de cambio entre dos monedas.

Solución: Utilizamos el siguiente código de ejemplo:

DATA: lv_fecha_ini TYPE sy-datum,
lv_kurst TYPE kurst_curr,
lv_fcurr_ori TYPE fcurr_curr,
lv_fcurr_des TYPE tcurr_curr,
lv_ukurs TYPE ukursp,
lc_ukurs TYPE char20,
lv_mensaje TYPE string.

START-OF-SELECTION.

* Busca el último tipo de cambio guardado en la transacción OB08, a partir de la fecha del día
lv_fecha_ini = sy-datum.
lv_kurst = ‘M’.
lv_fcurr_ori = ‘USD’.
lv_fcurr_des = ‘CLP’.

PERFORM obtener_tc USING lv_fecha_ini " Fecha a partir de…
lv_kurst " Tipo de Cotización
lv_fcurr_ori " Moneda origen
lv_fcurr_des " Moneda destino
CHANGING lv_ukurs. " T/C

IF lv_ukurs IS INITIAL.
MESSAGE w001(00) WITH ‘No existe tipo cambio para:’ lv_fecha_ini.
ELSE.
WRITE lv_ukurs TO lc_ukurs.
CONDENSE lc_ukurs.
CONCATENATE ‘T/C para:’
lv_fecha_ini+6(2)
‘.’
lv_fecha_ini+4(2)
‘.’
lv_fecha_ini(4)
‘ -> 1 ‘
lv_fcurr_ori
space
‘ = ‘
lc_ukurs
space
lv_fcurr_des
INTO lv_mensaje.
MESSAGE i001(00) WITH lv_mensaje ».
ENDIF.

FORM obtener_tc USING pi_fecha TYPE sy-datum
pi_kurst TYPE kurst_curr
pi_fcurr_ori TYPE fcurr_curr
pi_fcurr_des TYPE tcurr_curr
CHANGING po_ukurs TYPE ukursp.

DATA : l_exch_rate TYPE bapi1093_0,
l_fecha TYPE c LENGTH 10 VALUE space,
l_return TYPE bapiret1,
l_tcurr TYPE tcurr,
l_ukurs TYPE ukursp,
l_tc_encontrado TYPE c,
l_fecha_inicial TYPE sy-datum.

CLEAR l_tc_encontrado.
l_fecha_inicial = pi_fecha.

WHILE l_tc_encontrado IS INITIAL.

WRITE : pi_fecha TO l_fecha DD/MM/YYYY.

CALL FUNCTION ‘CONVERSION_EXIT_INVDT_INPUT’
EXPORTING
input = l_fecha
IMPORTING
output = l_fecha.

* Busco el registro en la tabla TCURR
SELECT SINGLE * INTO l_tcurr
FROM tcurr AS tcurr
WHERE tcurr~kurst EQ pi_kurst
AND tcurr~fcurr EQ ‘USD’
AND tcurr~tcurr EQ ‘CLP’
AND tcurr~gdatu EQ l_fecha.

IF ( sy-subrc EQ 0 ).
* Obtengo el tipo de cambio
CALL FUNCTION ‘BAPI_EXCHANGERATE_GETDETAIL’
EXPORTING
rate_type = ‘M’
from_curr = pi_fcurr_ori
to_currncy = pi_fcurr_des
date = l_fecha_inicial
IMPORTING
exch_rate = l_exch_rate
return = l_return.

* Si no lo encuentra, busco hacia atrás
IF ( l_return-type CA ‘S ‘ ).
po_ukurs = l_exch_rate-exch_rate.
l_tc_encontrado = ‘X’. " Encontré un tipo de cambio
ELSE.
l_fecha_inicial = l_fecha_inicial – 1.
ENDIF.
ELSE.
l_fecha_inicial = l_fecha_inicial – 1.
ENDIF.

ENDWHILE.

ENDFORM.

Mantener el valor de un monto/moneda

Caso: se busca modificar el campo moneda (WAERS) en las posiciones de un ALV que muestra precios, pero SIN MODIFICAR EL MONTO CARGADO en el ALV (dicho monto está referenciado a la moneda).

Es decir, suponiendo que el usuario posee montos en el ALV cargados y puede cambiar la moneda a todas las posiciones mediante un combobox, no se desea que se modifique el monto cargado por el usuario (ver la imagen).

Les paso la forma con lo que pude hacerlo, quizás haya una forma mejor..

Nota: en caso de pasar de USD a CLP, como USD trabaja con decimales y CLP no (generalmente), el sistema al querer convertir dará un mensaje de error B1532 (Traspasar el importe de la moneda con más de 0 decimales), se deberá modificar los montos primero a un formato sin decimales y luego hacer la conversión de la moneda.

LOOP AT it_tabla INTO wa_tabla.

CHECK g_waers NE wa_tabla-waers.
* Actualizo el monto al formato correcto
PERFORM cambiar_monto_moneda USING wa_tabla-waers
g_waers
CHANGING wa_tabla-precio_total.
* Actualizo el campo moneda
MOVE g_waers TO wa_tabla-waers.

MODIFY it_tabla FROM wa_tabla INDEX sy-tabix.
ENDLOOP.

*&———————————————————————*
*&      Form  cambiar_monto_moneda
*&———————————————————————*
*       Ajusta el monto ingresado por parámetro a la moneda nueva
*———————————————————————-*
FORM cambiar_monto_moneda USING p_moneda_vieja TYPE waers
p_moneda_nueva 
TYPE waers
CHANGING p_monto.

DATA: lv_value TYPE bapicurr-bapicurr.

lv_value =  p_monto.

CALL FUNCTION ‘BAPI_CURRENCY_CONV_TO_EXTERNAL’
EXPORTING
currency        = p_moneda_vieja
amount_internal = lv_value
IMPORTING
amount_external = lv_value.

CALL FUNCTION ‘CURRENCY_AMOUNT_BAPI_TO_SAP’
EXPORTING
currency    = p_moneda_nueva
bapi_amount = lv_value
IMPORTING
sap_amount  = lv_value.

p_monto = lv_value.

ENDFORM.                    «cambiar_monto_moneda