none
Produtos descontinuados na tela de pedido RRS feed

  • Pergunta

  • Bom dia.

    Estou criando um aplicativo com a seguinte estrutura:

    Tabelas:
    • Produtos
    • Pedidos
    • PedidoItens

    Cada PedidoItens está relacionado a um produto
    O produto pode ser descontinuado


    No meu formulário de pedido tenho informações do pedido e um DataGridView com a lista de itens do pedido.
    Neste grid tenho Produto propriamente dito, quantidade e valor.
    Neste formulário tenho um BindSource com o pedido, outro com os ítens do pedido e outro com os produtos.

    No meu grid de ítens do pedido a coluna produto é um combo com bind para o BindSource de produtos,
    o grid está com bind para o BindSource de itens de pedido.

    O problema é que quando carrego o BindSource de produtos, carrego apenas com os produtos que estão ativos, 
    ou seja, que não foram descontinuados.
    Porém se o usuário abrir um pedido que tenha algum produto descontinuado a seguinte exeption é lançada:

    The following exception occorred in the DataGridView:
    System.ArgumentException: DataGridViewComboBoxCell value is not valid.
    To replace this default dialog please handle the DataError event.

    Isso porque não carrego produtos descontinuados no BindSource de produtos e consequentimente o grid não consegue carregar o nome do produto.
    Ai vem a pergunta, como vocês resolvem este caso?

    Obrigado a todos!

    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    quarta-feira, 15 de dezembro de 2010 11:51

Respostas

  • Você esta conectando os seus clientes diretamente ao banco de dados né ?

    Eu normalmente resolvo o problema de performance usando webservices com cache.... como eu atualizo os caches do IIS somente quando é executado um metodo de manipulação de dados e faço os retorno dos metodos de consulta do cache... buscando no banco de dados somente se o cache tiver expirado ( em media mantenho os dados em cache por 8 horas). Isso da um ganho enorme de performance e mantem integridade de dados.

    Bem mas esse não é o assunto aqui...

    Agora, dificilmente voce vai conseguir escapar do fato que quando for manipulação de dados em uma linha vc tera que carregar os produtos somente ativos, e no final da operação carregar novamente todos os produtos. o que pode ser feito pensando agora.... é manter 2 controls na cell, um com o combobox com os produtos ativos... e uma label para vc colocar o nome do produto (ativo ou nao) do pedido, ja que não é necessario um combobox apenas para visualização da informação...

    e depois eh so ir alternando o "visible' deles conforme o estado do seu formulário... se tiver alterando ou incluído.. o combo fica visivel e o label não... nos outros casos faz-se o contrario....

    Não é uma tarefa muito agradável de se fazer em WindowsForms... mas não é também algo extremamente complexo... 


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    domingo, 19 de dezembro de 2010 00:43
    Moderador

Todas as Respostas

  • Prezado(a),

    Estou migrando seu post para o fórum de Windows Forms.

    Por favor, das próximas vezes que tiver alguma dúvida relacionada a esse assunto, poste por lá.

    Obrigado.


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quarta-feira, 15 de dezembro de 2010 21:46
    Moderador
  • Ola Riderman,

       Como voce define um produto como descontinuado... eh atraves de algum flag na tabela ?

       Como vc esta fazendo o acesso aos dados  ? (DataReader, TableAdapter, Linq to Sql, EntityFramework)

       Poderia mostrar a consulta que vc realiza na hora que vc carrega os produtos do pedidos para analizarmos ?

     

     


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    quarta-feira, 15 de dezembro de 2010 23:00
    Moderador
  • Ola Rui.

     

    Na tabela existe um campo bit que indica se ele está descontinuado.

    Acesso via ADO Entity Framework, com VS2008 .net framework 3.5

     

    Obrigado.


    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    quarta-feira, 15 de dezembro de 2010 23:52
  • Boa tarde a todos!

    Tenho a seguinte estrutura:

    Tabelas

     

    • Pedidos
    • Ítens do pedido
    • Produtos
    Cada item do pedido tem associação com um produto
    Um pedido pode ter vários ítens de pedido.

    Meu ambiente é:
    • VS 2008 SP1
    • SQL Server 2008 R2
    Quando crio o EDMX no meu visual studio, importo as tabelas pedido, itensPedido e produtos.
    Ele automaticamente cria as navigationproperties. Uso Database-first.
    No VS2008 não tem o checkbox para incluir a chave estrangeira da tabela, ou seja, só posso trabalhar com as navigation properties

    Tenho uma tela de pedido que possui as informações do pedido e um DataGridView com os ítens de pedido
    No meu DataGridView tenho uma coluna que é um combobox de podutos onde o usuário irá selecionar o produto, informar quantidade, preço unitário etc..

    O problema aparece exatamente ai. Na configuração do meu ComboBox de produtos no DataGridView tenho a opção de bind para um BindSource, e configuro as colunas DisplayMember, ValueMember. O problema é que ValueMember é um tipo primitivo e não me permite dar um bind diretamente na navigationproperty

    Como posso ligar um ComboBox para que o valueMember seja o produto da tabela ítensPedido.

    Agradeço a todos!

    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    quinta-feira, 16 de dezembro de 2010 00:01
  • Vc vai ter que criar outro bindsource com todos os produtos para carregar a lista de pedidos....


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    quinta-feira, 16 de dezembro de 2010 14:33
    Moderador
  • Blz, isso eu já estou fazendo.

     

    O problema é, quais produtos vou carregar neste bindsource?

     

    Se carregar apenas os ativos, quando abrir um pedido que tenha um produto que tenha sido desativado o mesmo retornará um erro.

    Se carregar todos, na hora de criar um novo pedido na grid de itens do pedido o usuário terá a opção de selecionar produtos que estão descontinuados.

    Como resolver esta situação?


    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    quinta-feira, 16 de dezembro de 2010 22:09
  • Bem se entendi direito vc inclui um produto novo diretamente na grid .... particulamente eu evito fazer esse tipo de coisa... alem de dar muito mais trabalho para controlar não é algo natural para o usuario...

    vc pode abrir uma janela popup, ou ir para uma pagina para inclusão de produtos... ou mesmo colocar os campos de inclusão acima da grid...  (fiz um post sobre algo parecido hoje - veja: http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/8058a67b-eac6-4e15-b345-fab0b26d03da) fica mais facil de controlar dessa forma..

    Mas se não tem como vc pode usar um column template... sendo q no template de inclusão vc usa um dropdown com o bindsource apenas dos ativos e no itemtemplate vc troca pelo dropdows (ou por um label ja que é somente-leitura) carregando do bindsource que vem com todos os dados...


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    sexta-feira, 17 de dezembro de 2010 00:32
    Moderador
  • Rui meu sistema é Windows Forms.

    Gostaria mesmo é de editar no próprio grid, o problema está sendo na hora de carregar a lista de produtos no BindSource que se carrego os ativos, da erro na hora de editar um pedido que tenha itens com produtos descontinuados. Se carrego todos na hora de criar um novo pedido vai aparecer produtos descontinuados para o usuário selecionar.

    Mesmo assim obrigado pela resposta!

    Se tiver alguma outra idéia, estou até hoje pensandoa a solução.


    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    sexta-feira, 17 de dezembro de 2010 22:02
  • Ah... num sei daonde tirei q era asp.net... foi mal... ignora tudo acima....

    são muitos produtos ??? tipo 5000 ou mais ? vc tem que consulta o tempo todo a lista de proudtos ... tem muita alteração... ou pode deixar em "cache" no cliente...

    dependendo de como for vc pode tentar algo mais ou menos assim... tem que testar a performance pra ver se eh viavel

        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) {
          if (e.ColumnIndex == 0) {
            var cell = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];
            // Se modo de inclusao
            cell.DataSource = produtosAtivosSource;
            // else 
            cell.DataSource = todosProdutosSource;
          }
        }
    


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    sexta-feira, 17 de dezembro de 2010 22:48
    Moderador
  • Bom, até já tinha pensado nisto mas ai temos um problema no modo edição;

    Se o usuário for editar um pedido e for adicionar um novo produto a este pedido, o mesmo irá listar todos os produtos.

    Assim existe a possibilidade de que este novo produto tenha sido descontinuado.

    Posso por exemplo na hora de adicionar o produto o sistema verificar se o produto está descontinuado porém o sistema não irá trabalhar de uma melhor forma.

    Outro ponto é que a medida que for crescendo o número de produtos isso poderá gerar um problema. Vamos imaginar que a empresa tenha 1000 produtos porém destes 1000, 700 são descontinuados, isso irá acarretar uma perda de performance para o sistema e perda de produtividade para o vendedor na hora de selecionar o produto.


    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    sábado, 18 de dezembro de 2010 16:20
  • Você esta conectando os seus clientes diretamente ao banco de dados né ?

    Eu normalmente resolvo o problema de performance usando webservices com cache.... como eu atualizo os caches do IIS somente quando é executado um metodo de manipulação de dados e faço os retorno dos metodos de consulta do cache... buscando no banco de dados somente se o cache tiver expirado ( em media mantenho os dados em cache por 8 horas). Isso da um ganho enorme de performance e mantem integridade de dados.

    Bem mas esse não é o assunto aqui...

    Agora, dificilmente voce vai conseguir escapar do fato que quando for manipulação de dados em uma linha vc tera que carregar os produtos somente ativos, e no final da operação carregar novamente todos os produtos. o que pode ser feito pensando agora.... é manter 2 controls na cell, um com o combobox com os produtos ativos... e uma label para vc colocar o nome do produto (ativo ou nao) do pedido, ja que não é necessario um combobox apenas para visualização da informação...

    e depois eh so ir alternando o "visible' deles conforme o estado do seu formulário... se tiver alterando ou incluído.. o combo fica visivel e o label não... nos outros casos faz-se o contrario....

    Não é uma tarefa muito agradável de se fazer em WindowsForms... mas não é também algo extremamente complexo... 


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    domingo, 19 de dezembro de 2010 00:43
    Moderador
  • Acho que terei de fazer isto mesmo.

    Este sistema é apenas um sistema de apresentação do ADO Entity para minha empresa, não é nada comercial por isso tentei não fazer nada complexo.

    Quanto ao WebService, normalmente quando trabalho com WebService também uso cache, mas o tempo depende do que o método faz. Se a(s) tabela(s) que o WebMethod acessa tem muitas auterações então coloco o tempo de cache menor, mas como você disse não é assunto agora rs.

    Obrigado pela ajuda!


    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    domingo, 19 de dezembro de 2010 12:19
  • Ah.... então pq vc ja aproveita e faz ele em WPF ???? é muito mais facilmanipulação de DataBindings e a customização de DataGrids nele... ?
    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    domingo, 19 de dezembro de 2010 15:31
    Moderador
  • Ai o pessoal vai ficar doido quando ver XAML e as novidades no WPF.

    Trabalho em uma empresa pequena onde o pessoal não conhece Linq, lambda, ou até mesmo Extension Methods.
    A camada de acesso a dados é uma classe chamda DAL, que é copiada para outros projetos, estou querendo melhorar isto.

    Minha idéia era trabalhar com POCO mas o vs 2010 não está disponível para nós no momento. Quem sabe mais a frente.


    Riderman Analista de desenvolvimento Sênior | MCTS, MCP http://ridermansb.spaces.live.com/
    domingo, 19 de dezembro de 2010 17:38
  • Ah... sei como é... ja passei por empresas assim...

    Olha eu trabalhei com POCO no VS2008... mas usando o Linq To SQL... me ajudo muito a me acostumar com ele ate eu começar a usar o Entity Framework no 2010...

     


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    domingo, 19 de dezembro de 2010 20:31
    Moderador