SELECT ENTRE DUAS TABELAS

W8.LISBOA 31/03/2016 23:13:54
#460224
Olá pessoal,

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
CLEVERTON 31/03/2016 23:18:31
#460225
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)
W8.LISBOA 31/03/2016 23:26:09
#460227
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.
ACCIOLLY 01/04/2016 09:08:01
#460247
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
W8.LISBOA 02/04/2016 19:23:49
#460333
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




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?
W8.LISBOA 03/04/2016 11:11:25
#460351
Acredito não ter me expressado corretamente na ultima resposta, vou tentar detalhar melhor a situação:

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?


ACCIOLLY 03/04/2016 11:51:30
#460352
Resposta escolhida
Não me lembro muito bem, mas voce pode colocar estrutura de decisão no SQL. Tipo uma clausula if isnull. Ou seja se for nulo recebe 0
W8.LISBOA 03/04/2016 15:29:40
#460356
Fiz varias tentativas usando (Is Null(campo),0) mas sem sucesso, acredito que minha logica acima esta incorreta pois uso como critério de seleção a ID do produto, e como não existe nenhuma saída referida ao produto 2, então na verdade o campo não é nulo.
W8.LISBOA 04/04/2016 18:51:01
#460423
UP
ACCIOLLY 04/04/2016 22:42:33
#460430
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.
W8.LISBOA 05/04/2016 06:20:23
#460436
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
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas