CONSULTA SQL COM 2 TABELAS
Amigos, boa tarde!
Tenho as seguintes tabelas
vendas
produtos
clientes
Gostaria de colocar em um frm dois listview; 1 com a lista de cliente e quando clicado, abrisse os dados de compra deste cliente na outra listview.
Entretanto, preciso que para os produtos que não vendeu retorne null ou 0. Ou seja, todos os produtos cadastrados, seja com vendas ou não.
A base de dados tem informação de mais de 10 anos, mas as vendas serão somente do ano corrente.
No código está me retornando somente os produtos com vendas realizadas.
veja o código:
Public Sub abre_produto()
Dim scnn As String
Dim newlist As ListItem
Dim nitens As Integer
Dim nomee As String
lista2.ListItems.Clear
nomee = [Ô]NOME[Ô]
mycon.Open [Ô]dsn=asgard_salles[Ô]
With mycmd
.ActiveConnection = mycon
.CommandType = adCmdText
If frminicial.txtemp = [Ô]170[Ô] Then
.CommandText = [Ô]select estoque.codigo, estoque.descricao, vendas.codigo_produto, sum(vendasquantidade) as quantidade, vendas.cliente, vendas.linha, vendas.data from estoque left join vendas on estoque.codigo = vendas.codigo_produto where vendas.cliente = [ô][Ô] & Me.txtcliente & [Ô][ô] and year(vendas.data) = [ô][Ô] & dataa & [Ô][ô] group by estoque.codigo, vendas.descricao, vendas.linha, vendas.cliente ORDER BY ESTOQUE.DESCRICAO[Ô]
Set myrs = .Execute
ElseIf frminicial.txtemp = [Ô]190[Ô] Then
.CommandText = [Ô]select estoque.codigo, estoque.descricao, vendas190.codigo_produto, sum(vendas190.quantidade) as quantidade, vendas190.cliente, vendas190.linha from estoque LEFT join vendas190 on estoque.codigo = vendas190.codigo_produto where vendas190.cliente = [ô][Ô] & Me.txtcliente & [Ô][ô] and year(vendas190.data) = [ô][Ô] & dataa & [Ô][ô] group by estoque.codigo, estoque.descricao, vendas190.codigo_produto, vendas190.cliente, vendas190.linha ORDER BY ESTOQUE.DESCRICAO[Ô]
Set myrs = .Execute
End If
End With
[ô] On Error Resume Next
Do Until myrs.EOF
Set newlist = lista2.ListItems.Add(, [Ô] Key [Ô] & myrs([Ô]CODIGO_PRODUTO[Ô]), myrs([Ô]CODIGO_PRODUTO[Ô]))
newlist.SubItems(1) = [Ô][Ô] & myrs([Ô]codigo[Ô])
newlist.SubItems(2) = [Ô][Ô] & myrs([Ô]descricao[Ô])
newlist.SubItems(3) = [Ô][Ô] & myrs([Ô]quantidade[Ô])
myrs.MoveNext
Loop
myrs.Close
Set myrs = Nothing
mycon.Close
End Sub
Desde já agradeço.
Tenho as seguintes tabelas
vendas
produtos
clientes
Gostaria de colocar em um frm dois listview; 1 com a lista de cliente e quando clicado, abrisse os dados de compra deste cliente na outra listview.
Entretanto, preciso que para os produtos que não vendeu retorne null ou 0. Ou seja, todos os produtos cadastrados, seja com vendas ou não.
A base de dados tem informação de mais de 10 anos, mas as vendas serão somente do ano corrente.
No código está me retornando somente os produtos com vendas realizadas.
veja o código:
Public Sub abre_produto()
Dim scnn As String
Dim newlist As ListItem
Dim nitens As Integer
Dim nomee As String
lista2.ListItems.Clear
nomee = [Ô]NOME[Ô]
mycon.Open [Ô]dsn=asgard_salles[Ô]
With mycmd
.ActiveConnection = mycon
.CommandType = adCmdText
If frminicial.txtemp = [Ô]170[Ô] Then
.CommandText = [Ô]select estoque.codigo, estoque.descricao, vendas.codigo_produto, sum(vendasquantidade) as quantidade, vendas.cliente, vendas.linha, vendas.data from estoque left join vendas on estoque.codigo = vendas.codigo_produto where vendas.cliente = [ô][Ô] & Me.txtcliente & [Ô][ô] and year(vendas.data) = [ô][Ô] & dataa & [Ô][ô] group by estoque.codigo, vendas.descricao, vendas.linha, vendas.cliente ORDER BY ESTOQUE.DESCRICAO[Ô]
Set myrs = .Execute
ElseIf frminicial.txtemp = [Ô]190[Ô] Then
.CommandText = [Ô]select estoque.codigo, estoque.descricao, vendas190.codigo_produto, sum(vendas190.quantidade) as quantidade, vendas190.cliente, vendas190.linha from estoque LEFT join vendas190 on estoque.codigo = vendas190.codigo_produto where vendas190.cliente = [ô][Ô] & Me.txtcliente & [Ô][ô] and year(vendas190.data) = [ô][Ô] & dataa & [Ô][ô] group by estoque.codigo, estoque.descricao, vendas190.codigo_produto, vendas190.cliente, vendas190.linha ORDER BY ESTOQUE.DESCRICAO[Ô]
Set myrs = .Execute
End If
End With
[ô] On Error Resume Next
Do Until myrs.EOF
Set newlist = lista2.ListItems.Add(, [Ô] Key [Ô] & myrs([Ô]CODIGO_PRODUTO[Ô]), myrs([Ô]CODIGO_PRODUTO[Ô]))
newlist.SubItems(1) = [Ô][Ô] & myrs([Ô]codigo[Ô])
newlist.SubItems(2) = [Ô][Ô] & myrs([Ô]descricao[Ô])
newlist.SubItems(3) = [Ô][Ô] & myrs([Ô]quantidade[Ô])
myrs.MoveNext
Loop
myrs.Close
Set myrs = Nothing
mycon.Close
End Sub
Desde já agradeço.
Estranho, pois vc está usando LEFT JOIN. A princÃpio está certo. Teria como vc subir o BD com as tabelas reduzidas (evidentemente) que permitam a simulação do resultado esperado por vc, para podermos testar o seu código?
Amigo, boa tarde!
Desculpe-me a resposta tardia (estou fechando a minha conclusão de perÃodo).
Tendo em vista as diversas variáveis que rodeiam o relatório que tenho que fazer, segue os dados que exporto para o PDV via FTP.
Preciso das informações na horizontal:
Cliente cidade batata tomate abacate banana total
Ricardo Nantes Belo Horizonte 200 100 0 100 R$ 100,00
Jóse das couves Belo Horizonte 0 500 2 20 R$ 250,00
TOTAIS 200 600 2 120 R$ 350,00
Média R$ 10,00 5,00 1,00 7,00
Ou seja, os dados devem ser apresentado desta maneira, com filtro por vendedor e por grupo de produtos
Tenho diversas tabelas;
produtos: CODIGO ;DESCRICAO ;SALDO ;
vendas: LINHA ;CODIGO ;DESCRICAO ;EMBALAGEM ;QUANTIDADE;VALOR TOTAL ;CLIENTE ;DATA ;VENDEDOR ;
clientes: CODIGO ;NOME ;ENDERECO ;BAIRRO ;CIDADE ;UF;CEP ;FONE ;ROTA ;
que podem ser usadas para a criação do relatório acima apresentado. ( a visualização pode ser para impressão ou na tela).
Aceito qualquer sugestão.
Att
Ricardo Nantes
Desculpe-me a resposta tardia (estou fechando a minha conclusão de perÃodo).
Tendo em vista as diversas variáveis que rodeiam o relatório que tenho que fazer, segue os dados que exporto para o PDV via FTP.
Preciso das informações na horizontal:
Cliente cidade batata tomate abacate banana total
Ricardo Nantes Belo Horizonte 200 100 0 100 R$ 100,00
Jóse das couves Belo Horizonte 0 500 2 20 R$ 250,00
TOTAIS 200 600 2 120 R$ 350,00
Média R$ 10,00 5,00 1,00 7,00
Ou seja, os dados devem ser apresentado desta maneira, com filtro por vendedor e por grupo de produtos
Tenho diversas tabelas;
produtos: CODIGO ;DESCRICAO ;SALDO ;
vendas: LINHA ;CODIGO ;DESCRICAO ;EMBALAGEM ;QUANTIDADE;VALOR TOTAL ;CLIENTE ;DATA ;VENDEDOR ;
clientes: CODIGO ;NOME ;ENDERECO ;BAIRRO ;CIDADE ;UF;CEP ;FONE ;ROTA ;
que podem ser usadas para a criação do relatório acima apresentado. ( a visualização pode ser para impressão ou na tela).
Aceito qualquer sugestão.
Att
Ricardo Nantes
Amigos,
Estou fazendo uma [Ô]gambiarra[Ô] para resolver o problema de imediato até que consiga colocar os dados conforme descrito acima.
Fiz uma planilha no excel e utilizei todas as formulas necessárias para obter o relatório. entretanto, estou com dificuldade em criar um array para que os dados sejam colocados em cada linha da planilha.
Tipo
linha 1 =
linha 2 =
conforme alocação na tabela.
Segue o código:
Private Sub Excel()
Dim Plan As Object [ô]Aplicação Excel
[ô]extraÃdo do vbmania
[ô]acesso em 18/11/2011
[ô]INSTANCIA OBJETO EXCEL NA MEMÓRIA
[ô]**********************************************************************
Set Plan = CreateObject([Ô]excel.application[Ô])
[ô]CHAMA EXCEL / IMPRIME
[ô]**********************************************************************
Plan.Workbooks.Open App.Path & [Ô]\excelptvendascliente006.xlsx[Ô]
Plan.Visible = True
Plan.UserControl = False
[ô]PREENCHE CéLULAS DESEJADAS
[ô]**********************************************************************
[ô]On Error GoTo errlocalizacao
Dim rs As New ADODB.Recordset
Dim mycon1 As New ADODB.Connection
mycon1.Open [Ô]dsn=asgard[Ô]
[ô] [Ô]where supervisor = [ô][Ô] & frminicial.StatusBar1.Panels(2).Text & [Ô][ô][Ô]
Dim sSQL As String
sSQL = [Ô]Select linha, [Ô] & _
[Ô]codigo_produto, [Ô] & _
[Ô]descricao, [Ô] & _
[Ô]embalagem, [Ô] & _
[Ô]quantidade, [Ô] & _
[Ô]valor_total, [Ô] & _
[Ô]cliente, [Ô] & _
[Ô]data, [Ô] & _
[Ô]vendedor [Ô] & _
[Ô]from vendas190 [Ô] & _
[Ô]where vendedor = [Ô] & Val(frminicial.StatusBar1.Panels(2)) & [Ô][Ô]
rs.CursorLocation = adUseClient
rs.Open sSQL, mycon1, adOpenKeyset, adLockOptimistic, adCmdText
rs.ActiveConnection = Nothing
Do While Not rs.EOF
With Plan
[ô] aqui entraria o array para mudar para .range([Ô]a3[Ô])...
.range([Ô]A2[Ô]).Value = rs!linha
.range([Ô]B2[Ô]).Value = (Val(rs!CODIGO_PRODUTO))
.range([Ô]c2[Ô]).Value = rs!descricao
.range([Ô]d2[Ô]).Value = rs!embalagem
.range([Ô]e2[Ô]).Value = rs!quantidade
.range([Ô]f2[Ô]).Value = rs!valor_total
.range([Ô]g2[Ô]).Value = rs!cliente
.range([Ô]h2[Ô]).Value = rs!data
.range([Ô]i2[Ô]).Value = rs!vendedor
End With
rs.MoveNext
Loop
[ô]FECHA REFERÊNCIA AOS OBJETOS
[ô]**********************************************************************
Set Plan = Nothing
saida:
Set rs = Nothing
Set mycmd = Nothing
mycon1.Close
Exit Sub
errlocalizacao:
With Err
If .Number <> 0 Then
MsgBox [Ô]Houve um erro ao gerar os dados do relatório. Favor verificar com o administrativo.[Ô], vbInformation, [Ô]Objetivo[Ô]
.Number = 0
GoTo saida
End If
End With
End Sub
Private Sub Command1_Click()
Call Excel
End Sub
Caso tenham um sugestão.
Att
Estou fazendo uma [Ô]gambiarra[Ô] para resolver o problema de imediato até que consiga colocar os dados conforme descrito acima.
Fiz uma planilha no excel e utilizei todas as formulas necessárias para obter o relatório. entretanto, estou com dificuldade em criar um array para que os dados sejam colocados em cada linha da planilha.
Tipo
linha 1 =
linha 2 =
conforme alocação na tabela.
Segue o código:
Private Sub Excel()
Dim Plan As Object [ô]Aplicação Excel
[ô]extraÃdo do vbmania
[ô]acesso em 18/11/2011
[ô]INSTANCIA OBJETO EXCEL NA MEMÓRIA
[ô]**********************************************************************
Set Plan = CreateObject([Ô]excel.application[Ô])
[ô]CHAMA EXCEL / IMPRIME
[ô]**********************************************************************
Plan.Workbooks.Open App.Path & [Ô]\excelptvendascliente006.xlsx[Ô]
Plan.Visible = True
Plan.UserControl = False
[ô]PREENCHE CéLULAS DESEJADAS
[ô]**********************************************************************
[ô]On Error GoTo errlocalizacao
Dim rs As New ADODB.Recordset
Dim mycon1 As New ADODB.Connection
mycon1.Open [Ô]dsn=asgard[Ô]
[ô] [Ô]where supervisor = [ô][Ô] & frminicial.StatusBar1.Panels(2).Text & [Ô][ô][Ô]
Dim sSQL As String
sSQL = [Ô]Select linha, [Ô] & _
[Ô]codigo_produto, [Ô] & _
[Ô]descricao, [Ô] & _
[Ô]embalagem, [Ô] & _
[Ô]quantidade, [Ô] & _
[Ô]valor_total, [Ô] & _
[Ô]cliente, [Ô] & _
[Ô]data, [Ô] & _
[Ô]vendedor [Ô] & _
[Ô]from vendas190 [Ô] & _
[Ô]where vendedor = [Ô] & Val(frminicial.StatusBar1.Panels(2)) & [Ô][Ô]
rs.CursorLocation = adUseClient
rs.Open sSQL, mycon1, adOpenKeyset, adLockOptimistic, adCmdText
rs.ActiveConnection = Nothing
Do While Not rs.EOF
With Plan
[ô] aqui entraria o array para mudar para .range([Ô]a3[Ô])...
.range([Ô]A2[Ô]).Value = rs!linha
.range([Ô]B2[Ô]).Value = (Val(rs!CODIGO_PRODUTO))
.range([Ô]c2[Ô]).Value = rs!descricao
.range([Ô]d2[Ô]).Value = rs!embalagem
.range([Ô]e2[Ô]).Value = rs!quantidade
.range([Ô]f2[Ô]).Value = rs!valor_total
.range([Ô]g2[Ô]).Value = rs!cliente
.range([Ô]h2[Ô]).Value = rs!data
.range([Ô]i2[Ô]).Value = rs!vendedor
End With
rs.MoveNext
Loop
[ô]FECHA REFERÊNCIA AOS OBJETOS
[ô]**********************************************************************
Set Plan = Nothing
saida:
Set rs = Nothing
Set mycmd = Nothing
mycon1.Close
Exit Sub
errlocalizacao:
With Err
If .Number <> 0 Then
MsgBox [Ô]Houve um erro ao gerar os dados do relatório. Favor verificar com o administrativo.[Ô], vbInformation, [Ô]Objetivo[Ô]
.Number = 0
GoTo saida
End If
End With
End Sub
Private Sub Command1_Click()
Call Excel
End Sub
Caso tenham um sugestão.
Att
Tópico encerrado , respostas não são mais permitidas