domingo, 30 de septiembre de 2012

Bloquear una tabla completa


Para bloquear todos los registros de una tabla utilizar:

CALL FUNCTION'ENQUEUE_E_TABLE'
EXPORTING
  MODE_RSTABLE ='E'
  TABNAME ='ZNOMBRETABLA'
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
 EXCEPTIONS
   FOREIGN_LOCK = 1
   SYSTEM_FAILURE = 2
   OTHERS = 3
          .
IF sy-subrc = 0.
 WRITE: 'Lock table successfully!'.
 else.
  write: 'Failed'.
ENDIF.

Bloquear un registro de tabla VBAK


* Bloquea un registro de tabla VBAK
  CALL FUNCTION 'ENQUEUE_EVVBAKE'
    EXPORTING
      mode_vbak      = 'E'
      mandt          = sy-mandt
      vbeln          = p_vbeln
      x_vbeln        = ' '
      _scope         = '2'
      _wait          = ' '
      _collect       = ' '
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.


* Desbloquea un registro de tabla VBAK
    CALL FUNCTION 'DEQUEUE_EVVBAKE'
      EXPORTING
        mode_vbak = 'E'
        mandt     = sy-mandt
        vbeln     = p_vbeln
        x_vbeln   = ' '
        _scope    = '3'
        _synchron = ' '
        _collect  = ' '.

Llamar a función en background


Para llamar a función en background.

data: w_tid  TYPE arfctid,
      w_fnum TYPE qretstate-qrfnum.


      CALL FUNCTION 'ZNOMBREFUNCION'
        IN BACKGROUND TASK
        EXPORTING
          i_incentivo = w_incentivo
          i_inc_act   = p_act1
          i_archivo   = p_file
        TABLES
          t_vbak      = t_vbak_back
          t_vbak_agru = t_vbak_agru_back
          t_liq       = u_liq_back.

      CALL FUNCTION 'START_OF_BACKGROUNDTASK'
        EXPORTING
          startdate = sy-datum
          starttime = sy-uzeit.

      CALL FUNCTION 'ID_OF_BACKGROUNDTASK'
        IMPORTING
          tid  = w_tid
          fnum = w_fnum.
      IF sy-subrc EQ 0.
        COMMIT WORK.
      ENDIF.

Y en los atributos de la función, Módulo de acceso remoto y inicio inmediato

Mensajes de error varios en una pantalla


data:
e_log        TYPE bapiret2,
t_log        TYPE bapiret2tab,

  CLEAR e_log.
  e_log-type    = 'S'.
  e_log-id      = 'ZZZZZ'.
  e_log-number  = 437.
  APPEND e_log TO t_log.

  CALL FUNCTION 'SUSR_DISPLAY_LOG'
    EXPORTING
      display_in_popup = abap_true
      log_title        = text-002
    TABLES
      it_log_bapiret2  = t_log[]
    EXCEPTIONS
      parameter_error  = 1
      OTHERS           = 2.

  IF NOT sy-subrc IS INITIAL.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

2 checkbox en una misma línea


SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN: COMMENT 23(22) text-062, POSITION 20.
PARAMETERS: v_cm_mod AS CHECKBOX.

SELECTION-SCREEN: COMMENT 53(24) text-063, POSITION 50.
PARAMETERS: v_cm_sld AS CHECKBOX.
SELECTION-SCREEN END OF LINE.

Caja de texto en dynpro


Crear custom control en dynpro

 TYPES: BEGIN OF tp_text,
          line TYPE c LENGTH 120,
        END OF tp_text.


data:
v_container_104_1  TYPE REF TO cl_gui_custom_container,

v_ccontrol_104_1   TYPE scrfname VALUE 'CCCOMENTARIOS',
v_texto            TYPE REF TO cl_gui_textedit,
t_text             TYPE tp_ttext,
tp_ttext           TYPE STANDARD TABLE OF tp_text.

EN PAI:
FORM f_crea_contenedor_texto .

  DATA lw_line_length TYPE i VALUE 120.

* Crea contenedor y lo asocia con la DYNPRO
  CREATE OBJECT v_container_104_1
    EXPORTING
      container_name              = v_ccontrol_104_1
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.

  IF NOT sy-subrc IS INITIAL.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*$ Crea  el Objeto EDITOR
  CREATE OBJECT v_texto
    EXPORTING
      wordwrap_mode          = cl_gui_textedit=>wordwrap_at_fixed_position
      wordwrap_position      = lw_line_length
      parent                 = v_container_104_1
    EXCEPTIONS
      error_cntl_create      = 1
      error_cntl_init        = 2
      error_cntl_link        = 3
      error_dp_create        = 4
      gui_type_not_supported = 5
      OTHERS                 = 6.

  IF NOT sy-subrc IS INITIAL.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  IF v_actvt = '03' AND v_edit IS INITIAL.
    CALL METHOD v_texto->set_readonly_mode
      EXPORTING
        readonly_mode          = '1'
      EXCEPTIONS
        error_cntl_call_method = 1
        invalid_parameter      = 2.
  ELSE.
    CALL METHOD v_texto->set_readonly_mode
      EXPORTING
        readonly_mode          = '0'
      EXCEPTIONS
        error_cntl_call_method = 1
        invalid_parameter      = 2.
  ENDIF.

  CALL METHOD v_texto->set_toolbar_mode
    EXPORTING
      toolbar_mode           = cl_gui_textedit=>false
    EXCEPTIONS
      error_cntl_call_method = 1
      invalid_parameter      = 2
      OTHERS                 = 3.

  CALL METHOD v_texto->set_statusbar_mode
    EXPORTING
      statusbar_mode         = cl_gui_textedit=>false
    EXCEPTIONS
      error_cntl_call_method = 1
      invalid_parameter      = 2
      OTHERS                 = 3.


ENDFORM.                    " f_crea_contenedor_texto


EN PBO: fuera de todo
MODULE rescata_comentarios INPUT.
  CHECK sy-ucomm NE 'YPR9_NO'.                            
  IF NOT v_texto IS INITIAL.                              
    PERFORM f_rescata_dd_dynpro.
  ENDIF.                                                
ENDMODULE.                 " rescata_comentarios


FORM f_rescata_dd_dynpro .

  DATA: u_text TYPE tp_ttext,
        w_true TYPE i.

  CLEAR u_text[].
  w_true = 1.


  CALL METHOD v_texto->get_text_as_r3table
    IMPORTING
      table                  = u_text
    EXCEPTIONS
      error_dp               = 1
      error_cntl_call_method = 2
      error_dp_create        = 3
      potential_data_loss    = 4
      OTHERS                 = 5.
  .
  IF NOT sy-subrc IS INITIAL.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  t_text[] = u_text[].

ENDFORM.                    " f_rescata_dd_dynpro

-----
FORM f_recupera_comentarios .

  TYPES: tp_lines TYPE STANDARD TABLE OF tline.


  DATA: w_name  TYPE tdobname,
        u_line        TYPE tp_lines,
        x_line        TYPE tline,
        x_line_txt    TYPE tp_text.

  w_name = v_vbeln.

* Rescata comentarios
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = c_0002
      language                = c_s
      name                    = w_name
      object                  = c_vbbk
    TABLES
      lines                   = u_line
    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 IS INITIAL.

    LOOP AT u_line INTO x_line.
      x_line_txt-line      = x_line-tdline.
      APPEND x_line_txt TO t_text.
      CLEAR  x_line_txt.
    ENDLOOP.

  ENDIF.

* Mueve el texto al Objeto Editor
  IF NOT t_text[] IS INITIAL.

    IF v_vehiculo_rasa = abap_true.

      CALL METHOD v_texto->set_enable
        EXPORTING
          enable            = abap_false
        EXCEPTIONS
          cntl_error        = 1
          cntl_system_error = 2
          OTHERS            = 3.

      IF NOT sy-subrc IS INITIAL.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.


    ENDIF.

    CALL METHOD v_texto->set_text_as_stream
      EXPORTING
        text            = t_text
      EXCEPTIONS
        error_dp        = 1
        error_dp_create = 2
        OTHERS          = 3.

    IF NOT sy-subrc IS INITIAL.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1
      sy-msgv3 sy-msgv4.
    ENDIF.

  ENDIF.

ENDFORM.                    " f_recupera_comentarios

Día laboral próximo


  CALL FUNCTION 'BKK_GET_NEXT_WORKDAY'
    EXPORTING
      i_date         = p_fecha
      i_calendar1    = 'SI'
    IMPORTING
      e_workday      = p_vto
    EXCEPTIONS
      calendar_error = 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.

Averiguar en que transacción estamos


DATA w_dynpro TYPE sy-tcode.

  CALL METHOD cl_dynpro=>get_current_transaction
    RECEIVING
      transaction_name = w_dynpro.

  LEAVE TO TRANSACTION w_dynpro.

Crear un List box en pantalla


Para crear un list box en selection screen:

PARAMETERS: p_day TYPE char4 AS LISTBOX VISIBLE LENGTH 6 OBLIGATORY.

TYPE-POOLS: vrm.
DATA: l_sid TYPE  vrm_id,
      l_i_val TYPE vrm_values,
      l_val LIKE LINE OF l_i_val.

INITIALIZATION.
  l_sid = 'p_day'.
  l_val-key = '0'.
  l_val-text = 'SUN'.
  APPEND l_val TO l_i_val.

  l_val-key = '1'.
  l_val-text = 'MON'.
  APPEND l_val TO l_i_val.

  l_val-key = '2'.
  l_val-text = 'TUE'.
  APPEND l_val TO l_i_val.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = l_sid
      values          = l_i_val
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.
  IF sy-subrc = 0.

  ENDIF.


-----------------------------------------------------------------
Para crear un list box en una dynpro:

THE TOP INCLUDE:


TYPES: begin of stru_t161t,
               BSTYP type t161t-BSTYP,
               BSART type t161t-BSART,
               BATXT type BATXT,
            end of stru_t161t.

types : BEGIN OF STRU_TEXT,                "STRUCTURE FOR FUNCTION MODULE
             KEY(40) TYPE C,                       " FOR DROPDOWN BOX
             TEXT(80) TYPE C,
          END OF STRU_TEXT.

data : it_t161t type TABLE OF stru_t161t,
         wa_t161t type stru_t161t,
        it_text type  TABLE OF STRU_TEXT,
        wa_text type STRU_TEXT.

IN THE PBO:
MODULE STATUS_1000 OUTPUT.
SELECT
   BSTYP
   BSART
   BATXT
  into table it_t161t
  from t161t
  where bstyp = 'B'
    and SPRAS = 'E'.

clear wa_text.
refresh it_text.

  loop at it_t161t into wa_t161t.
     move wa_t161t-bsart to wa_text-key.
     move wa_t161t-batxt to wa_text-text.
    append wa_text to it_text.
  endloop.


  CALL FUNCTION 'VRM_SET_VALUES'
  EXPORTING
    ID                    = 'V_DRPDWN'  "'V_DRPDWN' is the screen name of the dropdown field
    VALUES                = it_text
EXCEPTIONS
  ID_ILLEGAL_NAME       = 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.
ENDMODULE.                 " STATUS_1000  OUTPUT

Modificaciones en un documento buscarlas por tablas


    SELECT SINGLE changenr
      INTO w_changenr
      FROM cdhdr
      WHERE objectclas = 'VERKBELEG'
        AND objectid   = v_salesdocu "Numero de documento
        AND udate      = v_zfech_reg. "Fecha

    SELECT SINGLE value_old
      INTO w_contract_header_in-ord_reason
      FROM cdpos
      WHERE objectclas = 'VERKBELEG'
        AND objectid   = v_salesdocu
        AND changenr   = w_changenr
        AND fname      = 'AUGRU'. "Campo a buscar

Interlocutores de un documento


Para obtener el interlocutor de un documento, acceder a la tabla VBPA.
Ejemplo:
  SELECT SINGLE kunnr
    INTO w_kunnr
    FROM vbpa
   WHERE vbeln EQ v_doc_number
     AND parvw EQ 'AG'.

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).