viernes, 1 de julio de 2016

CONVERT ASCII TO CHAR - ABAP


REPORT  ztest20.

DATAclass_convert TYPE REF TO cl_abap_conv_in_ce,
      ascii        TYPE x,
      char(10)  TYPE c.

ascii '41'"hurfu A ------->>> HEXA!

class_convert cl_abap_conv_in_ce=>createencoding 'UTF-8' ).

class_convert->convertEXPORTING input ascii
                        IMPORTING data  char ).

WRITE/ char.

miércoles, 30 de marzo de 2016

BORRADO SELECTIVO BW


Para el borrado selectivo de BW , utilizamos la TX. DELETE_FACTS . Dicha aplicación generará un report Z para poder realizar el borrado selectivo sobre el objeto

Una vez generado el reporte Z podremos usarlos desde una cadena BW o llamarlo desde otro reporte Z.

viernes, 18 de marzo de 2016

BW - ABAP- CREAR JERARQUIA DINAMICA - Create Hierachy Dynamic BW

Para Crear una Jerarquia Dinamica a partir de una tabla Z en R3 o BW , tiene que tener una estructura con el ID/TEXTO/NODO(es o no)/PADRE(ID) . Una vez que tenemos la tabla creamos la fuente Z en base a esa vista .

Ya en BW , creamos el DSO con la siguiente estructura :


Luego conectamos la fuente y el DSO con una transformación , en la cual metemos una función Z para el llenado del DSO. La función soporta multinivel (hasta 5).

La función la detallamos al final :

Una vez que llenamos el DSO , realizamos la Transformación a la JErarquia. Si dumpea es porque faltan activar objetos del sistema. Verificar con RSD5/6 y activar con el repositorio en la RSA1. Por debug se pueden ver los objetos que faltan activar .





La estructura debe quedar de la siguiente manera en BW :

La tabla inicial Z :

La función Z :


FUNCTION zbwbi010_jerar_multi.

*"----------------------------------------------------------------------

*"*"Interfase local

*"  CHANGING

*"     REFERENCE(T_TABLA)

*"----------------------------------------------------------------------

  DATA : lt_table TYPE _ty_t_tg_1.

  DATA : lt_aux TYPE _ty_t_tg_1..


  FIELD-SYMBOLS :  TYPE _ty_s_tg_1.
  DATA : lv_nodeid TYPE i.
  DATA : wa_aux TYPE _ty_s_tg_1.

  break c04748.

*-----------------------------------------------------
  lt_table = t_tabla.

  SORT lt_table BY /bic/zparentc ASCENDING.

*1)NODEID
*2)MARCAR LOS HIERNODE Y OBJECT
  LOOP AT lt_table ASSIGNING .
    lv_nodeid  = lv_nodeid + 1.
**--Auxiliares

*      InfoObject: ZHIENM HIENM.
    -/bic/zhienm  = 'CONCEPTO_H'.
*      InfoObject: ZNODEID NODEID.
    -/bic/znodeid  = lv_nodeid .
*      InfoObject: ZINFOOBJE INFOOBJECT.
    IF -/bic/zinfoobje IS NOT INITIAL.
      -/bic/zinfoobje = '0HIER_NODE'.
    ELSE.
      -/bic/zinfoobje = 'ZCONCEPT1'.
    ENDIF.
    AT FIRST.
      -/bic/zparentid = 0.
      -/bic/zlevel = 1.
      -/bic/znextid = 0.
      -/bic/zchildid = 2.
    ENDAT.

* TO
    -/bic/zdateto = '99991231'.
*      InfoObject: ZDATEFROM DATEFROM.
    -/bic/zdatefrom = sy-datum.
    -/bic/zlangu = 'S'.
*      InfoObject: ZHIENM HIENM.
    -/bic/zhienm  = 'CONCEPTO_H'.
*      InfoObject: ZNODEID NODEID.
    -/bic/znodeid  = lv_nodeid .

    AT LAST.
      -/bic/znextid = 0.
    ENDAT.
*    APPEND  TO result_package .
  ENDLOOP.

  lt_aux[] = lt_table[].

  SORT lt_aux[] BY /bic/znodename ASCENDING.

*3)PARENTID: CON_TOT --> PONER EL PARENTID EN TODOS


  LOOP AT lt_table ASSIGNING .
*---PARENTID
    READ TABLE lt_aux INTO wa_aux
       WITH KEY /bic/znodename = -/bic/zparentc
        BINARY SEARCH.
    IF sy-subrc EQ 0.
      -/bic/zparentid = wa_aux-/bic/znodeid.
    ELSE.
      -/bic/zparentid = 0.
    ENDIF.

  ENDLOOP.

*4)CHILDID : POR QUIEN TIENE EL PARENTID , SOLO 1
  lt_aux[] = lt_table[].
  SORT lt_aux[] BY /bic/zparentid /bic/znodeid ASCENDING.
  LOOP AT lt_table ASSIGNING .
*---PARENTID
    READ TABLE lt_aux INTO wa_aux
       WITH KEY /bic/zparentid = -/bic/znodeid
        BINARY SEARCH.
    IF sy-subrc EQ 0.
      -/bic/zchildid  = wa_aux-/bic/znodeid.
    ELSE.
      -/bic/zchildid  = 0.
    ENDIF.

  ENDLOOP.

*5)NEXTID : NEXTID
  lt_aux[] = lt_table[].
  SORT lt_aux[] BY /bic/zparentid /bic/znodeid ASCENDING.
  LOOP AT lt_table ASSIGNING .
*---NEXTID
    LOOP AT lt_table INTO wa_aux WHERE /bic/zparentid EQ -/bic/zparentid AND
                                       /bic/znodeid NE -/bic/znodeid AND
                                       /bic/znextid EQ ''.
      -/bic/znextid = wa_aux-/bic/znodeid.
      EXIT.
    ENDLOOP.
    IF sy-subrc NE 0.
      -/bic/znextid = 0.
    ENDIF.
  ENDLOOP.


*6)LEVEL : LEVEL

  DO 5 TIMES. "5 NIVELES
    lt_aux[] = lt_table[].
    SORT lt_aux[] BY /bic/znodeid ASCENDING.
    LOOP AT lt_table ASSIGNING .
      AT FIRST.
        CONTINUE.
      ENDAT.

*---LEVEL
      READ TABLE lt_aux INTO wa_aux
         WITH KEY /bic/znodeid = -/bic/zparentid
          BINARY SEARCH.
      IF sy-subrc EQ 0.
        -/bic/zlevel = wa_aux-/bic/zlevel + 1.
      ELSE.
        -/bic/zlevel  = 0.
      ENDIF.
    ENDLOOP.
  ENDDO.
  t_tabla = lt_table.
ENDFUNCTION.









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.


BW - EJECUCION CADENA EN FORMA REMOTA - ABAP

PAra la ejecución de Cadenas de BW en forma Remota , lo podemos hacer con este simple codigo :

FORM p_exec  USING    p_chain TYPE  rspc_chain.

*-Verificar Autorizacion Cadena
  AUTHORITY-CHECK OBJECT 'ZCADENA'
           ID 'ZIDCADENA' FIELD p_chain
           ID 'ACTVT' FIELD '16'.


  IF sy-subrc NE 0.
    MESSAGE i005(zbw01).
    EXIT.
  ENDIF.

*--Ejecucion Cadena a Demanda
  CALL FUNCTION 'RSPC_API_CHAIN_START' DESTINATION gv_destination
    EXPORTING
      i_chain p_chain
    EXCEPTIONS
      failed  1
      OTHERS  2.

  IF sy-subrc <> 0.
    MESSAGE e003(zbw01).
  ELSE.
    MESSAGE s004(zbw01).
  ENDIF.

ENDFORM.                    " P_EXEC

BW - BPC - RETRACCION a R3 - IF_UJ_CUSTOM_LOGIC

Retracción de BPC a R3 : Para realizar esta acción , utilizaremos la BADI de BPC IF_UJ_CUSTOM_LOGIC~EXECUTE . En dicha BADI llamaremos a la función Z en BW , que cargará los datos en Cubo de BW desde un cubo de BPC. Luego llamaremos a dos BAPI de R3 via RFC , una para el modulo de CO y otra para el modulo FM . Aqui debajo , parte del codigo :

IF_UJ_CUSTOM_LOGIC~EXECUTE:

METHOD if_uj_custom_logic~execute.

  DATAls_param LIKE LINE OF it_param,
        l_param(30).
  DATAlv_data(4TYPE c,
        lv_gjahr(4TYPE n.
  DATAwa_error TYPE uj0_s_message.


  DATA lv_uzeit TYPE sy-uzeit,
         lv_zuser TYPE sy-uname,
         lv_datum TYPE sy-datum.

*Ini Testing

  READ TABLE it_param INTO ls_param WITH KEY hashkey 'TIEMPO'.
  IF sy-subrc EQ 0.
    lv_data ls_param-hashvalue.
  ELSE.
    EXIT.
  ENDIF.
  lv_gjahr lv_data(4).
*Llamado a Retraccion

  CALL FUNCTION 'ZBW001_RETRACBWR3'
    EXPORTING
      i_gjahr                   lv_gjahr
    IMPORTING
      err_uzeit                 lv_uzeit
      err_zuser                 lv_zuser
      err_datum                 lv_datum
    EXCEPTIONS
      error_cadena              1
      error_ejecucion_duplicada 2
      OTHERS                    3.

  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.


  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

*Error de Cadena
  IF sy-subrc EQ 1.
    wa_error-msgid 'ZBW001'.
    wa_error-msgty 'E'.
    wa_error-msgno '003'.
    APPEND wa_error TO et_message.
  ELSEIF sy-subrc EQ 2"Año Duplicado
    CONCATENATE lv_datum '-' lv_uzeit '-' lv_zuser INTO wa_error-msgv1.
    wa_error-msgid 'ZBW001'.
    wa_error-msgty 'E'.
    wa_error-msgno '007'.
    APPEND wa_error TO et_message.
  ENDIF.
ENDMETHOD.


FUNCION :



  DATA lv_nameco TYPE tbtcjob-jobname,
         lv_namefm TYPE  tbtcjob-jobname.
  DATA lv_countfm TYPE tbtcjob-jobcount,
         lv_countco TYPE tbtcjob-jobcount.

  DATAlt_param TYPE STANDARD TABLE OF rsparams,
        wa_param TYPE rsparams,
        ls_params TYPE pri_params,
        l_valid TYPE c.

  DATA sdate TYPE  tbtcjob-sdlstrtdt ,
         stime TYPE  tbtcjob-sdlstrttm .

  DATA lv_ok TYPE c.

*Validacion Ejercicio
  PERFORM f_val_ejercicio USING i_gjahr
                          CHANGING lv_ok
                                   err_zuser
                                   err_uzeit
                                   err_datum.

  IF lv_ok IS INITIAL.
    RAISE error_ejecucion_duplicada.
  ENDIF.

  IF i_notchain IS INITIAL.
*Ejecutar Cadena
    PERFORM f_run_chain CHANGING lv_ok.
    IF lv_ok IS INITIAL.
      RAISE error_cadena.
    ENDIF.
    CHECK lv_ok 'X'.
  ENDIF.

*----------------------------
  COMMIT WORK AND WAIT.
  WAIT UP TO 20 SECONDS.
*----------------------------

*Name Job FM
  PERFORM f_name_job USING 'FM'
                     CHANGING lv_namefm.

*Name Job CO
  PERFORM f_name_job USING 'CO'
                     CHANGING lv_nameco.

*Parameters

  wa_param-selname 'SO_GJAHR'.
  wa_param-kind 'S'.  " here P is parameter s is select-option
  wa_param-option 'EQ'.
  wa_param-sign 'I'.
  wa_param-low  i_gjahr.
  APPEND wa_param TO lt_param.

*Get Print Parameters
  CALL FUNCTION 'GET_PRINT_PARAMETERS'
    EXPORTING
      no_dialog      'X'
      destination    'LP01'
    IMPORTING
      valid          l_valid
      out_parameters ls_params.
*--------------------------------FM--------------------------------

  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobgroup         'RETRA' "GDP 25/08/2015
      jobname          lv_namefm
    IMPORTING
      jobcount         lv_countfm
    EXCEPTIONS
      cant_create_job  1
      invalid_job_data 2
      jobname_missing  3
      OTHERS           4.


*Submit report to job

  SUBMIT zbwbi002
  WITH SELECTION-TABLE lt_param
  VIA JOB lv_namefm
  NUMBER lv_countfm
*  USER 'BWREMOTE' "GDP 24/08/15
  TO SAP-SPOOL WITHOUT SPOOL DYNPRO
  SPOOL PARAMETERS ls_params
  AND RETURN.


  GET TIME.
  sdate sy-datum.
  stime sy-uzeit + 250.

*Schedule and close job.

  CALL FUNCTION 'JOB_CLOSE'
    EXPORTING
      jobcount             lv_countfm
      jobname              lv_namefm
      sdlstrtdt            sdate
      sdlstrttm            stime
    EXCEPTIONS
      cant_start_immediate 1
      invalid_startdate    2
      jobname_missing      3
      job_close_failed     4
      job_nosteps          5
      job_notex            6
      lock_failed          7
      invalid_target       8
      OTHERS               9.
*sdlstrtdt = sdate


*--------------------------------CO--------------------------------
*Open Job CO

  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobgroup         'RETRA' "GDP 25/08/2015
      jobname          lv_nameco
    IMPORTING
      jobcount         lv_countco
    EXCEPTIONS
      cant_create_job  1
      invalid_job_data 2
      jobname_missing  3
      OTHERS           4.


*Submit report to job

  SUBMIT zbwbi001
  WITH SELECTION-TABLE lt_param
  VIA JOB lv_nameco
  NUMBER lv_countco
*  USER 'BWREMOTE' "GDP 24/08/15
  TO SAP-SPOOL WITHOUT SPOOL DYNPRO
  SPOOL PARAMETERS ls_params
  AND RETURN.

  GET TIME.
  sdate sy-datum.
  stime sy-uzeit + 250
  .
*Schedule and close job.
  CALL FUNCTION 'JOB_CLOSE'
    EXPORTING
      jobcount             lv_countco
      jobname              lv_nameco
      sdlstrtdt            sdate
      sdlstrttm            stime
    EXCEPTIONS
      cant_start_immediate 1
      invalid_startdate    2
      jobname_missing      3
      job_close_failed     4
      job_nosteps          5
      job_notex            6
      lock_failed          7
      invalid_target       8
      OTHERS               9.
*sdlstrtdt = sdate

*Actualizar Validacion Ejercicio
  PERFORM upd_gjahr USING i_gjahr.

ENDFUNCTION.

UNO DE LOS PROGRAMAS QUE REALIZA LA RETRACCIÓN USANDO LA BAPI (FM) :

*==================================================================
*              S T A R T - O F - S E L E C T I O N
*==================================================================
START-OF-SELECTION.
  CLEAR gt_datafm[],
          gt_errorfm[].
*Busqueda de Datos Retracción
  PERFORM f_get_data_retrac_fm CHANGING gt_datafm[]
                                        gt_errorfm[].

*Llamar Retraccion
  PERFORM f_retraccion_fm USING gt_datafm[]
                          CHANGING gt_errorfm[].

*&---------------------------------------------------------------------*
*&      Form  F_RETRACCION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <-- nbsp="" p2="" span="" text="">
*----------------------------------------------------------------------*
FORM f_retraccion_fm USING ptc_data TYPE tyt_fm
                     CHANGING ptc_error TYPE tyt_error.

  CONSTANTS lc_300(7TYPE VALUE 'DSH_300',
              lc_bwd(3TYPE VALUE 'BWD'.

  DATAlv_per          TYPE co_perab,
        lv_cont(3)      TYPE c.

  DATAlv_periodo(3TYPE c.
  DATAls_headerinfo   TYPE bapiplnhdr,
      lt_indexstructure TYPE TABLE OF bapiacpstru,
      le_indexstructure TYPE bapiacpstru,
      lt_coobject       TYPE TABLE OF bapipcpobj,
      le_coobject       TYPE bapipcpobj,
      lt_pervalue       TYPE TABLE OF bapipcpval,
      le_pervalue       TYPE bapipcpval,
      lt_totvalue       TYPE TABLE OF bapipcptot,
      lt_contrl         TYPE TABLE OF bapipcpctrl,
      lt_return         TYPE TABLE OF bapiret2,
      ls_commit_ret     TYPE bapiret2,
      ls_return         LIKE LINE OF lt_return.


  DATA le_data LIKE LINE OF ptc_data,
         le_datax LIKE LINE OF ptc_data.

  DATA lv_destination TYPE string.

*Obtener Destino RFC
  SELECT SINGLE destination INTO lv_destination
    FROM zbwt004 WHERE origen EQ sy-sysid.
  IF sy-subrc NE OR lv_destination IS INITIAL.
    MESSAGE e006(zbw001).
  ENDIF.
  CONDENSE lv_destination.
*--------------------------------------------------------
  PERFORM f_cargar_datos_para_bapi
                                   USING gc_fikrs
                                         gc_valtyp
                                         gc_proces
                                         gc_budcat
                                         gc_versio
                                         gc_doctyp
                                         gc_budtyp
                                         gc_docsta
                                         gt_datafm[]
                                         lv_destination
                                         ptc_error[]
                                    CHANGING ge_header
                                             ge_header_add
                                             gt_item[]
                                             gt_period[] .


ENDFORM.                    "f_retraccion_fm


*&---------------------------------------------------------------------*
*&      Form  f_cargar_datos_para_bapi
*&---------------------------------------------------------------------*
*       Arma la tabla BDC
*----------------------------------------------------------------------*
*      -->PTI_ARCHIVO  Archivo de entrada
*      <--ptc_item artidas="" ind.="" nbsp="" oc.entrada:="" span="">
*      <--ptc_period er="" individuales="" nbsp="" oc.entrada="" odos="" partidas="" span="">
*      -->PVI_FIKRS    Entidad CP
*      -->PVI_VALTYP   Tipo de Valor BCS
*      -->PVI_WAERS    Moneda de Transacción
*      -->PVI_PROCES   Proceso
*      -->PVI_BUDCAT   Categoría de Presupuesto
*      -->PVI_VERSIO   Versión
*      -->PVI_DOCTYP   Clase de Documento
*      -->PVI_DOCDAT   Fecha de Documento
*      -->PVI_FISCYE   Ejercicio
*      -->PVI_RPMAX    Período
*      -->PVI_BUDTYP   Clase de Presupuesto
*      -->PVI_RESPPE   Responsable
*      -->PVI_TEXT50   Texto de Cabecera
*      -->PVI_TEXTNA   Nombre de Texto
*      -->PVI_DOCSTATE Status de un documento de entrada de presupuesto
*      <--pec_header atos="" cabecera="" de="" entrada="" nbsp="" p.documento="" span="">
*      <--pec_header_add adicionales="" atos="" cabecera="" nbsp="" span="">
*----------------------------------------------------------------------*
FORM f_cargar_datos_para_bapi
                   USING    pve_fikrs
                            pve_valtyp
                            pve_proces
                            pve_budcat
                            pve_versio
                            pve_doctyp
                            pve_budtyp
                            pve_docstate
                            ptc_datafm  TYPE tyt_fm
                            pve_destination
                            ptc_error TYPE tyt_error
                   CHANGING pec_header  TYPE zbapi_0050_header
                            pec_header_add TYPE zbapi_0050_header_add
                            ptc_item  TYPE ztbapi_0050_item
                            ptc_period TYPE ztbapi_0050_period  .

  DATAle_datafm  TYPE ty_fm,
        le_item    TYPE zbapi_0050_item,
        le_period  TYPE zbapi_0050_period,
        lv_item    TYPE i.
  DATA lv_docdat TYPE sy-datum.
*Fecha Documento
  lv_docdat sy-datum.
*Cargar Cabecera
  CLEAR lv_item.
  PERFORM f_cargar_cabecera USING pve_fikrs
                                  pve_proces
                                  pve_versio
                                  pve_doctyp
                                  lv_docdat
                                  pve_docstate
                            CHANGING pec_header.
*Info Add
  PERFORM f_cargar_cabecera_add USING p_resp
                                      p_text
                                      p_name
                            CHANGING pec_header_add.
*Carga Items
  LOOP AT ptc_datafm INTO le_datafm.
    lv_item lv_item + 1.

    PERFORM f_cargar_item USING le_datafm-fiscper
                                pve_budcat
                                pve_budtyp
                                le_datafm-moneda
                                pve_valtyp
                                le_datafm
                                lv_item
                          CHANGING le_item
                                   le_period.
    APPEND le_item TO ptc_item.
    IF le_period IS NOT INITIAL.
      APPEND le_period TO ptc_period.
    ENDIF.
*---Ejecutar BAPI
    PERFORM f_ejecutar_bapi
                            USING pec_header
                                  pec_header_add
                                  ptc_item[]
                                  pve_destination
                            CHANGING gt_log[]
                                     ptc_error[]
                                     ptc_period[].

    CLEAR ptc_period[].
    CLEAR ptc_error[].
    CLEAR gt_log[].
    CLEAR ptc_item[].
    CLEAR lv_item.
  ENDLOOP.
ENDFORM.                    " f_cargar_datos_para_bapi
 


*&---------------------------------------------------------------------*
*&      Form  F_EJECUTAR_BAPI
*&---------------------------------------------------------------------*
*       Ejecutar BAPI_0050_CREATE
*----------------------------------------------------------------------*
*      -->PTI_ITEM        Doc.entrada: Partidas ind.
*      -->PTI_PERIOD      Doc.entrada CP: Períodos partidas individuales
*      -->PTI_LOG         Log de errores
*      -->PEI_HEADER      Datos de cabecera p.documento de entrada
*      -->PEI_HEADER_ADD  Datos cabecera adicionales
*----------------------------------------------------------------------*
FORM f_ejecutar_bapi
                      USING    pei_header TYPE zbapi_0050_header
                               pei_header_add TYPE zbapi_0050_header_add
                               pti_item TYPE ztbapi_0050_item
                               pve_destination
                      CHANGING pti_log TYPE tyt_log
                               ptc_error TYPE tyt_error
                               pti_period TYPE ztbapi_0050_period.
* Local data
  DATAlv_lineas TYPE i,   " Variable Cantidad de Registros Cargados
        lt_return TYPE STANDARD TABLE OF bapiret2,
        le_return TYPE bapiret2,
        le_log    TYPE tye_log,
        lv_param(100)  TYPE c,
        le_item        LIKE LINE OF pti_item,
        le_period      LIKE LINE OF pti_period .

  DATA lt_error TYPE STANDARD TABLE OF zbwt003,
         lt_logdata TYPE STANDARD TABLE OF zbwt006,
         le_error TYPE  zbwt003,
         le_logdata TYPE zbwt006.

  CALL FUNCTION 'BAPI_0050_CREATE' DESTINATION pve_destination
    EXPORTING
      header_data        pei_header
      header_data_add    pei_header_add
      testrun            ''
    TABLES
      item_data          pti_item[]
*     sender_item_data   = pti_sender_item_
      period_data        pti_period[]
*     sender_period_data = i_sender_period_data
      return             lt_return[].

  READ TABLE lt_return WITH KEY type 'E' TRANSPORTING NO FIELDS.
  IF sy-subrc NE 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION pve_destination
      EXPORTING
        wait 'X'.

* Mensaje exitoso
    LOOP AT pti_item INTO le_item.
      CLEAR lv_param.
      CONCATENATE 'CG' le_item-funds_ctr '-CC' le_item-cmmt_item '-AF' le_item-func_area
                   INTO lv_param.
      MESSAGE s001(zbw001WITH lv_param"Mensaje Ok
      IF sy-batch IS INITIAL.
        WRITE :'OK' lv_param.
      ENDIF.
* GRABAR LOG FM
      CLEAR le_return.
      READ TABLE lt_return INTO le_return WITH KEY type 'S' .
*------Busqueda del periodo
      SORT pti_period BY item_num.
      READ TABLE pti_period INTO le_period
      WITH KEY item_num le_item-item_num
      BINARY SEARCH.
      IF sy-subrc EQ 0.
*-------Registro de Error DB
        PERFORM f_fill_log    USING le_item
                                    le_period
                                    pei_header
                                    le_return-message_v2+8(10)
                              CHANGING le_logdata.
        APPEND le_logdata TO lt_logdata.
      ENDIF.
    ENDLOOP.
*------Grabar en BD
    MODIFY zbwt006 FROM TABLE lt_logdata.
    IF sy-subrc EQ 0.
      COMMIT WORK AND WAIT.
    ENDIF.
  ELSE.
    gv_errorfm 'X'"GDP 16.11.2015
* Función para mostrar el log de mensajes
    READ TABLE lt_return INTO le_return WITH KEY type 'E'
                                                 id  'FMKU'.
    IF sy-subrc NE 0.
      READ TABLE lt_return INTO le_return WITH KEY type 'E'.
    ENDIF.
    SORT pti_period BY item_num.
    IF sy-subrc EQ 0.
      LOOP AT pti_item INTO le_item.
        CLEAR lv_param.
        CLEAR le_period.
        CONCATENATE 'CG' le_item-funds_ctr '-CC' le_item-cmmt_item '-AF' le_item-func_area
                     INTO lv_param.
        MESSAGE s002(zbw001WITH lv_param le_return-message.
        IF sy-batch IS INITIAL.
          WRITE :'NO OK' lv_param.
        ENDIF.
*------Busqueda del periodo
        READ TABLE pti_period INTO le_period
        WITH KEY item_num le_item-item_num
        BINARY SEARCH.
*-------Registro de Error DB
        PERFORM f_fill_error  USING le_item
                                    le_period
                                    pei_header
                              CHANGING le_error.
        le_error-error le_return-message.
        APPEND le_error TO lt_error.
      ENDLOOP.
    ENDIF.
*------Grabar en BD
    MODIFY zbwt003 FROM TABLE lt_error.
    IF sy-subrc EQ 0.
      COMMIT WORK AND WAIT.
    ENDIF.

  ENDIF.

ENDFORM.                    " F_RETRACCION 



PARA CO , se usa la siguiente parte del Codigo  :

FORM f_retraccion_co USING ptc_data TYPE tyt_cecosto.

  CONSTANTS lc_300(7TYPE VALUE 'DSH_300',
              lc_bwd(3TYPE VALUE 'BWD'.

  DATAlv_per          TYPE co_perab,
        lv_cont(6)      TYPE n,
        lv_delta         TYPE xfeld VALUE ' '.
  DATAlv_periodo(3TYPE c.
  DATAls_headerinfo   TYPE bapiplnhdr,
      lt_indexstructure TYPE TABLE OF bapiacpstru,
      le_indexstructure TYPE bapiacpstru,
      lt_coobject       TYPE TABLE OF bapipcpobj,
      le_coobject       TYPE bapipcpobj,
      lt_pervalue       TYPE TABLE OF bapipcpval,
      le_pervalue       TYPE bapipcpval,
      lt_totvalue       TYPE TABLE OF bapipcptot,
      lt_contrl         TYPE TABLE OF bapipcpctrl,
      lt_return         TYPE TABLE OF bapiret2,
      ls_commit_ret     TYPE bapiret2,
      ls_return         LIKE LINE OF lt_return.

  DATA lt_error TYPE STANDARD TABLE OF zbwt003.

  DATA le_data LIKE LINE OF ptc_data,
         le_datax LIKE LINE OF ptc_data.
  DATA lv_param(30TYPE c.
*  Declaration for RFC BAPI_COSTACTPLN_POSTPRIMCOST
  DATAlv_destination TYPE string.
  DATA lv_table(50TYPE c.
  DATA lv_time(3TYPE n.

*Obtener Destino RFC
  SELECT SINGLE destination INTO lv_destination
    FROM zbwt004 WHERE origen EQ sy-sysid.
  IF sy-subrc NE OR lv_destination IS INITIAL.
    MESSAGE e006(zbw001).
  ENDIF.
  CONDENSE lv_destination.

  CLEAR lv_cont.

**Tiempo Espera Entre BAPI
*  SELECT SINGLE zval INTO lv_table
*    FROM zbwt001 WHERE zname EQ 'RETR_TIME2'.
*  IF sy-subrc NE 0.
*    lv_time = 3.
*  ELSE.
*    lv_time = lv_table(3).
*  ENDIF.

*Completar Estructuras BAPI
  LOOP AT ptc_data INTO le_data.

    le_datax le_data.
*----Nueva Cuenta
    AT NEW cuenta.
      ADD TO lv_cont.
      CLEAR ls_headerinfo.
      CLEAR le_indexstructure.
      CLEAR le_coobject.
      CLEAR lt_coobject[].
      CLEAR lt_pervalue[].
      CLEAR lt_indexstructure[].
      CLEAR lt_return[].
      CLEAR le_pervalue.

*---Estructura Cabecera
      ls_headerinfo-co_area           le_datax-coarea.
      ls_headerinfo-fisc_year         le_datax-fiscper(4).

      ls_headerinfo-period_from       '01'.
      ls_headerinfo-period_to         '12'.
      ls_headerinfo-version           gc_version."p_versn.
      ls_headerinfo-doc_hdr_tx        text-001.
      ls_headerinfo-plan_currtype     'C'.
      ADD TO lv_cont.
*---Estructura Indice
      le_indexstructure-object_index  lv_cont.
      le_indexstructure-value_index   lv_cont.
      APPEND le_indexstructure TO lt_indexstructure.

      le_coobject-object_index        lv_cont.
      le_coobject-costcenter          le_datax-centrocosto."p_kostl.
      le_coobject-acttype             ' '."p_lstar.
      le_coobject-co_busproc          ' '."p_prznr.
      le_coobject-orderid             ' '."p_aufnr.
      le_coobject-wbs_element         ' '."p_pspel.
      APPEND le_coobject TO lt_coobject.
*---Periodo
      le_pervalue-value_index lv_cont.
      le_pervalue-cost_elem le_datax-cuenta.
      le_pervalue-trans_curr le_datax-moneda.
      le_pervalue-trans_currency_iso le_datax-moneda.
    ENDAT.

*----Valores Periodo
    lv_periodo le_data-fiscper+4(3).

    CASE lv_periodo.

      WHEN '001'.
        le_pervalue-var_val_per01 le_datax-monto.
      WHEN '002'.
        le_pervalue-var_val_per02 le_datax-monto.
      WHEN '003'.
        le_pervalue-var_val_per03 le_datax-monto.
      WHEN '004'.
        le_pervalue-var_val_per04 le_datax-monto.
      WHEN '005'.
        le_pervalue-var_val_per05 le_datax-monto.
      WHEN '006'.
        le_pervalue-var_val_per06 le_datax-monto.
      WHEN '007'.
        le_pervalue-var_val_per07 le_datax-monto.
      WHEN '008'.
        le_pervalue-var_val_per08 le_datax-monto.
      WHEN '009'.
        le_pervalue-var_val_per09 le_datax-monto.
      WHEN '010'.
        le_pervalue-var_val_per10 le_datax-monto.
      WHEN '011'.
        le_pervalue-var_val_per11 le_datax-monto.
      WHEN '012'.
        le_pervalue-var_val_per12 le_datax-monto.
    ENDCASE.
*---Fin Cuenta --Llamado Funcion RFC
    AT END OF cuenta.
*----Periodo
      APPEND le_pervalue TO lt_pervalue.
      CLEAR lv_cont.
**----Tiempo Espera entre BAPI
*      WAIT UP TO lv_time SECONDS.
*----Llamado RFC
      CALL FUNCTION 'BAPI_COSTACTPLN_POSTPRIMCOST' DESTINATION lv_destination
        EXPORTING
          headerinfo     ls_headerinfo
          delta          lv_delta
        TABLES
          indexstructure lt_indexstructure
          coobject       lt_coobject
          pervalue       lt_pervalue
          totvalue       lt_totvalue
          contrl         lt_contrl
          return         lt_return.

*---------------------------------------------------
      SORT lt_pervalue BY value_index.
      READ TABLE lt_return WITH KEY type 'E' TRANSPORTING NO FIELDS.
      IF sy-subrc NE 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION lv_destination
          IMPORTING
            return ls_commit_ret.

* Mensaje exitoso
        LOOP AT lt_coobject INTO le_coobject.
          CLEAR le_pervalue.
          READ TABLE lt_pervalue INTO le_pervalue WITH KEY
             value_index le_coobject-object_index BINARY SEARCH.
          CLEAR lv_param.
          CONCATENATE 'CN' le_pervalue-cost_elem '-CC' le_coobject-costcenter
                       INTO lv_param.
          MESSAGE s001(zbw001WITH lv_param"Mensaje OK
          IF sy-batch IS INITIAL.
            WRITE :'OK' lv_param.
          ENDIF.
        ENDLOOP.
      ELSE"Error
* Función para mostrar el log de mensajes
        READ TABLE lt_return INTO ls_return WITH KEY type 'E'.

        IF sy-subrc EQ 0.
          gv_errorco 'X'"GDP 16.11.2015
          LOOP AT lt_coobject INTO le_coobject.
            CLEAR le_pervalue.
            READ TABLE lt_pervalue INTO le_pervalue WITH KEY
               value_index le_coobject-object_index BINARY SEARCH.
            IF sy-subrc NE 0.
              CONTINUE.
            ENDIF.
            CLEAR lv_param.
            CONCATENATE 'CN' le_pervalue-cost_elem '-CC' le_coobject-costcenter
                         INTO lv_param.
            MESSAGE s002(zbw001WITH lv_param ls_return-message.
            IF sy-batch IS INITIAL.
              WRITE :'NO OK' lv_param.
            ENDIF.
*-------Registro de Error DB
            PERFORM f_fill_error  USING le_coobject
                                        le_pervalue
                                        ls_headerinfo
                                        ls_return-message
                                  CHANGING lt_error[].

          ENDLOOP.
*------Grabar en BD
          INSERT zbwt003 FROM TABLE lt_error.
          IF sy-subrc EQ 0.
            COMMIT WORK AND WAIT.
          ENDIF.
          CLEAR lt_error[].
        ENDIF.
      ENDIF.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " F_RETRACCION