TH_LONG_USR_INFO – Validar que un usuario no se encuentra ya logueado en la transacción

Caso: se busca generar un mensaje de error si el usuario ya se encuentra logueado en la transacción

Solución: utilizamos TH_LONG_USR_INFO

FORM validar_doble_ingreso  USING   p_mandt  TYPE sy-mandt
                                     p_uname  TYPE sy-uname
                                     p_tcode  TYPE sy-tcode
                            CHANGING p_error  TYPE c.
 
  DATA: wterminal LIKE  usr41-terminal,
        wfdpos    TYPE sy-fdpos,
        wmode     TYPE sy-modno,
        user_info	TYPE TABLE OF uinfo2,
        lw_user_info LIKE LINE OF user_info.
 
  wmode = sy-modno + 1.
 
  CALL FUNCTION 'TERMINAL_ID_GET'
    EXPORTING
      username             = sy-uname
    IMPORTING
      terminal             = wterminal
    EXCEPTIONS
      multiple_terminal_id = 1
      no_terminal_found    = 2
      OTHERS               = 3.
 
  SEARCH wterminal FOR '-'.
 
  CHECK sy-subrc = 0.
  wfdpos = sy-fdpos + 1.
  wterminal = wterminal+wfdpos.
 
  REFRESH user_info.
 
  CALL FUNCTION 'TH_LONG_USR_INFO'
    EXPORTING
      user      = '*'
    TABLES
      user_info = user_info.
 
* Busco si el usuario tiene una sesión abierta en SISCON
  READ TABLE user_info INTO lw_user_info WITH KEY client   = p_mandt
                                                  user     = p_uname
                                                  tcode    = p_tcode
                                                  terminal = wterminal.
 
  IF sy-subrc EQ 0.
    p_error = 'X'.
  ENDIF.
 
ENDFORM.                    " VALIDAR_DOBLE_INGRESO
Categorías:ABAP/4 Etiquetas: , ,

SM04 – Obtener lista de Usuarios y Transacciones logueados

Caso: se busca ver los usuarios logueados en el mandante y en que transacción se encuentran.

Screenshot_2

Solución: el código es obtenido del programa RSM04000_ALV (el de la SM04), en versión simplificada.

TABLES: msxxlist,
        uinfo.
 
* old (deprecated) UINFO structure
DATA: BEGIN OF COMMON PART usr.
DATA: BEGIN OF usr_tabl OCCURS 10.
        INCLUDE STRUCTURE usrinfo.
DATA: END OF usr_tabl.
DATA: END OF COMMON PART usr.
 
DATA: th_opcode(1)         TYPE x.
 
CONSTANTS:  opcode_list                     LIKE th_opcode VALUE 2.
 
REFRESH usr_tabl[].
 
CALL 'ThUsrInfo' ID 'OPCODE' FIELD opcode_list
  ID 'TABUSR' FIELD usr_tabl-*sys* .
 
SORT usr_tabl BY mandt bname.
 
LOOP AT usr_tabl.
  WRITE: / usr_tabl-MANDT, usr_tabl-BNAME, usr_tabl-tcode .
ENDLOOP.

Nota: para ver todas las transacciones de los usuarios, usar:
DATA: user_info  TYPE TABLE OF uinfo2

CALL FUNCTION 'TH_LONG_USR_INFO'
   EXPORTING
     user      '*'
   TABLES
     user_info user_info. 

Categorías:ABAP/4 Etiquetas: , , ,

SE03 – Buscar órdenes de transporte por objeto

Caso: se busca en que orden se encuentra un objeto.

Solución: Por la transacción SE03 se puede buscar objetos en las órdenes de transporte (tanto liberadas con modificables).

Screenshot_1

Se puede filtrar por el objeto a buscar (programa, clase, tipo tabla, etc.). 

Screenshot_2

Otros objetos que no aparecen por defecto en la pantalla inicial pero que se pueden añadir son:

R3TR TABU – Contenido de tabla
R3TR TDAT – Customizing: Contenido de tablas
R3TR VDAT – Actualización vistas: Datos
R3TR CDAT – Actualización cluster vistas: Datos

Link: https://abapforsap.wordpress.com/2013/07/18/buscar-ordenes-de-transporte/

Enviar E-Mail – Mejor forma

Caso: buscando encontré este código para envío de mail, muy correcto y simple.

Solución: Lo hice en una función

FUNCTION z_envio_mail.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     REFERENCE(I_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*"     REFERENCE(I_BODY) TYPE  BCSY_TEXT OPTIONAL
*"     REFERENCE(I_TYPE_DOC) TYPE  SO_OBJ_TP OPTIONAL
*"     REFERENCE(I_SENDER) TYPE  AD_SMTPADR OPTIONAL
*"     REFERENCE(I_RECEIVERS) TYPE  BCSY_SMTPA
*"----------------------------------------------------------------------
 
  DATA: lo_send_request   TYPE REF TO cl_bcs,
        lo_bcs_exception  TYPE REF TO cx_bcs,
        lo_document       TYPE REF TO cl_document_bcs,
        lo_sender         TYPE REF TO if_sender_bcs,
        lo_recipient      TYPE REF TO if_recipient_bcs,
        lit_message_body  TYPE bcsy_text,
        lx_document_bcs   TYPE REF TO cx_document_bcs,
        lv_sent_to_all    TYPE os_boolean,
        lv_sender         TYPE adr6-smtp_addr,
        lv_uname          TYPE uname,
        lv_emailadd       TYPE adr6-smtp_addr,
        wa_receivers      TYPE LINE OF bcsy_smtpa,
        lv_sub            TYPE so_obj_des,
        lv_subrc          TYPE sy-subrc,
        lv_error          TYPE string.
 
  TRY.
      lo_send_request = cl_bcs=>create_persistent( ).
*************** Subject      *****************************************
      CLEAR lv_sub.
      lv_sub = i_subject. " Asunto
*************** Message Body *****************************************
      REFRESH:lit_message_body.
      lit_message_body[] = i_body[].
 
*     put your text into the document
      IF i_type_doc IS NOT INITIAL.
        lo_document = cl_document_bcs=>create_document(
                         i_type     = i_type_doc
                         i_text     = lit_message_body
                         i_subject  = lv_sub ).
      ELSE.
        lo_document = cl_document_bcs=>create_document(
                         i_type     = 'RAW'
                         i_text     = lit_message_body
                         i_subject  = lv_sub ).
      ENDIF.
*************** Create sender *****************************************
      lv_sender = i_sender.                               " 'remitente@mail.com'.
      IF lv_sender IS INITIAL.
        lo_sender = cl_sapuser_bcs=>create( sy-uname ).
      ELSE.
        lo_sender = cl_cam_address_bcs=>create_internet_address( lv_sender ).
      ENDIF.
 
*         Set sender
      lo_send_request->set_sender( lo_sender ).
 
*************** Create Receiver *****************************************
      LOOP AT i_receivers INTO wa_receivers.
        lv_emailadd = wa_receivers. " destinatario@mail.com
        lo_recipient = cl_cam_address_bcs=>create_internet_address(
                                lv_emailadd  ).
 
*           Add recipient object to send request
        CALL METHOD lo_send_request->add_recipient
          EXPORTING
            i_recipient = lo_recipient
            i_express   = 'X'.
      ENDLOOP.
*************** Send Email *****************************************
      lo_send_request->set_document( lo_document ).
 
      lo_send_request->send(
        EXPORTING
          i_with_error_screen = 'X'
        RECEIVING
          result = lv_sent_to_all ).
 
      COMMIT WORK.
 
      IF lv_sent_to_all IS INITIAL.
        lv_subrc = '1'.
      ELSE.
        CLEAR lv_subrc.
      ENDIF.
 
    CATCH cx_bcs  INTO lo_bcs_exception.
      lv_error = lo_bcs_exception->get_text( ).
      lv_subrc = '1'.
 
  ENDTRY.
 
ENDFUNCTION.

Link: http://www.patelashish.com/wordpress/2013/08/abap-code-best-way-series-send-email/

Categorías:ABAP/4 Etiquetas: , , , ,

Set de Datos II – Una mejor forma

Caso: encontré una forma más facil de obtener el SET DE DATOS

Solución:

DATA: gr_ktokk        TYPE RANGE OF ktokk,
      gs_ktokk        LIKE LINE OF gr_ktokk.
 
DATA: lit_set_lines_basic TYPE TABLE OF rgsbv,
      lwa_set_lines_basic TYPE rgsbv.
 
* Obtengo el SET de datos con los grupos de cuentas a validar
CALL FUNCTION 'G_SET_FETCH'
EXPORTING
setnr           = '0000ZMM_SC_GRUPO_CUENTAS'  " Se pone 0000 antes del nombre del SET
TABLES
set_lines_basic = lit_set_lines_basic
EXCEPTIONS
no_authority    = 1
set_is_broken   = 2
set_not_found   = 3
OTHERS          = 4.
 
IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
 
LOOP AT lit_set_lines_basic INTO lwa_set_lines_basic.
   gs_ktokk-sign   = 'I'.
   gs_ktokk-option = 'BT'.
   gs_ktokk-low    = lwa_set_lines_basic-from.
   gs_ktokk-high   = lwa_set_lines_basic-to.
   APPEND gs_ktokk TO gr_ktokk.
ENDLOOP.
 
ENDIF.

Links:

http://scn.sap.com/community/spanish/blog/2013/01/17/set-de-datos-en-sap-us%C3%A1ndolos-con-abap

Crear matchcode con F4IF_INT_TABLE_VALUE_REQUEST

Caso: Se desea agregar un matchcode manual en un campo de una dynpro.

Solución: En el ejemplo, se busca mostrar en el matchcode sólo los proveedores de un Grupo de cuentas acreedor específico (ZPEE). Usamos la función F4IF_INT_TABLE_VALUE_REQUEST.

1. Ingresamos para el campo en cuestión el código en la dynpro

2. En el module, agregamos el siguiente código (mejor si queda dentro de un form)
  TYPES: BEGIN OF ty_lfa1,
    lifnr          TYPE lfa1-lifnr,
    name1          TYPE lfa1-name1,
  END OF ty_lfa1.
 
  DATA: lt_lfa1      TYPE TABLE OF ty_lfa1,
        lw_lfa1      TYPE ty_lfa1,
        lv_lifnr     type lfa1-lifnr,
        i_return     LIKE ddshretval OCCURS 0 WITH HEADER LINE.
 
  REFRESH lt_lfa1[].
* Obtengo los servicios respectivos al contratista
  SELECT lifnr name1
    INTO CORRESPONDING FIELDS OF TABLE lt_lfa1
    FROM lfa1.
 
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'LIFNR'
      window_title    = 'Proveedores'
      value_org       = 'S'
    TABLES
      value_tab       = lt_lfa1
      return_tab      = i_return
    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.
  ELSE.
    READ TABLE i_return INDEX 1.
    MOVE i_return-fieldval TO lv_lifnr.
  ENDIF.
Categorías:ABAP/4
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.