REPORT zfi_bal_client.
************************************************************************
* DEFINICION TABLAS, ESTRUCTURAS Y TIPOS *
************************************************************************
*--DEFINICION DE TABLAS DE SISTEMA
TABLES: bsad, "Contabilidad: índice secundario para deudores
glt0, "Cifras movimientos reg.maestro ctas.mayor
kna1,
t001.
*--DEFINICION DE TABLAS INTERNAS
*-- tabla de clientes
DATA: BEGIN OF i_cliente OCCURS 0,
kunnr LIKE kna1-kunnr.
DATA: END OF i_cliente.
*-- tabla para ALV
DATA: BEGIN OF i_datos OCCURS 0,
debe LIKE bsid-dmbtr,
haber LIKE bsid-dmbtr,
kunnr LIKE kna1-kunnr,
name1 LIKE kna1-name1,
dif_debe LIKE bsid-dmbtr,
dif_haber LIKE bsid-dmbtr,
saldo LIKE bsid-dmbtr,
END OF i_datos.
DATA: gs_disvariant TYPE disvariant.
INCLUDE zalv.
************************************************************************
* DEFINICION DE PARAMETROS DE SELECCION *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK uno WITH FRAME TITLE text-001.
SELECTION-SCREEN SKIP.
PARAMETERS: p_bukrs LIKE glt0-bukrs OBLIGATORY. "Sociedad
SELECT-OPTIONS: s_kunnr FOR bsad-kunnr, "Nº cuenta
s_budat FOR bsad-budat OBLIGATORY. "Fecha contab.
SELECTION-SCREEN END OF BLOCK uno.
************************************************************************
* DEFINICION DE VARIABLES *
************************************************************************
************************************************************************
* *
* *
* T R A T A M I E N T O *
* *
* *
************************************************************************
*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM selecciona_datos.
PERFORM procesa_datos.
END-OF-SELECTION.
PERFORM pinta.
************************************************************************
* *
* *
* S U B - R U T I N A S *
* *
* *
************************************************************************
*&---------------------------------------------------------------------*
*& Form selecciona_datos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM selecciona_datos .
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE i_cliente
FROM kna1
WHERE kunnr IN s_kunnr.
ENDFORM. " selecciona_datos
*&---------------------------------------------------------------------*
*& Form procesa_datos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM procesa_datos .
DATA: BEGIN OF i_items OCCURS 0.
INCLUDE STRUCTURE bapi3007_2.
DATA: END OF i_items.
DATA: companycode LIKE bapi3007_1-comp_code,
customer LIKE bapi3007_1-customer,
date_from LIKE bapi3007-from_date,
date_to LIKE bapi3007-to_date,
v_debe LIKE bsid-dmbtr,
v_haber LIKE bsid-dmbtr,
v_dif LIKE bsid-dmbtr.
IF s_budat-high IS INITIAL.
s_budat-high = s_budat-low.
ENDIF.
companycode = p_bukrs.
date_from = s_budat-low.
date_to = s_budat-high.
LOOP AT i_cliente.
CLEAR i_items. REFRESH i_items.
customer = i_cliente-kunnr.
CALL FUNCTION 'BAPI_AR_ACC_GETSTATEMENT'
EXPORTING
companycode = p_bukrs
customer = customer
date_from = date_from
date_to = date_to
* NOTEDITEMS = ' '
* IMPORTING
* RETURN =
TABLES
lineitems = i_items.
CLEAR: v_debe, v_haber.
LOOP AT i_items.
IF i_items-db_cr_ind = 'S'.
v_debe = v_debe + i_items-amount.
ELSE.
v_haber = v_haber + i_items-amount.
ENDIF.
ENDLOOP.
PERFORM name1_cliente USING i_cliente-kunnr.
PERFORM saldo USING i_datos-saldo.
if i_datos-saldo < 0.
v_haber = v_haber + ( i_datos-saldo * ( - 1 ) ).
else.
v_debe = v_debe + i_datos-saldo.
endif.
MOVE: v_debe TO i_datos-debe,
v_haber TO i_datos-haber,
i_cliente-kunnr TO i_datos-kunnr,
kna1-name1 TO i_datos-name1.
v_dif = v_debe - v_haber.
IF v_dif < 0.
i_datos-dif_haber = v_dif * ( - 1 ).
ELSE.
i_datos-dif_debe = v_dif.
ENDIF.
* PERFORM saldo USING i_datos-saldo.
IF i_datos-debe IS INITIAL AND
i_datos-haber IS INITIAL AND
i_datos-saldo IS INITIAL.
ELSE.
APPEND i_datos.
CLEAR i_datos.
ENDIF.
ENDLOOP.
ENDFORM. " procesa_datos
*&---------------------------------------------------------------------*
*& Form name1_cliente
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I_CLIENTE_KUNNR text
*----------------------------------------------------------------------*
FORM name1_cliente USING p_kunnr.
SELECT SINGLE * FROM kna1 WHERE kunnr = p_kunnr.
ENDFORM. " name1_cliente
*&---------------------------------------------------------------------*
*& Form saldo
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I_DATOS_saldo text
*----------------------------------------------------------------------*
FORM saldo USING p_saldo.
DATA: BEGIN OF keybalance OCCURS 0.
INCLUDE STRUCTURE bapi3007_3.
DATA: END OF keybalance.
DATA: companycode LIKE bapi3007_1-comp_code,
customer LIKE bapi3007_1-customer,
keydate LIKE bapi3007-key_date,
anio(4).
companycode = p_bukrs.
customer = i_cliente-kunnr.
anio = s_budat-high(4) - 1.
CONCATENATE anio '1231' INTO keydate.
*-- BAPI para sacar el Saldo Anterior.
CALL FUNCTION 'BAPI_AR_ACC_GETKEYDATEBALANCE'
EXPORTING
companycode = companycode
customer = customer
keydate = keydate
TABLES
keybalance = keybalance.
p_saldo = keybalance-lc_bal.
ENDFORM. " saldo
*&---------------------------------------------------------------------*
*& Form pinta
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM pinta .
DATA: var_saldo(30),
var_debe(30),
var_haber(30),
anio(4).
repname = sy-repid.
anio = s_budat-high(4) - 1.
* Descripción estándar de campos
PERFORM obt_descrip_campos_tabla USING repname 'I_DATOS'.
* Asignar TOP OF PAGE
PERFORM asignar_top_of_page.
* Quitamos el cero de los importes.
PERFORM no_zero USING: 'DEBE' 'X',
'HABER' 'X',
'DIF_DEBE' 'X',
'DIF_HABER' 'X',
'SALDO' 'X'.
* Marcamos los campos de los sumatorios.
PERFORM no_sum USING: 'DEBE' 'X',
'HABER' 'X',
'DIF_DEBE' 'X',
'DIF_HABER' 'X',
'SALDO' 'X'.
* Cambiamos la descripción
CONCATENATE 'Débiteur' s_budat-high(4)
INTO var_debe SEPARATED BY space.
CONCATENATE 'Créditeur' s_budat-high(4)
INTO var_haber SEPARATED BY space.
CONCATENATE 'Solde' anio
INTO var_saldo SEPARATED BY space.
PERFORM cambio_descripcion USING:
'DEBE' 'Cumul Débit' 'Cumul Débit'
'Cumul Débit' 'Cumul Débit',
'HABER' 'Cumul Crédit' 'Cumul Crédit'
'Cumul Crédit' 'Cumul Crédit',
'KUNNR' 'Nº Compte' 'Nº Compte'
'Nº Compte' 'Nº Compte',
'NAME1' 'Intitulé' 'Intitulé'
'Intitulé' 'Intitulé',
'DIF_DEBE' var_debe var_debe
var_debe var_debe,
'DIF_HABER' var_haber var_haber
var_haber var_haber,
'SALDO' var_saldo var_saldo
var_saldo var_saldo.
* Características generales del listado
PERFORM carac_gen_listado.
* Disposición gs_disvariant-report = repname.
* Se muestra el listado
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = repname
is_layout = layout
it_fieldcat = fieldtab[]
it_events = events[]
i_save = 'A'
is_variant = gs_disvariant
TABLES
t_outtab = i_datos
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " pinta
*&---------------------------------------------------------------------*
*& Form cambio_descripcion
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM cambio_descripcion USING pf_fieldname
pf_scrtext_l
pf_scrtext_m
pf_scrtext_s
pf_coltext.
READ TABLE fieldtab WITH KEY fieldname = pf_fieldname ASSIGNING <fs>.
IF sy-subrc EQ 0.
<fs>-seltext_l = pf_scrtext_l.
<fs>-seltext_m = pf_scrtext_m.
<fs>-seltext_s = pf_scrtext_s.
<fs>-reptext_ddic = pf_coltext.
ENDIF.
ENDFORM. " cambio_descripcion
*&---------------------------------------------------------------------*
*& Form no_zero
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM no_zero USING pf_fieldname
p_zero.
READ TABLE fieldtab WITH KEY fieldname = pf_fieldname ASSIGNING <fs>.
IF sy-subrc EQ 0.
<fs>-no_zero = p_zero.
ENDIF.
ENDFORM. " no_zero
*&---------------------------------------------------------------------*
*& Form no_sum
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM no_sum USING pf_fieldname
p_sum.
READ TABLE fieldtab WITH KEY fieldname = pf_fieldname ASSIGNING <fs>.
IF sy-subrc EQ 0.
<fs>-do_sum = p_sum.
ENDIF.
ENDFORM. " p_sum
*---------------------------------------------------------------------*
* FORM alv_top_of_page *
*---------------------------------------------------------------------*
* Textos de cabecera
* - typ, " H = Header, S = Selection, A = Action
* - key,
* - info,
*---------------------------------------------------------------------*
FORM alv_top_of_page.
DATA: lt_list_commentary TYPE slis_t_listheader,
ls_list_commentary TYPE slis_listheader.
DATA: v_date(60).
SELECT SINGLE * FROM t001 WHERE bukrs = p_bukrs.
CONCATENATE 'Du' s_budat-low+6(2) '/'
s_budat-low+4(2) '/'
s_budat-low(4) 'au'
s_budat-high+6(2) '/'
s_budat-high+4(2) '/'
s_budat-high(4)
INTO v_date SEPARATED BY space.
* Componemos texto de cabecera
CLEAR ls_list_commentary.
ls_list_commentary-typ = 'H'.
ls_list_commentary-info = 'Balance des comptes clients'.
APPEND ls_list_commentary TO lt_list_commentary.
*
CLEAR ls_list_commentary.
ls_list_commentary-typ = 'S'.
ls_list_commentary-key = 'Société:'.
ls_list_commentary-info = t001-butxt.
APPEND ls_list_commentary TO lt_list_commentary.
*
CLEAR ls_list_commentary.
ls_list_commentary-typ = 'S'.
ls_list_commentary-key = 'Date comptable:'.
ls_list_commentary-info = v_date.
APPEND ls_list_commentary TO lt_list_commentary.
*
CLEAR ls_list_commentary.
ls_list_commentary-typ = 'A'.
ls_list_commentary-info = 'Edition Provisiore - Experimé en euros'.
APPEND ls_list_commentary TO lt_list_commentary.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = lt_list_commentary.
ENDFORM. "alv_top_of_page