Ejecutar un comando en el application server

Con la sentencia CALL 'SYSTEM' ID 'COMMAND' ejecutamos un comando del servidor. El siguiente ejemplo creaba un determinado directorio en el mismo.

CONCATENATE 'mkdir' ' ' v_ruta ls_bil_invoice-HD_GEN-PAYER '\' ls_bil_invoice-HD_ORG-SALESORG '\' ls_bil_invoice-HD_GEN-BIL_DATE+4(2) '\'
INTO l_text.

CALL 'SYSTEM' ID 'COMMAND' FIELD l_text.

Crear ComboBox en reportes

En SAP tenemos el Matchcode, pero muchas veces es tedioso ya que tarda. De esta forma tendremos un combobox.

El parámetro ps_parm tendrá la opción elejida.

 

TYPE-POOLS: vrm.
DATA: name TYPE vrm_id, list TYPE vrm_values, value LIKE LINE OF list.
PARAMETERS: ps_parm(10) AS LISTBOX VISIBLE LENGTH 10.
AT SELECTION-SCREEN OUTPUT.
  name = 'PS_PARM'.
  value-key = '1'. value-text = 'Linea 1'. APPEND value TO list.
  value-key = '2'. value-text = 'Linea 2'. APPEND value TO list.
  value-key = '3'. value-text = 'Linea 3'. APPEND value TO list.
  value-key = '4'. value-text = 'Linea 4'. APPEND value TO list.
  value-key = '5'. value-text = 'Linea 5'. APPEND value TO list.
  value-key = '6'. value-text = 'Linea 6'. APPEND value TO list.
  CALL FUNCTION 'VRM_SET_VALUES'
       EXPORTING
            id     = name
            values = list.
START-OF-SELECTION.
  WRITE: / 'Parametros : ', ps_parm.

Bug - Smartforms sin valores en la interfaz

A veces suele suceder que al modificar un smartforms, al problarlo hay datos que desaparecen como por arte de magia. Esto es un bug, por no usar el verificar y solamente el activar.

 

Si sucede esto, Verificar y luego Activar. Y se soluciona.

Creación de IDOCs

El menu WEDI e SALE sirve para la administración de IDOCs.

 

En la WE20 creamos el IDOC base. Un IDOC está formado por segmentos, con la estructura especifica de los campos a transladar, suele ser una de cabecera y otra posición.

 

Con la WE81, luego debemos crear el tipo de mensaje. Esto es el evento que trasnsmite en si al IDOC un tipo de mensaje puede tener varios IDOCs base (sería ALGO similar a las clases de mensajes en las impresiones en SAP).

 

Cuando tenemos el IDOC y el tipo de mensaje debemos relacionarlos para unirlos usamos la WE82.

En la trx BD64 debemos ingresar el tipo de mensaje creado en el sistema lógico y enlace correspondiente. (todo este seteo de enlaces todavia no lo vi, solamente agregue un IDOC a un ambiente ya creado.

 

En la WE02 podemos visualizar los IDOCs, ves su estado y contenido.

 

Dejo el código fuente de la parte de envió de IDOC de un programa que ya tiene en la tabla TI_HEADER los datos de cabecera y en TI_TABLE los datos de las posiciones.

 

form enviar_idocs .
DATA:        edidd_rec  TYPE edidd.

v_msgtype = 'ZEXTBNK'.  "Nombre de tipo de mensaje
v_idoctp  = 'ZEXTBANK'.  "Nombre de IDOC base
CLEAR v_cont.

* Por cada registro en la cabecera
  LOOP AT ti_header. "INTO header_rec.

    ADD 1 TO v_cont.
    MOVE 'ZFII039_HS' TO v_segnam.

    MOVE: ti_header-bukrs TO v_ZFII039_H-bukrs,
          ti_header-DISKB TO v_ZFII039_H-DISKB.

    CLEAR edidd_rec.
    edidd_rec-segnum = v_cont.
    edidd_rec-segnam = v_segnam.
    edidd_rec-mandt  = sy-mandt.
    edidd_rec-sdata  = v_ZFII039_H.
    APPEND edidd_rec TO it_edidd.

    LOOP AT ti_table WHERE bukrs = ti_header-bukrs
                       AND diskb = ti_header-diskb.

      ADD 1 TO v_cont.
      v_segnam       = 'ZFII039_DS'.

      MOVE: ti_table-bukrs TO v_ZFII039_D-bukrs,
            ti_table-diskb TO v_ZFII039_D-diskb,
            ti_table-azdat TO v_ZFII039_D-azdat,
            ti_table-aznum TO v_ZFII039_D-aznum,
            ti_table-waers TO v_ZFII039_D-waers,
            ti_table-esbtr TO v_ZFII039_D-esbtr.

      edidd_rec-segnum = v_cont.
      edidd_rec-segnam = v_segnam.
      edidd_rec-mandt  = sy-mandt.
      edidd_rec-sdata  = v_ZFII039_D.
      APPEND edidd_rec TO it_edidd.

    ENDLOOP.

    CLEAR v_edidc.
    v_edidc-mestyp = v_msgtype.
    v_edidc-idoctp = v_idoctp.
    CLEAR v_edidc-rcvpfc.
    CLEAR v_edidc-sndpfc.
    CLEAR v_cont.

    CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
      EXPORTING
        master_idoc_control            = v_edidc
      TABLES
        communication_idoc_control     = it_edidc
        master_idoc_data               = it_edidd
      EXCEPTIONS
        error_in_idoc_control          = 01
        error_writing_idoc_status      = 02
        error_in_idoc_data             = 03
        sending_logical_system_unknown = 04.

    REFRESH it_edidc.
    REFRESH it_edidd.

  ENDLOOP. "Por cada registro en la cabecera
endform.                    " enviar_idocs

 

Declaraciones

DATA: v_edidc    LIKE edidc,
      v_msgtype  LIKE tbdme-mestyp,
      v_segnam   LIKE edidd-segnam,
      v_idoctp   LIKE bdaledc-idoctp,
      v_cont     TYPE i.

* Variables para ALV
DATA:
  lv_fieldcat  TYPE slis_t_fieldcat_alv,
  lv_layout    TYPE slis_layout_alv,
  lv_repid     TYPE sy-repid,
  lv_sorted    TYPE slis_t_sortinfo_alv,
  t_events     TYPE slis_t_event,         " Eventos.
  gt_header    TYPE slis_t_listheader,    " Tabla con el Titulo
  gt_sort      TYPE slis_t_sortinfo_alv,  "tabla con orden y subtot
  wa_header    TYPE slis_listheader.      " Work Area con el Titulo

TYPES: BEGIN OF TYPE_FEBKO,
         HKONT TYPE FEBKO-HKONT, "Cuenta
         BUKRS TYPE FEBKO-BUKRS, "Sociedad
         AZDAT TYPE FEBKO-AZDAT, "Fecha extracto
         AZNUM TYPE FEBKO-AZNUM, "Numero extracto
         WAERS TYPE FEBKO-WAERS, "Moneda
         ESBTR TYPE FEBKO-ESBTR, "Importe
         ESVOZ TYPE FEBKO-ESVOZ, "Debe/Haber
         HBKID TYPE FEBKO-HBKID, "Banco
         HKTID TYPE FEBKO-HKTID, "Cuenta
         EFART TYPE FEBKO-EFART, "Tipo extracto M o E
         DISKB TYPE T035D-DISKB, "Codigo
       END OF TYPE_FEBKO.

TYPES: BEGIN OF TYPE_HEADER,
         BUKRS TYPE FEBKO-BUKRS, "Sociedad
         DISKB TYPE T035D-DISKB, "Codigo
       END OF TYPE_HEADER.

DATA: TI_FEBKO TYPE STANDARD TABLE OF TYPE_FEBKO.
DATA: TI_FEBKO_AUX TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_TABLE TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_HEADER TYPE STANDARD TABLE OF TYPE_HEADER WITH HEADER LINE.

DATA: WA_FEBKO TYPE TYPE_FEBKO.
DATA: WA_FEBKO_AUX TYPE TYPE_FEBKO.

DATA: v_ZFII039_H LIKE ZFII039_H,
      v_ZFII039_D LIKE ZFII039_D.

DATA: it_edidd TYPE STANDARD TABLE OF edidd,
           it_edidc TYPE STANDARD TABLE OF edidc.

FIMA_DAYS_AND_MONTHS_AND_YEARS

Esta función nos devuelve la diferencia en dias, meses y años entre dos fechas.

    CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'       
      EXPORTING                                          
        i_date_from          = s_badat2-low               
        i_date_to            = s_badat2-high              
     IMPORTING                                           
        e_days               = gv_dias2                 
*       E_MONTHS             =                          
*       E_YEARS              =                          

Refrescar un ALV luego de una Ejecuación de proceso que modifica la tabla interna

Cuando en un ALV tenemos algún botón que ejecute un Batch Input o algún, proceso al Salvar y la información de la tabla interna del ALV debe refrescarse, para reflejar el proceso ejecutado, podemos usar este peqúeño truco.

 

*&---------------------------------------------------------------------*
*&      Form  PF_USER_COMMAND
*&---------------------------------------------------------------------*
FORM user_command1 USING p_okcode LIKE sy-ucomm        "ok-code
                       w_selfield TYPE slis_selfield. "estruct. de linea
* Se selecciona que el ALV se actualice al mostrarse.

w_selfield-refresh = 'X'.

CASE p_okcode.

  WHEN '&DATA_SAVE'.
    PERFORM arma_datos_bapi_1.
      IF g_cant_error IS INITIAL. "ROGI08102008
        PERFORM ejecutar_bapi1.
      ENDIF.                      "ROGI08102008
ENDCASE.


ENDFORM.                    " PF_STATUS

En el USER_COMMAND Form agregamos lo que esta en negrita, esto hace que al ejecutar un botón del ALV se refresque la tabla interna, por lo tanto podemos directamente modificar la tabla interna a nuestro gusto que se vera refrejado en el ALV.

IWO1_ORDER_BADI - Badi de IW31,IW32

Badi que se dispara en la tx IW31 e IW32.

MD_PEGGING_NODIALOG - Ordenes que posee una Solped

Devuelve las ordenes que están asociadas a una solped.

 

Ej:Bloque en el cual por cada solped encontrada para determinado Material-Centro busco las ordenes que están asociadas a esa solped.

DATA: lt_mdpsx TYPE STANDARD TABLE OF mdps,
      ls_mdpsx TYPE mdps,
      LT_MDRQX TYPE STANDARD TABLE OF mdrq,
      ls_mdrqx TYPE mdrq,
      l_fixkz TYPE EBAN-fixkz,
      l_msg(100),
      l_solped TYPE MDPS-DEL12,
      l_aufnr TYPE AUFK-AUFNR.

*    *** Veo todas las solicitudes de pedidos en las que se encuentra el componente
CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
EXPORTING
        matnr                          = ls_resbd-MATNR
        werks                          = ls_resbd-WERKS
TABLES
        MDPSX                          = lt_MDPSX[]
EXCEPTIONS
        MATERIAL_PLANT_NOT_FOUND       = 1
        PLANT_NOT_FOUND                = 2
OTHERS                         = 3.
IF sy-subrc = 0.
*    *** Veo todas las ordenes asociadas con las solpeds.
LOOP AT lt_MDPSX INTO ls_mdpsx WHERE DELKZ = 'BA' AND FIX01 = 'X'.
CLEAR l_solped.
      l_solped = ls_mdpsx-DELNR.
CALL FUNCTION 'MD_PEGGING_NODIALOG'
EXPORTING
          edelkz                      = 'BA'
          edelnr                      = l_solped "lt_MDPSX-DELNR
          EDELPS                      = ls_mdpsx-DELPS
          ematnr                      = ls_resbd-MATNR
          ewerks                      = ls_resbd-WERKS
tables
          imdrqx                      = LT_MDRQX[]
EXCEPTIONS
         ERROR                       = 1
         NO_REQUIREMENTS_FOUND       = 2
         ORDER_NOT_FOUND             = 3
OTHERS                      = 4.

MD_STOCK_REQUIREMENTS_LIST_API - Lista de Solped por Componente

Le pasamos Material y Centro y nos devuelve todas las Solped en las que ese componente se encuentra.

 

DATA: lt_mdpsx TYPE STANDARD TABLE OF mdps,
      ls_mdpsx TYPE mdps.

* *** Veo todas las solicitudes de pedidos en las que se encuentra el componente
CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
EXPORTING
        matnr                          = ls_resbd-MATNR
        werks                          = ls_resbd-WERKS
TABLES
        MDPSX                          = lt_MDPSX[]
EXCEPTIONS
        MATERIAL_PLANT_NOT_FOUND       = 1
        PLANT_NOT_FOUND                = 2
OTHERS                         = 3.

Extraer estructura de pantalla desde una BADI

Con esta forma, peculiar, podemos levantar datos de pantalla. No me puse a investigarlo a fondo porque no tenía tiempo. Según tengo entendido tmb sirve para levantar hasta tablas internas.

En este caso levanto la estructura resbd de la tx IW32.

 

DATA:l_field(60)         TYPE C VALUE '(SAPLCOIH)RESBD',
          ls_resbd                 TYPE resbd.

FIELD-SYMBOLS: <fs_resbd>          TYPE ANY.
*      Fetching the Component Item from the Screen. This is for read-only
*      purpose and content should not be changed.
ASSIGN (l_field) to <fs_resbd>.
if sy-subrc eq 0.
      ls_resbd = <fs_resbd>.
      UNASSIGN <fs_resbd>.
endif.

Manejo de Mensajes en BSP

El elemento a usar es <phtmlb:messageBar>

<phtmlb:messageBar id = "messageBar"
                             type = "<%= gv_severity_str %>"
                              text = "<%= gv_message %>"/>

TYPE puede ser ERROR/WARNING/OK/STOP/LOADING/NONE/TEXT.

ERROR-STOP:

image 

WARNING:

image

OK:

image

LOADING: se mueve circularmente

image 

TEXT: Solo sale texto no se muestra icono.

image

NONE:

No sale el display por pantalla.

 

En el inputProcessing donde deseemos  setear o cambiar el mensaje o Tipo.

gv_message = 'Usuario encontrado'.
gv_severity_str = 'OK'.

Estructura SFSY

Similar a la estructura SYST posee información propia del smartforms que podemos ver en tiempo de ejecución.

PAGE
Número/Cantidad páginas

FORMPAGES
Ctd.total páginas formularios

JOBPAGES
Ctd.total páginas job de salida

COPYCOUNT
Contador de copias ( 1 = original, 2 = 1ª copia, ...)

COPYCOUNT0
Contador de copias (0 = original, 1 = 1ª copia...)

DATE
Fecha y hora, fecha (servidor de aplicaciones) actual

TIME
Fecha y hora, hora (servidor de aplicaciones) actual

SUBRC
Código retorno, código retorno tras sentencias ABAP

USERNAME
Sistema SAP, nombre de acceso del usuario

PAGENAME
Nombre página + Variante

WINDOWNAME
Nombre ventana + Variante

XSF
Salida XSF activa/inactiva

XDF
Smart Forms SAP: Salida activa XDF

XDF2
Smart Forms SAP: Salida activa XDF

Como buscar BADIs

Para buscar las badis que pasan en algún momento dado. Debemos poner un break point en la Clase. SE24 -> CL_EXITHANDLER

Doble click en el método GET_INSTANCE.

Poner un break en la llamada del metodo get_class_name_by_interface.

METHOD get_instance.

  CLASS cl_badi_flt_data_trans_and_db DEFINITION LOAD.

  DATA: exit TYPE REF TO object,
        type_ref TYPE REF TO cl_abap_typedescr,
        class_name TYPE seoclsname,
        abs_type_classname TYPE string,
        def_impl TYPE seex_boolean VALUE seex_false.

  CALL METHOD cl_exithandler=>get_class_name_by_interface
    EXPORTING
      instance                      = instance
    IMPORTING
      class_name                    = class_name
    CHANGING
      exit_name                     = exit_name
    EXCEPTIONS
      no_reference                  = 1
      no_interface_reference        = 2
      no_exit_interface             = 3
      data_incons_in_exit_managem   = 4
      class_not_implement_interface = 5
      OTHERS                        = 6.

Cuando salte el break point hay que ver el valor de exit_name, ahi pasarán todos los nombres de las BADIS. en la SE18 encontramos esos nombres, en la SE19 se implementa.

 

Otra forma para buscar las BADI, es buscando por Paquete (clase de desarrollo) obtener el paquete de la tx que deseamos en la se93 -> visualizar tomamos el paquete y en la se18 después en la búsqueda ampliada buscamos por paquete y nos devuelve todas las BADIS del paquete.

Creación de IDOCs

El menu WEDI e SALE sirve para la administración de IDOCs.

 

En la WE20 creamos el IDOC base. Un IDOC está formado por segmentos, con la estructura especifica de los campos a transladar, suele ser una de cabecera y otra posición.

 

Con la WE81, luego debemos crear el tipo de mensaje. Esto es el evento que trasnsmite en si al IDOC un tipo de mensaje puede tener varios IDOCs base (sería ALGO similar a las clases de mensajes en las impresiones en SAP).

 

Cuando tenemos el IDOC y el tipo de mensaje debemos relacionarlos para unirlos usamos la WE82.

En la trx BD64 debemos ingresar el tipo de mensaje creado en el sistema lógico y enlace correspondiente. (todo este seteo de enlaces todavia no lo vi, solamente agregue un IDOC a un ambiente ya creado.

 

En la WE02 podemos visualizar los IDOCs, ves su estado y contenido.

 

Dejo el código fuente de la parte de envió de IDOC de un programa que ya tiene en la tabla TI_HEADER los datos de cabecera y en TI_TABLE los datos de las posiciones.

 

form enviar_idocs .
DATA:        edidd_rec  TYPE edidd.

v_msgtype = 'ZEXTBNK'.  "Nombre de tipo de mensaje
v_idoctp  = 'ZEXTBANK'.  "Nombre de IDOC base
CLEAR v_cont.

* Por cada registro en la cabecera
  LOOP AT ti_header. "INTO header_rec.

    ADD 1 TO v_cont.
    MOVE 'ZFII039_HS' TO v_segnam.

    MOVE: ti_header-bukrs TO v_ZFII039_H-bukrs,
          ti_header-DISKB TO v_ZFII039_H-DISKB.

    CLEAR edidd_rec.
    edidd_rec-segnum = v_cont.
    edidd_rec-segnam = v_segnam.
    edidd_rec-mandt  = sy-mandt.
    edidd_rec-sdata  = v_ZFII039_H.
    APPEND edidd_rec TO it_edidd.

    LOOP AT ti_table WHERE bukrs = ti_header-bukrs
                       AND diskb = ti_header-diskb.

      ADD 1 TO v_cont.
      v_segnam       = 'ZFII039_DS'.

      MOVE: ti_table-bukrs TO v_ZFII039_D-bukrs,
            ti_table-diskb TO v_ZFII039_D-diskb,
            ti_table-azdat TO v_ZFII039_D-azdat,
            ti_table-aznum TO v_ZFII039_D-aznum,
            ti_table-waers TO v_ZFII039_D-waers,
            ti_table-esbtr TO v_ZFII039_D-esbtr.

      edidd_rec-segnum = v_cont.
      edidd_rec-segnam = v_segnam.
      edidd_rec-mandt  = sy-mandt.
      edidd_rec-sdata  = v_ZFII039_D.
      APPEND edidd_rec TO it_edidd.

    ENDLOOP.

    CLEAR v_edidc.
    v_edidc-mestyp = v_msgtype.
    v_edidc-idoctp = v_idoctp.
    CLEAR v_edidc-rcvpfc.
    CLEAR v_edidc-sndpfc.
    CLEAR v_cont.

    CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
      EXPORTING
        master_idoc_control            = v_edidc
      TABLES
        communication_idoc_control     = it_edidc
        master_idoc_data               = it_edidd
      EXCEPTIONS
        error_in_idoc_control          = 01
        error_writing_idoc_status      = 02
        error_in_idoc_data             = 03
        sending_logical_system_unknown = 04.

    REFRESH it_edidc.
    REFRESH it_edidd.

  ENDLOOP. "Por cada registro en la cabecera
endform.                    " enviar_idocs

 

Declaraciones

DATA: v_edidc    LIKE edidc,
      v_msgtype  LIKE tbdme-mestyp,
      v_segnam   LIKE edidd-segnam,
      v_idoctp   LIKE bdaledc-idoctp,
      v_cont     TYPE i.

* Variables para ALV
DATA:
  lv_fieldcat  TYPE slis_t_fieldcat_alv,
  lv_layout    TYPE slis_layout_alv,
  lv_repid     TYPE sy-repid,
  lv_sorted    TYPE slis_t_sortinfo_alv,
  t_events     TYPE slis_t_event,         " Eventos.
  gt_header    TYPE slis_t_listheader,    " Tabla con el Titulo
  gt_sort      TYPE slis_t_sortinfo_alv,  "tabla con orden y subtot
  wa_header    TYPE slis_listheader.      " Work Area con el Titulo

TYPES: BEGIN OF TYPE_FEBKO,
         HKONT TYPE FEBKO-HKONT, "Cuenta
         BUKRS TYPE FEBKO-BUKRS, "Sociedad
         AZDAT TYPE FEBKO-AZDAT, "Fecha extracto
         AZNUM TYPE FEBKO-AZNUM, "Numero extracto
         WAERS TYPE FEBKO-WAERS, "Moneda
         ESBTR TYPE FEBKO-ESBTR, "Importe
         ESVOZ TYPE FEBKO-ESVOZ, "Debe/Haber
         HBKID TYPE FEBKO-HBKID, "Banco
         HKTID TYPE FEBKO-HKTID, "Cuenta
         EFART TYPE FEBKO-EFART, "Tipo extracto M o E
         DISKB TYPE T035D-DISKB, "Codigo
       END OF TYPE_FEBKO.

TYPES: BEGIN OF TYPE_HEADER,
         BUKRS TYPE FEBKO-BUKRS, "Sociedad
         DISKB TYPE T035D-DISKB, "Codigo
       END OF TYPE_HEADER.

DATA: TI_FEBKO TYPE STANDARD TABLE OF TYPE_FEBKO.
DATA: TI_FEBKO_AUX TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_TABLE TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_HEADER TYPE STANDARD TABLE OF TYPE_HEADER WITH HEADER LINE.

DATA: WA_FEBKO TYPE TYPE_FEBKO.
DATA: WA_FEBKO_AUX TYPE TYPE_FEBKO.

DATA: v_ZFII039_H LIKE ZFII039_H,
      v_ZFII039_D LIKE ZFII039_D.

DATA: it_edidd TYPE STANDARD TABLE OF edidd,
           it_edidc TYPE STANDARD TABLE OF edidc.

FIMA_DAYS_AND_MONTHS_AND_YEARS

Esta función nos devuelve la diferencia en dias, meses y años entre dos fechas.




    CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'       
      EXPORTING                                          
        i_date_from          = s_badat2-low               
        i_date_to            = s_badat2-high              
     IMPORTING                                           
        e_days               = gv_dias2                 
*       E_MONTHS             =                          
*       E_YEARS              =                          


BAPI_COMPANYCODE_GET_PERIOD

Esta función nos sirve para obtener el ejercicio desde una fecha dada, ya que algunas empresas no usan el año fiscal similar al calendario solar.

Parámetros:

  1. Sociedad
  2. Fecha

Base de datos lógicas - HR

Las base de datos lógicas es una forma mas rápida de obtener datos, la base de datos lógica se compone de la pantalla de selección y de los datos en si. La metodología de búsqueda es de árbol.

En la SE36 podemos administrar la base de datos lógicas.

Dentro del código fuente nos damos cuenta del uso de base de datos lógicas al ver la instrucción GET.

GET PERNR.

Esta instrucción obtiene los datos y los carga en una estructura. Si nosotros queremos filtrarlos por algún campo de su estructura debemos usar la sentencia CHECK.

Dentro de una lógica de BDL. Podemos extrae información de los infotipos usando el comando PROVIDE - ENDPROVIDE. (similar al select común y corriente)

Para usar este comando hay que declarar los infotipos con la sentencia INFOTYPES.

INFOTYPES:  0001,  "Asignación Organizacional
                    0002.  "Datos de Personal

 

 

*Te va traiendo todos los registros del infotipo 0 comprendidos entre pn-begda y pn-endda. (Base de datos logica PNP)
PROVIDE * FROM p0000 BETWEEN pn-begd AND pn-endda.

...
ENDPROVIDE.

*Te trae los registros del inotipo 1 y 8 entre '19000101' '99991231' con cada corte.
PROVIDE gsber abkrs FROM p0001 FROM p0008 BETWEEN '19000101' AND '99991231'.
ENDPROVIDE.

*Esta macro te deja en la cabezera el ultimo registro del infotipo 1 comprendido entre esas fechas
rp-provide-from-last p0001 space pn-begda pn-endda.

*Para validar la correcta ejecusión de esta sentencia se usa:

IF PNP-SW-FOUND EQ '1'. "encontró un registro

...

ENDIF.


*Esta macro te deja en la cabezera el prime registro del infotipo 1 comprendido entre esas fechas
rp-provide-from-last p0001 space pn-begda pn-endda.

 

Ejemplo de LDB

*Start of Selection Event
*========================
START-OF-SELECTION.
* "Retrieve Infotypes
GET PERNR.
* "Get last IT 0000 record
RP-PROVIDE-FROM-LAST P0000 SPACE PN-BEGDA PN-ENDDA.
* "Check employee is active
CHECK P0000-STAT2 IN PNPSTAT2.
* "Retrieve Employee Name
RP-PROVIDE-FROM-LAST P0002 SPACE PN-BEGDA PN-ENDDA.
*
format color col_heading.
Write : / 'Name : ', p0002-inits(4), p0002-nachn(10), 80 '*',
/ 'NINO : ', p0002-perid, 80 '*',
/ 'Birth Date : ', p0002-gbdat, 80 '*'.
skip 1.
format reset.
*
perform process_repeating_group.
*
*End of Selection Event
*========================
END-OF-SELECTION.

Validaciones - OB28

Las validaciones están regidas por Sociedad y por evento.

Evento:

  1. Cabecera de documento
  2. Posición de documento
  3. Documento Completo

image

Grado de activ. significa si está activo o no (1 = ACTIVO)

image

Ahí vemos todos los pasos, cada uno con sus respectivas condiciones, verificaciones y mensajes.

En el caso de necesitar usar un user exit, en la solapa user exit. seleccionamos una y le damos al botón de visualizar código.

Necesitamos crear el modulo dentro del siguiente FORM

*----------------------------------------------------------------------*
*       FORM GET_EXIT_TITLES                                           *
*----------------------------------------------------------------------*
*       returns name and title of all available standard-exits         *
*       every exit in this formpool has to be added to this form.      *
*       You have to specify a parameter type in order to enable the    *
*       code generation program to determine correctly how to          *
*       generate the user exit call, i.e. how many and what kind of    *
*       parameter(s) are used in the user exit.                        *
*       The following parameter types exist:                           *
*                                                                      *
*       TYPE                Description              Usage             *
*    ------------------------------------------------------------      *
*       C_EXIT_PARAM_NONE   Use no parameter         Subst. and Valid. *
*                           except B_RESULT                            *
*       C_EXIT_PARAM_CLASS  Use a type as parameter  Subst. and Valid  *
*----------------------------------------------------------------------*
*  -->  EXIT_TAB  table with exit-name and exit-titles                 *
*                 structure: NAME(5), PARAM(1), TITEL(60)
*----------------------------------------------------------------------*
FORM get_exit_titles TABLES etab.

  DATA: BEGIN OF exits OCCURS 50,
          name(5)   TYPE c,
          param     LIKE c_exit_param_none,
          title(60) TYPE c,
        END OF exits.
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
*        IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM:         *
*  EXITS-NAME  = 'U101'.
*  EXITS-PARAM = C_EXIT_PARAM_CLASS.
*  EXITS-TITLE = TEXT-100.                 "Posting date check
*  APPEND EXITS.

  exits-name  = 'U100'.
  exits-param = c_exit_param_none.        "Complete data used in exit.
  exits-title = text-101.                 "Posting date check
  APPEND exits.

REFRESH etab.
  LOOP AT exits.
    etab = exits.
    APPEND etab.
  ENDLOOP.

ENDFORM.                    "GET_EXIT_TITLES

 

Ahora creamos la subrutina U100

*---------------------------------------------------------------------*
*      form U941                                                      *
*---------------------------------------------------------------------*
*  Valida las retenciones de la clase de doc.
*---------------------------------------------------------------------*
* <--  b_result    t = true  f = false                                *
*---------------------------------------------------------------------*
FORM U941  USING B_RESULT.
DATA: l_ind TYPE WITH_ITEM-WT_WITHCD VALUE 'RB'.

  B_RESULT = B_TRUE.
  SELECT SINGLE * FROM WITH_ITEM
          WHERE WT_WITHCD = l_ind.

  IF sy-subrc <> 0.
    B_RESULT = B_FALSE.
* Mensaje de error
    MESSAGE E067(z1) WITH BKPF-BLART l_ind.
  Endif.
CLEAR WITH_ITEM.
ENDFORM.

Si necesitamos crear SET ( rangos o juegos de datos) los creamos con la transacción GS01

Creamos el SET, guardamos y manualmente hay que agregarlo a Orden de transporte al igual que las validaciones.

Para transportar éstas hay que posicionarnos sobre la validación, Menu Validación -> Transportar.

Creación de BTE

Tx FIBF

Investigar sobre los procesos,ésta opción nos tira todos los procesos.

image

Luego de elegir el que nos sirve hacemos click en Módulo funciones tipo.

image

Esto nos lleva a la se37 con el sample del proceso, el cual debemos copiar para ejecutar el nuestro con el código fuente que deseemos, pero antes debemos crear el "Producto" (sería algo así como el proyecto de ampliación de la CMOD)

image

Cuando creemos un producto nuevo, debemos tildar el checkbox que indica si está activado o no.

image

Luego creamos el "Módulo de proceso".

image

Acá es donde debemos poner la copia de la función ejemplo:

  1. Ponemos el proceso (ampliación que debemos usar).
  2. Ponemos la función de copia creada del original con nuestro código.
  3. Elejimos el producto (el proyecto de ampliación creado anteriormente).

image

A modo informativo dejo en ingles las diferencias entre BADI y BTE y como buscar BTEs

Difference between BADI’s and BTE’s:
The concepts behind the Business Add-Ins enhancement technique and Open FI are basically the same. However, the two enhancement techniques do differ from each other in the following points:
Open FI can only be used to make program enhancements, that is, you can only enhance source code using Open FI. You cannot enhance user interface elements with Open FI like you can with Business Add-Ins.
Open FI assumes that enhancement will only take place on three levels (SAP - partners - customers), whereas with Business Add-Ins you can create and implement enhancements in as many software layers as you like.
Open FI uses function modules for program enhancements. With Business Add-Ins, ABAP Objects are used enhance programs.


Finding Business Transaction Events:
SAP Reference IMG -> Financial Accounting -> Financial Accounting Global Settings -> Business Transaction Events
• For Publish and Subscribe Interfaces, Environment - > Info system (P/S)
• For Process Interfaces, Environment -> Infosystem(Processes)
Find for Character String “OPEN_FI_PERFORM” in source code