PESQUISA EM 3 TABELAS

CAIO.FR.SP 24/10/2010 13:48:41
#355778
GALERA COMO EU FAÇO PARA PESQUISAR DADOS EM 3 TABELAS (PEDIDOS,PEDIDO_CLI,PEDIDO_PROD), PRECISO CARREGAR UM LISTVIEW COM OS VALORES CONTIDOS NESSAS TABELAS.
AXO QUE DEVO FAZER USO DO INNER JOIN, MAS NAO SEI USALO.
OBS UM CAMPO COMUN ENTRE AS TABELAS é O CODSEG.

O LISTVIEW QUE PRECISO PREENCHER DEVE FICAR ASSIM:

PEDIDO | DATA | CLIENTE | VALOR | OBS |

PEDIDO, DATA E OBS ESTAO NA TABELA PEDIDOS

CLIENTE ESTA NA TABELA PEDIDO_CLI

VALOR NA TABELA PEDIDO_PROD

ALGUEM PODE ME AJUDAR COM A SINTAXE PARA ESSA PESQUISA.
SAMUKA 24/10/2010 15:37:23
#355779
Resposta escolhida
Tá aí.

SELECT PEDIDOS.PEDIDO, PEDIDOS.DATA, PEDIDO_CLI.CLIENTE, PEDIDO_PROD.VALOR, PEDIDOS.OBS
FROM (PEDIDOS LEFT JOIN PEDIDO_CLI ON PEDIDOS.CODSEG = PEDIDO_CLI)
LEFT JOIN PEDIDO_PROD ON PEDIDOS.CODSEG = PEDIDO_PROD.CODSEG
ORDER BY PEDIDOS.DATA


Conselho, estude isso, pq vai usar muuuito
CAIO.FR.SP 24/10/2010 15:51:01
#355780
porque voce esta usando o left join ao inves do inner join?
outra duvida depois vou precisar pegas todos os campos das 3 tabelas, posso usar simplesmente [Ô]*[ô] ?
SAMUKA 24/10/2010 16:33:11
#355785
LEFT indica qual tabela tem prioridade (esquerda da declaração, no caso)
Vc pode usar * qdo usa todos os campos da tabela. Caso não for usar todos não é indicado pois perde performance.

Dessa forma!
SELECT PEDIDOS.*, PEDIDO_CLI.*, PEDIDO_PROD.*
O restante da declaração SQL continua igual.
CAIO.FR.SP 25/10/2010 14:56:09
#355847
posso fazer a exclusao de dados das tres tabelas suando o inner join?
SAMUKA 25/10/2010 14:56:54
#355848
Não. Consulta SELECT é uma coisa consulta DELETE é outra. Tem q fazer individual
CAIO.FR.SP 25/10/2010 16:39:34
#355854
certo. enato o join so pode ser usando com select?
outra questao posso ter duas comparações em cada join? tipo

[Ô] SELECT PEDIDOS.PEDIDO, PEDIDOS.DATA, PEDIDO_CLI.CLIENTE, PEDIDO_PROD.VALOR, PEDIDOS.OBS
FROM (PEDIDOS LEFT JOIN PEDIDO_CLI ON PEDIDOS.CODSEG = PEDIDO_CLI AND PEDIDOS.REPRE = PEDIDOS_CLI.REPRE)
LEFT JOIN PEDIDO_PROD ON PEDIDOS.CODSEG = PEDIDO_PROD.CODSEG AND PEDIDOS.REPRE = PEDIDOS_CLI.REPRE
ORDER BY PEDIDOS.DATA; [Ô]
CAIO.FR.SP 25/10/2010 19:14:14
#355867
Gelera ajuda ai.

a consulta esta funcioando mais preciso da ajuda de voce para preencher uma listview com os dados
a string de consulta é a seguinte

SELECT PEDIDOS.PEDIDO, PEDIDOS.DATA, PEDIDOS.SITU , PEDIDOS_CLI.NOME,PEDIDO_CLI.REPRE, PEDIDOS_PROD.*
FROM (PEDIDOS LEFT JOIN PEDIDOS_CLI ON PEDIDOS.CODSEG = PEDIDO_CLI.CODSEG)
LEFT JOIN PEDIDOS_PROD ON PEDIDOS.CODSEG = PEDIDOS_PROD.CODSEG
ORDER BY PEDIDOS.DATA

dai eu preenche algum textbox com os dados retornados.
mas eu tenho que pegar os dados ta tabela pedidos_prod e preencher um listview

como eu faço um loop nessa pesquisa para preencher o litview

Do While Not Rst.EOF
Set lst = ListView1.ListItems.Add
With lst
.Text = Rst!CodPed
.SubItems(1) = Rst!arti
.SubItems(2) = Rst!tama
.SubItems(3) = Rst!cor
.SubItems(4) = Rst!Furo
.SubItems(5) = Rst!acab
.SubItems(6) = Rst!emba
.SubItems(7) = Rst!quan
.SubItems(8) = Rst!valuni
.SubItems(9) = Rst!valtot
End With
Rst.MoveNext
Loop
XXXANGELSXXX 25/10/2010 21:02:59
#355874
Sub PreencheGrid2()
On Error GoTo ErrorHandler
Set RS = New ADODB.Recordset
RS.Open [Ô]Select * from CadSubCategorias where idauxiliar=[ô][Ô] & txtCategoria.Text & [Ô][ô]order by descricao[Ô], Conexao, adOpenDynamic, adLockReadOnly
With Me.ListView1
.View = lvwReport
.GridLines = True
.FullRowSelect = True
.ListItems.Clear
.ColumnHeaders.Clear
End With

With Me.ListView1.ColumnHeaders
.Add , , [Ô]Código :[Ô], 1200, lvwColumnLeft
.Add , , [Ô]Categoria :[Ô], 6600, lvwColumnLeft
.Add , , [Ô]Sub-Categoria :[Ô], 6600, lvwColumnLeft
End With

RS.MoveFirst
Do Until RS.EOF
Set lstItem = Me.ListView1.ListItems.Add(, , [Ô][Ô], 3, 3)
lstItem.Text = IIf(IsNull(RS!id), [Ô][Ô], RS!id)
lstItem.SubItems(1) = IIf(IsNull(RS!idauxiliar), [Ô][Ô], RS!idauxiliar)
lstItem.SubItems(2) = IIf(IsNull(RS!descricao), [Ô][Ô], RS!descricao)

RS.MoveNext


Loop
RS.Close

ErrorHandlerExit:
Exit Sub
ErrorHandler:
If Err = 3021 Then
Resume Next
ElseIf Err = 94 Then
Resume Next
ElseIf Err = 3420 Then
Resume Next
Else
MsgBoxGT [Ô]Um erro inesperado Ocorreu![Ô] & _
Chr(13) & [Ô]Código do Erro : [Ô] & Err.Number & _
Chr(13) & [Ô]Descrição : [Ô] & Err.Description, vbCritical, [Ô]Erro do Sistema[Ô]
Resume ErrorHandlerExit
End If

End Sub

esse exemplo vai te ajudar
CAIO.FR.SP 25/10/2010 22:38:08
#355890
XXXANGELSXXX, preencher o listview com um select so para a tabela PEDIDOS_PROD eu consegui, queria saber se tem como eu fazer isso usando o seguinte select:

  SELECT PEDIDOS.PEDIDO, PEDIDOS.DATA, PEDIDOS.SITU , PEDIDOS_CLI.NOME,PEDIDO_CLI.REPRE, PEDIDOS_PROD.*
FROM (PEDIDOS LEFT JOIN PEDIDOS_CLI ON PEDIDOS.CODSEG = PEDIDO_CLI.CODSEG)
LEFT JOIN PEDIDOS_PROD ON PEDIDOS.CODSEG = PEDIDOS_PROD.CODSEG
ORDER BY PEDIDOS.DATA


estou começando a usar o JOIN para relacionar tabelas
tenho algumas duvidas sobre esse comando.

ex - tem algum problema se eu tiver campos com nomes iguais em tabelas diferente tipo
pedidos.codped, pedidos_prod.codped, pedidos.codseg, pedidos_prod.codseg, pedidos.codrepre, pedidos_prod.repre

AI EU USO A SIGUINTE SQL

rst.open [Ô]select pedidos.*, pedidos_pro.* from pedidos inner join pedido_pro on pedidos.codseg = pedidos_pro.codseg where pedido.codped = [ô][Ô] xcod [Ô][ô]; [Ô], conexao,...,...

ai quando eu vo resgatar os datos do recordset diz que o campo rst.repre nao existe

SAMUKA 26/10/2010 13:02:14
#355950
Não tem como. Tem q fazer 2 consultas.

Qto aos campos iguais em tabelas deferentes, é por isso q vc deve usar o nome da tabela + o PONTO + o nome do campo.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas