SELECT ENTRE DUAS TABELAS
Estou com o seguinte cenário em uma simulação de controle de estoque:
Na tabela [Ô]entradas[Ô] tenho os seguintes campos: IdProduto e QtdEntrada;
Na tabela [Ô]saidas[Ô] tenho os seguintes campos: IdProduto e QtdSaida;
Como construir uma query de consulta entre as duas tabelas onde o resultado seja a diferença entre as entradas e saÃdas do estoque, considerando cada produto individualmente e preenchendo um datagridview?
Private Sub CarregaEstoque()
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim sql As String = [Ô] [Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim dt As DataTable = New DataTable
da.Fill(dt)
MeuGrid.DataSource = dt
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Using
End Sub
Ex:
EstoqueES ( estoque entrada e saida )
campos
- IDProduto
- Qrd
Quando for entrada, vc grava a quantidade positiva, quando for saida, grava negativo
depois é só dar um SUM(Qtd)
Citação::
pq vc não coloca tudo numa mesma tabela ?
Ex:
EstoqueES ( estoque entrada e saida )
campos
- IDProduto
- Qrd
Quando for entrada, vc grava a quantidade positiva, quando for saida, grava negativo
depois é só dar um SUM(Qtd)
Pensei nessa possibilidade também, mas acredito que em duas tabelas seria a forma mais ideal, pois existe informações especificas que ocorrem nas entradas bem como nas saÃdas, então não queria sobrecarregar uma unica tabela com campos desnecessários.
Citação:Na tabela [Ô]entradas[Ô] tenho os seguintes campos: IdProduto e QtdEntrada;
Na tabela [Ô]saidas[Ô] tenho os seguintes campos: IdProduto e QtdSaida;
Como construir uma query de consulta entre as duas tabelas onde o resultado seja a diferença entre as entradas e saÃdas do estoque, considerando cada produto individualmente e preenchendo um datagridview?
Para isso, tem que existir mais uma entidade em comum, pois a partir dela você pode fazer uma query aninhada. Partindo do pressuposto que essas duas tabelas sejam filhas da tabela produtos cujos campos são idProduto e nomeProduto. A consulta ficaria assim
SELECT nomeProduto, (SELECT SUM(entradas.QtdEntrada) FROM entradas WHERE entradas.idProduto = produtos.idProduto) - (SELECT SUM(saidas.QtdSaida) FROM saidas WHERE saidas.idProduto = produtos.idProduto) AS diferenca FROM produtos
Té mais
Citação::
Na tabela [Ô]entradas[Ô] tenho os seguintes campos: IdProduto e QtdEntrada;
Na tabela [Ô]saidas[Ô] tenho os seguintes campos: IdProduto e QtdSaida;
Como construir uma query de consulta entre as duas tabelas onde o resultado seja a diferença entre as entradas e saÃdas do estoque, considerando cada produto individualmente e preenchendo um datagridview?
Para isso, tem que existir mais uma entidade em comum, pois a partir dela você pode fazer uma query aninhada. Partindo do pressuposto que essas duas tabelas sejam filhas da tabela produtos cujos campos são idProduto e nomeProduto. A consulta ficaria assimSELECT nomeProduto, (SELECT SUM(entradas.QtdEntrada) FROM entradas WHERE entradas.idProduto = produtos.idProduto) - (SELECT SUM(saidas.QtdSaida) FROM saidas WHERE saidas.idProduto = produtos.idProduto) AS diferenca FROM produtos
Té mais
Caro amigo ACCIOLL, isso mesmo, meu único problema agora é quando tenho entradas sem saÃdas correspondentes, com isso meu resultado vem nulo no produto correspondente.
Alguma detalhe que eu tenha esquecido?
Relações:
Tabela produtos:
Tabela entradas:
Tabela saÃdas:
Meu código:
Private Sub CarregaEstoque()
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim sql As String = [Ô]SELECT Descricao, (SELECT SUM(Entradas.QtdEntrada) FROM Entradas WHERE Entradas.IdProduto = Produtos.IdProduto) - (SELECT SUM(Saidas.QtdSaida) FROM Saidas WHERE Saidas.IdProduto = Produtos.IdProduto) AS Diferenca FROM Produtos[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim dt As DataTable = New DataTable
da.Fill(dt)
DataGridView1.DataSource = dt
Catch ex As Exception
MsgBox(ex.Message)
End Try
con.Close()
End Using
End Sub
Resultado:
Como não houve nenhuma saÃda do produto 2 o resultado deve ser igual a 30.
A minha logica/estrutura esta correta?
Citação::
Não que o campo seja nulo mas o resultado obtido sim. Vou dar uma revisada nessa questão quando chegar em casa. Enquanto isso, fica em aberto pra quem já tiver a resolução desse problema.
Valeu meu amigo, aguardarei...
Tentei de varias formas, encontrei alguns exemplos com o uso de [Ô]IIF IS NULL[Ô] mas sem sucesso, porem não apresenta erro de sintaxe
Private Sub CarregaEstoque()
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim sql As String = [Ô]SELECT Descricao, (SELECT SUM(Entradas.QtdEntrada) FROM Entradas WHERE Entradas.IdProduto = Produtos.IdProduto) - [Ô] & _
[Ô](SELECT IIF(SUM(Saidas.QtdSaida) IS NULL, 0) FROM Saidas WHERE Saidas.IdProduto = Produtos.IdProduto) AS Diferenca FROM Produtos[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim dt As DataTable = New DataTable
da.Fill(dt)
DataGridView1.DataSource = dt
Catch ex As Exception
MsgBox(ex.Message)
End Try
con.Close()
End Using
End Sub