Dúvida sobre Replace

Discussão em 'Progress 4GL' iniciado por eder.luca2012, Junho 4, 2013.

  1. eder.luca2012

    eder.luca2012 Membro Participativo

    Pessoal tive a necessidade de durante um comando fazer um comando find first para minha surpresa eu precise criar uma rotina de busca usando o cpf ou cnpj, porém no cliente existem casos onde o cpf e cnpj esta com caracteres referentes a mascara então qual foi minha ideia:

    FIND FIRST preserv WHERE preserv.cd-unidade = srvalida.cd-unidade
    AND replace(REPLACE(preserv.nr-cgc-cpf,".","-"),"/") = replace(REPLACE(contrat.nr-cgc-cpf,".","-"),"/") NO-LOCK NO-ERROR.

    Para minha surpresa quando eu tento executar ou checar a sintaxe do programa ele exibe a mensagem de que o progress client parou existe uma forma de utilizar alguma função nesse sentido, ate tentei criar uma função retornando char mas a quantidade de digitos que ele esta retornando não bate exemplo da função:

    FUNCTION limpavar RETURN CHARACTER (nm-limpa-retorno-aux AS CHARACTER):
    ASSIGN nm-limpa-retorno-aux = REPLACE(nm-limpa-retorno-aux,".","-").
    ASSIGN nm-limpa-retorno-aux = REPLACE(nm-limpa-retorno-aux,"/").
    RETURN nm-limpa-retorno-aux.
    END FUNCTION.

    Mas quando retorna ele retorna apenas por exemplo se o cpf for assim 999.999.999-05 ele retorna apenas 99999999 e não 99999999905, alguem saberia como me ajudar estou usando progress 10.1b?
  2. jalegria

    jalegria Membro Participativo

    Saudações

    tenta assim:

    Código:
    replace(replace(replace(campo,'.',''),'-',''),'/','')
    
    no caso do retorno errado, este não deve estar errado, deve ser pq vc tá dando display sem format e o Progress usa format X(8) por padrão... deve ser...
  3. joelscampos

    joelscampos Membro Participativo

    Não tem problema nenhum fazer replace dentro de replace(talvez não consiga a melhor performance).

    O replace sempre tem que ser:
    replace(variavel_que_será_analisada, string_a_ser_substituída, string_substituta)

    No find, você preencheu corretamente os replaces internos, mas deixou faltando 1 elemento em cada um dos replaces externos.

    Assim funcionaria:

    Código:
    FIND FIRST preserv WHERE preserv.cd-unidade = srvalida.cd-unidade
    AND replace(REPLACE(preserv.nr-cgc-cpf,".","-"),"/","") 
        = replace(REPLACE(contrat.nr-cgc-cpf,".","-"),"/","") NO-LOCK NO-ERROR.
    
    Criar uma function para isso deve funcionar, mas o replace também já é uma function.

    Só uma observação... Não lembro exatamente em quais circunstâncias, mas sei que colocar functions no where nem sempre funciona como esperado.
  4. jalegria

    jalegria Membro Participativo

    sim, mas teria que ter 3 replaces para tirar os "." "/" e "-"

Compartilhe esta Página