Usuário com melhor resposta
Ajuda com datagridview

Pergunta
-
Olá pessoal !
Até hoje só trabalhei com o executenonquery, mas creio que para o quê pretendo ele não serve.
Tenho duas tabelas, sendo a tabela 1 uma "lista de desejos" e a tabela 2 uma "lista de fornecedores". Como exemplo, temos:
Tabela 1
idProduto Item
1 Item A1
1 Item B1
2 Null
Bom, a partir desta tabela, quero pesquisar os campos idProduto e Item da tabela 1 na tabela 2, sendo que quando o campo Item da Tabela1 for nulo, deve-se retornar os itens referentes ao idProduto da tabela2. Como exemplo de tabela 2:
Tabela 2
idProduto Item Preco idFornecedor
1 Item A1 10,00 1
1 Item B1 20,00 1
1 Item C1 30,00 1
1 Item A1 20,00 2
1 Item B1 30,00 3
2 Item A2 40,00 1
2 Item A2 50,00 1
Bom, gostaria de comparar os valores da coluna Preco e Fornecedores, de forma a apresentar os Itens com menores preços nos diferentes fornecedores, a partir dos dados da tabela 1, assim como uma totalização dos itens encontrados, apresentados pelo idFornecedor. Para os itens encontrados a partir da tabela 2, teria os seguintes resultados:
idProduto Item Preco idFornecedor
1 Item A1 10,00 1
1 Item A1 20,00 2
1 Item B1 20,00 1
1 Item B1 30,00 3
2 Item A2 40,00 1
Eu estava pensando em apresentar os dados numa datagridview, porém tem um problema, pois além do número de fornecedores poder aumentar, não sei como gera-los dinamicamente, a partir do idFornecedor. Quando comecei, pensei no caso simples de um fornecedor, e tava usando a query abaixo :
SELECT a.idProduto, a.Item, a.preco From Tabela2 a join Tabela1 b on (a.idProduto = b.idProduto AND a.Item = b.Item ) Union SELECT a.idProduto, a.Item, MIN(a.Preco) as Preco From Tabela2 a join Tabela1 b on a.idProduto = b.idProduto AND b.Item = '' group by a.idProduto, a.Item
A partir desta seleção, apresentaria em uma datagridview. Porém, não tem como apresentar o idFornecedor da tabela 2, pois este campo não consta da tabela1, e não teria como fazer comparações entre diferentes datagridviews, para cada fornecedor.
Para resumir, a lógica então seria:
1) Veja os dados correspondentes da Tabela1 na Tabela2, e com os menores preços;
2) Veja o total da "lista de desejos" da tabela 1 por fornecedor;
3) Veja os Itens mais baratos entre os fornecedores, tais como na tabela abaixo, e com os dados acima:
idProduto Item Preco Fornecedor
1 Item A1 10,00 1
1 Item B1 20,00 1
2 Item A2 40,00 1
Desculpe pelo longo Post, e qualquer ajuda agradeço!
goku
Respostas
-
Beleza
Então vamos lá estou imaginando que sua regra de négocio está na aplicação.
Você deverá fazer o seguinte com os select's
SELECT b.Item,MIN(b.preco) as Preco
From Tabela2 a
join Tabela1 b on
(a.idProduto = b.idProduto AND a.Item is Null )
group by b.Item, b.preco
UNION
SELECT a.idProduto, a.Item, MIN(a.Preco) as Preco
From Tabela2 a
join Tabela1 b
on a.idProduto = b.idProduto AND b.Item NOT NULL
group by a.idProduto, a.ItemCom os select você terá o menor preço da tabela2 dos registros que vieram vazios na tabela1
No 2° select você terá os registro com o menor preço que também consta na tabela1.
Infelizmente não estou com o sql instalado então talvez possa ter escrito uma sintaxe errada, e também se sua dúvida for só essa você deverá postar no forum de SQL.
Mas erá essa sua dúvida ? Vê se funciona qualquer coisa você me avisa Brother ;)
- Marcado como Resposta Levi DomingosModerator domingo, 17 de março de 2013 12:28
Todas as Respostas
-
songoku99 post grande é melhor pq fica bem explicado.
Mas deixa ver se eu entendei, se o campo da tabela 1 for nulo você quer trazer as informações do campo dois correto ?
Depois você que realizar uma pesquisa buscando o menos valor da tabela 2 certo ? -
-
Beleza
Então vamos lá estou imaginando que sua regra de négocio está na aplicação.
Você deverá fazer o seguinte com os select's
SELECT b.Item,MIN(b.preco) as Preco
From Tabela2 a
join Tabela1 b on
(a.idProduto = b.idProduto AND a.Item is Null )
group by b.Item, b.preco
UNION
SELECT a.idProduto, a.Item, MIN(a.Preco) as Preco
From Tabela2 a
join Tabela1 b
on a.idProduto = b.idProduto AND b.Item NOT NULL
group by a.idProduto, a.ItemCom os select você terá o menor preço da tabela2 dos registros que vieram vazios na tabela1
No 2° select você terá os registro com o menor preço que também consta na tabela1.
Infelizmente não estou com o sql instalado então talvez possa ter escrito uma sintaxe errada, e também se sua dúvida for só essa você deverá postar no forum de SQL.
Mas erá essa sua dúvida ? Vê se funciona qualquer coisa você me avisa Brother ;)
- Marcado como Resposta Levi DomingosModerator domingo, 17 de março de 2013 12:28
-
Obrigado Ninho!
A sua query funcionou, com as alterações abaixo:
SELECT b.idProduto, b.Item, MIN(b.preco) as Preco From Tabela2 a join Tabela1 b on (a.idProduto = b.idProduto AND a.Item = b.item ) group by b.Item, b.preco, b.idProduto UNION SELECT a.idProduto, a.Item, MIN(a.Preco) as Preco From Tabela2 a join Tabela1 b on a.idProduto = b.idProduto AND b.Item = '' group by a.idProduto, a.Item
A sua query é interessante para resolver parte da minha "lógica 3", pois eu teria os menores preços em cada fornecedor. Porém, um dos objetivos é também apresentar ou comparar os dados, ai o problema é que quero apresentar a soma total por fornecedor, assim como a soma total desta query com preços minimos, porém tenho que indicar o idFornecedor.
Para o caso de um fornecedor, e com os dados já com os menores preços, eu usaria, por exemplo:
Dim valor As Double For Each col As DataGridViewRow In dgItensPesquisado.Rows valor = valor + col.Cells(2).Value Next lblsoma.Text = valor
goku
-
-
Sim, poderia ...deste modo, eu apresentaria a coluna idFornecedores :)
Mas como poderia calcular o numero de idFornecedores, e apresentar os dados com este numero. Seria algo como:
For each linha como datagridviewrow in meudatagrid.rows
For each celula como datagridviewcell in meudadagrid.rows(linha.index).cells
If celula.columnindex = 3 then
i = celula.value
end if
next
next
ai então poderia usar ?
me.datagrid&i& = new System.Windows.Forms.Datagrid ?????
goku