Olá pessoal…
Hoje vou mostrar, uma função que desenvolvi, que transforma o conteúdo de uma variável numérica, para caracter em AdvPL, respeitando número de dígitos e de dígitos decimais.
Geralmente quando fazemos alguma exportação, vem uma série de regras, como por exemplo, o campo ter 10 posições e mais 5 posições como decimais, e temos que fazer a conversão, utilizando várias funções, como StrZero, etc.
Pensando em otimizar isso, criei a rotina zTransNum, que recebe o valor numérico, a quantidade de posições, a quantidade de posições decimais, e se a quantidade de posições decimais, está junto da quantidade total de posições.
Abaixo o código fonte desenvolvido.
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zTransNum Função para conversão de valor numérico para texto conforme quantidade de decimais informada @author Daniel Atilio @since 05/06/2014 @version 1.0 @param nValor, Numérico, Valor que será convertido @param nTotal, Numérico, Quantidade total de casas @param nDec, Numérico, Quantidade de casas decimais @param lConsDec, Lógico, Considera a quantidade de decimais no tamanho final @return cTexto, Conteúdo texto da conversão @example u_zTransNum(15.23, 5, 2) /*/ User Function zTransNum(nValor, nTotal, nDec, lConsDec) Local cMascara := "@E 9,999,999,999,999,999,999" Local cTexto := "" Default lConsDec := .F. //Decimais cMascara += "."+Replicate('9',nDec) //Transformando conforme máscara cTexto := Alltrim(Transform(nValor,cMascara)) //Retirando ponto e vírgula cTexto := StrTran(cTexto,',','') cTexto := StrTran(cTexto,'.','') //Colocando zeros a esquerda cTexto := StrZero(Val(cTexto),nTotal+Iif(lConsDec, nDec, 0)) /* MsgInfo( 'nValor: '+cValToChar(nValor)+Chr(13)+Chr(10)+; 'cMascara: '+cMascara+Chr(13)+Chr(10)+; 'cTexto: '+cTexto+Chr(13)+Chr(10)+; 'nTotal: '+cValToChar(nTotal)+Chr(13)+Chr(10)+; 'nDec: '+cValToChar(nDec))*/ Return cTexto
E abaixo um print de um exemplo da rotina:
O diferencial dessa rotina com a StrZero / Transform, é que essa respeita os zeros a direita, ou seja, se eu tenho o valor 47,5 e quero que ele seja enviado com 3 casas decimais, o certo seria, 47500, porém com as outras rotinas isso não é possível.
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Muito interessante. Material muito bom. seria legal deixa como instalar um ambiente de teste desse banco de dados para podermos testar!
Boa noite Elizeu.
Ótima ideia, irei analisar a viabilidade.
Um grande abraço.