Ajuda em uma função

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

johnataa
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 05 Dez 2016 05:52
Localização: Cuiaba/MT

Ajuda em uma função

Mensagem por johnataa »

Olá a todos,

não tenho conhecimento sobre Clipper ou xHarbour, porém estou precisando traduzir um código de uma função que meu pai escreveu no sistema dele, pesquisei bastante sobre as funções usadas no código mas não consegui o resultado esperado, não posso pedir ajuda para ele pois já faleceu.

a função está descrita abaixo, o parametro que ela recebe é sempre uma string com tamanho = 19, contendo apenas numeros.

Código: Selecionar todos

func linhadig(CAMPO) 
    D_DIG1=CAMPO
    *************calcula primeiro digito
    D_DIG2=subs(D_DIG1,1,9)
    LINDIG=space(11)
    TOT=0
    TOT1=0
    NUM=2
    for i =1 to 9
       TOT =val(substr(D_DIG2,(10-I),1))*NUM
       TOT1 = TOT1+iif(TOT>=10,val(substr(str(TOT),9,1))+val(substr(str(TOT),10,1)),TOT)
       NUM=iif(NUM=1,2,1)
    NEXT  
    STOT1=int(TOT1/10)
    STOT2=STOT1*10
    RES1=TOT1-STOT2
    RES1=iif(RES1#0,RES1-10,0)
    DV=subs(str(RES1),10,1)
    LINDIG=alltrim(LINDIG)+D_DIG2+DV
    *************calcula segundo digito
    D_DIG2=subs(D_DIG1,10,10)
    TOT=0
    TOT1=0
    NUM=2
    for i =1 to 10
        TOT =val(substr(D_DIG2,(11-I),1))*NUM
        TOT1 = TOT1+iif(TOT>=10,val(substr(str(TOT),9,1))+val(substr(str(TOT),10,1)),TOT)
        NUM=iif(NUM=1,2,1)
    NEXT  
    STOT1=int(TOT1/10)
    STOT2=STOT1*10
    RES1=TOT1-STOT2
    RES1=iif(RES1#0,RES1-10,0)
    DV=subs(str(RES1),10,1)
    LINDIG=alltrim(LINDIG)+D_DIG2+DV
 return(LINDIG)
se alguem conseguir traduzir esse código para linguagens como C, C++, Python, Java, PHP, JavaScript vai ser de grande ajuda!

Agradeço desde já!
Editado pela última vez por Toledo em 05 Dez 2016 07:23, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Ajuda em uma função

Mensagem por Pablo César »

Olá Johnataa, bem vindo a nossa comunidade.

Lamento muito a sua perda, faz um ano que perdi o meu, assim como muito aqui devem saber o que isso significa.

Acho que o que você está pedindo é algo inédito neste fórum. Se fosse na nosso dialeto (na nossa linguagem xBase) para melhorar o código, transformá-lo em UNICODE ou adaptar melhor para Harbour, eu como muitos poderiamos te ajudar na hora. O meu conhecimento em C é mínimo mas se você quiser se juntar a nós: bem vindo, pois o Harbour trabalha com linguagem C. A linguagem xBase (a que nós usamos) é muito boa prática se você tiver algum interesse é só participar.

Eu trabalho exclusivamente com HMG, uma ferramenta gráfica que trabalha com Harbour/MiniGW.

Mas para o momento o que eu posso fazer, considerando que você tem conhecimento de programação (ora mesmo que em outra linguagem como você solicitou, deduzo eu) é em oferecer uma tradução em linguagem universal (lógica de programação).

Código: Selecionar todos

Function linhadig(CAMPO) 
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
Você vai notar que tive que desdobrar algumas linhas para você entender melhor. Note que tem ";" (ponto e virgula) para desdobramento e que segue o comando em outra linha.

Bom já que respondi e de alguma forma espero ter ajudado você. Poderia nos dizer para quê serve essa função ou destinada para quê ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Ajuda em uma função

Mensagem por wmanesco »

Boa tarde,

também não tenho muito conhecimento nessas linguagens, o que chego mais perto é javascript, tentei montar um código que te ajude, só ressaltando que não tive como testar, então deve ter varios erros, mas espero que esclareça as coisas pra você.

Código: Selecionar todos


var linhadig = function() {
	var D_DIG1 = CAMPO;
	var D_DIG2 = D_DIG1.substring(0,8);
	var TOT = 0; 
	var TOT1 = 0; 
	var NUM = 2;
	
	for (var i = 0; i <= 8; i++) { 
		
		TOT = parseInt( D_DIG2.substring( (8-i), 1 ) ) * NUM;

		if( TOT >= 10 ){ 
		   TOT1 += parseInt( TOT.toString().substring(8,1) ) + parseInt( TOT.toString().substring(9,1) );
		} else { 
		   TOT1 += TOT;
		}
    }

	var STOT1 = Math.round( TOT1 / 10 );
	var STOT1 = STOT1*10;
	var RES1 = TOT1-STOT2;
	
	RES1 = RES1 != 0 ? RES1-10 : 0;
	
	var DV = RES1.toString().substring(9,1);
	var LINDIG = "" + D_DIG2 + DV;
	
	D_DIG2 = D_DIG1.substring(9,10);
	TOT = 0; 
	TOT1 = 0; 
	NUM = 2;

	for (var i = 0; i <= 9; i++) { 
		
		TOT = parseInt( D_DIG2.substring( (10-i), 1 ) ) * NUM;

		if( TOT >= 10 ){ 
		   TOT1 += parseInt( TOT.toString().substring(8,1) ) + parseInt( TOT.toString().substring(9,1) );
		} else { 
		   TOT1 += TOT;
		}
		
		NUM = NUM == 1 ? 2 : 1;
    }


	STOT1 = Math.round( TOT1 / 10 );  
	STOT2 = STOT1 * 10;  
	RES1 = TOT1 - STOT2;  
	RES1 = RES1 != 0 ? RES1-10 : 0;
		
	DV = RES1.toString().substring( 10, 1 );
	
	LINDIG = LINDIG.trim() + D_DIG2 + DV ;
	
	return LINDIG;
}
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

É que a função tá ruim mesmo, mais fácil e seguro reescrever.

Talvez facilite se souber o que cada função faz:

Uma coisa do Clipper.Harbour que é ruim, é que ela deixa abreviar nomes até 4 letras, então confunde parecendo ser outra função, mas é a mesma coisa.

Subs(), Subst(), e Substr() são o mesmo que no MySQL Mid() ou VB, pra pegar uma parte do texto (uma sub-string, daí o nome)
Int() - parte inteira, exemplo Int( 1.5 ) = 1
AllTrim() - Eliminar espaços em branco antes e depois . Exemplo AllTrim( " AB " ) = "AB"
Val() - transformar string em número. exemplo val( "1" ) = 1
Str() - o inverso de val, transforma número em string, geralmente definimos a parte inteira e decimais, exemplo Str( 5, 1, 0 ) = "5" // 5, usando 1 inteiro e 0 decimais

Comparação de diferente, pode ser usado <>, != ou #

Vai identificar um furo na rotina nesta parte:

Substr( Str( Tot ), 10, 1 )

Não se sabe o tamanho da conversão de TOT pra string, então fica esquisito pegar o caractere na posição 10, se nem se sabe se vai existir a posição 10. Isso seria abusar da sorte.

Basicamente é pegar o número recebido como string, separar cada dígito, e fazer conta com ele.

Acredito que sabendo o que faz cada função possa facilitar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

Faltou uma, não sei se é normal em outras linguagens:

Código: Selecionar todos

x = iif( y=1, 2, 3 )
Considere o iif() como sendo um bloco de if, pra economizar fonte

Código: Selecionar todos

if y = 1
   x = 2
else
   x = 3
endif
não reparei se o fonte tem, mas a finalidade seria a mesma:

Código: Selecionar todos

x = 1
x := 1
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

Estou aqui mexendo aos poucos, mas a rotina está complicada mesmo.
Ilustrando:

Código: Selecionar todos

   LINDIG = Space( 11 )
   LINDIG = AllTrim( LINDIG ) + D_DIG2 + DV
cria a variável com 11 espaços em branco, pra depois usar AllTrim(), o que apaga tudo.

Isso se resumiria a:

Código: Selecionar todos

LINDIG = D_DIG2 + DV
Ajuda a justificar eu ter descrito a rotina como ruim.
E por isso você está tendo mais dificuldades do que o normal.

É que muitos dizem que a linguagem Clipper é ruim.
Como percebe, não é relacionado à linguagem, e sim a forma de uso de cada um.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

Dei uma mexida aqui, o estranho é que o retorno da rotina do seu pai parece inválido, não me pergunte porque.
Veja se fica mais fácil pra converter

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
O retorno das duas:

Código: Selecionar todos

d:\temp>test

12345678978
123456789700
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

Esta parte achei estranha, mas agora entendi.

Código: Selecionar todos

RES1=iif(RES1#0,RES1-10,0) 
se o retorno for 1....

Do jeito que está, RES1 - 10, vai resultar -9, e ele pega só o número, sem o sinal

E 10 - RES1 dá 9, direto o que precisa

Fiquei na dúvida se eu tinha convertido errado.
Pra própria linguagem já confundiu, pra outra linguagem então.... piorou.

Espero que ajude o que eu fiz.

Nota: Meus comentários foram sobre o fonte
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

Aqui fiz o que não precisa.... rs
Se é 0, não precisa atribuir zero.

Código: Selecionar todos

   IF nResto == 0
      nResto := 0
   ELSE
      nResto := 10 - nResto
   ENDIF
basta:

Código: Selecionar todos

IF nResto != 0
   nResto := 10 - nResto
ENDIF
É que fui ajustando aos poucos, pra evitar de fazer errado.
Tem mais coisas que dá pra melhorar, mas não adianta melhorar pra Clipper/Harbour, tem que melhorar pra linguagem que vai usar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
johnataa
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 05 Dez 2016 05:52
Localização: Cuiaba/MT

Ajuda em uma função

Mensagem por johnataa »

Obrigado pela ajuda de todos! Consegui entender completamente através dos comentários de todos como funciona o código. Porém, infelizmente não consegui o resultado esperado transcrevendo para outra linguagem.

Respondendo o Pablo César, esta função era responsável por liberar mais tempo de uso do software do meu pai. Após ele falecer, muitos clientes trocaram de sistema, mas alguns decidiram continuar usando. Só que direto o programa expirava o tempo de uso, e era preciso passar uma nova licença. O grande problema é que o sistema é muito antigo e só executa em Windows de arquitetura 32 bits, tendo eu que criar uma maquina virtual para poder executar. Então decidi transcrever esse trecho para JavaScript por exemplo e poder gerar esse código no navegador mesmo.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda em uma função

Mensagem por JoséQuintas »

Se compensar, poderia tentar converter o aplicativo inteiro pra Harbour.
Mas se não está acostumado pode complicar.

Por exemplo, o que comentei do Str( Numero ), onde no fonte não está especificado o tamanho, e vai dar diferença entre Clipper e Harbour.
Pode ter o mesmo uso em outros locais do fonte.

No Harbour não fica limitado a DBF, pode usar ADO, MySQL, ou outra base de dados.
Infelizmente, isso não significa que seja automático, vai precisar trabalho extra nos fontes.

Se decidir mexer, é só ir perguntando no fórum.
Corre o risco de gostar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder