Cerca nel blog

martedì 29 dicembre 2015

Programma: Ottenere F4 help di un campo in base al valore di un altro campo

Ottenere F4 help di un campo in base al valore di un altro campo 

Questo programma mostra come accedere o aggiornare il valore di un campo nel caso in cui si prema F4 help da un altro campo.
In questo programma, che ha 2 campi nella schemrata di selezione, si considerano due SCENARI.
SCENARIO 1: Si inserisce un valore nel campo SOCIETA' e premendo F4 help nel campo Org. Commerciale vengono visualizzati i valori possibili dell'Organizzazione Commerciale associati alla società selezionata precedentemente, e settato il valore nel campo Organizzazione Commerciale mediante il FM : F4IF_INT_TABLE_VALUE_REQUEST
SCENARIO 1: Se nel campo società è presente un valore, e premendo F4 help nel campo Org. Commerciale che visualizza  anche un valore diverso  della sosietà, viene settato questo nuovo valore nel campo società mediante il FM DYNP_VALUES_UPDATE.

*&---------------------------------------------------------------------*
*& Report  Z_VALUES_F4HELP_CHANGE
*&---------------------------------------------------------------------*

REPORT z_values_f4help_change.

DATA: BEGIN OF gt_vkorg OCCURS 0, "f4 values for user
        bukrs LIKE tvko-bukrs,
        vkorg LIKE tvko-vkorg,
      END OF gt_vkorg.

PARAMETERS: p_bukrs TYPE tvko-bukrs, "Società
            p_vkorg TYPE tvko-vkorg. "Org. commerciale


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vkorg.
  PERFORM get_sales.

START-OF-SELECTION.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  GET_SALES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_sales.
* DATO CHE IN QUESTO EVENTO, IL CAMPO p_bukrs
* NON E' ACCESSIBILE, QUINDI ANCHE SE VALORIZZATO
* NON SI RIESCE A VEDERE IL SUO VALORE, PER OVVIARE
* A QUESTO PROBLEMA E' NECESSARIO USARE IL FM
* DYNP_VALUES_READ.

  DATA: lt_dynpfields       TYPE STANDARD TABLE OF dynpread,
        ls_dynpfields       TYPE                   dynpread,
        lt_return           TYPE STANDARD TABLE OF ddshretval,
        ls_return           TYPE                   ddshretval,
        lt_where_tab(50)    TYPE                   c OCCURS 1 WITH HEADER LINE,
        ls_where_clause(50) TYPE                   c,
        gs_vkorg            LIKE LINE OF           gt_vkorg.

  CLEAR: gt_vkorg, lt_dynpfields,
         ls_dynpfields, lt_return,
         ls_return, lt_where_tab,
         ls_where_clause, gs_vkorg.
  REFRESH: gt_vkorg, lt_dynpfields,
           lt_return, lt_where_tab.

  ls_dynpfields-fieldname = 'P_BUKRS'.
  APPEND ls_dynpfields TO lt_dynpfields.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname               = sy-repid
      dynumb               = sy-dynnr
    TABLES
      dynpfields           = lt_dynpfields
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      invalid_parameter    = 7
      undefind_error       = 8
      double_conversion    = 9
      stepl_not_found      = 10
      OTHERS               = 11.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  CLEAR: ls_dynpfields.
  READ TABLE lt_dynpfields
        INTO ls_dynpfields
        WITH KEY fieldname = 'P_BUKRS'.
  IF sy-subrc = 0.
    p_bukrs = ls_dynpfields-fieldvalue.
  ENDIF.

* Creo la WHERE DINAMICA
* Se la SOCIETA' E' VALORIZZATA, VISUALIZZO L'ORGANIZZAZIONE
* COMMERCIALE ASSOCIATA, ALTRIMENTI VISUALIZZO TUTTE LE ORGANIZZAZIONI
  IF p_bukrs IS NOT INITIAL.
    CONCATENATE ' bukrs EQ  ' '''' p_bukrs '''' INTO ls_where_clause.
  ELSE.
    CONCATENATE ' bukrs NE  ' ''''  '''' INTO ls_where_clause.
  ENDIF.

  APPEND ls_where_clause TO lt_where_tab.

  SELECT bukrs vkorg
    FROM tvko
    INTO TABLE gt_vkorg
    WHERE (lt_where_tab).


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'VKORG'
      window_title    = 'Codice Org. commerciale'
      value_org       = 'S'
    TABLES
      value_tab       = gt_vkorg
      return_tab      = lt_return
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ELSE.
    CLEAR: ls_return.
    READ TABLE lt_return
          INTO ls_return INDEX 1.

    p_vkorg = ls_return-fieldval.
* SE LA SOCIETA' NON E' VALORIZZATA, E L'ORGANIZZAZIONE E'
* VALORIZZATA, SETTO IL VALORE LETTO ANCHE PER LA SOCIETA'
    IF p_bukrs IS INITIAL AND
       p_vkorg IS NOT INITIAL.

      READ TABLE gt_vkorg INTO gs_vkorg
      WITH KEY vkorg = p_vkorg.

      IF sy-subrc = 0.
        p_bukrs = gs_vkorg-bukrs.

* PER VISUALIZZARE SULLA DYNPRO IL CAMPO BUKRS
* USARE IL FM DYNP_VALUES_UPDATE

        CLEAR: ls_dynpfields, lt_dynpfields.
        REFRESH: lt_dynpfields.

        ls_dynpfields-fieldname = 'P_BUKRS'.
        ls_dynpfields-fieldvalue = p_bukrs.
        APPEND ls_dynpfields TO lt_dynpfields.

        CALL FUNCTION 'DYNP_VALUES_UPDATE'
          EXPORTING
            dyname               = sy-repid
            dynumb               = sy-dynnr
          TABLES
            dynpfields           = lt_dynpfields
          EXCEPTIONS
            invalid_abapworkarea = 1
            invalid_dynprofield  = 2
            invalid_dynproname   = 3
            invalid_dynpronummer = 4
            invalid_request      = 5
            no_fielddescription  = 6
            undefind_error       = 7
            OTHERS               = 8.

        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " GET_SALES



Nessun commento:

Posta un commento