AJUDA COM QUERY ORACLE / FORM

CAIOHSZA 12/09/2016 09:55:51
#466769
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?

ASHKATCHUP 12/09/2016 10:04:09
#466770
Resposta escolhida
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.

CAIOHSZA 12/09/2016 10:06:39
#466771
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
ASHKATCHUP 12/09/2016 11:08:26
#466775
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?
CAIOHSZA 12/09/2016 11:26:40
#466776
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.
ASHKATCHUP 12/09/2016 13:01:32
#466780
Posta aqui a SQL que preenche o grid. Quero conferir algo.
CAIOHSZA 12/09/2016 13:46:29
#466781
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

ASHKATCHUP 12/09/2016 14:52:04
#466783
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?
CAIOHSZA 12/09/2016 15:05:50
#466785
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?
MARCELO.TREZE 12/09/2016 15:06:23
#466786
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.
ASHKATCHUP 12/09/2016 15:15:11
#466787
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.
Página 1 de 3 [22 registro(s)]
Tópico encerrado , respostas não são mais permitidas