Você está na página 1de 33

REPORT zfir003 MESSAGE-ID zfi001 LINE-SIZE 141 NO STANDARD PAGE HEADING.

************************************************************************
* DECLARAÇÕES *
************************************************************************

*----------------------------------------------------------------------*
* Objetos DDIC *
*----------------------------------------------------------------------*
TABLES: bsid. "Contabilidade: clientes

*----------------------------------------------------------------------*
* Parâmetros de seleção *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_bukrs FOR bsid-bukrs, "Empresa
s_kunnr FOR bsid-kunnr, "Cliente
s_gjahr FOR bsid-gjahr OBLIGATORY, "Exercício
s_budat FOR bsid-budat OBLIGATORY. "Data lançamento
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.


PARAMETERS: p_alv RADIOBUTTON GROUP.
SELECTION-SCREEN END OF BLOCK b3.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.


PARAMETERS: p_saida TYPE rlgrap-filename OBLIGATORY, "Arquivo de gravação
r_normal RADIOBUTTON GROUP gr1 MODIF ID gr2, "Remessa normal
r_correc RADIOBUTTON GROUP gr1 MODIF ID gr2. "Remessa de correção
SELECTION-SCREEN END OF BLOCK b2.

*----------------------------------------------------------------------*
* Constantes *
*----------------------------------------------------------------------*
CONSTANTS: c_cnpj_msm(14) VALUE '25860305000102',
c_id_header(2) VALUE '00',
c_desc(20) VALUE 'RELATO COMP NEGOCIOS',
c_versao(1) VALUE 'V',
c_01(2) VALUE '01',
c_tp_dados(2) VALUE '05',
c_id_trailler(2) VALUE '99',
c_correcao(8) VALUE 'CORRECAO',
c_exclui(13) VALUE '9999999999999',
c_msg_1(18) VALUE 'Inserindo registro',
c_de(2) VALUE 'de',
c_msg_2(10) VALUE 'no arquivo',
c_a VALUE 'a'.

*----------------------------------------------------------------------*
* Ranges *
*----------------------------------------------------------------------*
RANGES: gr_blart FOR bsid-blart.

*----------------------------------------------------------------------*
* Tabelas internas *
*----------------------------------------------------------------------*
TYPES truxs_t_text_data(4096) TYPE c OCCURS 0.
DATA: it_txt TYPE truxs_t_text_data.
DATA: ls_txt LIKE LINE OF it_txt.
*** Recebem dados do banco de dados

* Dados de clientes
DATA: BEGIN OF gt_kna1 OCCURS 0,
kunnr TYPE kna1-kunnr, "Nº cliente 1
name1 TYPE kna1-name1, "Nome 1
name2 TYPE kna1-name2, "Nome 2
ort01 TYPE kna1-ort01, "Local
pstlz TYPE kna1-pstlz, "Código postal
regio TYPE kna1-regio, "Região (país, estado, província,
condado)
stras TYPE kna1-stras, "Rua e nº
telf1 TYPE kna1-telf1, "1º Nº telefone
telfx TYPE kna1-telfx, "Nº telefax
erdat TYPE kna1-erdat, "Data de criação do registro
loevm TYPE kna1-loevm, "Marcado para eliminação
ort02 TYPE kna1-ort02, "Bairro
pstl2 TYPE kna1-pstl2, "Código postal da cx.postal
cityc TYPE kna1-cityc, "Código da cidade
sperr TYPE kna1-sperr, "Bloqueio central contabilização
stcd1 TYPE kna1-stcd1, "CNPJ
stcd2 TYPE kna1-stcd2, "CPF
stkzn TYPE kna1-stkzn,
END OF gt_kna1.

* Partidas em aberto e compensadas - FI


DATA: BEGIN OF gt_titulos OCCURS 0,
bukrs TYPE bsid-bukrs, "Empresa
kunnr TYPE bsid-kunnr, "Nº cliente 1
augdt TYPE bsid-augdt, "Data de compensação
augbl TYPE bsid-augbl, "Nº documento de compensação
gjahr TYPE bsid-gjahr, "Exercício
belnr TYPE bsid-belnr, "Nº documento de um documento
contábil
budat TYPE bsid-budat, "Data de lançamento no documento
bldat TYPE bsid-budat, "Data documento
xblnr TYPE bsid-xblnr, "Nº documento de referência
wrbtr TYPE bsid-wrbtr, "Montante em moeda do documento
zfbdt TYPE bsid-zfbdt, "Data base para cálculo do
vencimento
zbd1t TYPE bsid-zbd1t, "Dias de desconto 1
xstov TYPE bsid-xstov, "Código: documento marcado para
estorno
vbeln TYPE bsid-vbeln, "Doc faturamento
END OF gt_titulos.

DATA: gt_titulos_aux LIKE gt_titulos OCCURS 0 WITH HEADER LINE,


gt_bsid_aux LIKE TABLE OF gt_titulos.

* Partidas em aberto
DATA: BEGIN OF gt_bsid OCCURS 0,
bukrs TYPE bsid-bukrs, "Empresa
kunnr TYPE bsid-kunnr, "Nº cliente 1
augdt TYPE bsid-augdt, "Data de compensação
augbl TYPE bsid-augbl, "Nº documento de compensação
gjahr TYPE bsid-gjahr, "Exercício
belnr TYPE bsid-belnr, "Nº documento de um documento
contábil
budat TYPE bsid-budat, "Data de lançamento no documento
bldat TYPE bsid-budat, "Data documento
xblnr TYPE bsid-xblnr, "Nº documento de referência
wrbtr TYPE bsid-wrbtr, "Montante em moeda do documento
zfbdt TYPE bsid-zfbdt, "Data base para cálculo do
vencimento
zbd1t TYPE bsid-zbd1t, "Dias de desconto 1
xstov TYPE bsid-xstov, "Código: documento marcado para
estorno
vbeln TYPE bsid-vbeln, "Doc faturamento
END OF gt_bsid.

* Partidas compensadas
DATA: BEGIN OF gt_bsad OCCURS 0,
bukrs TYPE bsad-bukrs, "Empresa
kunnr TYPE bsad-kunnr, "Nº cliente 1
augdt TYPE bsad-augdt, "Data de compensação
augbl TYPE bsad-augbl, "Nº documento de compensação
gjahr TYPE bsad-gjahr, "Exercício
belnr TYPE bsad-belnr, "Nº documento de um documento
contábil
budat TYPE bsid-budat, "Data de lançamento no documento
bldat TYPE bsid-budat, "Data documento
xblnr TYPE bsad-xblnr, "Nº documento de referência
wrbtr TYPE bsad-wrbtr, "Montante em moeda do documento
zfbdt TYPE bsad-zfbdt, "Data base para cálculo do
vencimento
zbd1t TYPE bsid-zbd1t, "Dias de desconto 1
xstov TYPE bsid-xstov, "Código: documento marcado para
estorno
vbeln TYPE bsid-vbeln, "Doc faturamento
END OF gt_bsad.

* Cabeçalho Documento contábil


DATA: BEGIN OF gt_bkpf OCCURS 0,
bukrs TYPE bkpf-bukrs, "Empresa
belnr TYPE bkpf-belnr, "Nº documento de um documento
contábil
gjahr TYPE bkpf-gjahr, "Exercício
blart TYPE bkpf-blart, "
bldat TYPE bkpf-bldat, "
bstat TYPE bkpf-bstat, "Status do documento
END OF gt_bkpf.

DATA: BEGIN OF gt_dados OCCURS 0,


empresa TYPE ztfi004-empresa,
n_cliente TYPE ztfi004-n_cliente,
n_document TYPE ztfi004-n_document ,
exercicio TYPE ztfi004-exercicio ,
chave TYPE ztfi004-chave ,
envio_inclusao TYPE ztfi004-envio_inclusao,
envio_exclusao TYPE ztfi004-envio_exclusao,
END OF gt_dados.

TYPES: BEGIN OF ty_detalhe,


cod_registro(1) TYPE c,
operacao(1) TYPE c,
final_cnpj(6) TYPE c,
dt_venc(8) TYPE c,
dt_vendiv(8) TYPE c,
natureza(7) TYPE c,
tp_pessoa(1) TYPE c,
tp2(1) TYPE c,
documento(15) TYPE c,
mot_baixa(57) TYPE c,
nome(218) TYPE c,
endereco(45) TYPE c,
bairro(20) TYPE c,
municipio(25) TYPE c,
uf(2) TYPE c,
cep(8) TYPE c,
vl_divida(15) TYPE c,
num_contrato(155) TYPE c,
sequencia TYPE n LENGTH 7,
END OF ty_detalhe,

BEGIN OF ty_rodape,
cod_registro(1) TYPE c,
lv_braco(592) TYPE c,
sequencia TYPE n LENGTH 7,
END OF ty_rodape.

TYPES: BEGIN OF ty_fi0003,


sigla TYPE zsigla,
cnpj TYPE stcd1,
telefone TYPE ztelefone,
nome TYPE znomeserasa,
cnpj2 TYPE stcd1,
END OF ty_fi0003.

DATA: w_detalhe TYPE ty_detalhe,


w_rodape TYPE ty_rodape,
t_detalhe TYPE TABLE OF ty_detalhe,
t_rodape TYPE TABLE OF ty_rodape,
t_fi003 TYPE TABLE OF ztfi003,
t_fi003_aux TYPE TABLE OF ztfi003,
t_fi003_aux2 TYPE TABLE OF ztfi003,
t_fi004_aux TYPE TABLE OF ty_fi0003,
t_00z1 TYPE TABLE OF t001z,
w_00z1 TYPE t001z,
w_fi003 TYPE ztfi003,
w_fi004 TYPE ty_fi0003,
t_bseg TYPE TABLE OF bseg,
w_bseg TYPE bseg.

FIELD-SYMBOLS: <fi003> TYPE ztfi003,


<fi003_aux> TYPE ztfi003.

* Partidas em aberto e compensadas


DATA: BEGIN OF gt_bsid_bsad OCCURS 0.
INCLUDE STRUCTURE gt_bsid.
DATA flag(4) TYPE c.
DATA: END OF gt_bsid_bsad.

*** Tabelas de saída

* Registro Header - Cabeçalho


*DATA: BEGIN OF gt_header OCCURS 0,
* id(2), "Identificação Registro Header
* desc(20), "Número do CNPJ da instituição
informante
* cnpj(14) TYPE n, "CNPJ Empresa Conveniada
* dat_ini(8), "Data Início do Período Informado
* dat_fim(8), "Data Final do Período Informado
* movto(48), "Definição do Movimento
* versao(2), "Identificação da Versão do
Layout
* num_versao(28), "Número da Versão do Layout
* END OF gt_header.

* Registro Header - Cabeçalho


DATA: BEGIN OF gt_header OCCURS 0,
id(1), "Codigo do Registro
cnpj(9) TYPE n, "CNPJ Empresa Conveniada
dat_ini(8), "Data Geração do arquivo
telefone(12), "Telefone Instituição
ramal(4), "Ramal
nome(70), "Nome do contrato Instituição
id_arq(15), "Identificação Arquivo
num_rem(6), "Numero remessa arquivo
cod_env(1), "Código envio
branco(467), "Embranco
sequencial(7), "Sequencia
END OF gt_header.

* Registros detalhes - Tempo de relacionamento


DATA: BEGIN OF gt_detalhe_relation OCCURS 0,
id(2), "Identificação do Registro de
Dados
cnpj(14) TYPE n, "CNPJ Empresa Cliente (Sacado)
tipo_dados(2), "Tipo de Dados - 01=(Tempo de
Relacionamento)
dat_ini(8), "Cliente Desde
tipo(1), "Tipo de Cliente: 1 = Antigo; 2 =
Menos de um ano; 3 = Inativo
space(103),
END OF gt_detalhe_relation.

DATA: BEGIN OF gt_detalhe_titulos OCCURS 0,


id(2), "Identificação do Registro de
Dados
cnpj(14) TYPE n, "CNPJ Empresa Cliente (Sacado)
tp_dados(2), "Tipo de Dados = 05 (Títulos #
Para Sacado Pessoa Jurídica)
titulo(10), "Número do Título
dat_emissao(8), "Data da Emissão do título
valor(13), "Valor do Título
dat_vencto LIKE sy-datum, "Data de Vencimento
dat_pgto(8), "Data de Pagamento
flag_titulo(35), "Area reservada - Flag titulo
space(31),
END OF gt_detalhe_titulos.

* Registro trailler do arquivo - Rodapé


DATA: BEGIN OF gt_trailler OCCURS 0,
id(2), "Identificação do Registro
Trailler
qtde_relac(11) TYPE n, "Quantidade de Registros 01#Tempo
de Relacionamento.
space1(44),
qtde_reg(11) TYPE n, "Quantidade de Registros 05 #
Títulos
space2(31),
END OF gt_trailler.

*----------------------------------------------------------------------*
* Variáveis *
*----------------------------------------------------------------------*
DATA: gn_qtde_reg_relation TYPE i,
gn_qtde_reg_titulos TYPE i,
p_saida_old LIKE rlgrap-filename,
lc_first.

* Utilizadas durante gravação no arquivo de saída


DATA: lt_detalhe_relation LIKE gt_detalhe_relation OCCURS 0 WITH HEADER LINE,
lt_detalhe_titulos LIKE gt_detalhe_titulos OCCURS 0 WITH HEADER LINE,
li_qtde_relation TYPE i,
li_qtde_titulos TYPE i,
li_qtde_sucesso TYPE i,
li_qtde_total TYPE i,
li_cont_registros TYPE i,
lc_texto_status(60) TYPE c.

DATA: lt_ztfi004 type TABLE OF ztfi004,


li_ztfi004 type ztfi004.

*-------------------------------------------------------------------------
* Definição de Estruturas
*-------------------------------------------------------------------------
DATA: gs_ztfi004 TYPE ztfi004.
*
* gs_bsid TYPE ty_bsid.

*-------------------------------------------------------------------------
" Estruturas e tabelas intenas ( ALV )
*-------------------------------------------------------------------------
DATA: gw_alv TYPE TABLE OF ztfi004,
gw_fcat TYPE TABLE OF slis_fieldcat_alv.

DATA: gs_alv TYPE ztfi004,


gs_fcat TYPE slis_fieldcat_alv,

st_layout TYPE slis_layout_alv..

* Utilizadas para geração da letra para diferenciar número do títulos das


faturas
DATA: gc_alfabeto(2) TYPE c,
gi_conta_faturas TYPE i.

DATA: li_erros TYPE i.

*----------------------------------------------------------------------*
* Estruturas *
*----------------------------------------------------------------------*
DATA: gs_titulos LIKE gt_titulos.
*----------------------------------------------------------------------*
* Contantes *
*----------------------------------------------------------------------*
CONSTANTS: c_registro(1) VALUE '0',
c_ramal(4) VALUE '0001',
c_serasa(15) VALUE 'SERASA-CONVEM04',
c_envio(1) VALUE 'E',
c_sequencia(7) VALUE '0000001',
c_num_rem(6) VALUE '000001',
c_cnpj(9) VALUE '058997354',
c_telefone(12) VALUE '001120788075',
c_nome(70) VALUE 'SHOPPING CENTER IGUATEMI CAMPINAS'.

************************************************************************
* EVENTOS *
************************************************************************

*----------------------------------------------------------------------*
* Initialization *
*----------------------------------------------------------------------*
INITIALIZATION.
lc_first = 'X'.

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_saida.
PERFORM f_busca_diretorio USING p_saida.

*----------------------------------------------------------------------*
* START-OF-SELECTION. *
*----------------------------------------------------------------------*
START-OF-SELECTION.

* Seleciona dados do BD
PERFORM f_seleciona_dados.

IF r_normal = 'X'.

* Monta tabela de saída


PERFORM f_monta_arquivo_saida.

IF p_alv IS NOT INITIAL.

PERFORM exibe_alv.

*Alv Here

ELSE.

PERFORM gera_arquivo.

ENDIF.

* PERFORM f_gera_arq_saida.

ELSE.
* Monta tabela de saída
* PERFORM f_monta_arq_correcao.
*
* PERFORM f_gera_arq_saida.

ENDIF.

*----------------------------------------------------------------------*
* END-OF-SELECTION. *
*----------------------------------------------------------------------*
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Form f_seleciona_dados
*&---------------------------------------------------------------------*
* Seleciona dados das tabelas transparentes
*----------------------------------------------------------------------*
FORM f_seleciona_dados .

PERFORM f_seleciona_add.

PERFORM f_alimenta_range.

* Seleciona partidas em aberto


PERFORM f_seleciona_bsid.
* Seleciona partidas compensadas
PERFORM f_seleciona_bsad.
* Filtra Títulos
PERFORM f_filtra_titulos.
* Seleciona dados Cabeçalho Doc. contábil
PERFORM f_seleciona_bkpf.
* Seleciona dados clientes
PERFORM f_seleciona_kna1.

PERFORM f_seleciona_bseg.

ENDFORM. " f_seleciona_dados

*&---------------------------------------------------------------------*
*& Form f_seleciona_bsid
*&---------------------------------------------------------------------*
* Seleciona partidas em aberto - BSID
*----------------------------------------------------------------------*
FORM f_seleciona_bsid .

PERFORM send_gui(saplcozf) USING text-003.

SELECT bukrs kunnr


augdt augbl
gjahr belnr
budat bldat
xblnr wrbtr
zfbdt zbd1t
xstov vbeln
INTO TABLE gt_titulos
FROM bsid
WHERE bukrs IN s_bukrs AND
kunnr IN s_kunnr AND
gjahr IN s_gjahr AND
budat IN s_budat AND
blart IN gr_blart.

ENDFORM. " f_seleciona_bsid


*&---------------------------------------------------------------------*
*& Form f_seleciona_bsad
*&---------------------------------------------------------------------*
* Seleciona partidas compensadas
*----------------------------------------------------------------------*
FORM f_seleciona_bsad .

PERFORM send_gui(saplcozf) USING text-004.

SELECT bukrs kunnr


augdt augbl
gjahr belnr
budat bldat
xblnr wrbtr
zfbdt zbd1t
xstov vbeln
APPENDING TABLE gt_titulos
FROM bsad
WHERE bukrs IN s_bukrs AND
kunnr IN s_kunnr AND
gjahr IN s_gjahr AND
budat IN s_budat AND
blart IN gr_blart.

ENDFORM. " f_seleciona_bsad

*&---------------------------------------------------------------------*
*& Form f_seleciona_kna1
*&---------------------------------------------------------------------*
* Seleciona dados dos clientes
*----------------------------------------------------------------------*
FORM f_seleciona_kna1 .

DATA: lt_titulos LIKE gt_titulos OCCURS 0 WITH HEADER LINE.


lt_titulos[] = gt_titulos[].
DELETE ADJACENT DUPLICATES FROM lt_titulos
COMPARING kunnr.

SORT lt_titulos BY kunnr.

PERFORM send_gui(saplcozf) USING text-005.

SELECT kunnr name1


name2 ort01
pstlz regio
stras telf1
telfx erdat
loevm ort02
pstl2 cityc
sperr stcd1
stcd2 stkzn
INTO TABLE gt_kna1
FROM kna1
FOR ALL ENTRIES IN lt_titulos
WHERE kunnr = lt_titulos-kunnr.

DELETE gt_kna1 WHERE stcd1 IS INITIAL AND


stcd2 IS INITIAL.

ENDFORM. " f_seleciona_kna1

*&---------------------------------------------------------------------*
*& Form f_ordena_tabelas
*&---------------------------------------------------------------------*
* Ordena tabelas internas
*----------------------------------------------------------------------*
FORM f_ordena_tabelas .

* pendente: verificar se é necessario


SORT: gt_titulos BY kunnr belnr xblnr DESCENDING,
gt_kna1 BY kunnr,
gt_bkpf BY belnr,
gt_kna1 BY kunnr.

ENDFORM. " f_ordena_tabelas

*&---------------------------------------------------------------------*
*& Form f_monta_arquivo_saida
*&---------------------------------------------------------------------*
* Monta arquivo de saída
*----------------------------------------------------------------------*
FORM f_monta_arquivo_saida.

DATA: ln_anterior_xblnr TYPE xblnr.

PERFORM f_ordena_tabelas.

PERFORM send_gui(saplcozf) USING text-006.

PERFORM f_alimenta_header.

PERFORM alimenta_item.

* LOOP AT gt_titulos.
*
* CLEAR: gt_bkpf, gt_kna1.
*
* IF ln_anterior_xblnr NE gt_titulos-xblnr.
* CLEAR: gc_alfabeto, gi_conta_faturas.
* ENDIF.
*
* READ TABLE gt_bkpf WITH KEY belnr = gt_titulos-belnr BINARY SEARCH.
* CHECK sy-subrc EQ 0.
* READ TABLE gt_kna1 WITH KEY kunnr = gt_titulos-kunnr BINARY SEARCH.
* CHECK sy-subrc EQ 0.
*
* MOVE-CORRESPONDING gt_titulos TO gs_titulos.
*
** Data vencimento
* gt_detalhe_titulos-dat_vencto = gs_titulos-zfbdt + gs_titulos-zbd1t.
*
** Alimenta tabela Header - Busca Datas
* PERFORM f_busca_periodo.
*
* AT NEW kunnr.
* PERFORM f_alimenta_detalhes_relation.
* ENDAT.
*
* PERFORM f_alimenta_detalhes_titulos.
*
* ln_anterior_xblnr = gt_titulos-xblnr.
*
* ENDLOOP.

APPEND gt_header.

ENDFORM. " f_monta_arquivo_saida


*&---------------------------------------------------------------------*
*& Form f_alimenta_header
*&---------------------------------------------------------------------*
* Alimenta registro Header do arquivo
*----------------------------------------------------------------------*
FORM f_alimenta_header .

DATA: lv_espaco(467) TYPE c,


lv_string TYPE string,
lv_nome TYPE string,
lv_cnpj TYPE string.

CONCATENATE lv_espaco '' INTO lv_string RESPECTING BLANKS.


CONCATENATE c_nome '' INTO lv_nome RESPECTING BLANKS.

UNASSIGN <fi003_aux>.

READ TABLE t_fi003_aux2 ASSIGNING <fi003_aux> INDEX 1.

IF <fi003_aux> IS ASSIGNED.

CONCATENATE '0' <fi003_aux>-cnpj INTO lv_cnpj.

gt_header-cnpj = lv_cnpj.
gt_header-telefone = <fi003_aux>-telefone.

REPLACE ALL OCCURRENCES OF '.' IN gt_header-telefone WITH space.


REPLACE ALL OCCURRENCES OF '/' IN gt_header-telefone WITH space.
REPLACE ALL OCCURRENCES OF '-' IN gt_header-telefone WITH space.
REPLACE ALL OCCURRENCES OF ')' IN gt_header-telefone WITH space.
REPLACE ALL OCCURRENCES OF '(' IN gt_header-telefone WITH space.

CONDENSE gt_header-telefone NO-GAPS.

CONCATENATE <fi003_aux>-nome '' INTO lv_nome RESPECTING BLANKS.


gt_header-nome = lv_nome.

ENDIF.

gt_header-id = c_registro.

gt_header-dat_ini = sy-datum.

gt_header-ramal = c_ramal.
gt_header-id_arq = c_serasa.
gt_header-num_rem = c_num_rem.
gt_header-cod_env = c_envio.
gt_header-branco = lv_string.
gt_header-sequencial = c_sequencia.

ENDFORM. " f_alimenta_header

*&---------------------------------------------------------------------*
*& Form f_alimenta_trailler
*&---------------------------------------------------------------------*
* Alimenta registros de detalhes
*----------------------------------------------------------------------*
FORM f_alimenta_detalhes_relation.

DATA: ld_tempo_cliente TYPE d.

gt_detalhe_relation-id = c_01.
gt_detalhe_relation-tipo_dados = c_01.
gt_detalhe_relation-dat_ini = gt_kna1-erdat.

* Verifica o tempo que é cliente em anos


PERFORM f_verifica_tempo_cliente CHANGING ld_tempo_cliente.

* Almenta CNPJ / CPF


PERFORM f_aliementa_cnpj CHANGING gt_detalhe_relation-cnpj.

APPEND gt_detalhe_relation.
CLEAR gt_detalhe_relation.

ENDFORM. " f_alimenta_trailler

*&---------------------------------------------------------------------*
*& Form f_alimenta_trailler
*&---------------------------------------------------------------------*
* Alimenta registro Trailler
*----------------------------------------------------------------------*
FORM f_alimenta_trailler.

gt_trailler-id = c_id_trailler.
gt_trailler-qtde_relac = gn_qtde_reg_relation.
gt_trailler-qtde_reg = gn_qtde_reg_titulos.

SHIFT gt_trailler-qtde_relac LEFT DELETING LEADING space.


SHIFT gt_trailler-qtde_reg LEFT DELETING LEADING space.

APPEND gt_trailler.

ENDFORM. " f_alimenta_trailler

*&---------------------------------------------------------------------*
*& Form f_busca_periodo
*&---------------------------------------------------------------------*
* Busca período informado
*----------------------------------------------------------------------*
FORM f_busca_periodo .
DATA: lc_flag_first.

* Atribui a primeira data encontrada para o campo inicio


* para que ele não seja mais inicial
IF lc_flag_first <> 'X'.
IF NOT gs_titulos-budat IS INITIAL.

IF gt_header-dat_ini IS INITIAL.
gt_header-dat_ini = gs_titulos-budat.
lc_flag_first = 'X'.
ENDIF.

ENDIF.
ENDIF.

* Encontra a menor e maior data do intervalo


* IF gs_titulos-budat > gt_header-dat_fim.
*
** IF gt_header-dat_fim IS INITIAL.
* gt_header-dat_fim = gs_titulos-budat.
** ENDIF.
*
* ELSEIF gs_titulos-budat < gt_header-dat_ini.
* gt_header-dat_ini = gs_titulos-budat.
* ENDIF.

ENDFORM. " f_busca_periodo

*&---------------------------------------------------------------------*
*& Form f_alimenta_detalhes_titulos
*&---------------------------------------------------------------------*
* Alimenta detalhes Titulos
*----------------------------------------------------------------------*
FORM f_alimenta_detalhes_titulos .

DATA: li_tam_num_nf TYPE i.

gt_detalhe_titulos-dat_emissao = gt_titulos-bldat.
gt_detalhe_titulos-id = c_01.
gt_detalhe_titulos-tp_dados = c_tp_dados.
gt_detalhe_titulos-dat_pgto = gs_titulos-augdt.

IF r_normal = 'X'.
gt_detalhe_titulos-valor = gs_titulos-wrbtr.

* Formata campo Valor título


TRANSLATE gt_detalhe_titulos-valor USING '. '.
CONDENSE gt_detalhe_titulos-valor NO-GAPS.
SHIFT gt_detalhe_titulos-valor RIGHT DELETING TRAILING space.
TRANSLATE gt_detalhe_titulos-valor USING ' 0'.

ELSE.
gt_detalhe_titulos-valor = c_exclui.
ENDIF.

PERFORM f_incrementa_letra CHANGING gc_alfabeto


gi_conta_faturas.

* Alimenta CNPJ ou CPF


PERFORM f_aliementa_cnpj CHANGING gt_detalhe_titulos-cnpj.

APPEND gt_detalhe_titulos.
CLEAR gt_detalhe_titulos.

ENDFORM. " f_alimenta_detalhes_titulos


*&---------------------------------------------------------------------*
*& Form f_gera_arq_saida
*&---------------------------------------------------------------------*
* Gera arquivo de saída
*----------------------------------------------------------------------*
FORM f_gera_arq_saida .

DESCRIBE TABLE gt_detalhe_relation LINES li_qtde_relation.


DESCRIBE TABLE gt_detalhe_titulos LINES li_qtde_titulos.

PERFORM f_monta_msg_status_atualizacao USING li_qtde_total


CHANGING li_cont_registros
lc_texto_status.

PERFORM send_gui(saplcozf) USING lc_texto_status.

PERFORM f_grava_header.

PERFORM f_grava_item.

PERFORM f_grava_rodape.

* Gera uma linha para cada cliente


* LOOP AT gt_detalhe_relation.
*
* PERFORM f_grava_header_clientes.
*
** Gera uma linha para cada fatura deste cliente
* LOOP AT gt_detalhe_titulos WHERE cnpj = gt_detalhe_relation-cnpj.
* MOVE gt_detalhe_titulos TO lt_detalhe_titulos.
* APPEND lt_detalhe_titulos.
** Soma qtde registros Detalhes dos títulos
* ADD 1 TO gn_qtde_reg_titulos.
* ENDLOOP.
*
* PERFORM f_grava_detalhe_faturas.
*
* ENDLOOP.

PERFORM f_grava_trailler.

ENDFORM. " f_gera_arq_saida


*&---------------------------------------------------------------------*
*& Form f_grava_arquivo_saida
*&---------------------------------------------------------------------*
* Grava registros do arquivo de saída
*----------------------------------------------------------------------*
FORM f_grava_arquivo_saida TABLES pt_table
CHANGING p_sucesso.

DATA: ls_diretorio TYPE string.

ls_diretorio = p_saida.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
filename = ls_diretorio
filetype = 'ASC'
append = 'X'
trunc_trailing_blanks_eol = ' '
TABLES
data_tab = pt_table
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc = 0.
p_sucesso = p_sucesso + 1.
ENDIF.

ENDFORM. " f_grava_arquivo_saida


*&---------------------------------------------------------------------*
*& Form f_aliementa_cnpj
*&---------------------------------------------------------------------*
* Alimenta CNPJ / CPF
*----------------------------------------------------------------------*
FORM f_aliementa_cnpj CHANGING p_cnpj.

* CNPJ
IF NOT gt_kna1-stcd1 IS INITIAL.
p_cnpj = gt_kna1-stcd1.
ENDIF.

* CPF
IF NOT gt_kna1-stcd2 IS INITIAL.
p_cnpj = gt_kna1-stcd2.
ENDIF.

ENDFORM. " f_aliementa_cnpj

*&---------------------------------------------------------------------*
*& Form f_busca_diretorio
*&---------------------------------------------------------------------*
* Busca diretório de gravação para arquivo de saída
*----------------------------------------------------------------------*
FORM f_busca_diretorio USING p_saida.

DATA: ls_title TYPE string,


ls_arquivo TYPE string,
ls_diretorio TYPE string,
ls_caminho TYPE string.

ls_title = text-003.

CALL METHOD cl_gui_frontend_services=>file_save_dialog


EXPORTING
window_title = ls_title
default_extension = 'txt'
file_filter = 'txt'
initial_directory = 'c:\temp'
CHANGING
filename = ls_arquivo
path = ls_diretorio
fullpath = ls_caminho
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

p_saida = ls_caminho.

ENDFORM. " f_busca_diretorio

*&---------------------------------------------------------------------*
*& Form f_verifica_tempo_cliente
*&---------------------------------------------------------------------*
* Calcula tempo em que é cliente
*----------------------------------------------------------------------*
FORM f_verifica_tempo_cliente CHANGING p_anos.

DATA: li_years TYPE vtbbewe-atage,


ld_from TYPE vtbbewe-dbervon,
ld_ate TYPE vtbbewe-dberbis.

ld_from = gt_kna1-erdat.
ld_ate = sy-datum.

* Verifica tempo em que é cliente


CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
i_date_from = ld_from
i_key_day_from = '03'
i_date_to = ld_ate
IMPORTING
e_years = li_years.
* Cliente a menos de um ano
IF li_years <= 1.
gt_detalhe_relation-tipo = 02.

* Cliente antigo
ELSE.
gt_detalhe_relation-tipo = 01.
ENDIF.

* Cliente inativo
IF gt_kna1-sperr = 'X'.
gt_detalhe_relation-tipo = 03.
ENDIF.

SHIFT gt_detalhe_relation LEFT DELETING LEADING space.

ENDFORM. " f_verifica_tempo_cliente

*&---------------------------------------------------------------------*
*& Form f_monta_arq_correcao
*&---------------------------------------------------------------------*
* Monta arquivo de correção - Registros a serem excluídos
*----------------------------------------------------------------------*
FORM f_monta_arq_correcao .

PERFORM f_ordena_tabelas.

PERFORM send_gui(saplcozf) USING text-006.

PERFORM f_alimenta_header.

* Titulo já foi pago, monta registros a serem excluídos


LOOP AT gt_titulos WHERE augdt NE '00000000'.

CLEAR: gt_bkpf, gt_kna1.

READ TABLE gt_bkpf WITH KEY belnr = gt_titulos-belnr BINARY SEARCH.


CHECK sy-subrc EQ 0.
READ TABLE gt_kna1 WITH KEY kunnr = gt_titulos-kunnr.
CHECK sy-subrc EQ 0.

MOVE-CORRESPONDING gt_titulos TO gs_titulos.

* Data vencimento
gt_detalhe_titulos-dat_vencto = gs_titulos-zfbdt + gs_titulos-zbd1t.

* limenta tabela Header - Busca Datas


PERFORM f_busca_periodo.

AT NEW kunnr.
PERFORM f_alimenta_detalhes_relation.
ENDAT.

PERFORM f_alimenta_detalhes_titulos.

ENDLOOP.

IF r_correc = 'X'.
gt_header-dat_ini = c_correcao.
ENDIF.

APPEND gt_header.

ENDFORM. " f_monta_arq_correcao

*&---------------------------------------------------------------------*
*& Form f_alimenta_range
*&---------------------------------------------------------------------*
* Alimenta Range para TIPO de documento FI
*----------------------------------------------------------------------*
FORM f_alimenta_range .

* Alimenta Range para seleção de dados da BSID e BSAD

* Fatura
gr_blart-sign = 'I'.
gr_blart-option = 'EQ'.
gr_blart-low = 'RV'.
APPEND gr_blart.

* Fatura em FI
gr_blart-sign = 'I'.
gr_blart-option = 'EQ'.
gr_blart-low = 'DR'.
APPEND gr_blart.

* Devolução
gr_blart-sign = 'I'.
gr_blart-option = 'EQ'.
gr_blart-low = 'AB'.
APPEND gr_blart.

ENDFORM. " f_alimenta_range

*&---------------------------------------------------------------------*
*& Form f_seleciona_bkpf
*&---------------------------------------------------------------------*
* Seleciona Cabeçalho DOC contábil
*----------------------------------------------------------------------*
FORM f_seleciona_bkpf .

DATA: lt_titulos LIKE gt_titulos OCCURS 0 WITH HEADER LINE.


lt_titulos[] = gt_titulos[].
DELETE ADJACENT DUPLICATES FROM lt_titulos
COMPARING bukrs belnr gjahr.

SELECT bukrs
belnr
gjahr
blart
bldat
bstat
INTO TABLE gt_bkpf
FROM bkpf
FOR ALL ENTRIES IN lt_titulos
WHERE bukrs = lt_titulos-bukrs AND
belnr = lt_titulos-belnr AND
gjahr = lt_titulos-gjahr.
* Desconsidera partidas-memo
DELETE gt_bkpf WHERE bstat EQ 'S'.

ENDFORM. " f_seleciona_bkpf

*&---------------------------------------------------------------------*
*& Form f_monta_msg_status_atualizacao
*&---------------------------------------------------------------------*
* Monta mensagem atualização - Status processamento
*----------------------------------------------------------------------*
FORM f_monta_msg_status_atualizacao USING p_qtde_total
CHANGING p_cont_registros
p_texto_status.
DATA: lc_cont_registros(6) TYPE c,
lc_qtde_total(6) TYPE c.

* Quantidade total de registros inseridos no arquivo


li_qtde_total = li_qtde_relation + li_qtde_titulos + 2.
lc_qtde_total = li_qtde_total.

* p_cont_registros = p_cont_registros + 1.
*
* lc_cont_registros = p_cont_registros.
* lc_qtde_total = p_qtde_total.

CONCATENATE text-011
lc_qtde_total
text-012
* lc_qtde_total
* c_msg_2
INTO p_texto_status
SEPARATED BY space.

ENDFORM. " f_monta_msg_status_atualizacao


*&---------------------------------------------------------------------*
*& Form f_grava_header
*&---------------------------------------------------------------------*
* Grava registro header
*----------------------------------------------------------------------*
FORM f_grava_header .

PERFORM f_monta_msg_status_atualizacao USING li_qtde_total


CHANGING li_cont_registros
lc_texto_status.

PERFORM send_gui(saplcozf) USING lc_texto_status.

* Grava registro Header no arquivo de saida


PERFORM f_grava_arquivo_saida TABLES gt_header
CHANGING li_qtde_sucesso.

ENDFORM. " f_grava_header

*&---------------------------------------------------------------------*
*& Form f_grava_header_clientes
*&---------------------------------------------------------------------*
* Grava detalhes dos clientes
*----------------------------------------------------------------------*
FORM f_grava_header_clientes .

MOVE gt_detalhe_relation TO lt_detalhe_relation.


APPEND lt_detalhe_relation.
CLEAR lt_detalhe_relation.

PERFORM f_grava_arquivo_saida TABLES lt_detalhe_relation


CHANGING li_qtde_sucesso.
CLEAR lt_detalhe_relation[].

* Soma quantidade de registros TEMPO de RELACIONAMENTO


ADD 1 TO gn_qtde_reg_relation.

ENDFORM. " f_grava_header_clientes


*&---------------------------------------------------------------------*
*& Form f_grava_detalhe_faturas
*&---------------------------------------------------------------------*
* Grava detalhes faturas
*----------------------------------------------------------------------*
FORM f_grava_detalhe_faturas .

li_cont_registros = li_cont_registros + 1.

* CONCATENATE

* PERFORM f_monta_msg_status_titulos USING li_qtde_total


* CHANGING li_cont_registros
* lc_texto_status.

* PERFORM send_gui(saplcozf) USING lc_texto_status.

PERFORM f_grava_arquivo_saida TABLES lt_detalhe_titulos


CHANGING li_qtde_sucesso.

CLEAR: lt_detalhe_titulos[],
lt_detalhe_titulos.

ENDFORM. " f_grava_detalhe_faturas


*&---------------------------------------------------------------------*
*& Form f_grava_trailler
*&---------------------------------------------------------------------*
* Grava trailer - último registro no arquivo
*----------------------------------------------------------------------*
FORM f_grava_trailler .

PERFORM f_alimenta_trailler.

PERFORM f_monta_msg_status_atualizacao USING li_qtde_total


CHANGING li_cont_registros
lc_texto_status.

PERFORM send_gui(saplcozf) USING lc_texto_status.

PERFORM f_grava_arquivo_saida TABLES gt_trailler


CHANGING li_qtde_sucesso.

ENDFORM. " f_grava_trailler


*&---------------------------------------------------------------------*
*& Form f_incrementa_letra
*&---------------------------------------------------------------------*
* Incrementa letra para identificar os registros
*----------------------------------------------------------------------*
FORM f_incrementa_letra CHANGING lc_alfabeto
li_conta_faturas.

DATA: lc_conta_faturas(2) TYPE c.

lc_alfabeto = sy-abcde+li_conta_faturas(1).
li_conta_faturas = li_conta_faturas + 1.
* lc_conta_faturas = li_conta_faturas.

CONCATENATE '#D'
lc_alfabeto
gt_titulos-xblnr
INTO gt_detalhe_titulos-flag_titulo.

ENDFORM. " f_incrementa_letra


*&---------------------------------------------------------------------*
*& Form f_filtra_titulos
*&---------------------------------------------------------------------*
FORM f_filtra_titulos .

* Desconsidera arquivos estornados


DELETE gt_titulos WHERE xstov EQ 'X'.
* Desconsidera referências em branco
DELETE gt_titulos WHERE xblnr IS INITIAL OR
xblnr EQ '0000000000000000'.

IF gt_titulos[] IS INITIAL.
MESSAGE s010 DISPLAY LIKE 'E'.
STOP.
ENDIF.

SORT gt_titulos BY bukrs belnr gjahr.

ENDFORM. " f_filtra_titulos

*Text elements
*-------------
* 001 Fltro
* 002 Arquivo de saída
* 003 Selecionando partidas em aberto (tabela BSID) ...
* 004 Selecionando partidas compensadas (tabela BSAD) ...
* 005 Selecionando dados clientes (tabela KNA1) ...
* 006 Montando arquivo de saída ...
* 007 Gravando registros no arquivo de saída ...
* 008 Arquivo gerado com sucesso.
* 009 Erro ao gerar registros no arquivo
* 010 Erro ao gerar arquivo.
* 011 Gravando
* 012 registros no arquivo.
*Selection texts
*---------------
* P_SAIDA Arquivo de saída
* R_CORREC Remessa de correção
* R_NORMAL Remessa normal
* S_BUDAT Data lançamento
* S_BUKRS Empresa
* S_GJAHR Exercício
* S_KUNNR Cliente

*Messages
*-------------
* Message class: ZFI001 LINE-SIZE 141
* 010
*&---------------------------------------------------------------------*
*& Form ALIMENTA_ITEM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alimenta_item.

CONSTANTS: cod_registro(1) TYPE c VALUE '1',


cod_rodape(1) TYPE c VALUE '9',
oper1(1) TYPE c VALUE 'L',
oper2(1) TYPE c VALUE 'E',
c_data(8) TYPE c VALUE '20211001',
c_pessoa_j(1) TYPE c VALUE 'J',
c_pessoa_f(1) TYPE c VALUE 'F',
c_pessoa_1(1) TYPE c VALUE '1',
c_pessoa_2(1) TYPE c VALUE '2',
c_sequencia(7) TYPE c VALUE '000002',
c_contrato(15) TYPE c VALUE '000010000479',
c_divida(15) TYPE c VALUE '000000147379925'.

DATA: lv_branco TYPE string,


lv_natureza TYPE string,
lv_documento TYPE string,
lv_moti TYPE string,
lv_nome TYPE string,
lv_endereco TYPE string,
lv_bairro TYPE string,
lv_municipio TYPE string,
lv_num_contrato TYPE string,
lv_divida TYPE string,
lv_tamanho TYPE i,
lv_contador TYPE i,
lv_sequencial TYPE n LENGTH 7,
lv_espacorodape(592) TYPE c.

SORT: gt_titulos BY bukrs kunnr gjahr belnr,


* gt_kna1 by kunnr,
t_bseg BY bukrs kunnr gjahr belnr.

LOOP AT gt_titulos.
READ TABLE gt_kna1 WITH KEY
kunnr = gt_titulos-kunnr
BINARY SEARCH.

IF sy-subrc EQ 0.

lv_contador = lv_contador + 1.
w_detalhe-sequencia = lv_contador.
UNPACK w_detalhe-sequencia TO w_detalhe-sequencia.

w_detalhe-cod_registro = cod_registro. "Contante fixa


w_detalhe-operacao = oper1. " Constante Fixa
* w_detalhe-natureza = lv_natureza.
w_detalhe-mot_baixa = lv_moti.
* w_detalhe-sequencia = c_sequencia.

w_detalhe-tp_pessoa = gt_kna1-stkzn.
w_detalhe-tp2 = gt_kna1-stkzn.

w_detalhe-nome = gt_kna1-name1.
CONCATENATE w_detalhe-nome ' ' INTO lv_nome RESPECTING BLANKS.
w_detalhe-nome = lv_nome.

w_detalhe-endereco = gt_kna1-stras.
CONCATENATE w_detalhe-endereco ' ' INTO lv_endereco RESPECTING BLANKS.
w_detalhe-endereco = lv_endereco.

w_detalhe-bairro = gt_kna1-ort01.
CONCATENATE w_detalhe-bairro ' ' INTO lv_bairro RESPECTING BLANKS.
w_detalhe-bairro = lv_bairro.

w_detalhe-municipio = gt_kna1-ort01.
CONCATENATE w_detalhe-municipio ' ' INTO lv_municipio RESPECTING BLANKS.
w_detalhe-municipio = lv_municipio.

CONCATENATE 'AL' w_detalhe-natureza INTO lv_natureza RESPECTING BLANKS.


w_detalhe-natureza = lv_natureza.
CLEAR lv_natureza.

CONCATENATE ' ' ' ' INTO lv_moti RESPECTING BLANKS.


CONCATENATE w_detalhe-nome ' ' INTO lv_nome RESPECTING BLANKS.

IF gt_kna1-stkzn IS NOT INITIAL.


w_detalhe-tp2 = 2.
w_detalhe-tp_pessoa = 'F'.
w_detalhe-documento = gt_kna1-stcd2.
ELSE.

w_detalhe-tp2 = 1.
w_detalhe-tp_pessoa = 'J'.
w_detalhe-documento = gt_kna1-stcd1.
ENDIF.

CONCATENATE w_detalhe-documento ' ' INTO lv_documento RESPECTING BLANKS.


w_detalhe-documento = lv_documento.

READ TABLE t_fi004_aux INTO w_fi004 INDEX 1.


lv_tamanho = strlen( w_fi004-cnpj2 ).
lv_tamanho = lv_tamanho - 6.

w_detalhe-final_cnpj = w_fi004-cnpj2+lv_tamanho(6)."gt_kna1-
stcd1+lv_tamanho(6).

READ TABLE t_bseg INTO w_bseg


WITH KEY bukrs = gt_titulos-bukrs
kunnr = gt_titulos-kunnr
gjahr = gt_titulos-gjahr
belnr = gt_titulos-belnr
BINARY SEARCH.

IF sy-subrc EQ 0.

w_detalhe-dt_venc = w_bseg-fdtag.
w_detalhe-dt_vendiv = w_bseg-fdtag.

w_detalhe-vl_divida = w_bseg-dmbtr.
CONCATENATE w_detalhe-vl_divida ' ' INTO lv_divida RESPECTING BLANKS.
w_detalhe-vl_divida = lv_divida.

w_detalhe-num_contrato = w_bseg-vertn.
CONCATENATE w_detalhe-num_contrato ' ' INTO lv_num_contrato RESPECTING
BLANKS.
w_detalhe-num_contrato = lv_num_contrato.

ENDIF.

w_detalhe-uf = gt_kna1-regio.
REPLACE ALL OCCURRENCES OF '.' IN gt_kna1-pstlz WITH space.
REPLACE ALL OCCURRENCES OF '/' IN gt_kna1-pstlz WITH space.
REPLACE ALL OCCURRENCES OF '-' IN gt_kna1-pstlz WITH space.
REPLACE ALL OCCURRENCES OF ')' IN gt_kna1-pstlz WITH space.
REPLACE ALL OCCURRENCES OF '(' IN gt_kna1-pstlz WITH space.

w_detalhe-cep = gt_kna1-pstlz.
* w_detalhe-natureza = c_natureza.

APPEND w_detalhe TO t_detalhe.


CLEAR w_detalhe.

ENDIF.

ENDLOOP.

CONCATENATE w_rodape-lv_braco '' INTO lv_branco RESPECTING BLANKS.

w_rodape-cod_registro = '9'.
CONCATENATE lv_espacorodape '' INTO lv_branco RESPECTING BLANKS.
w_rodape-lv_braco = lv_branco.

w_rodape-sequencia = lv_contador.
UNPACK w_rodape-sequencia TO w_rodape-sequencia.

APPEND w_rodape TO t_rodape.

ENDFORM. " ALIMENTA_ITEM


*&---------------------------------------------------------------------*
*& Form F_GRAVA_ITEM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_grava_item .

* * Grava registro Header no arquivo de saida


PERFORM f_grava_arquivo_saida TABLES t_detalhe
CHANGING li_qtde_sucesso.

ENDFORM. " F_GRAVA_ITEM


*&---------------------------------------------------------------------*
*& Form F_GRAVA_RODAPE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_grava_rodape .

* Grava registro \\rodape no arquivo de saida


PERFORM f_grava_arquivo_saida TABLES t_rodape
CHANGING li_qtde_sucesso.

ENDFORM. " F_GRAVA_RODAPE


*&---------------------------------------------------------------------*
*& Form F_SELECIONA_ADD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_seleciona_add .

DATA: lv_cnpj TYPE string.

SELECT * FROM ztfi003


INTO TABLE t_fi003.

LOOP AT t_fi003 ASSIGNING <fi003>.

REPLACE ALL OCCURRENCES OF '.' IN <fi003>-cnpj WITH space.


REPLACE ALL OCCURRENCES OF '/' IN <fi003>-cnpj WITH space.
REPLACE ALL OCCURRENCES OF '-' IN <fi003>-cnpj WITH space.

CONDENSE <fi003>-cnpj.

ASSIGN <fi003> TO <fi003_aux>.

IF <fi003_aux> IS ASSIGNED.
w_fi004-cnpj2 = <fi003_aux>-cnpj.
<fi003_aux>-cnpj = <fi003_aux>-cnpj(8).

APPEND <fi003_aux> TO t_fi003_aux.

w_fi004-sigla = <fi003_aux>-sigla .
w_fi004-cnpj = <fi003_aux>-cnpj .
w_fi004-telefone = <fi003_aux>-telefone .
w_fi004-nome = <fi003_aux>-nome .

APPEND w_fi004 TO t_fi004_aux.

ENDIF.

ENDLOOP.

SELECT * FROM t001z INTO TABLE t_00z1


WHERE bukrs IN s_bukrs.

CLEAR lv_cnpj.

LOOP AT t_00z1 INTO w_00z1.

lv_cnpj = w_00z1-paval.

READ TABLE t_fi003_aux INTO w_fi003


WITH KEY cnpj = lv_cnpj.

IF sy-subrc EQ 0.

APPEND w_fi003 TO t_fi003_aux2.

ENDIF.

ENDLOOP.

ENDFORM. " F_SELECIONA_ADD


*&---------------------------------------------------------------------*
*& Form F_SELECIONA_BSEG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_seleciona_bseg .
SORT gt_titulos BY belnr gjahr.

gt_bsid_aux[] = gt_titulos[].

IF gt_bsid_aux IS NOT INITIAL.

SELECT *
INTO TABLE t_bseg
FROM bseg
FOR ALL ENTRIES IN gt_bsid_aux
WHERE belnr = gt_bsid_aux-belnr.

"belnr = gt_titulos-belnr.
"budat IN s_budat AND
" blart IN gr_blart.

ENDIF.

ENDFORM. " F_SELECIONA_BSEG


*&---------------------------------------------------------------------*
*& Form GERA_ARQUIVO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM gera_arquivo .

DATA: ls_diretorio TYPE string.

ls_diretorio = p_saida.

CLEAR: w_rodape,w_detalhe.

LOOP AT gt_header.

WRITE gt_header TO ls_txt.


APPEND ls_txt TO it_txt.

ENDLOOP.

CLEAR ls_txt.

LOOP AT t_detalhe INTO w_detalhe.

WRITE w_detalhe TO ls_txt.


APPEND ls_txt TO it_txt.

ENDLOOP.

CLEAR ls_txt.

LOOP AT t_rodape INTO w_rodape.

WRITE w_rodape TO ls_txt.


APPEND ls_txt TO it_txt.

ENDLOOP.

IF it_txt IS NOT INITIAL.

CALL FUNCTION 'GUI_DOWNLOAD'


EXPORTING
filename = ls_diretorio
filetype = 'ASC'
append = 'X'
TABLES
data_tab = it_txt
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDIF.

ENDFORM. " GERA_ARQUIVO


*&---------------------------------------------------------------------*
*& Form EXIBE_ALV
*&---------------------------------------------------------------------*

FORM exibe_alv .

* Seleciona Dados da BSID


PERFORM sel_dados.

* Criação do ALV
PERFORM cria_alv.
ENDFORM. " EXIBE_ALV
*&---------------------------------------------------------------------*
*& Form SEL_DADOS
*&---------------------------------------------------------------------*

FORM sel_dados .

SELECT empresa
n_cliente
n_document
exercicio
chave
envio_inclusao
envio_exclusao
FROM ztfi004
INTO TABLE lt_ztfi004
WHERE empresa IN s_bukrs.

LOOP AT lt_ztfi004 INTO li_ztfi004. "ti_bsid INTO gs_bsid.


PERFORM preenche_coluna_alv.
ENDLOOP.

ENDFORM. " SEL_DADOS

*&---------------------------------------------------------------------*
*& Form PREENCHE_COLUNA_ALV
*&---------------------------------------------------------------------*
FORM preenche_coluna_alv .
CLEAR: gs_alv.

gs_alv-empresa = li_ztfi004-empresa.
gs_alv-n_cliente = li_ztfi004-n_cliente.
gs_alv-n_document = li_ztfi004-n_document.
gs_alv-exercicio = li_ztfi004-exercicio.
gs_alv-chave = li_ztfi004-chave.
gs_alv-envio_inclusao = li_ztfi004-envio_inclusao.
gs_alv-envio_exclusao = li_ztfi004-envio_exclusao.

APPEND gs_alv TO gw_alv.


ENDFORM. "preenche_coluna_alv

*&---------------------------------------------------------------------*
*& Form F_ALV
*&---------------------------------------------------------------------*
FORM cria_alv. "f_alv .
" Criação da tabela contendo as informações dos campos que serão mostrados no ALV
PERFORM : monta_fieldcat,
* f_mostra_alv,
f_layout.

PERFORM : f_mostra_alv TABLES gw_fcat


lt_ztfi004
USING sy-repid
'F_SET_PF_STATUS'
'F_USER_COMMAND'
st_layout.
ENDFORM. " F_ALV

*&---------------------------------------------------------------------*
*& Form F_FIELDCAT
*&---------------------------------------------------------------------*
FORM monta_fieldcat .
DATA: lv_pos TYPE slis_fieldcat_main0-col_pos.
PERFORM f_fieldcat USING:
'01' 'BUKRS' 'GW_ALV' text-t01 ' ', " EMPRESA
'02' 'KUNNR' 'GW_ALV' text-t02 ' ', " Nº CLIENTE
'03' 'BELNR' 'GW_ALV' text-t03 ' ', " Nº DOCUMENTO
'04' 'GJAHR' 'GW_ALV' text-t04 ' ', " EXERCÍCIO
'05' 'ZLSPR' 'GW_ALV' text-t05 ' ', " CHAVE PARA
BLOQUEIO
'06' 'INCLUSAO' 'GW_ALV' text-t06 ' ', " ENVIO INCLUSÃO
'07' 'EXCLUSAO' 'GW_ALV' text-t07 ' '. " ENVIO EXCLUSÃO

ENDFORM. "monta_fieldcat

*&---------------------------------------------------------------------*
*& Form f_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->T_COL_POS text
* -->T_FIELDNAME text
* -->T_TABNAME text
* -->T_REPTEXT_DDIC text
* -->T_HOTSPOT text
*----------------------------------------------------------------------*
FORM f_fieldcat USING t_col_pos
t_fieldname
t_tabname
t_reptext_ddic
t_hotspot.

gs_fcat-col_pos = t_col_pos.
gs_fcat-fieldname = t_fieldname.
gs_fcat-tabname = t_tabname.
gs_fcat-seltext_l = t_reptext_ddic.
gs_fcat-hotspot = t_hotspot.
gs_fcat-outputlen = '20'.
gs_fcat-just = 'C'.

APPEND gs_fcat TO gw_fcat.


CLEAR gs_fcat.

ENDFORM. " F_FIELDCAT

*-------------------------------------------------------------------------
*& Form F_MOSTRA_ALV
*-------------------------------------------------------------------------
FORM f_mostra_alv TABLES fieldcat
outtab
USING repid
status
command
layout.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = repid
i_callback_pf_status_set = status
i_callback_user_command = command
is_layout = layout
it_fieldcat = gw_fcat[]
i_save = 'X'
TABLES
t_outtab = outtab "gw_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " F_MOSTRA_ALV

*&---------------------------------------------------------------------*
*& Form F_LAYOUT
*&---------------------------------------------------------------------*
FORM f_layout .

st_layout-zebra = 'X'.
st_layout-colwidth_optimize = 'X'.

ENDFORM. " F_LAYOUT

*&---------------------------------------------------------------------*
*& Form SET_PF_STATUS
*&---------------------------------------------------------------------*
* Setting custom PF-Status
*----------------------------------------------------------------------*
* -->RT_EXTAB Excluding table
*----------------------------------------------------------------------*
FORM f_set_pf_status USING rt_extab TYPE slis_t_extab.

SET PF-STATUS 'Z_STANDARD'.

ENDFORM. "SET_PF_STATUS

*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* Handling custom function codes
*----------------------------------------------------------------------*
* -->R_UCOMM Function code value
* -->RS_SELFIELD Info. of cursor position in ALV
*----------------------------------------------------------------------*
FORM f_user_command USING vl_ucomm LIKE sy-ucomm
st_selfield TYPE slis_selfield.
" Declarações das variáveis locais
DATA: it_dados_temp TYPE TABLE OF ty_dados,
st_out_temp TYPE ty_dados,
it_fieldcat_temp TYPE TABLE OF slis_fieldcat_alv,
st_fieldcat_temp TYPE slis_fieldcat_alv.
BREAK-POINT.
" Verifica a ação do Usuário.
CASE vl_ucomm.
" Caso o usuário tenha selecionado um registro no ALV.
WHEN '&IC1'.
* Trata fieldcat para abrir para edição todos os campos exceto os campos chaves
it_fieldcat_temp = gw_fcat.
st_fieldcat_temp-edit = 'X'.
MODIFY it_fieldcat_temp FROM st_fieldcat_temp
TRANSPORTING edit
WHERE key IS INITIAL.

* Trata dados do registro selecionado.


READ TABLE it_dados INTO st_out
INDEX st_selfield-tabindex.
APPEND st_out TO it_dados_temp.

* Cria um novo ALV usando o mesmo perform só que sem User_command e com tabelas <>.
PERFORM : f_mostra_alv TABLES it_fieldcat_temp
it_dados_temp
USING sy-repid
' '
' '
st_layout.
BREAK-POINT.
" Se o botão 'Salvar' não for pressionado então a modificação não irá ser
" atualizado na tabela 'IT_OUT_TEMP'.
" Verifica o primeiro (e Unico) registro da tabela
READ TABLE it_dados_temp INTO st_out_temp
INDEX 1.

" Verifica se esse registro foi modificado.


IF st_out_temp <> st_out.
" Atualiza a tabela interna com as informações modificadas
MODIFY it_dados FROM st_out_temp
INDEX st_selfield-tabindex.
" Move a informação da linha do registro para uma estrutura que aliemnta a
tabela
MOVE st_selfield-tabindex TO st_index-index.
APPEND st_index TO it_index.
ENDIF.
" Muito importante este comando pois isso atualiza as alterações feitas na
tabela,
" e mostra no ALV.
st_selfield-refresh = 'X'.
" Caso o Usuário tenha clicado no botão 'Salvar'.
WHEN 'SAVE'.
" Verifica se teve alteração.
IF it_index IS NOT INITIAL.
LOOP AT it_index INTO st_index.
" Lê a tabela principal no registro informado na tabela de registros
modiicados.
READ TABLE it_dados INTO st_out
INDEX st_index-index.
" Move os dados da estrutura modificada para uma estrutura local
temporária.
MOVE-CORRESPONDING st_out TO st_out_temp.
" Alimenta uma tabela auxiliar com os registros alterados.
APPEND st_out_temp TO it_dados_temp.
ENDLOOP.

" Usa a tabela alimentada com os registros modificados e atualiza a tabela


transparente.
" Muito Cuidado em usar essas coisas de atualizar, incluir e excluir dados
de tabelas
" transparente.
MODIFY sflight FROM TABLE it_dados_temp.
MESSAGE 'Os dados foram alterados com Sucesso' TYPE 'S'.
" Caso não teve alteração - Mostra a mensagem
ELSE.
MESSAGE 'Não houve alteração!' TYPE 'W'.
ENDIF.
" Caso o usuário tenha clicado no botão 'BACK' ou 'EXIT'
WHEN 'BACK' OR 'EXIT'.
LEAVE PROGRAM.
" Qualquer outro caso.
WHEN OTHERS.

ENDCASE.

ENDFORM. "user_command

Você também pode gostar