项目中碰到用
CONVERT_TO_LOCAL_CURRENCY 转换日元到其它货币时数额大100倍的问题,经过研究发现日元在透明表中存储时,会把原币向左移2位既缩小一百倍存储。见图:
以下是在FB01中新建一张凭证,最后在bseg表找到该凭证号
可能是因为日元没有小数位,SAP在数据存储时必须要有小数位,再次查资料,发现SAP有所谓的external及internal的数据格式,不是存透明表取出的数都是external的,所以要解决此问题应在调用CONVERT_TO_LOCAL_CURRENCY 函数前,先调用一个
BAPI_CURRENCY_CONV_TO_INTERNAL 函数,就行了。
下面是一个Zfunction
FUNCTION ZP1_CONVERT_TO_LOCAL_CURRENCY.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(CLIENT) TYPE SY-MANDT DEFAULT SY-MANDT
*" REFERENCE(DATE) TYPE SYST-DATUM
*" REFERENCE(FOREIGN_AMOUNT)
*" REFERENCE(FOREIGN_CURRENCY)
*" REFERENCE(LOCAL_CURRENCY)
*" REFERENCE(RATE) DEFAULT 0
*" REFERENCE(TYPE_OF_RATE) DEFAULT 'M'
*" REFERENCE(READ_TCURR) DEFAULT 'X'
*" EXPORTING
*" REFERENCE(EXCHANGE_RATE)
*" REFERENCE(FOREIGN_FACTOR)
*" REFERENCE(LOCAL_AMOUNT)
*" REFERENCE(LOCAL_FACTOR)
*" REFERENCE(EXCHANGE_RATEX)
*" REFERENCE(FIXED_RATE)
*" REFERENCE(DERIVED_RATE_TYPE) TYPE TCURR-KURST
*" EXCEPTIONS
*" NO_RATE_FOUND
*" OVERFLOW
*" NO_FACTORS_FOUND
*" NO_SPREAD_FOUND
*" DERIVED_2_TIMES
*"----------------------------------------------------------------------
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(CLIENT) TYPE SY-MANDT DEFAULT SY-MANDT
*" REFERENCE(DATE) TYPE SYST-DATUM
*" REFERENCE(FOREIGN_AMOUNT)
*" REFERENCE(FOREIGN_CURRENCY)
*" REFERENCE(LOCAL_CURRENCY)
*" REFERENCE(RATE) DEFAULT 0
*" REFERENCE(TYPE_OF_RATE) DEFAULT 'M'
*" REFERENCE(READ_TCURR) DEFAULT 'X'
*" EXPORTING
*" REFERENCE(EXCHANGE_RATE)
*" REFERENCE(FOREIGN_FACTOR)
*" REFERENCE(LOCAL_AMOUNT)
*" REFERENCE(LOCAL_FACTOR)
*" REFERENCE(EXCHANGE_RATEX)
*" REFERENCE(FIXED_RATE)
*" REFERENCE(DERIVED_RATE_TYPE) TYPE TCURR-KURST
*" EXCEPTIONS
*" NO_RATE_FOUND
*" OVERFLOW
*" NO_FACTORS_FOUND
*" NO_SPREAD_FOUND
*" DERIVED_2_TIMES
*"----------------------------------------------------------------------
DATA: l_foreign_amount_internal type bseg-wrbtr.
DATA: l_foreign_amount_external type bapicurr-bapicurr.
l_foreign_amount_external = foreign_amount.
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL'
EXPORTING
currency = foreign_currency
amount_external = l_foreign_amount_external
max_number_of_digits = 13
IMPORTING
AMOUNT_INTERNAL = l_foreign_amount_internal
* RETURN =
.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
CLIENT = client
date = date
foreign_amount = l_foreign_amount_internal
foreign_currency = foreign_currency
local_currency = local_currency
RATE = RATE
TYPE_OF_RATE = TYPE_OF_RATE
READ_TCURR = read_tcurr
IMPORTING
EXCHANGE_RATE = EXCHANGE_RATE
FOREIGN_FACTOR = FOREIGN_FACTOR
LOCAL_AMOUNT = LOCAL_AMOUNT
LOCAL_FACTOR = LOCAL_FACTOR
EXCHANGE_RATEX = EXCHANGE_RATEX
FIXED_RATE = FIXED_RATE
DERIVED_RATE_TYPE = DERIVED_RATE_TYPE
EXCEPTIONS
NO_RATE_FOUND = 1
OVERFLOW = 2
NO_FACTORS_FOUND = 3
NO_SPREAD_FOUND = 4
DERIVED_2_TIMES = 5
OTHERS = 6
.
CASE SY-SUBRC.
WHEN 1.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING NO_FACTORS_FOUND.
WHEN 2.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING DERIVED_2_TIMES.
WHEN 3.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING NO_SPREAD_FOUND.
WHEN 4.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING OVERFLOW.
ENDCASE.
ENDFUNCTION.