Dei uma mexida aqui, o estranho é que o retorno da rotina do seu pai parece inválido, não me pergunte porque.
Código: Selecionar todos
PROCEDURE Main
Inkey(0)
? NovoCalculo( "1234567890" )
? LinhaDig( "1234567890" )
FUNCTION NovoCalculo( cNumDoc )
LOCAL nTotal, nMultiplica, nPosicao, cSoma, cNovoDoc, nResto, nNumero, cDigito
nTotal = 0
nMultiplica = 2
FOR nPosicao = 9 TO 1 STEP -1
nNumero := Val( Substr( cNumDoc, nPosicao, 1 ) )
cSoma := Str( nNumero * nMultiplica, 2 )
nTotal := nTotal + Val( Substr( cSoma, 1, 1 ) ) + Val( Substr( cSoma, 2, 1 ) )
nMultiplica := iif( nMultiplica = 1, 2, 1 )
NEXT
nResto := nTotal - Int( nTotal / 10 ) * 10
IF nResto == 0
nResto := 0
ELSE
nResto := 10 - nResto
ENDIF
cDigito := Str( nResto, 1 )
cNovoDoc := Substr( cNumDoc, 1, 9 ) + cDigito
nTotal = 0
nMultiplica = 2
FOR nPosicao = 10 TO 1 STEP -1
nNumero := Val( Substr( cNovoDoc, nPosicao, 1 ) )
cSoma := Str( nNumero * nMultiplica, 2 )
nTotal := nTotal + Val( Substr( cSoma, 1, 1 ) ) + Val( Substr( cSoma, 2, 1 ) )
nMultiplica := iif( nMultiplica = 1, 2, 1 )
NEXT
nResto := nTotal - Int( nTotal / 10 ) * 10
IF nResto == 0
nResto := 0
ELSE
nResto := 10 - nResto
ENDIF
cDigito := Str( nResto, 1 )
cNovoDoc := cNovoDoc + cDigito
RETURN cNovoDoc
Function linhadig(CAMPO)
LOCAL d_Dig1, d_Dig2, Tot, Tot1, Num, Dv, LinDig, Res1, I, STot1, STot2
D_DIG1=CAMPO // atribui a outra variavel o valor recebido de CAMPO
*************calcula primeiro digito
D_DIG2=subs(D_DIG1,1,9) // pega os primeiros 9 digitos
LINDIG=space(11) // atribui o valor de 11 espace em brancos a variavel
//TOT=0 // declara a variavel numerica, o valor zero
TOT1=0 // declara a variavel numerica, o valor zero
NUM=2 // declara a variavel numerica, o valor dois
For i =1 to 9 // faz um laço de repetição começando do valor 1 até o 9
TOT = val( ; // atribui a var TOT um valor numérico
substr(D_DIG2,(10-I), ; // a substring de D_DIG2, começando do ultimo caracter pra o inicio (9,8,7,6,5,4,3,2,1)
1)); // pegando apenas um caracter
*NUM // essa string convertida em valor numerico e multiplicado pelo valor de NUM
TOT1 = TOT1 + ; // TOT1 é formado pela soma consecutiva (9 vezes) de si mesmo mais
iif(TOT>=10, ; // o valor condicionado de TOT, quando for este maior ou igual que 10
val(substr(str(TOT),9,1))+val(substr(str(TOT),10,1)), ; /* pegará o primeiro caracter e transformado em valor numerico e somará com o segundo caracter tbm convertido em numerico */
TOT) // Caso o valor TOT for menor que 10, pegará o ese valor para simplesmente somar com TOT1
NUM=iif(NUM=1,2,1) // O valor de NUM começou com 2 e foi alternando para 1 e 2 (nove vezes)
Next
STOT1=int(TOT1/10) // STOT1 recebe o valor inteiro (sem decimal algum) do valor TOT1 dividido por 10
STOT2=STOT1*10 // STOT2 recebe o valor se STOT1 multiplicado por 10
RES1=TOT1-STOT2 // RES1 recebe decimal de "resto" entre TOT1-STOT2
RES1=iif(RES1#0,RES1-10,0) /* RES1 recebe o valor condicional: se é diferente de zero, recebe o valor de RES1-10
caso contrario recebe o valor de zero */
DV=subs(str(RES1),10,1) // pega a substring de RES1 o ultimo caracter (valores strings)
LINDIG=alltrim(LINDIG)+D_DIG2+DV /* LINDIG é uma concatenação do tipo caracter (só pode) composto por
"" (valor de string vazio, sem espaço algum) mais
os primeiros 9 digitos mais o valor caracter de DV*/
*************calcula segundo digito
D_DIG2=subs(D_DIG1,10,10) // D_DIG2 recebe de 10 characteres apartir do décimo caracter do valor CAMPO recebido inicialmente
//TOT=0 // TOT recebe o valor inteiro de 0
TOT1=0 // TOT1 recebe o valor inteiro de 0
NUM=2 // NUM recebe o valor inteiro de 2
For i =1 to 10 // faz um laço de repetição começando do valor 1 até o 10
TOT = val( ; // atribui a var TOT um valor numérico
substr(D_DIG2,(11-I), ; // a substring de D_DIG2, começando do ultimo caracter pra o inicio (10,9,8,7,6,5,4,3,2,1)
1)); // pegando apenas um caracter
*NUM // essa string convertida em valor numerico e multiplicado pelo valor de NUM
TOT1 = TOT1 + ; // TOT1 é formado pela soma consecutiva (9 vezes) de si mesmo mais
iif(TOT>=10, ; // o valor condicionado de TOT, quando for este maior ou igual que 10
val(substr(str(TOT),9,1))+val(substr(str(TOT),10,1)), ;/* pegará o primeiro caracter e transformado em valor numerico e somará com o segundo caracter tbm convertido em numerico */
TOT) // Caso o valor TOT for menor que 10, pegará o ese valor para simplesmente somar com TOT1
NUM=iif(NUM=1,2,1) // O valor de NUM começou com 2 e foi alternando para 1 e 2 (nove vezes)
Next
STOT1=int(TOT1/10) // STOT1 recebe o valor inteiro (sem decimal algum) do valor TOT1 dividido por 10
STOT2=STOT1*10 // STOT2 recebe o valor se STOT1 multiplicado por 10
RES1=TOT1-STOT2 // RES1 recebe decimal de "resto" entre TOT1-STOT2
RES1=iif(RES1#0,RES1-10,0) /* RES1 recebe o valor condicional: se é diferente de zero, recebe o valor de RES1-10 caso contrario recebe o valor de zero */
DV=subs(str(RES1),10,1) // pega a substring de RES1 o ultimo caracter (valores strings)
LINDIG=alltrim(LINDIG)+D_DIG2+DV /* LINDIG é uma concatenação do tipo caracter (só pode) composto por
"" (valor de string vazio, sem espaço algum) mais
os primeiros 9 digitos mais o valor caracter de DV*/
Return LINDIG // retorna o valor de LINDIG