sexta-feira, 12 de agosto de 2016

F4IF_INT_TABLE_VALUE_REQUEST - Montagem campo F4 com tabeas e campo de colunas diferentes

  Problema clássico, tenho um campo de tela que pode receber um valor do cliente ou fornecedor (KNA1 e LFA1), os campos das 2 tabelas são idênticos. No meu caso preciso de um matchcode que identifique os valores a serem exibidos, na tela eu tenho um radio buttton para escolha entre o cliente e o fornecedor e 1 campo para receber o código de 1 ou outro.









No código eu tenho o PROCESS ON VALUE-REQUEST para chamada do match code.

  TYPESBEGIN OF tp_parceiro,
           line TYPE char50,
         END OF tp_parceiro.

  DATAlt_parceiro  TYPE TABLE OF tp_parceiro,
        lt_rettab    TYPE TABLE OF ddshretval,
        lt_dfies     TYPE TABLE OF dfies,
        lt_dfies_aux TYPE TABLE OF dfies,
        lt_dselc     TYPE TABLE OF dselc.

  DATAlw_parceiro TYPE tp_parceiro,
        lw_cli      TYPE z_mestre_cliente,
        lw_for      TYPE z_mestre_fornecedor,
        lw_rettab   TYPE ddshretval,
        lw_dfies    TYPE dfies,
        lw_dselc    TYPE dselc.

  DATAl_tabname   TYPE tabname,
        l_fieldname TYPE fieldname.

  DEFINE lm_ddget.

    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        tabname        &1
        fieldname      &2
      TABLES
        dfies_tab      lt_dfies_aux
      EXCEPTIONS
        not_found      1
        internal_error 2
        OTHERS         3.

    IF sy-subrc 0.
      APPEND LINES OF lt_dfies_aux TO lt_dfies.
    ENDIF.

  END-OF-DEFINITION.

  "Z_LOTE = estrutura do paraâmetro de tela

  "Radio button da tela com o cliente/fornecedor
  IF z_lote-partyp_t c_partyp_cli AND
       t_cliente[] IS INITIAL ).

    l_tabname 'Z_MESTRE_CLIENTE'.
    l_fieldname 'KUNNR'.

    SELECT *
      INTO lw_cli
      FROM kna1
     WHERE EXISTS SELECT *
                       FROM knb1
                     WHERE bukrs EQ z_lote-bukrs
                       AND kunnr EQ kna1~kunnr ).

      CLEAR lw_parceiro.
      lw_parceiro-line =  lw_cli-land1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_cli-kunnr.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_cli-name1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_cli-regio.
      APPEND lw_parceiro TO lt_parceiro.

    ENDSELECT.

  ELSEIF z_lote-partyp_t c_partyp_for AND
        t_fornecedor[] IS INITIAL ).

    l_tabname 'Z_MESTRE_FORNECEDOR'.
    l_fieldname 'LIFNR'.


    SELECT *
     INTO lw_for
     FROM lfa1
    WHERE EXISTS SELECT *
                      FROM lfb1
                    WHERE bukrs EQ z_lote-bukrs
                      AND lifnr EQ kna1~lifnr ).

      CLEAR lw_parceiro.
      lw_parceiro-line =  lw_for-land1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_for-lifnr.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_for-name1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_for-regio.
      APPEND lw_parceiro TO lt_parceiro.

    ENDSELECT.


  ENDIF.

  lm_ddget l_tabname l_fieldname.
  lm_ddget l_tabname 'NAME1'.
  lm_ddget l_tabname 'REGIO'.

  CLEAR lw_dselc.
  lw_dselc-fldname l_fieldname.
  lw_dselc-dyfldname 'Z_LOTE-TFRNR'.
  APPEND lw_dselc TO lt_dselc.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        l_fieldname
      dynpprog        sy-repid
      dynpnr          '1000'
      dynprofield     'Z_LOTE-TFRNR'
    TABLES
      value_tab       lt_parceiro
      field_tab       lt_dfies
      return_tab      lt_rettab
      dynpfld_mapping lt_dselc
    EXCEPTIONS
      parameter_error 1
      no_values_found 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.
  ENDIF.
 


Nenhum comentário:

Postar um comentário