viernes, 18 de marzo de 2016

BW - ABAP - CREACION FUENTE DE DATOS

Para la creación de fuente de datos desde R3/BW , accedemos a la TX. RSO2. Se puede realizar por VISTA / FUNCIÓN . A continuación un ejempo por función :

Codigo ABAP para levantar datos una tabla (BSIS) :

*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     REFERENCE(I_REQUNR) TYPE  SRSC_S_IF_SIMPLE-REQUNR
*"     REFERENCE(I_DSOURCE) TYPE  SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
*"     REFERENCE(I_MAXSIZE) TYPE  SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
*"     REFERENCE(I_INITFLAG) TYPE  SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
*"     REFERENCE(I_READ_ONLY) TYPE  SRSC_S_IF_SIMPLE-READONLY OPTIONAL
*"     REFERENCE(I_REMOTE_CALL) TYPE  SBIWA_FLAG DEFAULT
*"       SBIWA_C_FLAG_OFF
*"  TABLES
*"      E_T_DATA TYPE  ZBWT004 OPTIONAL
*"      I_T_SELECT TYPE  SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL
*"      I_T_FIELDS TYPE  SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL
*"  EXCEPTIONS
*"      NO_MORE_DATA
*"      ERROR_PASSED_TO_MESS_HANDLER
*"----------------------------------------------------------------------



*==================================================================
* DATA
*------------------------------------------------------------------
  TABLES bsis.

  DATA lt_bsid TYPE STANDARD TABLE OF zbwe002.

* Auxiliary Selection criteria structure
  DATAle_select LIKE LINE OF i_t_select .
  DATAle_zfit074 TYPE zfit074.
  DATAlv_format TYPE c.
  DATA lv_string(60TYPE c.
  DATA lv_delta TYPE c.
* Maximum number of lines for DB table
  STATICSle_if TYPE srsc_s_if_simple,
* counter
           lv_counter_datapakid TYPE sy-tabix,
* cursor
           lv_cursor TYPE cursor,
           lv_year TYPE gjahr.

  RANGES lr_belnr FOR bsis-belnr,
           lr_budat FOR bsis-budat,
           lr_gjahr FOR bsis-gjahr,
           lr_hkont FOR bsis-hkont,
           lr_bukrs FOR bsis-bukrs.
*==================================================================
* Constantes
*------------------------------------------------------------------
  CONSTANTS lc_belnr(5TYPE VALUE 'BELNR',
              lc_format(6TYPE VALUE 'FORMAT',
              lc_budat(5TYPE VALUE 'BUDAT',
              lc_hkont(5TYPE VALUE 'HKONT',
              lc_gjahr(5TYPE VALUE 'GJAHR',
              lc_bukrs(5TYPE VALUE 'BUKRS',
              lc_fuente1(10TYPE VALUE 'ZFU_BW_001',
              lc_fuente2(10TYPE VALUE 'ZFU_BW_005',
              lc_bhsa(4TYPE VALUE 'BHSA'.
*==================================================================
*          S T A R T - O F - S E L E C T I O N
*==================================================================
  DATA lv_gjahr(4TYPE n.

*TESTING
*LOG BUDAT (Para Verificacion)
  LOOP AT i_t_select  INTO le_select.
    CONCATENATE le_select-fieldnm '-' le_select-option '-' le_select-low '-' le_select-high INTO lv_string.
    CONDENSE lv_string.
    MESSAGE s002(zbw01WITH lv_string.
    CLEAR lv_string.
  ENDLOOP.
*FIN TESTING
*Ver DELTA
  IF i_dsource EQ lc_fuente2.
    lv_delta 'X'.
  ENDIF.
*BELNR
  LOOP AT i_t_select  INTO le_select WHERE fieldnm lc_belnr.
    MOVE-CORRESPONDING le_select TO lr_belnr.
    APPEND lr_belnr.
  ENDLOOP.

*GJAHR
  LOOP AT i_t_select  INTO le_select WHERE fieldnm lc_gjahr.
    MOVE-CORRESPONDING le_select TO lr_gjahr.
    lv_year le_select-low.
    APPEND lr_gjahr.
  ENDLOOP.

*BUDAT
  LOOP AT i_t_select  INTO le_select WHERE fieldnm lc_budat.
    MOVE-CORRESPONDING le_select TO lr_budat.
*---CORRECCION FECHA DELTA
    IF lv_delta EQ 'X'.
      IF lr_budat-low LT lr_budat-high.
        lr_budat-low lr_budat-low + 1.
      ENDIF.
    ENDIF.
    APPEND lr_budat.
  ENDLOOP.

*HKONT
  LOOP AT i_t_select  INTO le_select WHERE fieldnm lc_hkont.
    MOVE-CORRESPONDING le_select TO lr_hkont.
    APPEND lr_hkont.
  ENDLOOP.


*BUKRS
  LOOP AT i_t_select  INTO le_select WHERE fieldnm lc_bukrs.
    MOVE-CORRESPONDING le_select TO lr_bukrs.
    APPEND lr_bukrs.
  ENDLOOP.
*Sociedad
  IF lr_bukrs[] IS INITIAL.
    lr_bukrs-sign 'I'.
    lr_bukrs-option 'EQ'.
    lr_bukrs-low lc_bhsa.
    APPEND lr_bukrs.
  ENDIF.

*Cuenta por default
  IF lr_hkont[] IS INITIAL.
    SELECT SINGLE FROM zfit074
      INTO le_zfit074
      WHERE sociedad IN lr_bukrs AND
            programa EQ sy-repid AND
            campo EQ lc_hkont.

    IF sy-subrc EQ 0.
      MOVE-CORRESPONDING le_zfit074 TO lr_hkont.
      lr_hkont-option le_zfit074-c_option.
    ENDIF.

    APPEND lr_hkont.
  ENDIF.

*LOG BUDAT (Para Verificacion)
  CONCATENATE lr_budat-sign '-' lr_budat-option '-' lr_budat-low '-' lr_budat-high INTO lv_string.
  CONDENSE lv_string.
  MESSAGE s002(zbw01WITH lv_string.
  CLEAR lv_string.

*---------------------------------------
*Asignar Ejercicio si no esta completo
  IF lr_gjahr[] IS INITIAL.
    READ TABLE lr_budat INDEX 1.
    IF sy-subrc EQ 0"GDP 13.01.2016
      lv_gjahr lr_budat-low(4).
      lr_gjahr-sign 'I'.
      lr_gjahr-option 'BT'.
      lr_gjahr-high lv_gjahr .
      lv_gjahr lv_gjahr 1.
      lr_gjahr-low lv_gjahr.
      APPEND lr_gjahr.
    ENDIF."GDP 13.01.2016
  ENDIF.

*---LOG PARAMETROS ENTRADA
*LOG BUDAT (Para Verificacion)
  READ TABLE lr_budat INDEX 1.
  IF sy-subrc EQ 0.
    CONCATENATE lr_budat-sign '-' lr_budat-option '-' lr_budat-low '-' lr_budat-high INTO lv_string.
    CONDENSE lv_string.
    MESSAGE s002(zbw01WITH lv_string.
  ENDIF.
*LOG GJAHR (Para Verificacion)
  READ TABLE lr_gjahr INDEX 1.
  IF sy-subrc EQ 0.
    CONCATENATE lr_gjahr-sign '-' lr_gjahr-option '-' lr_gjahr-low '-' lr_gjahr-high INTO lv_string.
    CONDENSE lv_string.
    MESSAGE s002(zbw01WITH lv_string.
  ENDIF.
*LOG BUKRS (Para Verificacion)
  READ TABLE lr_bukrs INDEX 1.
  IF sy-subrc EQ 0.
    CONCATENATE lr_bukrs-sign '-' lr_bukrs-option '-' lr_bukrs-low '-' lr_bukrs-high INTO lv_string.
    CONDENSE lv_string.
    MESSAGE s002(zbw01WITH lv_string.
  ENDIF.
* Initialization mode (first call by SAPI) or data transfer mode
* (following calls) ?
  IF i_initflag sbiwa_c_flag_on.

    CASE i_dsource.
      WHEN lc_fuente1.
      WHEN lc_fuente2.
      WHEN OTHERS.
        IF 2MESSAGE e009(r3)ENDIF.
* this is a typical log call. Please write every error message like this
*        log_write 'E' "message type
*        'R3' "message class
*        '009' "message number
*        i_dsource "message variable 1
*        ' '. "message variable 2

        RAISE error_passed_to_mess_handler.
    ENDCASE.

    APPEND LINES OF i_t_select TO le_if-t_select.
* Fill parameter buffer for data extraction calls
    le_if-requnr i_requnr.
    le_if-dsource i_dsource.
    le_if-maxsize i_maxsize.
* Fill field list table for an optimized select statement
* (in case that there is no 1:1 relation between InfoSource fields
* and database table fields this may be far from beeing trivial)
    APPEND LINES OF i_t_fields TO le_if-t_fields.
  ELSE"Initialization mode or data extraction ?


* First data package -> OPEN CURSOR
*    IF lv_delta IS INITIAL. "FULL
*    IF lv_counter_datapakid = 0.
*
*      OPEN CURSOR WITH HOLD lv_cursor FOR
*
**BSIS
**--->Carga FULL
*
*      SELECT  bukrs augdt
*              augbl zuonr gjahr belnr buzei
*              budat bldat waers xblnr
*              shkzg gsber mwskz dmbtr
*              wrbtr hkont kostl fipos
*              fistl fkber aufnr
*              FROM bsis
*              WHERE belnr IN lr_belnr AND
*                    budat IN lr_budat AND
*                    hkont IN lr_hkont AND
*                    gjahr IN lr_gjahr AND
*                    bukrs IN lr_bukrs.
*
*    ENDIF.
*
*
*    FETCH NEXT CURSOR lv_cursor
*    APPENDING CORRESPONDING FIELDS
*    OF TABLE e_t_data
*    PACKAGE SIZE le_if-maxsize.
*
*    ELSE.
*--->Carga DELTA
    IF lv_counter_datapakid 0.

      OPEN CURSOR WITH HOLD lv_cursor FOR
*BSIS
        SELECT  bsis~bukrs bsis~augdt
                bsis~augbl bsis~zuonr bsis~gjahr bsis~belnr bsis~buzei
                bsis~budat bsis~bldat bsis~waers bsis~xblnr
                bsis~shkzg bsis~gsber bsis~mwskz bsis~dmbtr
                bsis~wrbtr bsis~hkont bsis~kostl bsis~fipos
                bsis~fistl bsis~fkber bsis~aufnr
                FROM bkpf INNER JOIN bsis
                ON bkpf~bukrs bsis~bukrs AND
                   bkpf~belnr bsis~belnr AND
                   bkpf~gjahr bsis~gjahr
                WHERE bkpf~belnr IN lr_belnr AND
*                        budat IN lr_budat AND
                      bkpf~cpudt IN lr_budat AND
                      bsis~hkont IN lr_hkont AND
                      bkpf~gjahr IN lr_gjahr AND
                      bkpf~bukrs IN lr_bukrs.
*---

    ENDIF.


    FETCH NEXT CURSOR lv_cursor
    APPENDING CORRESPONDING FIELDS
    OF TABLE e_t_data
    PACKAGE SIZE le_if-maxsize.

*  ENDIF."DELTA

    IF sy-subrc <> 0.
      CLOSE CURSOR lv_cursor.
      RAISE no_more_data.
    ENDIF.
    lv_counter_datapakid lv_counter_datapakid + 1.

  ENDIF"Initialization mode or data extraction ?


ENDFUNCTION.


No hay comentarios:

Publicar un comentario