Pagos parciales vía POSTING_INTERFACE_END

Que pasa chavales?

Algún @abapers ha usado la bapi POSTING_INTERFACE_END para pagos/compensaciones parciales de ununa factura de deudor/cliente???

Al final esta bapi lo que hace es un Batch Input así que es muy probable que desestime el uso de la misma y haga yo mismo mi BI como los hombres para el posteo de pagos parciales, porque la forma en que se llenan los datos del batch en esta bapi es diferente a yo hacerlo manual con mi grabación.

Actualmente uso la bapi para pagos completos.

Gracias de antemano y ahí nos leemos.

Si te acostumbras a usarla en el fondo es sencilla, quizá tenga menos trabajo que un BI, te paso un ejemplo:

La rutina COMPENSAR_PARTIDA realiza la contabilización y compensación de una partida financiera. Con rellenar la tabla FTCLEAR con los documentos que se quieren compensar se compensarán todos.

Las rutinas que se implementan son:

  • COMPENSAR_PARTIDA : rutina general de proceso
  • INICIAR_INTERFAZ: rutina que inicializa el posting interface.
  • PROCESAR_INTERFAZ : rutina que realiza la compensación.
  • CERRAR_INTERFAZ : rutina que cierra el posting interface.

Notar que se emplea en la rutina la variable P_AUGBL. En función de si tenemos que compensar factura o abono, la variable tiene un valor u otro:

* La operación depende de si tenemos
   * factura o abono
    case lv_tipo_doc.
      when gc_tipo_doc_f.
        lv_auglv = gc_eingzahl.
      when gc_tipo_doc_a.
        lv_auglv = gc_ausgzahl.
    endcase.

Donde
constants: gc_eingzahl type t041a-auglv value 'EINGZAHL',
           gc_ausgzahl type t041a-auglv value 'AUSGZAHL',
           gc_umbuchng type t041a-auglv value 'UMBUCHNG'.
*&---------------------------------------------------------------------*
*&      Form  COMPENSAR_PARTIDA
*&---------------------------------------------------------------------*
*       Compensación de partidas de cliente
*----------------------------------------------------------------------*
form compensar_partida  using    p_bsid type bsid
                                 p_datos type zws_crm
                                 p_importe
                                p_auglv
                                 p_waers
                        changing p_subrc type sy-subrc
                                 return type bapiret2_t
                                 t_blntab type re_t_ex_blntab.

  data: lt_ftclear type standard table of ftclear
                   with header line,
        lt_ftpost type standard table of ftpost
                  with header line,
        lt_fttax type standard table of fttax
                  with header line.

  data: txt_fecha(10) type c.
  data: txt_importe(15) type c.
  data: lv_sgtxt type bseg-sgtxt.

* Iniciar interfaz de contabilización
  perform iniciar_interfaz changing p_subrc
                                    return.
  if p_subrc <> 0.
    return.
  endif.

* Creamos el documento de compensación de la
* partida
* Batch Input Values
  lt_ftpost-stype = 'K'."Header
  lt_ftpost-count = 1. "number of Dynpro

* Fecha de documento
  write p_datos-fecha_contabilizacion to txt_fecha.
  lt_ftpost-fnam = 'BKPF-BLDAT'.
  lt_ftpost-fval = txt_fecha.
  append lt_ftpost.
* Fecha de contabilizacion
  lt_ftpost-fnam = 'BKPF-BUDAT'.
  lt_ftpost-fval = txt_fecha.
  append lt_ftpost.
* Clase de documento
  lt_ftpost-fnam = 'BKPF-BLART'.
  case p_auglv.
    when gc_ausgzahl.
      lt_ftpost-fval = zfi_param_crm-blart_pa.
    when gc_eingzahl.
      lt_ftpost-fval = zfi_param_crm-blart_co.
  endcase.
  append lt_ftpost.
* Sociedad
  lt_ftpost-fnam = 'BKPF-BUKRS'.
  lt_ftpost-fval = p_bsid-bukrs.
  append lt_ftpost.
* Moneda
  lt_ftpost-fnam = 'BKPF-WAERS'.
  lt_ftpost-fval = p_waers.
  append lt_ftpost.
* Referencia
  lt_ftpost-fnam = 'BKPF-XBLNR'.
  lt_ftpost-fval = p_bsid-xblnr.
  append lt_ftpost.
* Primera línea, Siguiente DYNRPO
  lt_ftpost-stype = 'P'."Posicion
  lt_ftpost-count = 2.  "number of ITEM
* Ind movimiento
  lt_ftpost-fnam = 'RF05A-NEWBS'.
* Tenemos que asignar el proceso
  case p_auglv.
    when gc_ausgzahl.
      lt_ftpost-fval = '50'.
    when gc_eingzahl.
      lt_ftpost-fval = '40'.
  endcase.
  append lt_ftpost.
* Cuenta
  lt_ftpost-fnam = 'RF05A-NEWKO'.
  lt_ftpost-fval = p_datos-cuenta_banco.
  append lt_ftpost.
* Importe
  write p_importe to txt_importe
                currency p_waers.
  lt_ftpost-fnam = 'BSEG-WRBTR'.
  lt_ftpost-fval = txt_importe.
  append lt_ftpost.

* Texto de posición
  write p_importe to txt_importe
                currency p_waers.
  lt_ftpost-fnam = 'BSEG-SGTXT'.
  perform forma_texto_posicion_cobro using p_bsid-kunnr
                                           p_bsid-xblnr
                                  changing lv_sgtxt.
  lt_ftpost-fval = lv_sgtxt.
  append lt_ftpost.


* Documents to be cleared
  lt_ftclear-agkoa = 'D'. "Account Type
  lt_ftclear-xnops = 'X'.  "Indicator: Select only open items which are not special G/L?
  lt_ftclear-xfifo = 'X'.
  lt_ftclear-agbuk = p_bsid-bukrs. "Example company code
  lt_ftclear-agkon = p_bsid-kunnr. "Example Customer
  lt_ftclear-selfd = 'BELNR'."Selection Field
  lt_ftclear-selvon = p_bsid-belnr. "Documento seleccionado
  lt_ftclear-selbis = p_bsid-belnr. "Documento seleccionado
  append lt_ftclear.

  perform procesar_interfaz using p_auglv
                                  t_blntab[]
                                  lt_ftclear[]
                                  lt_ftpost[]
                                  lt_fttax[]
                         changing p_subrc
                                  return.

* Cerrar interfaz
  perform cerrar_interfaz changing p_subrc
                                   return.

endform.                    " COMPENSAR_PARTIDA
*&---------------------------------------------------------------------*
*&      Form  INICIAR_INTERFAZ
*&---------------------------------------------------------------------*
*       Iniciamos la interfaz de contabilización
*----------------------------------------------------------------------*
form iniciar_interfaz  changing p_subrc type sy-subrc
                                return type bapiret2_t.

  data: wa_return type bapiret2.

  call function 'POSTING_INTERFACE_START'
    exporting
      i_function               = 'C'        "CALL TRANSACTION
      i_mode                   = gv_modoct  "Modo N
      i_update                 = 'S'        "Update S
    exceptions
      client_incorrect         = 1
      function_invalid         = 2
      group_name_missing       = 3
      mode_invalid             = 4
      update_invalid           = 5
      others                   = 6
            .
  if sy-subrc <> 0.
    p_subrc = sy-subrc.
    call function 'MAP2I_SYST_TO_BAPIRET2'
      exporting
        syst           = syst
      changing
        bapiret2       = wa_return.
    if not wa_return is initial.
      append wa_return to return.
    endif.
  endif.

endform.                    " INICIAR_INTERFAZ
*&---------------------------------------------------------------------*
*&      Form  PROCESAR_INTERFAZ
*&---------------------------------------------------------------------*
*       Llamamos a la interfaz de proceso de documentos
*----------------------------------------------------------------------*
form procesar_interfaz  using    p_auglv
                                 t_blntab type standard table
                                 t_ftclear type standard table
                                 t_ftpost type standard table
                                 t_fttax type standard table
                        changing p_subrc
                                 return type bapiret2_t.

  data: l_tcode type sy-tcode value 'FB05', "You get an error with any other value
      l_sgfunct type rfipi-sgfunct value 'C'. "Post immediately
  data: wa_syst type syst.
  data: wa_return type bapiret2.

* Podemos llamar a contabilizar y compensar (si pasamos
* el valor para P_AUGLV) es decir, FB05, o llamamos a
* contabilizar a secas (FB01) si P_AUGLV es inicial
  if p_auglv is not initial.
    l_tcode = 'FB05'.
    call function 'POSTING_INTERFACE_CLEARING'
      exporting
        i_auglv                          = p_auglv
        i_tcode                          = l_tcode
        i_sgfunct                        = l_sgfunct
*       I_NO_AUTH                        = ' '
      importing
        e_msgid                          = wa_syst-msgid
        e_msgno                          = wa_syst-msgno
        e_msgty                          = wa_syst-msgty
        e_msgv1                          = wa_syst-msgv1
        e_msgv2                          = wa_syst-msgv2
        e_msgv3                          = wa_syst-msgv3
        e_msgv4                          = wa_syst-msgv4
        e_subrc                          = p_subrc
      tables
        t_blntab                         = t_blntab[]
        t_ftclear                        = t_ftclear[]
        t_ftpost                         = t_ftpost[]
        t_fttax                          = t_fttax[]
      exceptions
        clearing_procedure_invalid       = 1
        clearing_procedure_missing       = 2
        table_t041a_empty                = 3
        transaction_code_invalid         = 4
        amount_format_error              = 5
        too_many_line_items              = 6
        company_code_invalid             = 7
        screen_not_found                 = 8
        no_authorization                 = 9
        others                           = 10.
  else.
    l_tcode = 'FB01'.
    call function 'POSTING_INTERFACE_DOCUMENT'
      exporting
        i_tcode                        = l_tcode
        i_sgfunct                      = l_sgfunct
*       I_NO_AUTH                      = ' '
      importing
        e_msgid                          = wa_syst-msgid
        e_msgno                          = wa_syst-msgno
        e_msgty                          = wa_syst-msgty
        e_msgv1                          = wa_syst-msgv1
        e_msgv2                          = wa_syst-msgv2
        e_msgv3                          = wa_syst-msgv3
        e_msgv4                          = wa_syst-msgv4
        e_subrc                          = p_subrc
      tables
        t_blntab                       = t_blntab[]
        t_ftpost                       = t_ftpost[]
        t_fttax                        = t_fttax[]
      exceptions
        account_missing                = 1
        company_code_missing           = 2
        posting_key_invalid            = 3
        posting_key_missing            = 4
        record_type_invalid            = 5
        transaction_code_invalid       = 6
        amount_format_error            = 7
        too_many_line_items            = 8
        company_code_invalid           = 9
        screen_not_found               = 10
        no_authorization               = 11
        others                         = 12.
  endif.
  if    sy-subrc <> 0
     or wa_syst-msgty ca 'EAX'
     or p_subrc <> 0.
    if wa_syst-msgty ca 'EAX'.
      call function 'MAP2I_SYST_TO_BAPIRET2'
        exporting
          syst           = wa_syst
        changing
          bapiret2       = wa_return.
       wa_return-type = 'E'. "Error siempre
    else.
      call function 'MAP2I_SYST_TO_BAPIRET2'
        exporting
          syst           = syst
        changing
          bapiret2       = wa_return.
      wa_return-type = 'E'. "Error siempre
    endif.
    if not wa_return is initial.
      append wa_return to return.
    endif.
  endif.

endform.                    " PROCESAR_INTERFAZ
*&---------------------------------------------------------------------*
*&      Form  CERRAR_INTERFAZ
*&---------------------------------------------------------------------*
*       Cerramos la interfaz de proceso de contabilizaciones
*----------------------------------------------------------------------*
form cerrar_interfaz  changing p_subrc type sy-subrc
                               return type bapiret2_t.

  data: wa_return type bapiret2.

  call function 'POSTING_INTERFACE_END'
    exporting
      i_bdcimmed                    = ' '
*     I_BDCSTRTDT                   = NO_DATE
*     I_BDCSTRTTM                   = NO_TIME
    exceptions
      session_not_processable       = 1
      others                        = 2
            .
  if sy-subrc <> 0.
    call function 'MAP2I_SYST_TO_BAPIRET2'
      exporting
        syst           = syst
      changing
        bapiret2       = wa_return.
    if not wa_return is initial.
      append wa_return to return.
    endif.
  endif.

endform.                    " CERRAR_INTERFAZ
1 me gusta

Gracias @Salco, es así mismo que uso esta bapi.

Mi problema está en hacer pagos parciales.
Estoy buscando una forma de llenar los valores de este TAB usando dicha bapi:

Mira una vez hice algo asi para un proceso de pago, era relacionado a carnet y visanet, pero no sabia de la existencia de esta bapi que mencionas, y bueno, como tal lo que hice fue una grabacion que funciono de maravilla, por asi decirlo, me hice una bapi funcion que realizaba pagos parciales y pagos totales.
Estuven pensando para traer el codigo, pero no lo tengo en mi repositorio.
Te recomiendo que intentes la grabacion a ver como queda.
Solo debes estar pendiente en cada paso que das, y asegurarte de llenar justo los campos que vas a necesitar.

2 Me gusta

Gracias @smota, hice como mencioné al principio[quote=“Haden_Yasser_, post:1, topic:4605”]
es muy probable que desestime el uso de la misma y haga yo mismo mi BI como los hombres para el posteo de pagos parciales
[/quote]

Hice mi BI para los parciales y la BAPI la uso para pago completos.

No creo que esto cuente como solución ya que el problema era parciales con la bapi, entonces esto sería un ESQUIVO DEL PROBLEMA en lugar de SOLUCIÓN.

Tranquilo con la solucion, si quieres marca tu propia respuesta ya que fue mas una opinion de experiencia, para confirmar la solucion de la BI y darte seguridad con ese proceso.

@smota lo que digo es que al final no dimos solución al problema en sí, yo no veo esto como una solución, más bien le dí la espalda al problema.

Oh ya, es que no entendi en el primero post, si @Haden_Yasser_ esta solicitud no tiene solucion, los de SAP nunca se han preocupado por mejorar o mas bien facilitar , bapis para la f-28

Saludos @Haden_Yasser_,

Ten pendiente que las grabaciones a la F-28 funcionará perfectamente siempre y cuando no existan número de documentos duplicados con ejercicios fiscales diferentes. Ej:

  • Doc 1000009 ejer 2015
  • Doc 1000009 ejer 2016

Cuando le envíes el doc 1000009 la estúpida F-28 no te deja especificar el ejercicio por lo que los encontrará los dos siempre y cuando la empresa cometa el error de no compensar el del ejercicio anterior a tiempo (Créeme que ya he visto este caso y aunque muy rara vez, suele pasar).

Tienes razón Romaldy Black @romaldyminaya,aunque es muy dificil que pase porque ya tengo el filtro de Cliente, las probabilidades de que un cliente caiga con las mismas facturas en dos ejercicios diferentes son muy pocas, además estás facturas son al contado la mayoría. Pero no descarto de que pueda pasar.

Pero de todas formas gracias por mencionarlo, haré una subrutinita para curarme en salud y usar los demás filtros que hay en caso de que pase la burrada esa.

1 me gusta

@Haden_Yasser_, ¿como estas?, ¿Este tema fue solucionado?

1 me gusta

@Shadowdancer, no se solucionó, tuve que desestimar el uso de la bapi.

Tengo un tema similar, necesito hacer unas compensaciones que las hacen desde las F-32, pero no encuentro que BAPI usar.

Hola Amigos buenas tardes,
Se logro hacer un pago parcial con esa bapi?

Hola,

Hice algo parecido pero pagos por resto:
image

Solo usen un Call transaction

para que se ejecute automaticamente:

opt-dismode = ‘N’.
opt-updmode = ‘S’.
opt-cattmode = space.
opt-defsize = ‘X’.
opt-racommit = space.
opt-nobinpt = space.
opt-nobiend = space.

y llenan la tabla bdcdata según los campos que deben llenar de la transaccion FB05 o pueden usar la F-30, en mi caso use la F-30.

Saludos

Nunca pude hacerlo con dicha bapi, es buena para compensar directamente saldos en 0,
pero para otras opciones usa un call transaction fb05 o f-30
y llena la tabla bdcdata según los campos que necesitas llenar para compensar

1 me gusta

Gracias, si igual llegue a la misma conclusión.

Buenos Días @Haden_Yasser_ me podrías ayudar con un ejemplo de tu código con BI para cubrir la necesidad de los pagos parciales por F-53?

Hola @ches,
Al final recuerdo que terminé haciendo un batch-input para este tema, fue en uno de mis tantos clientes así que no te puedo dar el codigo, además de que las grabaciones pueden o no variar de un sistema a otro.

1 me gusta