Carga de Archivo por BAPI

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • ABellamy
    Member
    • dic
    • 44

    #1

    Carga de Archivo por BAPI

    HOla buen dia.
    En el trabajo me pidieron hacer una carga de archivo y estoy usando la 'BAPI_ACC_DOCUMENT_POST' para el archivo. Pero desconozco como deberia de salir el resultado. En algun momento hice un batch input, pero ahora no entiendo bien que hace la bapi.
    Aqui el codigo.
    Código:
    REPORT  y_bapi_01 NO STANDARD PAGE HEADING.
    *----------------------------------------------------------------------*
    *                            INCLUDES                                  *
    *----------------------------------------------------------------------*
    INCLUDE y_bapi01_top.
    INCLUDE y_bapi01_forms.
    *----------------------------------------------------------------------*
    *                           AT SELECTION SCREEN
    *----------------------------------------------------------------------*
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ruta.
      PERFORM f_leer_ruta USING p_ruta.
    *----------------------------------------------------------------------*
    *                           START-OF-SELECTION
    *----------------------------------------------------------------------*
    START-OF-SELECTION.
      PERFORM f_carga_archivo.
      PERFORM f_proceso.
    *----------------------------------------------------------------------*
    *                           END-OF-SELECTION
    *----------------------------------------------------------------------*
    END-OF-SELECTION.
      WRITE: 25 'Detalle de Documentos financieros' COLOR 1.
      SKIP.
      ULINE AT (75).
      SKIP.
      WRITE: 2 'Documento FI creado' COLOR 4, 50 'Póliza Errónea' COLOR 4.
      SKIP.
    
      LOOP AT gt_log.
        IF gt_log-flag EQ 'X'.
          WRITE: 2 gt_log-reg.
          SKIP.
        ELSE.
          WRITE: 50 gt_log-reg.
          SKIP.
        ENDIF.
      ENDLOOP.
    *********************************************************
    *&  Include           Y_BAPI01_TOP
    *&---------------------------------------------------------------------*
    
    DATA:  BEGIN OF gt_carga OCCURS 0,
      no_poli(3) TYPE c,
      fe_doc(10) TYPE c,
      clase(2) TYPE c,
      soc TYPE bukrs_vf,
      fe_cont(10) TYPE c,
      periodo TYPE monat,
      moneda TYPE waers,
      refe TYPE string,
      txt_cab TYPE string,
      clave(2) TYPE c,
      cuenta(10) TYPE c,
      importe(15) TYPE c,
      ceco(10) TYPE c,
      cebe(10) TYPE c,
      asign TYPE string,
      txt_pos TYPE string,
      END OF gt_carga,
    
      BEGIN OF gt_log OCCURS 0,
        flag TYPE c,
        reg TYPE string,
        END OF gt_log.
    
    * Pantalla de selección.
    SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
    PARAMETERS: p_ruta TYPE rlgrap-filename OBLIGATORY.
    SELECTION-SCREEN: END OF BLOCK a1.
    
    * rlgrap-filename: Fichero local para upload/download
    * RLGRAP: Campos de programa / campos de dynpro SAPLGRAP
    *********************************************************
    *&---------------------------------------------------------------------*
    *&      Form  F_CARGA_ARCHIVO
    *&---------------------------------------------------------------------*
    *& Carga un archivo externo.
    *----------------------------------------------------------------------*
    FORM f_carga_archivo .
      DATA: l_ruta TYPE string.
      l_ruta = p_ruta.
    
      CALL FUNCTION 'GUI_UPLOAD'
        EXPORTING
          filename                = l_ruta
          filetype                = 'ASC'
    *      has_field_separator     = 'SPACE'
          has_field_separator     = 'X'
        TABLES
          data_tab                = gt_carga
        EXCEPTIONS
          file_open_error         = 1
          file_read_error         = 2
          no_batch                = 3
          gui_refuse_filetransfer = 4
          invalid_type            = 5
          no_authority            = 6
          unknown_error           = 7
          bad_data_format         = 8
          header_not_allowed      = 9
          separator_not_allowed   = 10
          header_too_long         = 11
          unknown_dp_error        = 12
          access_denied           = 13
          dp_out_of_memory        = 14
          disk_full               = 15
          dp_timeout              = 16
          OTHERS                  = 17.
      IF sy-subrc <> 0.
        MESSAGE text-100 TYPE 'I'.
    *    LEAVE TO TRANSACTION 'Z_CARGA_NOM'.       " Hacer tx
        LEAVE PROGRAM.
      ENDIF.
    
    ENDFORM.                    " F_CARGA_ARCHIVO
    *&---------------------------------------------------------------------*
    *&      Form  F_PROCESO
    *&---------------------------------------------------------------------*
    *&  Sin bandera para cálculo de impuesto.
    *----------------------------------------------------------------------*
    FORM f_proceso .
      DATA: lt_account TYPE STANDARD TABLE OF bapiacgl09 WITH HEADER LINE,
            lt_currency TYPE STANDARD TABLE OF bapiaccr09 WITH HEADER LINE,
            lt_accountp TYPE STANDARD TABLE OF bapiacap09 WITH HEADER LINE,
            lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
            lw_header TYPE bapiache09,
            lw_carga LIKE LINE OF gt_carga,
            l_obj_type LIKE bapiache09-obj_type, " Op. referencia.
            l_obj_key LIKE bapiache09-obj_key,   " Clave referencia.
            l_obj_sys LIKE bapiache09-obj_sys,   " Sist lógico doc de origen
            l_cuenta(10) TYPE n,
            l_tabix TYPE sy-tabix,
            l_item(10) TYPE n,
            l_nuevo TYPE c.
    *  BAPIACGL09  Pos.Cta.de Mayor
    *  BAPIACCR09  Posiciones de moneda
    *  BAPIACAP09  Posiciones del acreedor.
    *  BAPIACHE09  Línea de cabecera.
    
      LOOP AT gt_carga.
        l_tabix = sy-tabix + 1.
        l_item = l_item + 1.
    
        CLEAR l_cuenta.
        MOVE gt_carga-cuenta TO l_cuenta.
        IF sy-subrc EQ 1
          OR l_nuevo EQ 'X'.
          CLEAR lw_header.
          CONCATENATE gt_carga-fe_doc+6(4) gt_carga-fe_doc+3(2) gt_carga-fe_doc+0(2)
          INTO lw_header-doc_date.
    
          CONCATENATE gt_carga-fe_cont+6(4) gt_carga-fe_cont+3(2) gt_carga-fe_cont+0(2)
          INTO lw_header-pstng_date.
    
          lw_header-fisc_year = lw_header-doc_date(4).
    
          MOVE: gt_carga-refe    TO lw_header-ref_doc_no,
                gt_carga-txt_cab TO lw_header-header_txt,
                sy-uname         TO lw_header-username,
                gt_carga-soc     TO lw_header-comp_code,
                gt_carga-clase   TO lw_header-doc_type.
        ENDIF.
        IF gt_carga-clave EQ '40' OR gt_carga-clave EQ '50'.
    *  Cuenta mayor.
          CLEAR lt_account.
          lt_account-itemno_acc = l_item.
          lt_account-gl_account = l_cuenta.
          lt_account-item_text  = gt_carga-txt_pos.
          lt_account-costcenter = gt_carga-ceco.
          lt_account-profit_ctr = gt_carga-cebe.
          APPEND lt_account.
        ELSE.
    *  Cuenta de proveedor-acreedor.
          CLEAR lt_accountp.
          SELECT SINGLE akont
            INTO lt_accountp-gl_account
            FROM lfb1
            WHERE lifnr EQ l_cuenta
            AND bukrs EQ gt_carga-soc.
    
          IF sy-subrc EQ 0.
            SHIFT lt_accountp-gl_account RIGHT DELETING TRAILING space.
            OVERLAY lt_accountp-gl_account WITH '0000000000'.
          ENDIF.
          lt_accountp-itemno_acc = l_item.
          lt_accountp-vendor_no  = l_cuenta.
          lt_accountp-item_text  = gt_carga-txt_pos.
          APPEND lt_accountp.
        ENDIF.
    * Importe.
        CLEAR lt_currency.
        lt_currency-itemno_acc = l_item.
        lt_currency-curr_type  = '00'.
        lt_currency-currency   = 'MXN'.
    
        IF gt_carga-clave EQ '40'
          OR gt_carga-clave EQ '25'.
          lt_currency-amt_doccur = gt_carga-importe.
        ELSE.
          lt_currency-amt_doccur = gt_carga-importe * -1.
        ENDIF.
        APPEND lt_currency.
    
        READ TABLE gt_carga INTO lw_carga INDEX l_tabix.
        IF sy-subrc NE 0
          OR gt_carga-no_poli NE lw_carga-no_poli.
    
          l_nuevo = 'X'.
          CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
            EXPORTING
              documentheader = lw_header
            IMPORTING
              obj_type       = l_obj_type
              obj_key        = l_obj_key
              obj_sys        = l_obj_sys
            TABLES
              accountgl      = lt_account
              accountpayable = lt_accountp
              currencyamount = lt_currency
              return         = lt_return.
    
          DELETE ADJACENT DUPLICATES FROM lt_return COMPARING id type number.
          LOOP AT lt_return.
            CASE lt_return-type.
              WHEN 'S'.
                IF lt_return-id EQ 'RW'
                  AND lt_return-number EQ '605'.
                  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
                  CLEAR gt_log.
                  gt_log-flag = 'X'.
                  CONCATENATE 'Póliza No.' gt_carga-no_poli INTO gt_log-reg SEPARATED BY space.
                  CONCATENATE gt_log-reg lt_return-message_v2(10) INTO gt_log-reg SEPARATED BY ' -> '.
                  APPEND gt_log.
    
                ELSE.
                  ROLLBACK WORK.
                  CLEAR gt_log.
                  CONCATENATE 'Póliza No.' gt_carga-no_poli INTO gt_log-reg SEPARATED BY space.
                  CONCATENATE gt_log-reg lt_return-message INTO gt_log-reg SEPARATED BY ' -> '.
                  APPEND gt_log.
                ENDIF.
    
              WHEN 'E'.
                IF lt_return-id NE 'RW'.
                  ROLLBACK WORK.
                  CLEAR gt_log.
                  CONCATENATE 'Póliza No.' gt_carga-no_poli INTO gt_log-reg SEPARATED BY space.
                  CONCATENATE gt_log-reg lt_return-message INTO gt_log-reg SEPARATED BY ' -> '.
                  APPEND gt_log.
                ENDIF.
            ENDCASE.
          ENDLOOP.
    
          REFRESH:
          lt_account,
          lt_accountp,
          lt_currency,
          lt_return.
    
          CLEAR: lw_header,
                 l_item.
    
        ELSE.
          CLEAR l_nuevo.
        ENDIF.
      ENDLOOP.
    ENDFORM.                    "f_proceso
    *&---------------------------------------------------------------------*
    *&      Form  F_LEER_RUTA
    *&---------------------------------------------------------------------*
    *       Obtiene la ruta del archivo de pólizas.
    *----------------------------------------------------------------------*
    
    FORM f_leer_ruta  USING p_ruta  TYPE any.
      DATA: lt_ruta TYPE filetable,
            lw_ruta TYPE file_table, " EStructura
            l_rc TYPE sy-subrc.
    
      CALL METHOD cl_gui_frontend_services=>file_open_dialog
        EXPORTING
          window_title = 'Carga Archivo de Nómina'
        CHANGING
          file_table   = lt_ruta
          rc           = l_rc.
      READ TABLE lt_ruta INTO lw_ruta INDEX 1.
      IF sy-subrc EQ 0.
    *    pp_ruta = lw_ruta-filename.
        p_ruta = lw_ruta-filename.
      ENDIF.
    ENDFORM.                    " F_LEER_RUTA
    *********************************************************
    El consultor funcional como que no es de mucha ayuda, yo tuve que hacer el layout para la carga, pero esperaba que se mostrara tal y como lo veo en el txt.

    Espero haberme dado a entender.

    Aqui el archivo txt.
    1 02.07.2012 SA 1010 02.07.2012 6 MXN NÓMINA NÓMINA 40 650000 1000 SAFI008 SA001 NÓMINA NÓMINA
    1 02.07.2012 SA 1010 02.07.2012 6 MXN NÓMINA NÓMINA 50 215000 500 NÓMINA NÓMINA
    1 02.07.2012 SA 1010 02.07.2012 6 MXN NÓMINA NÓMINA 31 900000 500 NÓMINA NÓMINA
    2 02.07.2012 SA 1010 02.07.2012 6 MXN NÓMINA NÓMINA 40 650000 1000 SAFI008 SA001 NÓMINA NÓMINA
    2 02.07.2012 SA 1010 02.07.2012 6 MXN NÓMINA NÓMINA 50 215000 500 NÓMINA NÓMINA
    2 02.07.2012 SA 1010 02.07.2012 6 MXN NÓMINA NÓMINA 31 900000 500 NÓMINA NÓMINA


    Saludos.
    Editado por última vez por ABellamy; 20/03/2017, 03:25:28.
    Es más fácil encontrar el final del arcoíris que el de un estándar SAP.
  • SidV
    Usuario Avanzado
    • oct
    • 1761

    #2
    Hola.

    El cómo debería salir, lo tiene que decir o definir el consultor funcional.
    Ya es parte de su responsabilidad.

    Saludos

    Comentario

    • ABellamy
      Member
      • dic
      • 44

      #3
      Carga de Archivo por BAPI

      Ese es el problema SidV, mi funcional.
      Es más fácil encontrar el final del arcoíris que el de un estándar SAP.

      Comentario

      • SidV
        Usuario Avanzado
        • oct
        • 1761

        #4
        Si, me imagine.
        Pero vamos, tu debes poner los límites.
        Tu responsabilidad ya concluyó.
        Ahora debes dejar el "desarrollo" en pruebas.
        Si el funcional no sabe que hacer, o no sabe responder tus consultas funcionales, pues es SU problema. No el tuyo. :P

        Saludos

        PD: ... y eso que soy funcional, te lo respondo honestamente. Me da vergüenza agena por ahí los funcionales que veo.

        Comentario

        Trabajando...