none
Ajuda com datagridview RRS feed

  • 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

    quarta-feira, 13 de março de 2013 04:28

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.Item

    Com 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 ;)


    quarta-feira, 13 de março de 2013 20:51

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 ?
    quarta-feira, 13 de março de 2013 13:24
  • Olá,

    Correto, apenas tem que ter o mesmo idProduto...e a outra pergunta também correto... :)


    goku

    quarta-feira, 13 de março de 2013 19:33
  • 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.Item

    Com 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 ;)


    quarta-feira, 13 de março de 2013 20:51
  • 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

    quarta-feira, 13 de março de 2013 23:07
  • Entendi
    Então você não acha melhor mudar a estrutura da sua tabela ?
    quinta-feira, 14 de março de 2013 11:30
  • 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

    sexta-feira, 15 de março de 2013 04:15