AJUDA COM QUERY ORACLE / FORM
Galera, estou com problema em uma rotina de geração de recibo de pagamento.
Criei uma tela com um datagridview onde os usuários podem selecionar quais tÃtulos desejam imprimir recibos de pagamento.
Este grid é alimentado por query, que se houver mais de um tÃtulo para determinado fornecedor, no mesmo dia, ele agrupa os mesmos.
Desta forma, passo por parâmetro ao Crystal Reports um campo que chamo de Sequência, para que ele filtre nesta view os recibos de pagamento selecionados no grid.
Este campo sequência, nada mais que que o ROWNUM do Oracle, pois como estou agrupando os tÃtulos, não tenho um identificador de linha.
Meu problema é que quando alguém cadastra um tÃtulo novo e alguém está gerando recibos, e os dados já estão no grid, o rownum fica furado e outro recibo diferente do selecionado é exibido, afinal o número de linha está correndo mas a informação já é outra.
Já tentei utilizar o recurso do ROWID do Oracle, mas não funciona com o GROUP BY.
Vejam a minha view, e a tela de gerar o recibo.
Como posso resolver meu problema?
Criei uma tela com um datagridview onde os usuários podem selecionar quais tÃtulos desejam imprimir recibos de pagamento.
Este grid é alimentado por query, que se houver mais de um tÃtulo para determinado fornecedor, no mesmo dia, ele agrupa os mesmos.
Desta forma, passo por parâmetro ao Crystal Reports um campo que chamo de Sequência, para que ele filtre nesta view os recibos de pagamento selecionados no grid.
Este campo sequência, nada mais que que o ROWNUM do Oracle, pois como estou agrupando os tÃtulos, não tenho um identificador de linha.
Meu problema é que quando alguém cadastra um tÃtulo novo e alguém está gerando recibos, e os dados já estão no grid, o rownum fica furado e outro recibo diferente do selecionado é exibido, afinal o número de linha está correndo mas a informação já é outra.
Já tentei utilizar o recurso do ROWID do Oracle, mas não funciona com o GROUP BY.
Vejam a minha view, e a tela de gerar o recibo.
Como posso resolver meu problema?
O ROWNUM enumera as linhas do resultado. Outro usuário inserindo dados não deveria alterar o resultado da consulta que já foi feita.
Qual o código do botão imprimir? Acho que ai está teu problema.
Qual o código do botão imprimir? Acho que ai está teu problema.
If Trim(Replace(msk_Dt_Pagto.Text, [Ô]/[Ô], [Ô][Ô])) = [Ô][Ô] Then
MsgBox([Ô]Favor informar data de pagamento![Ô], vbInformation, [Ô]Emissão de Recibo de Pagamento[Ô])
msk_Dt_Pagto.Focus()
ElseIf DataGridView1.SelectedRows.Count = 0 Then
MsgBox([Ô]Nenhum recibo a ser impresso![Ô], vbInformation, [Ô]Emissão de Recibo de Pagamento[Ô])
ElseIf DataGridView1.SelectedRows.Count > 750 Then
MsgBox([Ô]Para ajudá-lo a otimizar o tempo necessário para processar o relatório existe um limite de 750 recibos por execução![Ô], vbInformation, [Ô]Emissão de Recibo de Pagamento[Ô])
Else
Dim dgvColecaoLinhasSelecionadas As DataGridViewSelectedRowCollection = DataGridView1.SelectedRows
Dim selecao_tit As String
[ô]Limpar variáveis
selecao_tit = [Ô][Ô]
[ô] If DataGridView1.SelectedRows.Count > 0 Then
For i As Integer = 0 To DataGridView1.SelectedRows.Count - 1
Dim seq As Integer = dgvColecaoLinhasSelecionadas(i).Cells(0).Value
selecao_tit = Replace(Trim(selecao_tit & [Ô] [Ô] & seq), [Ô] [Ô], [Ô],[Ô])
Next
[ô]Carrega o relatorio desejado
Dim strReportName As String = [Ô]CR_Recibo[Ô]
[ô]
[ô]Define o caminho e nome do relatorio
Dim strReportPath As String = [Ô]F:\S.I.U.Peports\[Ô] _
& [Ô][Ô] & strReportName & [Ô].rpt[Ô]
[ô]
[ô]Verifica se o arquivo existe
If Not IO.File.Exists(strReportPath) Then
Throw (New Exception([Ô]Relatorio nao localizado :[Ô] & vbCrLf & strReportPath))
End If
[ô]Instancia o relatório e carrega
Dim crReportDocument As New ReportDocument
crReportDocument.Load(strReportPath)
crReportDocument.SetDatabaseLogon([Ô]INFORMATICA[Ô], [Ô]******[Ô])
If chkDuasVias.Checked = False Then
crReportDocument.DataDefinition.FormulaFields([Ô]Duas_Vias[Ô]).Text = 0
Else
crReportDocument.DataDefinition.FormulaFields([Ô]Duas_Vias[Ô]).Text = 1
End If
crReportDocument.DataDefinition.FormulaFields([Ô]Data_Pagamento[Ô]).Text = [Ô]#[Ô] & CDate(msk_Dt_Pagto.Text).ToString([Ô]yyyy-MM-dd[Ô]) & [Ô]#[Ô]
If chkObservGeral.Checked = True Then
crReportDocument.DataDefinition.FormulaFields([Ô]Obs_Geral[Ô]).Text = [Ô][ô][Ô] & Replace(txtObGeral.Text, [Ô][ô][Ô], [Ô][Ô]) & [Ô][ô][Ô]
Else
crReportDocument.DataDefinition.FormulaFields([Ô]Obs_Geral[Ô]).Text = [Ô]If {RECIBO_PAGAMENTO_BOR_LOTE.NRO_DOCTO} <> [ô] [ô] Then
[ô]Referente pagamento de Notas Fiscais: [ô] & {RECIBO_PAGAMENTO_BOR_LOTE.NRO_DOCTO}[Ô]
End If
crReportDocument.DataDefinition.FormulaFields([Ô]Pagante[Ô]).Text = [Ô][ô][Ô] & cboPagante.Text & [Ô][ô][Ô]
[ô] Define a fonte do controle Crystal Report Viewer como sendo o relatorio definido acima
FrmReportRecibo.CrystalReportViewer1.ReportSource = Nothing
FrmReportRecibo.CrystalReportViewer1.Refresh()
FrmReportRecibo.CrystalReportViewer1.ReportSource = crReportDocument
If Tipo = [Ô]B[Ô] Then
crReportDocument.RecordSelectionFormula = [Ô]{RECIBO_PAGAMENTO_BOR_LOTE.SEQ} in [[Ô] & selecao_tit & [Ô]][Ô]
Else
crReportDocument.RecordSelectionFormula = [Ô]{RECIBO_PAGAMENTO_BOR_LOTE.SEQ} in [[Ô] & selecao_tit & [Ô]][Ô]
End If
FrmReportRecibo.Text = [Ô]Recibos - [Ô] & cboPagante.Text & [Ô][Ô]
FrmReportRecibo.Show()
End If
MsgBox([Ô]Favor informar data de pagamento![Ô], vbInformation, [Ô]Emissão de Recibo de Pagamento[Ô])
msk_Dt_Pagto.Focus()
ElseIf DataGridView1.SelectedRows.Count = 0 Then
MsgBox([Ô]Nenhum recibo a ser impresso![Ô], vbInformation, [Ô]Emissão de Recibo de Pagamento[Ô])
ElseIf DataGridView1.SelectedRows.Count > 750 Then
MsgBox([Ô]Para ajudá-lo a otimizar o tempo necessário para processar o relatório existe um limite de 750 recibos por execução![Ô], vbInformation, [Ô]Emissão de Recibo de Pagamento[Ô])
Else
Dim dgvColecaoLinhasSelecionadas As DataGridViewSelectedRowCollection = DataGridView1.SelectedRows
Dim selecao_tit As String
[ô]Limpar variáveis
selecao_tit = [Ô][Ô]
[ô] If DataGridView1.SelectedRows.Count > 0 Then
For i As Integer = 0 To DataGridView1.SelectedRows.Count - 1
Dim seq As Integer = dgvColecaoLinhasSelecionadas(i).Cells(0).Value
selecao_tit = Replace(Trim(selecao_tit & [Ô] [Ô] & seq), [Ô] [Ô], [Ô],[Ô])
Next
[ô]Carrega o relatorio desejado
Dim strReportName As String = [Ô]CR_Recibo[Ô]
[ô]
[ô]Define o caminho e nome do relatorio
Dim strReportPath As String = [Ô]F:\S.I.U.Peports\[Ô] _
& [Ô][Ô] & strReportName & [Ô].rpt[Ô]
[ô]
[ô]Verifica se o arquivo existe
If Not IO.File.Exists(strReportPath) Then
Throw (New Exception([Ô]Relatorio nao localizado :[Ô] & vbCrLf & strReportPath))
End If
[ô]Instancia o relatório e carrega
Dim crReportDocument As New ReportDocument
crReportDocument.Load(strReportPath)
crReportDocument.SetDatabaseLogon([Ô]INFORMATICA[Ô], [Ô]******[Ô])
If chkDuasVias.Checked = False Then
crReportDocument.DataDefinition.FormulaFields([Ô]Duas_Vias[Ô]).Text = 0
Else
crReportDocument.DataDefinition.FormulaFields([Ô]Duas_Vias[Ô]).Text = 1
End If
crReportDocument.DataDefinition.FormulaFields([Ô]Data_Pagamento[Ô]).Text = [Ô]#[Ô] & CDate(msk_Dt_Pagto.Text).ToString([Ô]yyyy-MM-dd[Ô]) & [Ô]#[Ô]
If chkObservGeral.Checked = True Then
crReportDocument.DataDefinition.FormulaFields([Ô]Obs_Geral[Ô]).Text = [Ô][ô][Ô] & Replace(txtObGeral.Text, [Ô][ô][Ô], [Ô][Ô]) & [Ô][ô][Ô]
Else
crReportDocument.DataDefinition.FormulaFields([Ô]Obs_Geral[Ô]).Text = [Ô]If {RECIBO_PAGAMENTO_BOR_LOTE.NRO_DOCTO} <> [ô] [ô] Then
[ô]Referente pagamento de Notas Fiscais: [ô] & {RECIBO_PAGAMENTO_BOR_LOTE.NRO_DOCTO}[Ô]
End If
crReportDocument.DataDefinition.FormulaFields([Ô]Pagante[Ô]).Text = [Ô][ô][Ô] & cboPagante.Text & [Ô][ô][Ô]
[ô] Define a fonte do controle Crystal Report Viewer como sendo o relatorio definido acima
FrmReportRecibo.CrystalReportViewer1.ReportSource = Nothing
FrmReportRecibo.CrystalReportViewer1.Refresh()
FrmReportRecibo.CrystalReportViewer1.ReportSource = crReportDocument
If Tipo = [Ô]B[Ô] Then
crReportDocument.RecordSelectionFormula = [Ô]{RECIBO_PAGAMENTO_BOR_LOTE.SEQ} in [[Ô] & selecao_tit & [Ô]][Ô]
Else
crReportDocument.RecordSelectionFormula = [Ô]{RECIBO_PAGAMENTO_BOR_LOTE.SEQ} in [[Ô] & selecao_tit & [Ô]][Ô]
End If
FrmReportRecibo.Text = [Ô]Recibos - [Ô] & cboPagante.Text & [Ô][Ô]
FrmReportRecibo.Show()
End If
Então tu filtra o resultado usando o campo RECIBO_PAGAMENTO_BOR_LOTE.SEQ.
Beleza.
E qual o conteúdo da coluna SEQ no grid? é o campo SEQ da tabela ou é RowNum?
Beleza.
E qual o conteúdo da coluna SEQ no grid? é o campo SEQ da tabela ou é RowNum?
Exatamente!
RECIBO_PAGAMENTO_BOR_LOTE.SEQ é o campo ROWNUM.
Mas quando um novo tÃtulo é inserido e os dados já estão na grid, o oracle, acredito eu que seja por conta de Ãndice, altera o rownum.
RECIBO_PAGAMENTO_BOR_LOTE.SEQ é o campo ROWNUM.
Mas quando um novo tÃtulo é inserido e os dados já estão na grid, o oracle, acredito eu que seja por conta de Ãndice, altera o rownum.
Posta aqui a SQL que preenche o grid. Quero conferir algo.
Já tentei retirar o ORDER BY também e não resolveu.
SELECT
ROWNUM SEQ,
A.COD_ESTAB,
A.COD_EMITENTE,
A.NOME_EMIT,
A.CGC,
A.ENDERECO,
A.TELEFONE,
A.CONTA_CORREN,
A.AGENCIA,
A.COD_BANCO,
A.DIGITO_CC,
A.NOM_BANCO NOME_BANCO,
A.COD_TIT_AP,
A.COD_PARCELA,
A.NOM_FAVOREC_CHEQ,
A.COD_SER_DOCTO,
A.COD_ESPEC_DOCTO,
A.DAT_TRANSACAO,
A.VAL_PAGTO,
A.COD_REFER,
A.CDN_FORNECEDOR,
A.NUM_CHEQUE,
TRIM(COD_PORTADOR) COD_PORTADOR,
A.TIPO,
CASE WHEN TRIM(nro_docto) IS NOT NULL THEN
nro_docto ELSE [ô] [ô]
END NRO_DOCTO
FROM (
-- Query Lote - Com númeração de Cheques
SELECT
TO_NUMBER(LP.COD_ESTAB_REFER) COD_ESTAB,
E.COD_EMITENTE,
CASE WHEN E.COD_EMITENTE = 0 THEN [ô] [ô] ELSE E.NOME_EMIT END NOME_EMIT,
E.CGC,
E.ENDERECO,
E.TELEFONE##1 TELEFONE,
CC.cod_cta_corren_bco CONTA_CORREN,
CC.cod_agenc_bcia AGENCIA,
CC.COD_BANCO COD_BANCO,
BANCO.NOM_BANCO,
CC.COD_DIGITO_CTA_CORREN DIGITO_CC,
CASE WHEN COUNT(LI.COD_TIT_aP) > 1 THEN [ô]AGRUPADO[ô] ELSE MAX(LI.COD_TIT_AP) END COD_TIT_aP,
CASE WHEN COUNT(LI.cod_parcela) > 1 THEN [ô] [ô] ELSE MAX(LI.cod_parcela) END cod_parcela,
CHE.NOM_FAVOREC_CHEQ,
LI.cod_ser_docto,
LI.cod_espec_docto,
MAX(LI.DAT_VENCTO_TIT_AP) dat_transacao,
SUM(LI.val_pagto) VAL_PAGTO,
LP.cod_refer,
LI.cdn_fornecedor,
che.num_cheque,
TO_NUMBER(LI.cod_portador) COD_PORTADOR,
[ô]L[ô] TIPO,
wm_concat(NFE.nro_docto) nro_docto
FROM EMS5MOV.LOTE_PAGTO LP
INNER JOIN EMS5MOV.ITEM_LOTE_PAGTO LI
ON LP.COD_REFER = LI.COD_REFER
AND LP.COD_EMPRESA = LI.COD_EMPRESA
AND LP.COD_ESTAB_REFER = LI.COD_ESTAB_REFER
LEFT OUTER JOIN EMS5MOV.ITEM_CHEQ_AP ICHE
ON LI.COD_EMPRESA = ICHE .COD_EMPRESA
AND LI.COD_ESTAB_REFER = ICHE .COD_ESTAB_REFER
AND Li.Cdn_Fornecedor = Iche.Cdn_Fornecedor
AND Li.Cod_Refer = Iche.Cod_Refer
AND Li.Num_Seq_Refer = Iche.Num_Seq_Refer
LEFT OUTER JOIN ems5mov.cheq_ap CHE
ON Iche.Cod_Empresa = Che.Cod_Empresa
AND Iche.Cod_Estab_Cheq = Che.Cod_Estab_Cheq
AND Iche.Cod_Estab_Refer = Che.Cod_Estab_Refer
AND Iche.Num_Id_Cheq_Ap = Che.Num_Id_Cheq_Ap
LEFT OUTER JOIN EMS2CAD.EMITENTE E
ON LI.CDN_FORNECEDOR = E.COD_EMITENTE
LEFT OUTER JOIN EMS5CAD.CTA_CORREN_FORNEC CC ON
E.COD_EMITENTE = CC.CDN_FORNECEDOR AND LOG_CTA_CORREN_PREFER = 1
LEFT OUTER JOIN EMS5CAD.BANCO
ON (CC.COD_BANCO = BANCO.COD_BANCO)
LEFT OUTER JOIN EMS2MOV.DOCUM_EST NFE
ON NFE.serie_docto = COD_SER_DOCTO
AND NFE.nro_docto = cod_tit_ap
AND NFE.cod_emitente = cdn_fornecedor
AND NFE.nat_operacao IS NOT NULL
WHERE UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]ESTORNADO[ô]
AND UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]SUSTADO[ô]
AND CHE.NOM_FAVOREC_CHEQ IS NOT NULL
GROUP BY
LP.COD_ESTAB_REFER,
E.CGC,
E.ENDERECO,
E.TELEFONE##1,
CC.cod_cta_corren_bco,
CC.cod_agenc_bcia,
CC.COD_BANCO,
COD_DIGITO_CTA_CORREN,
BANCO.NOM_BANCO,
E.COD_EMITENTE,E.NOME_EMIT,CHE.NOM_FAVOREC_CHEQ,
LI.cod_ser_docto,LI.cod_espec_docto,LI.cdn_fornecedor,LP.cod_refer,
che.num_cheque,LI.cod_portador
-- Query Lote - Cheques sem numeração
UNION ALL
SELECT
To_Number(LP.COD_ESTAB_REFER) COD_ESTAB,
E.COD_EMITENTE,
CASE WHEN E.COD_EMITENTE = 0 THEN [ô] [ô] ELSE E.NOME_EMIT END NOME_EMIT,
E.CGC,
E.ENDERECO,
E.TELEFONE##1 TELEFONE,
CC.cod_cta_corren_bco,
CC.cod_agenc_bcia,
CC.COD_BANCO,
BANCO.NOM_BANCO,
CC.COD_DIGITO_CTA_CORREN DIGITO_CC,
LI.COD_TIT_aP COD_TIT_aP,
LI.cod_parcela cod_parcela,
CHE.NOM_FAVOREC_CHEQ,
LI.cod_ser_docto,
LI.cod_espec_docto,
LI.DAT_VENCTO_TIT_AP dat_transacao,
LI.val_pagto,
LP.cod_refer,
LI.cdn_fornecedor,
che.num_cheque,
COALESCE(TO_NUMBER(TRIM(LI.cod_portador)),0) cod_portador,
[ô]L[ô] TIPO,
NFE.nro_docto
FROM EMS5MOV.LOTE_PAGTO LP
INNER JOIN EMS5MOV.ITEM_LOTE_PAGTO LI
ON LP.COD_REFER = LI.COD_REFER
AND LP.COD_EMPRESA = LI.COD_EMPRESA
AND LP.COD_ESTAB_REFER = LI.COD_ESTAB_REFER
LEFT OUTER JOIN EMS5MOV.ITEM_CHEQ_AP ICHE
ON LI.COD_EMPRESA = ICHE .COD_EMPRESA
AND LI.COD_ESTAB_REFER = ICHE .COD_ESTAB_REFER
AND Li.Cdn_Fornecedor = Iche.Cdn_Fornecedor
AND Li.Cod_Refer = Iche.Cod_Refer
AND Li.Num_Seq_Refer = Iche.Num_Seq_Refer
LEFT OUTER JOIN ems5mov.cheq_ap CHE
ON Iche.Cod_Empresa = Che.Cod_Empresa
AND Iche.Cod_Estab_Cheq = Che.Cod_Estab_Cheq
AND Iche.Cod_Estab_Refer = Che.Cod_Estab_Refer
AND Iche.Num_Id_Cheq_Ap = Che.Num_Id_Cheq_Ap
LEFT OUTER JOIN EMS2CAD.EMITENTE E
ON LI.CDN_FORNECEDOR = E.COD_EMITENTE
LEFT OUTER JOIN EMS5CAD.CTA_CORREN_FORNEC CC ON
E.COD_EMITENTE = CC.CDN_FORNECEDOR AND LOG_CTA_CORREN_PREFER = 1
LEFT OUTER JOIN EMS5CAD.BANCO
ON (CC.COD_BANCO = BANCO.COD_BANCO)
LEFT OUTER JOIN EMS2MOV.DOCUM_EST NFE
ON NFE.serie_docto = COD_SER_DOCTO
AND NFE.nro_docto = cod_tit_ap
AND NFE.cod_emitente = cdn_fornecedor
AND NFE.nat_operacao IS NOT NULL
WHERE UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]ESTORNADO[ô]
AND UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]SUSTADO[ô]
AND CHE.NOM_FAVOREC_CHEQ IS NULL
UNION ALL
SELECT
To_Number(BAP.COD_ESTAB) COD_ESTAB,
e.cod_emitente,
E.NOME_EMIT,
E.CGC,
E.ENDERECO,
E.TELEFONE##1 TELEFONE,
CC.cod_cta_corren_bco,
CC.cod_agenc_bcia,
CC.COD_BANCO,
BANCO.NOM_BANCO,
CC.COD_DIGITO_CTA_CORREN DIGITO_CC,
BAP.COD_TIT_AP,
BAP.COD_PARCELA,
[ô] [ô] FAVORECIDO_CHEQUE,
BAP.COD_SER_DOCTO,
BAP.COD_ESPEC_DOCTO,
B.DAT_TRANSACAO,
BAP.VAL_PAGTO,
TO_CHAR(BAP.NUM_BORD_AP) REFERENCIA,
E.COD_EMITENTE,
0 CHEQUE,
TO_NUMBER(BAP.COD_PORTADOR) COD_PORTADOR,
[ô]B[ô] TIPO,
NFE.nro_docto
FROM EMS5MOV.BORD_AP B
INNER JOIN EMS5MOV.ITEM_BORD_AP BAP
ON B.COD_EMPRESA = BAP.COD_EMPRESA
AND B.COD_ESTAB_BORD = BAP.COD_ESTAB_BORD
AND B.COD_PORTADOR = BAP.COD_PORTADOR
AND B.NUM_BORD_AP = BAP.NUM_BORD_AP
INNER JOIN EMS2CAD.EMITENTE E ON
E.COD_EMITENTE = BAP.CDN_FORNECEDOR
LEFT OUTER JOIN EMS5CAD.CTA_CORREN_FORNEC CC ON
E.COD_EMITENTE = CC.CDN_FORNECEDOR AND LOG_CTA_CORREN_PREFER = 1
LEFT OUTER JOIN EMS5CAD.BANCO
ON (CC.COD_BANCO = BANCO.COD_BANCO)
LEFT OUTER JOIN EMS2MOV.DOCUM_EST NFE
ON NFE.serie_docto = COD_SER_DOCTO
AND NFE.nro_docto = cod_tit_ap
AND NFE.cod_emitente = cdn_fornecedor
AND NFE.nat_operacao IS NOT NULL
WHERE UPPER(BAP.ind_sit_item_bord_ap) != [ô]ESTORNADO[ô]
AND UPPER(BAP.ind_sit_item_bord_ap) != [ô]SUSTADO[ô]
) A
-- Ordenação da View
ORDER BY NOME_EMIT,COD_TIT_AP
SELECT
ROWNUM SEQ,
A.COD_ESTAB,
A.COD_EMITENTE,
A.NOME_EMIT,
A.CGC,
A.ENDERECO,
A.TELEFONE,
A.CONTA_CORREN,
A.AGENCIA,
A.COD_BANCO,
A.DIGITO_CC,
A.NOM_BANCO NOME_BANCO,
A.COD_TIT_AP,
A.COD_PARCELA,
A.NOM_FAVOREC_CHEQ,
A.COD_SER_DOCTO,
A.COD_ESPEC_DOCTO,
A.DAT_TRANSACAO,
A.VAL_PAGTO,
A.COD_REFER,
A.CDN_FORNECEDOR,
A.NUM_CHEQUE,
TRIM(COD_PORTADOR) COD_PORTADOR,
A.TIPO,
CASE WHEN TRIM(nro_docto) IS NOT NULL THEN
nro_docto ELSE [ô] [ô]
END NRO_DOCTO
FROM (
-- Query Lote - Com númeração de Cheques
SELECT
TO_NUMBER(LP.COD_ESTAB_REFER) COD_ESTAB,
E.COD_EMITENTE,
CASE WHEN E.COD_EMITENTE = 0 THEN [ô] [ô] ELSE E.NOME_EMIT END NOME_EMIT,
E.CGC,
E.ENDERECO,
E.TELEFONE##1 TELEFONE,
CC.cod_cta_corren_bco CONTA_CORREN,
CC.cod_agenc_bcia AGENCIA,
CC.COD_BANCO COD_BANCO,
BANCO.NOM_BANCO,
CC.COD_DIGITO_CTA_CORREN DIGITO_CC,
CASE WHEN COUNT(LI.COD_TIT_aP) > 1 THEN [ô]AGRUPADO[ô] ELSE MAX(LI.COD_TIT_AP) END COD_TIT_aP,
CASE WHEN COUNT(LI.cod_parcela) > 1 THEN [ô] [ô] ELSE MAX(LI.cod_parcela) END cod_parcela,
CHE.NOM_FAVOREC_CHEQ,
LI.cod_ser_docto,
LI.cod_espec_docto,
MAX(LI.DAT_VENCTO_TIT_AP) dat_transacao,
SUM(LI.val_pagto) VAL_PAGTO,
LP.cod_refer,
LI.cdn_fornecedor,
che.num_cheque,
TO_NUMBER(LI.cod_portador) COD_PORTADOR,
[ô]L[ô] TIPO,
wm_concat(NFE.nro_docto) nro_docto
FROM EMS5MOV.LOTE_PAGTO LP
INNER JOIN EMS5MOV.ITEM_LOTE_PAGTO LI
ON LP.COD_REFER = LI.COD_REFER
AND LP.COD_EMPRESA = LI.COD_EMPRESA
AND LP.COD_ESTAB_REFER = LI.COD_ESTAB_REFER
LEFT OUTER JOIN EMS5MOV.ITEM_CHEQ_AP ICHE
ON LI.COD_EMPRESA = ICHE .COD_EMPRESA
AND LI.COD_ESTAB_REFER = ICHE .COD_ESTAB_REFER
AND Li.Cdn_Fornecedor = Iche.Cdn_Fornecedor
AND Li.Cod_Refer = Iche.Cod_Refer
AND Li.Num_Seq_Refer = Iche.Num_Seq_Refer
LEFT OUTER JOIN ems5mov.cheq_ap CHE
ON Iche.Cod_Empresa = Che.Cod_Empresa
AND Iche.Cod_Estab_Cheq = Che.Cod_Estab_Cheq
AND Iche.Cod_Estab_Refer = Che.Cod_Estab_Refer
AND Iche.Num_Id_Cheq_Ap = Che.Num_Id_Cheq_Ap
LEFT OUTER JOIN EMS2CAD.EMITENTE E
ON LI.CDN_FORNECEDOR = E.COD_EMITENTE
LEFT OUTER JOIN EMS5CAD.CTA_CORREN_FORNEC CC ON
E.COD_EMITENTE = CC.CDN_FORNECEDOR AND LOG_CTA_CORREN_PREFER = 1
LEFT OUTER JOIN EMS5CAD.BANCO
ON (CC.COD_BANCO = BANCO.COD_BANCO)
LEFT OUTER JOIN EMS2MOV.DOCUM_EST NFE
ON NFE.serie_docto = COD_SER_DOCTO
AND NFE.nro_docto = cod_tit_ap
AND NFE.cod_emitente = cdn_fornecedor
AND NFE.nat_operacao IS NOT NULL
WHERE UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]ESTORNADO[ô]
AND UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]SUSTADO[ô]
AND CHE.NOM_FAVOREC_CHEQ IS NOT NULL
GROUP BY
LP.COD_ESTAB_REFER,
E.CGC,
E.ENDERECO,
E.TELEFONE##1,
CC.cod_cta_corren_bco,
CC.cod_agenc_bcia,
CC.COD_BANCO,
COD_DIGITO_CTA_CORREN,
BANCO.NOM_BANCO,
E.COD_EMITENTE,E.NOME_EMIT,CHE.NOM_FAVOREC_CHEQ,
LI.cod_ser_docto,LI.cod_espec_docto,LI.cdn_fornecedor,LP.cod_refer,
che.num_cheque,LI.cod_portador
-- Query Lote - Cheques sem numeração
UNION ALL
SELECT
To_Number(LP.COD_ESTAB_REFER) COD_ESTAB,
E.COD_EMITENTE,
CASE WHEN E.COD_EMITENTE = 0 THEN [ô] [ô] ELSE E.NOME_EMIT END NOME_EMIT,
E.CGC,
E.ENDERECO,
E.TELEFONE##1 TELEFONE,
CC.cod_cta_corren_bco,
CC.cod_agenc_bcia,
CC.COD_BANCO,
BANCO.NOM_BANCO,
CC.COD_DIGITO_CTA_CORREN DIGITO_CC,
LI.COD_TIT_aP COD_TIT_aP,
LI.cod_parcela cod_parcela,
CHE.NOM_FAVOREC_CHEQ,
LI.cod_ser_docto,
LI.cod_espec_docto,
LI.DAT_VENCTO_TIT_AP dat_transacao,
LI.val_pagto,
LP.cod_refer,
LI.cdn_fornecedor,
che.num_cheque,
COALESCE(TO_NUMBER(TRIM(LI.cod_portador)),0) cod_portador,
[ô]L[ô] TIPO,
NFE.nro_docto
FROM EMS5MOV.LOTE_PAGTO LP
INNER JOIN EMS5MOV.ITEM_LOTE_PAGTO LI
ON LP.COD_REFER = LI.COD_REFER
AND LP.COD_EMPRESA = LI.COD_EMPRESA
AND LP.COD_ESTAB_REFER = LI.COD_ESTAB_REFER
LEFT OUTER JOIN EMS5MOV.ITEM_CHEQ_AP ICHE
ON LI.COD_EMPRESA = ICHE .COD_EMPRESA
AND LI.COD_ESTAB_REFER = ICHE .COD_ESTAB_REFER
AND Li.Cdn_Fornecedor = Iche.Cdn_Fornecedor
AND Li.Cod_Refer = Iche.Cod_Refer
AND Li.Num_Seq_Refer = Iche.Num_Seq_Refer
LEFT OUTER JOIN ems5mov.cheq_ap CHE
ON Iche.Cod_Empresa = Che.Cod_Empresa
AND Iche.Cod_Estab_Cheq = Che.Cod_Estab_Cheq
AND Iche.Cod_Estab_Refer = Che.Cod_Estab_Refer
AND Iche.Num_Id_Cheq_Ap = Che.Num_Id_Cheq_Ap
LEFT OUTER JOIN EMS2CAD.EMITENTE E
ON LI.CDN_FORNECEDOR = E.COD_EMITENTE
LEFT OUTER JOIN EMS5CAD.CTA_CORREN_FORNEC CC ON
E.COD_EMITENTE = CC.CDN_FORNECEDOR AND LOG_CTA_CORREN_PREFER = 1
LEFT OUTER JOIN EMS5CAD.BANCO
ON (CC.COD_BANCO = BANCO.COD_BANCO)
LEFT OUTER JOIN EMS2MOV.DOCUM_EST NFE
ON NFE.serie_docto = COD_SER_DOCTO
AND NFE.nro_docto = cod_tit_ap
AND NFE.cod_emitente = cdn_fornecedor
AND NFE.nat_operacao IS NOT NULL
WHERE UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]ESTORNADO[ô]
AND UPPER(LI.INDSITITEMLOTEBXAAP) <> [ô]SUSTADO[ô]
AND CHE.NOM_FAVOREC_CHEQ IS NULL
UNION ALL
SELECT
To_Number(BAP.COD_ESTAB) COD_ESTAB,
e.cod_emitente,
E.NOME_EMIT,
E.CGC,
E.ENDERECO,
E.TELEFONE##1 TELEFONE,
CC.cod_cta_corren_bco,
CC.cod_agenc_bcia,
CC.COD_BANCO,
BANCO.NOM_BANCO,
CC.COD_DIGITO_CTA_CORREN DIGITO_CC,
BAP.COD_TIT_AP,
BAP.COD_PARCELA,
[ô] [ô] FAVORECIDO_CHEQUE,
BAP.COD_SER_DOCTO,
BAP.COD_ESPEC_DOCTO,
B.DAT_TRANSACAO,
BAP.VAL_PAGTO,
TO_CHAR(BAP.NUM_BORD_AP) REFERENCIA,
E.COD_EMITENTE,
0 CHEQUE,
TO_NUMBER(BAP.COD_PORTADOR) COD_PORTADOR,
[ô]B[ô] TIPO,
NFE.nro_docto
FROM EMS5MOV.BORD_AP B
INNER JOIN EMS5MOV.ITEM_BORD_AP BAP
ON B.COD_EMPRESA = BAP.COD_EMPRESA
AND B.COD_ESTAB_BORD = BAP.COD_ESTAB_BORD
AND B.COD_PORTADOR = BAP.COD_PORTADOR
AND B.NUM_BORD_AP = BAP.NUM_BORD_AP
INNER JOIN EMS2CAD.EMITENTE E ON
E.COD_EMITENTE = BAP.CDN_FORNECEDOR
LEFT OUTER JOIN EMS5CAD.CTA_CORREN_FORNEC CC ON
E.COD_EMITENTE = CC.CDN_FORNECEDOR AND LOG_CTA_CORREN_PREFER = 1
LEFT OUTER JOIN EMS5CAD.BANCO
ON (CC.COD_BANCO = BANCO.COD_BANCO)
LEFT OUTER JOIN EMS2MOV.DOCUM_EST NFE
ON NFE.serie_docto = COD_SER_DOCTO
AND NFE.nro_docto = cod_tit_ap
AND NFE.cod_emitente = cdn_fornecedor
AND NFE.nat_operacao IS NOT NULL
WHERE UPPER(BAP.ind_sit_item_bord_ap) != [ô]ESTORNADO[ô]
AND UPPER(BAP.ind_sit_item_bord_ap) != [ô]SUSTADO[ô]
) A
-- Ordenação da View
ORDER BY NOME_EMIT,COD_TIT_AP
Que saudades dessas SQLs malucas de ERPs...
Na SQL que preenche o grid, o campo SEQ corresponde ao ROWNUM, ou seja, ao número da linha dentro do resultado da SQL (Conforme documentação do Oracle).
Assim, a primeira linha do GRID tem o campo SEQ = 1, a segunda SEQ = 2, a décima SEQ = 10, etc.
Porém, na hora de enviar para o Crystal Reports, tu compara o SEQ do grid com o campo RECIBO_PAGAMENTO_BOR_LOTE.SEQ.
Assim, não necessariamente a primeira linha do grid (SEQ = 1) corresponderá ao campo RECIBO_PAGAMENTO_BOR_LOTE.SEQ = 1.
Faz anos que eu não uso o Crystal Reports, mas acho que essa é a questão.
Por que tu não cria uma tabela temporária para guardar os dados selecionados pelo usuário e aponta o Crystal Reports para ela?
Na SQL que preenche o grid, o campo SEQ corresponde ao ROWNUM, ou seja, ao número da linha dentro do resultado da SQL (Conforme documentação do Oracle).
Assim, a primeira linha do GRID tem o campo SEQ = 1, a segunda SEQ = 2, a décima SEQ = 10, etc.
Porém, na hora de enviar para o Crystal Reports, tu compara o SEQ do grid com o campo RECIBO_PAGAMENTO_BOR_LOTE.SEQ.
Assim, não necessariamente a primeira linha do grid (SEQ = 1) corresponderá ao campo RECIBO_PAGAMENTO_BOR_LOTE.SEQ = 1.
Faz anos que eu não uso o Crystal Reports, mas acho que essa é a questão.
Por que tu não cria uma tabela temporária para guardar os dados selecionados pelo usuário e aponta o Crystal Reports para ela?
Prezado ASHKATCHUP, penso que dessa forma vá funcionar, mas não seria a melhor solução.
Infelizmente a rotina atual só dá problema quando um novo tÃtulo é inserido.
Teria alguma outra ideia?
Infelizmente a rotina atual só dá problema quando um novo tÃtulo é inserido.
Teria alguma outra ideia?
eu acho que pegar o numero da linha se baseando na quantidade de registro não é viável, o correto e pegar o numero contido na celula.
Citação::
Prezado ASHKATCHUP, penso que dessa forma vá funcionar, mas não seria a melhor solução.
Infelizmente a rotina atual só dá problema quando um novo tÃtulo é inserido.
Teria alguma outra ideia?
é curioso que a consulta funcione quando nenhum tÃtulo novo é adicionado. Que tipo de valor é guardado na tabela RECIBO_PAGAMENTO_BOR_LOTE e qual a relação dela com o resultado da consulta?
Pelo que vi, essa tabela nem é referida na SQL.
Tópico encerrado , respostas não são mais permitidas