Jul 232010

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?

Jul 142010

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:

  1. FM GET_FIELDTAB (deprecated);
  2. FM DDIF_FIELDINFO_GET;
  3. FM DDIF_NAMETAB_GET;
  4. 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!

Jul 082010

http://sapsdforum.com/category/idoc-edi-and-ale/

Jul 072010

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

Jun 182010

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:

  1. What the New Enhancement Framework Is For – Its Basic Structure and Elements For Beginners
  2. The new Enhancement Framework Part 2 – What Else You Need to Know Before Building an Enhancement
  3. How To Define a New BAdI Within the Enhancement Framework – Part 3 of the Series
  4. How to implement a BAdI And How to Use a Filter – Part 4 of the Series on the New Enhancement Framework
  5. Source Code Enhancements – Part 5 of the Series on the New Enhancement Framework
Jun 182010

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

Jun 182010

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

Jun 182010

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

Jun 112010

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:

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/17092

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/12152

Jun 082010

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′