Página 1 de 1

Codigo com digito no final

Enviado: 18 Mar 2023 08:53
por Antonio Matheus
Bom dia amigos eu queria saber como fazer um codigo com digito no final, eu tenho um programa de terceiro feito no clipper summer e ele não da a manutenção do mesmo para atualização de dadaos e tem mais de 22000 registros.
O que eu queria fazer era um sistema de cadastro alternativo para cadastrar os novos registros e de produtos que não estão em base de dados.
CODLAB: 002 - ABBOTT
CODPROD: 002.276-7

Codigo com digito no final

Enviado: 18 Mar 2023 09:50
por Itamar M. Lins Jr.
Olá!
Olhe aqui no forum.
Provavelmente use as funções modulo 10 -> mod10() ou modulo 11 -> mod11() para gerar o dígito.
Peguei aqui mesmo no forum:

Código: Selecionar todos

STATIC FUNCTION Modulo10( cNumero )

   LOCAL cChar, nSoma := 0, nValor, nResto, cDigito

   FOR EACH cChar IN cNumero DESCEND
      nValor := Val( cChar ) * iif( mod( cChar:__EnumIndex, 2 ) == 0, 1, 2 )
      nSoma += nValor - iif( nValor > 9, 9, 0 )
   NEXT
   nResto := MOD( nSoma, 10 )
   cDigito := Str( iif( nResto == 0, 0, 10 - nResto ), 1 )

   RETURN cDigito

STATIC FUNCTION Modulo11( cNumero )

   LOCAL cChar, nSoma := 0, nResto, cDigito, nMultiplica := 2

   cNumero := AllTrim( cNumero )
   FOR EACH cChar IN cNumero DESCEND
      nSoma += Val( cChar ) * nMultiplica
      nMultiplica := iif( nMultiplica == 9, 2, nMultiplica + 1 )
   NEXT
   nResto := Mod( nSoma, 11 )
   cDigito := Str( iif( nResto == 0, 1, iif( nResto == 1, 0, 11 - nResto ) ), 1 )

   RETURN cDigito
http://pctoledo.com.br/forum/viewtopic. ... 15#p157213
Saudações,
Itamar M. Lins Jr.

Codigo com digito no final

Enviado: 28 Mar 2023 01:23
por rochinha
Amiguinhos,

Antonio Matheus pelo jeito você se acostumou com o sistema e pelo investimento e ele realmente te serve e por isto deseja cadastrar itens que o sistema provavelmente não cadastra mais.

Se o intuito é só gerar um digito porque ele funcione apenas como perfumaria visual as funções apresentadas até agora já servem mas se o digito for um ponto de verificação e critica em partes internas do seu sistema precisará fazer com que o mesmo realmente bata com tal verificação.

Não testei a função módulo10 e a módulo11 retornou um digito diferente baseado no código que você forneceu como exemplo pelo fato da função usar fixo o peso 2 e multiplicador 9.

Ela é idêntica a função que usamos para gerar o digito verificador das chaves de notas NF-e/NFC-e.

Fiz um teste com a passagem de vários pesos e multiplicadores para ver qual deles retornava 7 e assim ficou a conclusão;

Código: Selecionar todos

   ? DVModulo11( "002276", 1, 9 ), 01
   ? DVModulo11( "002276", 2, 9 ), 02
   ? DVModulo11( "002276", 3, 9 ), 03
   ? DVModulo11( "002276", 4, 9 ), 04
   ? DVModulo11( "002276", 5, 9 ), 05
   ? DVModulo11( "002276", 6, 9 ), 06
   ? DVModulo11( "002276", 7, 9 ), 07 // *
   ? DVModulo11( "002276", 8, 9 ), 08
   ? DVModulo11( "002276", 9, 9 ), 09
   ? DVModulo11( "002276", 1, 8 ), 10
   ? DVModulo11( "002276", 2, 8 ), 11
   ? DVModulo11( "002276", 3, 8 ), 12
   ? DVModulo11( "002276", 4, 8 ), 13
   ? DVModulo11( "002276", 5, 8 ), 14
   ? DVModulo11( "002276", 6, 8 ), 15
   ? DVModulo11( "002276", 7, 8 ), 16
   ? DVModulo11( "002276", 8, 8 ), 17 // *
   ? DVModulo11( "002276", 9, 8 ), 18
   ? DVModulo11( "002276", 1, 7 ), 19
   ? DVModulo11( "002276", 2, 7 ), 20
   ? DVModulo11( "002276", 3, 7 ), 21
   ? DVModulo11( "002276", 4, 7 ), 22
   ? DVModulo11( "002276", 5, 7 ), 23
   ? DVModulo11( "002276", 6, 7 ), 24
   ? DVModulo11( "002276", 7, 7 ), 25
   ? DVModulo11( "002276", 8, 7 ), 26
   ? DVModulo11( "002276", 9, 7 ), 27
   ? DVModulo11( "002276", 1, 6 ), 28
   ? DVModulo11( "002276", 2, 6 ), 29
   ? DVModulo11( "002276", 3, 6 ), 30
   ? DVModulo11( "002276", 4, 6 ), 31
   ? DVModulo11( "002276", 5, 6 ), 32
   ? DVModulo11( "002276", 6, 6 ), 33
   ? DVModulo11( "002276", 7, 6 ), 34 // *
   ? DVModulo11( "002276", 8, 6 ), 35
   ? DVModulo11( "002276", 9, 6 ), 36
   ? DVModulo11( "002276", 1, 5 ), 37
   ? DVModulo11( "002276", 2, 5 ), 38
   ? DVModulo11( "002276", 3, 5 ), 39
   ? DVModulo11( "002276", 4, 5 ), 40
   ? DVModulo11( "002276", 5, 5 ), 41
   ? DVModulo11( "002276", 6, 5 ), 42
   ? DVModulo11( "002276", 7, 5 ), 43 // *
   ? DVModulo11( "002276", 8, 5 ), 44
   ? DVModulo11( "002276", 9, 5 ), 45
   ? DVModulo11( "002276", 1, 4 ), 46
   ? DVModulo11( "002276", 2, 4 ), 47
   ? DVModulo11( "002276", 3, 4 ), 48
   ? DVModulo11( "002276", 4, 4 ), 49
   ? DVModulo11( "002276", 5, 4 ), 50
   ? DVModulo11( "002276", 6, 4 ), 51
   ? DVModulo11( "002276", 7, 4 ), 52 // *
   ? DVModulo11( "002276", 8, 4 ), 53
   ? DVModulo11( "002276", 9, 4 ), 54
   ? DVModulo11( "002276", 1, 3 ), 55
   ? DVModulo11( "002276", 2, 3 ), 56
   ? DVModulo11( "002276", 3, 3 ), 57
   ? DVModulo11( "002276", 4, 3 ), 58
   ? DVModulo11( "002276", 5, 3 ), 59
   ? DVModulo11( "002276", 6, 3 ), 60
   ? DVModulo11( "002276", 7, 3 ), 61 // *
   ? DVModulo11( "002276", 8, 3 ), 62
   ? DVModulo11( "002276", 9, 3 ), 63
Os resultados com "*" retornaram 7 como digito.

Função DVModulo11 com parâmetros:

Código: Selecionar todos

STATIC FUNCTION DVModulo11(cStr,nPeso1,nPeso2)
   local nTot := 0                       
   local nMul := nPeso1                 
   local i                               
   for i := Len(cStr) to 1 step -1
       nTot += Val(SubStr(cStr,i,1)) * nMul
       nMul := if(nMul=nPeso2, nPeso1, nMul+1)
   next
   return if(nTot%11 < 2, "0", Str(11-(nTot%11),1))
Quase nada diferente da função do Itamar M Lins Jr

Você pode usar qualquer uma das dicas passadas mas se em outro ponto do seu sistema ele retornar mensagem de que o digito não bate é porque a função interna de seu sistema use outra forma de gerá-lo e portanto, usar a terceira opção pode aproximar ao seu resultado e minimizar os erros.

Codigo com digito no final

Enviado: 28 Abr 2023 18:09
por JoséQuintas
Antonio Matheus escreveu:om dia amigos eu queria saber como fazer um codigo com digito no final, eu tenho um programa de terceiro feito no clipper summer e ele não da a manutenção do mesmo para atualização de dadaos e tem mais de 22000 registros.
O que eu queria fazer era um sistema de cadastro alternativo para cadastrar os novos registros e de produtos que não estão em base de dados.
CODLAB: 002 - ABBOTT
CODPROD: 002.276-7
Programa em Clipper Summer, provavelmente dá pra recuperar os fontes usando UNCLIP.
Não vão ser exatamente iguais aos originais, podem precisar ajustes extras, mas podem ajudar.
Talvez até possa compilar com Harbour.
NÃO é certeza, vai ter que fazer seu próprio teste, SE PRECISAR DELES.
Pode até recuperar a rotina de cálculo de dígito que é usada por ele.

Codigo com digito no final

Enviado: 08 Mai 2023 19:57
por mauricioportela
CODLAB: 002 - ABBOTT
CODPROD: 002.276-7
O código do produto é somente 276 ?
O "002" é do laboratório ?

Código: Selecionar todos

FUNCTION Main()
    FOR x := 270 TO 280
        ? "Codigo: " + ALLTRIM(STR(x)) + "-" + ALLTRIM(STR(Digito(x)))
    NEXT
RETURN Nil

FUNCTION Digito(nNumero)
RETURN INT(MOD(nNumero,9))+1
Att.
Mauricio Portela