Codigo com digito no final

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Antonio Matheus
Usuário Nível 1
Usuário Nível 1
Mensagens: 28
Registrado em: 13 Jul 2010 23:18
Localização: sao caetano dosul

Codigo com digito no final

Mensagem 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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Codigo com digito no final

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Codigo com digito no final

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Codigo com digito no final

Mensagem 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.
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
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Codigo com digito no final

Mensagem 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
Responder