none
Comparar intervalo de campo texto com Linq RRS feed

  • Pergunta

  • Bom dia,

    Como realizar uma pesquisa com campos do tipo texto?

    Na tabela que eu estou utilizando o campo COFCFO, que é o código do cliente/fornecedor, é do tipo texto e quero selecionar um intervalo, exemplo 000001 até 000030, abaixo segue o código que eu fiz.

    var listRet = from a in ctx.FLAN
                                  where a.CODCOLIGADA == iColigada && a.STATUSLAN == 0 && a.DATAVENCIMENTO >= dtIni && a.DATAVENCIMENTO <= dtFim &&
                                  a.CODCFO >= cCodCFOIni && a.CODCFO <= cCodCFOFim && a.PAGREC == iTipoCF && (a.CODTDO == "ADC" || a.CODTDO == "ADF"
     || a.CODTDO == "NC-A")
                                  select new Adiantamento
                                  {
                                      CodCFO = a.CODCFO,
                                      NomeCliente = (from x in ctx.FCFO where a.CODCFO == x.CODCFO select x.NOME).FirstOrDefault(),
                                      Historico = a.HISTORICO,
                                      DataVencimento = a.DATAVENCIMENTO,
                                      VlrBaixado = a.VALORBAIXADO,
                                      CodTDO = a.CODTDO,
                                      VlrTitulo = a.VALORORIGINAL
                                  };


    Acontece que está dando erro nas condições "a.CODCFO >= cCodCFOIni" e "a.CODCFO <= cCodCFOFim", pois não é possível utilizar o operador ">= ou <=" com campos do tipo texto.

    Como eu posso fazer esse tipo de pesquisa?

    Att,

    Leandro.


    • Editado Marcos SJ sexta-feira, 15 de abril de 2016 13:16 Edição
    sexta-feira, 15 de abril de 2016 13:05

Respostas

  • Opa, tudo bom LeandroMarcelino?

    A menos que espere que haja valores de texto alfanumérico neste campo, o que simplemente impediria uma comparação usando operadores aritméticos, porque você está utilizando um campo que armazena um valor numérico como texto?! :) 

    De qualquer forma, além da recomendação de alterar o valor do campo para INT (de -2,147,483,648 até 2,147,483,647) ou mesmo BIGINT (-9,223,372,036,854,775,808 até 9,223,372,036,854,775,807!!!) caso a expectativa é que sejam números muito grandes MESMO, não há muito que se possa fazer além de uma gambiarra forte mesmo, como iterar por todos os registros fazendo um convert ou cast dos campos de texto para tipos inteiros e comparar o valor para ver se está dentro do range que você precisa.

    Alternativamente, você pode tentar converter o tipo do campo na clausula where, mas eu não acredito que isso vá funcionar, eu não cheguei a testar o código:

    var listRet = from a in ctx.FLAN
                 where a.CODCOLIGADA == iColigada 
    			    && a.STATUSLAN == 0 
    				&& a.DATAVENCIMENTO >= dtIni 
    				&& a.DATAVENCIMENTO <= dtFim 
    				&& Convert.ToInt32(a.CODCFO) >= cCodCFOIni 
    				&& Convert.ToInt32(a.CODCFO) <= cCodCFOFim 
    				&& a.PAGREC == iTipoCF 
    				&& (a.CODTDO == "ADC" || a.CODTDO == "ADF" || a.CODTDO == "NC-A")
            select new Adiantamento
    				   {
    					  CodCFO = a.CODCFO,
    					  NomeCliente = (from x in ctx.FCFO where a.CODCFO == x.CODCFO select x.NOME).FirstOrDefault(),
    					  Historico = a.HISTORICO,
    					  DataVencimento = a.DATAVENCIMENTO,
    					  VlrBaixado = a.VALORBAIXADO,
    					  CodTDO = a.CODTDO,
    					  VlrTitulo = a.VALORORIGINAL
    				   };

    Enfim, mude os campos para tipos numéricos :)

    Aquele abraço!

    • Marcado como Resposta Marcos SJ sexta-feira, 15 de abril de 2016 13:43
    sexta-feira, 15 de abril de 2016 13:43

Todas as Respostas

  • Opa, tudo bom LeandroMarcelino?

    A menos que espere que haja valores de texto alfanumérico neste campo, o que simplemente impediria uma comparação usando operadores aritméticos, porque você está utilizando um campo que armazena um valor numérico como texto?! :) 

    De qualquer forma, além da recomendação de alterar o valor do campo para INT (de -2,147,483,648 até 2,147,483,647) ou mesmo BIGINT (-9,223,372,036,854,775,808 até 9,223,372,036,854,775,807!!!) caso a expectativa é que sejam números muito grandes MESMO, não há muito que se possa fazer além de uma gambiarra forte mesmo, como iterar por todos os registros fazendo um convert ou cast dos campos de texto para tipos inteiros e comparar o valor para ver se está dentro do range que você precisa.

    Alternativamente, você pode tentar converter o tipo do campo na clausula where, mas eu não acredito que isso vá funcionar, eu não cheguei a testar o código:

    var listRet = from a in ctx.FLAN
                 where a.CODCOLIGADA == iColigada 
    			    && a.STATUSLAN == 0 
    				&& a.DATAVENCIMENTO >= dtIni 
    				&& a.DATAVENCIMENTO <= dtFim 
    				&& Convert.ToInt32(a.CODCFO) >= cCodCFOIni 
    				&& Convert.ToInt32(a.CODCFO) <= cCodCFOFim 
    				&& a.PAGREC == iTipoCF 
    				&& (a.CODTDO == "ADC" || a.CODTDO == "ADF" || a.CODTDO == "NC-A")
            select new Adiantamento
    				   {
    					  CodCFO = a.CODCFO,
    					  NomeCliente = (from x in ctx.FCFO where a.CODCFO == x.CODCFO select x.NOME).FirstOrDefault(),
    					  Historico = a.HISTORICO,
    					  DataVencimento = a.DATAVENCIMENTO,
    					  VlrBaixado = a.VALORBAIXADO,
    					  CodTDO = a.CODTDO,
    					  VlrTitulo = a.VALORORIGINAL
    				   };

    Enfim, mude os campos para tipos numéricos :)

    Aquele abraço!

    • Marcado como Resposta Marcos SJ sexta-feira, 15 de abril de 2016 13:43
    sexta-feira, 15 de abril de 2016 13:43
  • Boa tarde,

    Eu não posso mudar o campo da tabela para numérico, esse banco é do nosso ERP (Totvs), eu estou gerando os relatórios, pelo VS - C# que é mais completo que a ferramenta de relatório da Totvs.

    Vou tentar converter os campos no where e vamos ver se da certo.

    Obrigado.

    segunda-feira, 18 de abril de 2016 19:55
  • Bom dia,

    Eu fiz a conversão direto no where, mas deu erro.

    terça-feira, 19 de abril de 2016 10:40
  • Bom dia,

    Na tabela FCFO tem um campo IDCFO ele é numérico e sequencial.

    Agora estou usando o IDCFO e não o CODCFO.

    Relatório funcionando corretamente.

    Valeu pelas dicas

    terça-feira, 19 de abril de 2016 11:22