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