Surgiu-me uma necessidade. Ter cáculos que possam ser parametrizados…
Pensei em inventar uma rotina que fizesse o parse de uma string e efectuar os cálculos. Mas as variáveis eram demasiadas e a hipotese de cair erro era grande.
Após algumas pesquisas pela net, descobri o seguinte Function Module: EVAL_FORMULA.
Uau! (pensei) é mesmo isto! E é mesmo. fica um código disponibilizado pela SAP que eu alterei para alguns testes:
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* Avaliação de Formulas
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REPORT zzz_text_eval_formula .
DATA: formel(50),
* Returncode für Fb-Aufruf
retcode LIKE sy-subrc,
funcname(30) TYPE c,
message(70) TYPE c,
pos TYPE i,
c TYPE i.
formel = ' ( TESTE * TESTE2 ) / TESTE3'.
DATA: teste(10) TYPE c VALUE '1.2',
teste2(10) TYPE c VALUE '2',
teste3(10) TYPE c VALUE '3'.
DATA: BEGIN OF params OCCURS 0,
string(50) TYPE c,
END OF params.
DATA formula(100).
SPLIT formel AT '6' INTO TABLE params.
FIELD-SYMBOLS: TYPE ANY.
FIELD-SYMBOLS: TYPE ANY.
ASSIGN 'teste' TO .
SPLIT formel AT ' ' INTO TABLE params.
DELETE params WHERE string = ' '.
LOOP AT params.
CONDENSE params-string.
ASSIGN (params-string) TO .
IF sy-subrc = 0.
CONCATENATE formula INTO formula SEPARATED BY space.
ELSE.
CONCATENATE formula params-string INTO formula SEPARATED BY space.
ENDIF.
ENDLOOP.
CALL FUNCTION 'EVAL_FORMULA'
EXPORTING
formula = formula
unit_of_measure = 'CM'
IMPORTING
value = c
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
WRITE: / 'EVAL_FORMULA ', formel,'=',formula, '=', c.
ELSE.
WRITE: / sy-subrc.
ENDIF.
*averiguar o seguinte módulo função:
DATA: lt_var TYPE STANDARD TABLE OF rpoc_variable,
ls_var LIKE LINE OF lt_var.
DATA: ret LIKE rpoc_variable-value.
DATA: ret2 LIKE rpoc_variable-value.
CALL FUNCTION 'POC_FORMULA_EVALUATE'
EXPORTING
formula = formula
IMPORTING
value = ret
TABLES
var_table = lt_var
EXCEPTIONS
invalid_value = 1
evaluation_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE: / 'POC_FORMULA_EVALUATE', formel,'=',formula, '=', ret.
ENDIF.
* agora permitindo que ele substitua as variaveis:
LOOP AT params.
CONDENSE params-string.
ASSIGN (params-string) TO .
IF sy-subrc = 0.
ls_var-VARNAME = params-string.
ls_var-VALUE = .
append ls_var to lt_var.
ENDIF.
ENDLOOP.
CALL FUNCTION 'POC_FORMULA_EVALUATE'
EXPORTING
formula = formula
IMPORTING
value = ret2
TABLES
var_table = lt_var
EXCEPTIONS
invalid_value = 1
evaluation_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE: / 'POC_FORMULA_EVALUATE', formel, '=', ret2.
ENDIF.
data: netpr like vbap-netpr.
netpr = ret2.
write: / netpr.
e o output:
EVAL_FORMULA ( TESTE * TESTE2 ) / TESTE3 = ( 1.2 * 2 ) / 3 = 1
POC_FORMULA_EVALUATE ( TESTE * TESTE2 ) / TESTE3 = ( 1.2 * 2 ) / 3 = 7,999999999999999E-01
POC_FORMULA_EVALUATE ( TESTE * TESTE2 ) / TESTE3 = 7,999999999999999E-01
0,80
Nice, não?
Quantas vezes necessitaram de saber quais os coponentes de uma determinada tabela ou estrutura do dicionário de dados SAP?
Pois bem, deixo algumas alternativas:
- FM GET_FIELDTAB (deprecated);
- FM DDIF_FIELDINFO_GET;
- FM DDIF_NAMETAB_GET;
- Classe cl_rebf_ddic_tabl;
No caso da classe, deixo um sample code:
DATA : lt_list TYPE dd03ttyp.
CALL METHOD cl_rebf_ddic_tabl=>get_field_list_x
EXPORTING
id_name = ’MARA’
* IF_SUPPRESS_MANDT =
* IF_SUPPRESS_KEY =
* IF_SUPPRESS_NONKEY =
* ID_LANGU = SY-LANGU
IMPORTING
et_field_list_x = lt_list .
Espero que seja útil!
http://sapsdforum.com/category/idoc-edi-and-ale/
Um dos grandes stresses é fazer a passagem correcta entre campos de tipos diferentes… de char para número.
Apanhei (só agora…) a FM que o faz de uma forma muito interessante:
CATS_ITS_MAKE_STRING_NUMERICAL
O mecanismo de ampliação ao STD da SAP foi alargado à muito tempo, mas só agora tive a necessidade de investir tempo nesta tecnologia.
A série de Blogs no SDN do Sr. Thomas Weis está muito interessante, no sentido em que explica os prós e contras da tecnologia, e ainda mostra exemplos de como o fazer.
A série de Blogs:
- What the New Enhancement Framework Is For – Its Basic Structure and Elements For Beginners
- The new Enhancement Framework Part 2 – What Else You Need to Know Before Building an Enhancement
- How To Define a New BAdI Within the Enhancement Framework – Part 3 of the Series
- How to implement a BAdI And How to Use a Filter – Part 4 of the Series on the New Enhancement Framework
- Source Code Enhancements – Part 5 of the Series on the New Enhancement Framework
Nas listas técnicas, conseguimos ler os materiais que fazem parte da lista técnica de uma forma fácil, ver aqui.
E se quisermos saber de que listas técnicas faz parte um material?
Pode-se usar a FM:
CS_WHERE_USED_MAT_ANY
Ler uma lista técnica pode ser duro… tem muitos promenores.
Para facilitar a “coisa” aconcelho o uso da seguinte FM:
CS_BOM_EXPL_MAT_V2
Para saber detalhes da ordem de venda, ver/usar a seguinte BAPI:
BAPISDORDER_GETDETAILEDLIST
Retorna tudo o que se possa necessitar. Lá dentro é chamada uma função que não faz os mapeamentos para os campos com nome user-friendly, caso se prefira usar nomes técnicos:
SD_SALES_DOCUMENT_PREFETCH
Nas versões mais recentes do SAP, para passar campos adicionais às BAPIs deve-se usar o EXTENSIONIN…
Ver os seguintes links para mais detalhes:
T-Code: SE43
Pode-se copiar o STD da SAP para um outro e modifica-lo. Pode-se também ampliar o STD da SAP adicionando as entradas que necessitar-mos.
Tipicamente menu de área da SAP é identificado pelo ‘S000′


o que dizem