PROBLEMA COM O UNION

WEBIER 22/06/2011 14:51:35
#377539
Tenho que mostrar num mesmo flexgrid os dados de 3 tabelas.

então uso a SQL assim:

Call Abrir_BancodeDados
SQL = [Ô]SELECT PARCELAS.Hora AS HORA_PARC, PARCELAS.CODIGO AS CAMPOcp, PEDIDOS.COD_PEDIDO AS CAMPO00, Cliente.NOME AS CAMPO01, PARCELAS.FORMA_PGTO AS CAMPO0x, PARCELAS.VALOR_FINAL AS CAMPO02, [ô]0[ô] AS CAMPO03, (CCUR(CAMPO02)-CCUR(CAMPO03)) AS CAMPO04, PEDIDOS.TIPO_CARTAO AS CAMPOTP, PEDIDOS.TIPO_CARTAO as CAMPOTC, PARCELAS.PAGAMENTO, PEDIDOS.Cod_Pedido, PEDIDOS.COD_CLIENTE, Cliente.CODIGO FROM CLIENTE INNER JOIN (PARCELAS INNER JOIN PEDIDOS ON PARCELAS.COD_PEDIDO = PEDIDOS.COD_PEDIDO) ON CLIENTE.CODIGO = PEDIDOS.COD_CLIENTE WHERE PARCELAS.STATUS = true and PARCELAS.PAGAMENTO = #[Ô] & Format(mskData, [Ô]mm/dd/yyyy[Ô]) & [Ô]# [Ô] & ORIGEM_CAIXA & [Ô] ORDER BY HORA [Ô] & _
[Ô] UNION [Ô] & _
[Ô]SELECT HORA AS HORA_PARC, [ô][ô] AS CAMPOcp, [ô][ô] AS CAMPO00, DESCRICAO AS CAMPO01, [ô]SUPRIMENTO[ô] AS CAMPO0x, VALOR AS CAMPO02, [ô]0[ô] AS CAMPO03, (CCUR(CAMPO02)-CCUR(CAMPO03)) AS CAMPO04, [ô]0[ô] AS CAMPOTP, [ô]0[ô] as CAMPOTC, COD_HAVER, SETOR, DATA, CODIGO FROM CAIXA_ENTRADA WHERE DATA = #[Ô] & Format(mskData, [Ô]mm/dd/yyyy[Ô]) & [Ô]# [Ô] & _
[Ô] UNION [Ô] & _
[Ô]SELECT CAIXA_SAIDA.HORA AS HORA_PARC, [ô][ô] AS CAMPOcp, [ô][ô] AS CAMPO00, CAIXA_SAIDA.DESCRICAO AS CAMPO01, [ô]SAÍDA[ô] AS CAMPO0x, [ô]0[ô] AS CAMPO02, CAIXA_SAIDA.VALOR AS CAMPO03, (CCUR(CAMPO02)-CCUR(CAMPO03)) AS CAMPO04, [ô]0[ô] AS CAMPOTP, COD_HAVER, SETOR, DATA, CODIGO, [ô]0[ô] as CAMPOTC FROM CAIXA_SAIDA WHERE DATA = #[Ô] & Format(mskData, [Ô]mm/dd/yyyy[Ô]) & [Ô]#[Ô]
Set RS = BD.OpenRecordset(SQL)


meu problema é que antes está funcionando normal... devo ter modificado alguma coisa ao qual nao me lembro que a consulta tá me mostrando somente 1 registro de cada cliente.

ou seja, seu um cliente tiver 5 parcelas com as condições do where ai... ele só me mostra a ultima... ou seja... de 5 ele me mostra só 1.

se eu tirar o UNIION e deixar somente a primeira SQL ele me mostra normal... ou seja os 5 registros

SQL = [Ô]SELECT PARCELAS.Hora AS HORA_PARC, PARCELAS.CODIGO AS CAMPOcp, PEDIDOS.COD_PEDIDO AS CAMPO00, Cliente.NOME AS CAMPO01, PARCELAS.FORMA_PGTO AS CAMPO0x, PARCELAS.VALOR_FINAL AS CAMPO02, [ô]0[ô] AS CAMPO03, (CCUR(CAMPO02)-CCUR(CAMPO03)) AS CAMPO04, PEDIDOS.TIPO_CARTAO AS CAMPOTP, PEDIDOS.TIPO_CARTAO as CAMPOTC, PARCELAS.PAGAMENTO, PEDIDOS.Cod_Pedido, PEDIDOS.COD_CLIENTE, Cliente.CODIGO FROM CLIENTE INNER JOIN (PARCELAS INNER JOIN PEDIDOS ON PARCELAS.COD_PEDIDO = PEDIDOS.COD_PEDIDO) ON CLIENTE.CODIGO = PEDIDOS.COD_CLIENTE WHERE PARCELAS.STATUS = true and PARCELAS.PAGAMENTO = #[Ô] & Format(mskData, [Ô]mm/dd/yyyy[Ô]) & [Ô]# [Ô] & ORIGEM_CAIXA & [Ô] ORDER BY HORA


a quantidade de campos nas 3 SQL são iguais
já olhei no banco de dados e vi que os registros estão com as mesmas condições

o q poderá ser?
MARCELO.TREZE 22/06/2011 15:26:01
#377549
Resposta escolhida
veja se vc não mudou alguma coisa em um Loop depois da query, o problema deve estar ai.
WEBIER 22/06/2011 16:44:37
#377564
NÃO HÁ LOOP

olha o codigo na integra

Public Sub cmdMostrar_Click()
If Not IsDate(mskData) Then Exit Sub

Dim ORIGEM_CAIXA As String
If StatusBar1.Panels(2).Text <> [Ô]TODOS[Ô] Then
ORIGEM_CAIXA = [Ô]AND PEDIDOS.MAQUINA = [ô][Ô] & StatusBar1.Panels(2).Text & [Ô][ô][Ô]
ElseIf StatusBar1.Panels(2).Text = [Ô]TODOS[Ô] Then
ORIGEM_CAIXA = [Ô]AND PEDIDOS.MAQUINA <> [ô]CAIXA[ô][Ô]
End If

[ô]MOSTRAR As ENTRADAS
<aqui vem essa parte de coloquei ai a cima>

FormatarGridEntrada
End Sub
MARCELO.TREZE 22/06/2011 16:56:12
#377567
Wieber é assim

em algum lugar deve estar assim

sql = [Ô]select ......[Ô]
set rs = con.open(sql)
Do while Not rs.Eof
grid que usa
rs.Movenext
Loop

da forma acima vai inserindo os registros

agora se for assim

sql = [Ô]select ......[Ô]
set rs = con.open(sql)
if not rs.eof and rs.bof then
grid que usa
End if

só vai mostrar o uçltimo registro

LLAIA 22/06/2011 17:00:51
#377569
o que deve está acontecendo é que os registros são totalmente iguais mesmo vindo de tabelas diferentes, e em união de conjuntos apenas mostramos um único elemento, mesmo ele existindo em A e B. Por exemplo:

A = {1,2,3}
B = {2,4,6}
A U B = {1,2,3,4,6}

Se A e B fossem tabelas e cada elemento um registro, os selects nelas com Union trouxessem somente o elemento 2 uma vez. No início dos selects, coloque um diferenciador como campo injetado assim:

SELECT [ô]1[ô] as Identificador, PARCELAS.Hora ...
SELECT [ô]2[ô] , PARCELAS.Hora ...
SELECT [ô]3[ô] , PARCELAS.Hora ...



Veja se isso resolve
PARREIRA 22/06/2011 17:18:30
#377574
Tenta assim (seu 1 select) union (seu segunto select) union (seu terceiro selec) order by 1.
Colocando os parenteses.
FFCOUTO 22/06/2011 20:44:25
#377585
Como o LLAIA disse na união de tabelas é mostrada os registros apenas uma vez os dados duplicados são removidos. Para unir todos sem remover os duplicados você dever usar UNION ALL.
WEBIER 22/06/2011 23:30:15
#377589
Citação:

:
Wieber é assim

em algum lugar deve estar assim

sql = [Ô]select ......[Ô]
set rs = con.open(sql)
Do while Not rs.Eof
grid que usa
rs.Movenext
Loop

da forma acima vai inserindo os registros

agora se for assim

sql = [Ô]select ......[Ô]
set rs = con.open(sql)
if not rs.eof and rs.bof then
grid que usa
End if

só vai mostrar o uçltimo registro



Marcelo... entendi...

Entao esse loop fica na rotina FormatarGridParcelas

ele é assim

Do Until RS.EOF

If Not IsNull(RS!HORA_PARC) Then .TextMatrix(.Rows - 1, 1) = Format(RS!HORA_PARC, [Ô]hh:mm[Ô])
If Not IsNull(RS!CAMPO00) Then .TextMatrix(.Rows - 1, 2) = Format(RS!CAMPO00, [Ô]000000[Ô])
If Not IsNull(RS!CAMPO01) Then .TextMatrix(.Rows - 1, 3) = RS!CAMPO01

RS.MoveNext
.Rows = .Rows + 1
Loop



WEBIER 22/06/2011 23:33:51
#377590
Citação:

:
Como o LLAIA disse na união de tabelas é mostrada os registros apenas uma vez os dados duplicados são removidos. Para unir todos sem remover os duplicados você dever usar UNION ALL.



substituir o UNION por UNION ALL e continuou da mesma forma
WEBIER 22/06/2011 23:37:36
#377591
Citação:

:
o que deve está acontecendo é que os registros são totalmente iguais mesmo vindo de tabelas diferentes, e em união de conjuntos apenas mostramos um único elemento, mesmo ele existindo em A e B. Por exemplo:

A = {1,2,3}
B = {2,4,6}
A U B = {1,2,3,4,6}

Se A e B fossem tabelas e cada elemento um registro, os selects nelas com Union trouxessem somente o elemento 2 uma vez. No início dos selects, coloque um diferenciador como campo injetado assim:

SELECT [ô]1[ô] as Identificador, PARCELAS.Hora ...
SELECT [ô]2[ô] , PARCELAS.Hora ...
SELECT [ô]3[ô] , PARCELAS.Hora ...



Veja se isso resolve



mas se eu identificar o primeiro campo da primeira select... na hora de prencher o grid... como farei para reconhecer ele e os outros campos de devem ficar na mesma coluna?
LLAIA 23/06/2011 11:47:07
#377596
Se vc não estiver acessando as colunas no recordset por indexação, não terá problemas no exemplo que te passei. Se estiver, joga ele pro final em vez do início. Vai ser criada uma coluna chamada identificador. Se vc quiser, em vez de Identificador, coloca Origem, e em vez de números, coloque o nome da tabela.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas