Sei sulla pagina 1di 6

One Point Lesson SD-2013-

Utilização da função Pricing


By Issam Ibrahim

1. Introdução
Neste documento, iremos descrever a utilização da função Pricing dentro de uma fórmula
de valor de condição, recuperando os valores necessários para o cálculo do ICMS por
dentro.

A ideia consiste na criação de uma nova condição (ZCMI, por exemplo), que receberá o
valor do ICMS que fará parte da formação de preço de partida.

2. Utilização da Função Pricing


O primeiro passo é a criação de uma de uma condição, neste caso chamada de ZCMI:

1. Criação da condição ZCMI: esta condição deverá ser do tipo A (Sumpl. Ou deduções e
não poderá ser processada manualmente):

O próximo passo é a criação de um esquema de cálculo auxiliar. Existe a necessidade da


criação do mesmo, para evitar que a fórmula entre em loop infinito.

Material confidencial. Uso interno. Reprodução não autorizada. Impressão: 21/12/2017 16:34 Página: 1 de 6
One Point Lesson SD-2013-
Este esquema de cálculo deverá ser criado com cópia do esquema já existente, salvo que
deverá ser removida a referência da fórmula.

2. Criar com cópia do esquema de cálculo utilizado através da transação j1btax:

Esquema de cálculo original:

Esquema de cálculo criado com cópia e sem referência a fórmula que chamará a função
Pricing:

3. Chamada da função Pricing para recuperação de valores e cálculo do ICMS por dentro.
Alguns detalhes importantes sobre o código a seguir:

a) A função Pricing deverá ser chamada em uma nova sessão, anulando o risco da
modificação de variáveis globais;

b) Após a chamada da função Pricing, alguns valores são extraídos da KOMV que
possui as condições do esquema de cálculo auxiliar. Estas condições são
passadas como parâmetro para a função
ZSD_APL_CALC_FORMULA_<NUM_FORMULA>. O cálculo é realizado dentro
desta chamada de função evitando problemas de arredondamentos e possíveis
tratamentos que são frequentes em fórmulas.

FORM FRM_KONDI_WERT_<NUM_FORMULA>.

DATA:
tl_komv TYPE STANDARD TABLE OF komv.

DATA:
wl_komk TYPE komk,
wl_komp TYPE komp,
wl_komv TYPE komv,
wl_komv_z101 TYPE komv,
wl_komv_z273 TYPE komv,
Material confidencial. Uso interno. Reprodução não autorizada. Impressão: 21/12/2017 16:34 Página: 2 de 6
One Point Lesson SD-2013-
wl_komv_zfpe TYPE komv,
wl_komv_BXZF TYPE komv,
wl_komv_BX10 TYPE komv,
wl_komv_icbs TYPE komv.

DATA:
vl_calculation_type TYPE komv-ksteu VALUE 'B',
vl_kschl TYPE komv-kschl VALUE 'BX13',
vl_kalsm TYPE komk-kalsm VALUE 'ZBRAS6',
vl_kbetr TYPE komv-kbetr,
vl_kwert TYPE komv-kwert.

IF komk-kalsm <> vl_kalsm.


* Copia os valores da KOMK e KOMP para variáveis locais mudando o esquem
a de calculo
MOVE-CORRESPONDING komk to wl_komk.
wl_komk-kalsm = vl_kalsm.
wl_komk-trtyp = 'H'.
CLEAR:
wl_komk-belnr,
wl_komk-knumv,
wl_komk-lifnr,
wl_komk-ix_komk,
wl_komk-ix_komt1_v,
wl_komk-ix_komt1_b.

MOVE-CORRESPONDING komp to wl_komp.


CLEAR:
wl_komp-kaend_typ.

* Chama a função PRICING em uma nova sessão


CALL FUNCTION 'ZPRICING_RFC' DESTINATION 'NONE'
EXPORTING
calculation_type = vl_calculation_type
comm_head_i = wl_komk
comm_item_i = wl_komp
TABLES
tkomv = tl_komv.

* Retorna o resultado da condição BX13 do esquema de calculo ZBRAS6


READ TABLE tl_komv INTO wl_komv
WITH KEY kschl = vl_kschl.

IF sy-subrc = 0 AND wl_komv-kbetr <> 0.


vl_kbetr = ( wl_komv-kbetr / 1000 ).
ENDIF.

READ TABLE tl_komv INTO wl_komv_z101


WITH KEY kschl = 'Z101'.

Material confidencial. Uso interno. Reprodução não autorizada. Impressão: 21/12/2017 16:34 Página: 3 de 6
One Point Lesson SD-2013-
READ TABLE tl_komv INTO wl_komv_z273
WITH KEY kschl = 'Z273'.

READ TABLE tl_komv INTO wl_komv_zfpe


WITH KEY kschl = 'ZFPE'.

READ TABLE tl_komv INTO wl_komv_bxzf


WITH KEY kschl = 'BXZF'.

READ TABLE tl_komv INTO wl_komv_bx10


WITH KEY kschl = 'BX10'.

READ TABLE tl_komv INTO wl_komv_icbs


WITH KEY kschl = 'ICBS'.

* IF wl_komv_bxzf IS NOT INITIAL OR wl_komv_bx10 IS INITIAL.


IF "wl_komv_bxzf IS NOT INITIAL OR "DTH01
wl_komv_bxzf IS INITIAL AND "DTH01
( wl_komv_bx10-kbetr = 0 AND wl_komv_bx10-kwert = 0 ).
XKWERT = 0.
EXIT.
ENDIF.

IF wl_komv_z101 IS NOT INITIAL


AND vl_kbetr IS NOT INITIAL .

* vl_sum_z101_zfpe = wl_komv_z101-kwert + wl_komv_zfpe-kwert.


CALL FUNCTION 'ZSD_APC_CALC_FORMULA_<NUM_FORMULA>’ '
EXPORTING
iw_komv_zfpe = wl_komv_zfpe
iw_komv_z101 = wl_komv_z101
iw_komv_z273 = wl_komv_z273
iw_komv_icbs = wl_komv_icbs
iv_kbetr = vl_kbetr
iw_komp = komp
IMPORTING
E_XKWERT = vl_kwert.
ENDIF.

IF vl_kwert IS NOT INITIAL.


xkwert = vl_kwert.
ELSE.
xkwert = 0.
ENDIF.
ELSE.
xkwert = 0.
ENDIF.

*} INSERT
ENDFORM.

Material confidencial. Uso interno. Reprodução não autorizada. Impressão: 21/12/2017 16:34 Página: 4 de 6
One Point Lesson SD-2013-

4. Dentro da função ZSD_APC_CALC_FORMULA_<NUM_FORMULA> é realizado o cálculo do


ICMS com os parâmetros passados:

FUNCTION zsd_apc_calc_formula_<NUM_FORMULA>.

TYPES:
BEGIN OF tp_mbew,
matnr TYPE mbew-matnr,
bwkey TYPE mbew-bwkey,
bwtar TYPE mbew-bwtar,
ownpr TYPE mbew-ownpr,
END OF tp_mbew.

DATA: vl_sum TYPE p LENGTH 13 DECIMALS 3,


vl_res_kbetr TYPE p LENGTH 13 DECIMALS 4,
vl_res_final TYPE p LENGTH 13 DECIMALS 3,
vl_kbetr TYPE p LENGTH 13 DECIMALS 2 VALUE '583.30',
vl_base_reduzida TYPE p LENGTH 13 DECIMALS 2 VALUE '58.33',
vl_base_reduz TYPE p LENGTH 13 DECIMALS 2 .

DATA:
wl_mbew TYPE tp_mbew.

SELECT SINGLE matnr bwkey bwtar ownpr


FROM mbew
INTO wl_mbew
WHERE matnr = iw_komp-matnr
AND bwkey = iw_komp-werks.

* Coeficiente de cálculo
vl_res_kbetr = 1 - iv_kbetr.

* Formação da base de cálculo


IF iw_komv_z273-kwert IS NOT INITIAL.
vl_sum = iw_komv_z101-kwert + iw_komv_z273-kwert.
ELSE.
vl_sum = iw_komv_z101-kwert + iw_komv_zfpe-kwert.
ENDIF.

* Verifica se base reduzida ou não


IF iw_komv_icbs-kbetr = 1000.
IF vl_sum IS NOT INITIAL AND vl_res_kbetr IS NOT INITIAL .
vl_res_final = vl_sum / vl_res_kbetr.
IF sy-subrc = 0 .
e_xkwert = vl_res_final - vl_sum.
Material confidencial. Uso interno. Reprodução não autorizada. Impressão: 21/12/2017 16:34 Página: 5 de 6
One Point Lesson SD-2013-
ENDIF.
ENDIF.
* ELSEIF iw_komv_icbs-kbetr = vl_kbetr.
ELSE.

vl_base_reduz = vl_sum * vl_base_reduzida.


vl_base_reduz = vl_base_reduz / 100.
vl_res_final = vl_base_reduz / vl_res_kbetr.

IFsy-subrc = 0.
e_xkwert = vl_res_final - vl_base_reduz.
ENDIF.
ENDIF.

ENDIF.

ENDFUNCTION.

Material confidencial. Uso interno. Reprodução não autorizada. Impressão: 21/12/2017 16:34 Página: 6 de 6

Potrebbero piacerti anche