domingo, 30 de septiembre de 2012

Crear un ENTER en tiempo de ejecución


  CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
    EXPORTING
      functioncode           = '=/00'
    EXCEPTIONS
      function_not_supported = 0
      OTHERS                 = 0.

Radiobuttons en un ALV


Para utilizar radiobuttons en un alv, se puede mostrar en una celda de ALV el dibujo de un radiobutton como icono y capturar cuando se presiona sobre el para cambiarlo por el icono del radiobutton presionado.
Ejemplo:


INCLUDE <icons>.

DATA: BEGIN OF it_alv_flight OCCURS 0,
       carrid TYPE sflight-carrid,
       connid TYPE sflight-connid,
       radio1(4),                            "Radio button
       radio2(4),
      END OF it_alv_flight.


En fieldcat:
wa_fcat-fieldname = 'RADIO2'.
wa_fcat-tabname = 'IT_ALV_FLIGHT'.
wa_fcat-seltext_l = 'RADIO2'.
  x_fieldcat-edit      = c_x.
  x_fieldcat-icon      = c_x.
  x_fieldcat-hotspot   = c_x.


A la celda asignarle de valor inicial:
x_alv-pedidos = icon_wd_radio_button_empty. "Radio no seleccionado


en creación de alv definir el evento:
  SET HANDLER lcl_event_receiver=>hotspot_click
              FOR og_grid1.


CLASS lcl_eventhandler DEFINITION.

  PUBLIC SECTION.

    CLASS-DATA:
      md_cnt    TYPE i.

    CLASS-METHODS:
      handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING
          e_row_id
          e_column_id
          es_row_no
          sender.

ENDCLASS.    


CLASS lcl_eventhandler IMPLEMENTATION.

  METHOD handle_hotspot_click.
* define local data
    FIELD-SYMBOLS:
      <ls_entry>    TYPE ty_s_sflight,
      <ld_fld>      TYPE ANY.

    READ TABLE gt_sflight ASSIGNING <ls_entry> INDEX es_row_no-row_id.
    CHECK ( <ls_entry> IS ASSIGNED ).

*   Set all radio buttons "unselected"
    <ls_entry>-button1 =  icon_wd_radio_button_empty.
    <ls_entry>-button2 =  icon_wd_radio_button_empty.
    <ls_entry>-button3 =  icon_wd_radio_button_empty.
    <ls_entry>-button4 =  icon_wd_radio_button_empty.

    ASSIGN COMPONENT e_column_id-fieldname OF STRUCTURE <ls_entry>
                                              TO <ld_fld>.
    IF ( <ld_fld> IS ASSIGNED ).
*     Set selected radio button "selected".
      <ld_fld> = icon_wd_radio_button.
    ENDIF.

*   Force PAI followed by refresh of table display in PBO
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'DUMMY'
*      IMPORTING
*        RC       =
        .


  ENDMETHOD.                    "handle_hotspot_click

ENDCLASS.                    "lcl_eventhandler IMPLEMENTATION

Smartform signo de número a izquierda

Dentro de un smartform si queremos mostrar el signo de un número a la izquierda, en la ventana al momento de mostrar una variable utilizar:
&variable(<)&


Cantidad de caracteres de un string

Para obtener la cantidad de caracteres de un string utilizar:

data: v_cantidad type i,
v_texto(50) type c.
v_texto = 'Hola mundo'.

v_cantidad = STRLEN( v_texto ).

SAVE_TEXT y CREATE_TEXT


Ejemplo de utilización de grabación de texto standard, si ya existe el texto utiliza la función save_text para modificarlo, si no existe utiliza la función create_text para crearlo.

FORM f_guarda_comentarios.
  DATA: u_line   TYPE STANDARD TABLE OF tline,
        u_line_aux TYPE STANDARD TABLE OF tline,
        x_line   TYPE tline,
        x_text   TYPE tp_text,
        x_header TYPE thead,
        w_name   TYPE tdobname.
  CHECK NOT t_text[] IS INITIAL.
  REFRESH u_line.
  LOOP AT t_text INTO x_text.
    CLEAR x_line.
    x_line-tdline = x_text-line.
    APPEND x_line TO u_line.
  ENDLOOP.

  CHECK NOT u_line[] IS INITIAL.
  CHECK NOT v_vbeln IS INITIAL.

* Busca si ya existe el texto
  w_name = v_vbeln.

* Rescata comentarios
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = '0002'
      language                = 'S'
      name                    = w_name
      object                  = 'VBBK'
    TABLES
      lines                   = u_line_aux
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.
  IF sy-subrc NE 0.
* Crea texto
    CALL FUNCTION 'CREATE_TEXT'
      EXPORTING
        fid       = '0002'
        flanguage = sy-langu
        fname     = w_name
        fobject   = 'VBBK'
      TABLES
        flines    = u_line
      EXCEPTIONS
        no_init   = 1
        no_save   = 2
        OTHERS    = 3.
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.
  ELSE.
    CLEAR x_header.
    x_header-tdname = w_name.
    x_header-tdid = '0002'.
    x_header-tdspras = sy-langu.
    x_header-tdobject = 'VBBK'.
    x_header-mandt = sy-mandt.

* Guarda texto
    CALL FUNCTION 'SAVE_TEXT'
      EXPORTING
        client   = sy-mandt
        header   = x_header
        savemode_direct = 'X'
      TABLES
        lines    = u_line
      EXCEPTIONS
        id       = 1
        language = 2
        name     = 3
        object   = 4
        OTHERS   = 5.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
  ENDIF.
  CALL FUNCTION 'COMMIT_TEXT'.
ENDFORM.                    " F_GUARDA_COMENTARIOS

Obtener el nombre de los meses


Para obtener el listado de nombres de los meses utilizar la función:
CALL FUNCTION 'MONTH_NAMES_GET'
 EXPORTING
   language                    = sy-langu
* IMPORTING
*   RETURN_CODE                 =
  TABLES
    month_names                 = t_month
* EXCEPTIONS
*   MONTH_NAMES_NOT_FOUND       = 1
*   OTHERS                      = 2
          .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

en la tabla interna t_month obtendremos el listado completo de los meses en el idioma sy-langu.

Signo menos a la izquierda

Para mover el signo menos de un número a la izquierda (ya que SAP utiliza por defecto el signo a la derecha). Utilizar la función:

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
  CHANGING
    value = p_amount.
(donde p_amount es la variable que contiene el número con el signo que queremos modificar).