CONSULTA DINMICA COM LINQ

 Tópico anterior Próximo tópico Novo tópico

CONSULTA DINMICA COM LINQ

C#

 Compartilhe  Compartilhe  Compartilhe
#483711 - 07/08/2018 09:05:08

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Bom dia a todos.
Estou querendo fazer uma tela de consulta dinmica no estoque dos produtos, onde o usurio escolhe os filtros que quer utilizar.
Essa a tela

O usurio escolhe Mostrar Movimentao. Se ele quiser listar a movimentao de todos os produtos s clicar no boto Processar. Se ele quiser filtrar a movimentao de apenas um produto, ele digita o cdigo do produto e clica no boto Processar.
A query que realiza essa consulta essa:

var filtro = from est in db.Estoque
join prod in db.Produto on est.ProdutoId equals prod.Id
join tipo in db.TipoOperacao on est.SiglaTipoOperacao equals tipo.Sigla
select new
{
    data = est.Data,
    codigoproduto = est.CodigoProduto,
    produto = prod.Descricao,
    quantidade = est.Quantidade,
    sigla = tipo.Sigla,
    tipooperacao = tipo.Descricao,
};


Estou pegando a movimentao na tabela Estoque e dando um Join nas tabelas Produto (para trazer a descrio) e Tipo de Operao (venda, retorno, devoluo, etc).
At aqui funciona perfeito, mostrando toda a movimentao.
Agora se eu quiser aplicar filtros, por exemplo, digitando um cdigo de produto, tenho que acrescentar uma clusula Where na query.
Nosso amigo Kerplunk j me passou o cdigo, essa linha ficaria assim:
.Where(x => (mskCodigoProduto.Text != [][]) ? x.codigoproduto == mskCodigoProduto.Text : x.codigoproduto != null)

S que no d certo, ocorre uma Exception conforme a imagem abaixo:

Algum poderia me ajudar? Estou trabalhando com Entity Framework e Banco de Dados SQLCE.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

Resposta escolhida #483712 - 07/08/2018 09:30:29

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Aquele valor []01.00001[] no te familiar?

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483713 - 07/08/2018 09:49:02

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Última edição em 07/08/2018 09:49:45 por PERCIFILHO

Bom dia, Kerplunk.

Citação:
Aquele valor []01.00001[] no te familiar?


Sim, o cdigo que eu digitei para mostrar somente a movimentao deste produto.

No entendi a sua pergunta, mas reparei que no InnerException tem um valor max=0 e len=8. Ento pensei em alterar a linha do cdigo para:
.Where(x => (mskCodigoProduto.Text != []  .     []) ? x.codigoproduto == mskCodigoProduto.Text : x.codigoproduto != null)

colocando os espaos em branco e o ponto para ficar com o comprimento do cdigo.
E no que FUNCIONOU?


____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#483714 - 07/08/2018 09:51:02

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Fiz com as datas da mesma maneira, colocando espaos em branco e as barras, e tambm funcionou.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#483715 - 07/08/2018 10:11:48

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Agora, eu s no sei como implementar essa mesma idia com as ComboBox para ordenar por determinado(s) campo(s).
Na minha tela eu tenho como ordenar por duas colunas. Por exemplo:



Neste caso quero ordenar por data ascendente e depois por descrio tambm ascendente.

Voc acha que existe outra maneira mais fcil ou mais funcional que essa ou assim tambm possvel?
Se for possvel gostaria que me desse []pistas[] de como fazer. No quero somente cdigo pronto, quero aprender.


____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#483720 - 07/08/2018 12:34:10

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Veja bem, o que voc est querendo fazer, foge um pouco da proposta de simplificao do EF, por isso que no outro tpico sugeri a utilizao de um PredicateBuilder.
Outra alternativa vivel e que pode at ser melhor para voc, se quiser expandir ainda mais isso no futur, o uso de DTO[]s com implementao de Fluent API. Assim, voc pode []amarrar[] objetos clusulas e predicados. Isso porque, se no futuro voc quiser mltiplas possibilidades de clusula(where), voc teria um pouco mais de dificuldade. Uma idia de como poderia ficar seria:

meuContexto.AddCondition(x => x.CodigoCliente, txtCodigoCliente).WithOperator(Operators.Equal);
meuContexto.AddCondition(x => x.DataCadastro, (txtDataInicial, txtDataFinal).WithOperator(Operators.Between);
meuContexto.OrderComponent(txtOrdenacao).Direction(txtDirecaoOrdenacao);
var meusDados = meuContexto.Get();


Usei assim em um projeto que tem relatrios criados dinamicamente pelo cliente. Esses relatrios alm de gerados pelo prprio cliente(arrasta e solta colunas, formata agrupamentos e outras funcionalidades), tambm tem o formulrio de seleo de dados gerado dinamicamente. Os campos adicionados ao relatrio podem ser marcados como []filtrveis[], por exemplo, adiciona o campo []codigoCliente[] e marca a propriedade []Filter[] como true, ao executar o relatrio, uma janela exibida, mostrando uma label e um campo para digitar o cdigo do cliente desejado. Pena que no posso compartilhar aqui tudo isso porque proprietrio, o cara pagou por isso e mesmo eu tendo o fonte, no posso compartilhar.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483721 - 07/08/2018 12:35:04

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Esqueci de colocar alguma coisa sobre Fluent API

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483722 - 07/08/2018 14:11:28

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Ento, Kerp, eu havia conseguido o resultado esperado, s que tive que usar alguns if[]s para ir montando os filtros, eu s pensei que conseguiria fazer um cdigo economizando linha, mas acho que vou desistir j que creio que no vai valer a pena insistir nisso, vou procurar entender mais sobre o PredicateBuilder, j que at agora no encontrei nenhum material que me ajudasse muito, mas agradeo muito a sua disposio em me ajudar. Deixo o tpico aberto por enquanto para se voc ou algum mais quiser dar sugestes.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#483723 - 07/08/2018 14:14:01

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Citação:
Usei assim em um projeto que tem relatrios criados dinamicamente pelo cliente. Esses relatrios alm de gerados pelo prprio cliente(arrasta e solta colunas, formata agrupamentos e outras funcionalidades), tambm tem o formulrio de seleo de dados gerado dinamicamente. Os campos adicionados ao relatrio podem ser marcados como []filtrveis[], por exemplo, adiciona o campo []codigoCliente[] e marca a propriedade []Filter[] como true, ao executar o relatrio, uma janela exibida, mostrando uma label e um campo para digitar o cdigo do cliente desejado.

Deve ter ficado muito show.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#483724 - 07/08/2018 14:19:23

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O PredicateBuilder de nvel moderado/alto no seu aspecto de implementao tcnica. No chega ser um bicho de sete cabeas, mas tambm no mamo com acar.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483725 - 07/08/2018 14:26:52

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Citação:
:
Usei assim em um projeto que tem relatrios criados dinamicamente pelo cliente. Esses relatrios alm de gerados pelo prprio cliente(arrasta e solta colunas, formata agrupamentos e outras funcionalidades), tambm tem o formulrio de seleo de dados gerado dinamicamente. Os campos adicionados ao relatrio podem ser marcados como []filtrveis[], por exemplo, adiciona o campo []codigoCliente[] e marca a propriedade []Filter[] como true, ao executar o relatrio, uma janela exibida, mostrando uma label e um campo para digitar o cdigo do cliente desejado.
Deve ter ficado muito show.

Ficou bem bacana mesmo, ainda mais por estar(agora) implementado Web. Usando o Electron, ficou at melhor que eu esperava. As telas de consulta, so geradas dinamicamente em HTML5, que encaminham os parmetros para o core do report, que por sua vez um arquivo json contendo todas as coisas relacionadas ele: fonte de dados (tabelas/views/SQL/Entitdades), campos serem exibidos, campos serem agrupados(soma/mdia/contagem/frmula, cores e fontes, alinhamento horizontal, opcional consultvel, opcional formato de dados de consulta(se intervalo, nmero fixo, valor data...)), formato de sada(HTML/PDF/XHTML/diversos formatos para exportao), opes de cabealho(nmero da pgina, data/hora, alinhamento vertical das colunas na pgina, rodap e algumas outras).

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PERCIFILHO em 13/08/2018 10:51:26