Prezados,
como recebi gratuitamente do amigo EOLO VENTURA informações que desde o ano 2003 eu procurava e não encontrava que é fazer com que o programa Clipper funcionasse sem ocupar o CPU no Win XP;
e agora tb com as informações dessa rotina de Código de Barras (apesar que eu já tinha uma); gostaria de compartilhar com todos as alterações que pra mim ficaram melhores na verificação do "digito verificador" do EAN-13.
A rotina é a abaixo, que é dividida em 2 partes e logo abaixo explico a todos que se interessarem:
Código: Selecionar todos
*** nova rotina do código barras ean13 - parte1 - 21/3/12w ***
if mCDPRODUTO <= 9 .or. mCDPRODUTO > 9999999999999
MENSAGEM ('C¢digo do Produto deve estar entre 10 e 9999999999999 inclusive')
return (.f.)
endif
if !ValidaEAN( str(mCDPRODUTO) )
MENSAGEM ("Alterei o 'dÖgito verificador' pra vocˆ para o n£mero correto, automaticamente")
mCDPRODUTO := str(mCDPRODUTO,13)
Digito := alltrim(str(Digito))
mCDPRODUTO := left(mCDPRODUTO,12 ) + Digito
mCDPRODUTO := val(mCDPRODUTO)
Digito := val(Digito)
return (.f.)
Endif
*** nova rotina do código barras ean13 - parte1 - 21/3/12w ***
**************************************************************
***************************************************************
*** nova rotina do código barras ean13 - parte2 - 21/3/12w ***
Function ValidaEAN( mCDPRODUTO )
Local i, Vetor[12], SomaPares, SomaImpar
Local SomaResul, Unidade
Local lRetorno := .f. // acrescentado em 22/3/12w.
Public Digito // acrescentado em 21/3/12w.
For i := 1 to 12
Vetor[i] := Val( SubStr( StrZero( Val( AllTrim(mCDPRODUTO) ),13 ), i, 1 ) )
Next
SomaPares = ( Vetor[2] + Vetor[4] + Vetor[6] + Vetor[8] + Vetor[10] + Vetor[12] ) * 3
SomaImpar = ( Vetor[1] + Vetor[3] + Vetor[5] + Vetor[7] + Vetor[09] + Vetor[11] )
SomaResul = SomaPares + SomaImpar
Unidade = Val( Right( Str( SomaResul ), 1 ) )
Digito = If( ( 10 - Unidade ) > 9, 0, 10 - Unidade )
lRetorno := Digito = Val(Right(AllTrim(mCDPRODUTO), 1))
Return Digito = Val( Right( AllTrim( mCDPRODUTO ), 1 ) )
*** nova rotina do código barras ean13 - parte2 - 21/3/12w ***
***************************************************************
Agora as explicações:
- No meu caso uso apenas códigos de 13 barras;
- toda vez que o usuário digitar qualquer número que tenha apenas uma unidade, ou seja menos que 2 caracteres ele responde com uma mensagem que a digitação deve ser entre 10 e 9999999999999 (entre 2 e 13 caracteres), isso impede que gere um código erroneo, pois o código pra começar deve no mínimo ser de 1 a 12, pois o 13º número é o dígito verificador;
- quando o usuário digita qualquer número acima de 2 caracteres (exemplo 99, 11, 12, etc), ele entende que o último caractere é o dígito verificador;
Nesse caso, ele faz 2 coisas; a primeira, e a mais simples, retorna pra função chamadora o resultado do código digitado e, se estiver correto, ele continua com os próximos campos, mas se tiver errado ele faz a próxima situação (ex.: se digitar "17", ele verifica que o 7 é o digito verificador do código 1, então dá se prosseguimento, já se digitarmos qualquer outro número, (10, 11, 12, 13...,18,19, etc) ele retorna para a próxima etapa que vou explicar detalhadamente (apesar da maioria dos usuários isso ser banal e muito simples, gostaria que me ajudasse a ajudar aqueles como eu que um dia precisava de coisas simples para tornar meu código mais seguro):
Código: Selecionar todos
if !ValidaEAN( str(mCDPRODUTO) )
/* Esta linha já fala por si só, caso o código
esteja errado (digito verificador incorreto),
execute abaixo: */
MENSAGEM ("Alterei o 'dÖgito verificador' pra vocˆ para o n£mero correto, automaticamente")
/* esta linha é uma mensagem apenas pra conhecimento
do usuário.
Vamos às próximas linhas:
como minhas variáveis (mCDPRODUTO) e (Digito)
são do tipo numérico, nas duas linhas abaixo,
converto-as temporariamente para "strings",
através da função str():*/
mCDPRODUTO := str(mCDPRODUTO,13)
Digito := alltrim(str(Digito))
/* Agora que já temos as duas variáves como strings,
fazemos agora o que acho de mais importante desta
função, a concatenação ou junção do dígito correto
ao código, bem como da exclusão do dígito errado,
conforme linha abaixo: */
mCDPRODUTO := left(mCDPRODUTO,12 ) + Digito
/* já as 2 linhas abaixo, convertem novamente as variáveis
para tipo "numéricas", como eram anteriormente: */
mCDPRODUTO := val(mCDPRODUTO)
Digito := val(Digito)
/* finalmente, você pode optar na linha abaixo por .f. ou .t.
que vai acontecer 2 situações interessantes:
- se optar .f., a mensagem que o dígito foi alterado
para o número correto aparecerá e o usuário deverá
pressionar enter novamente para que o aplicativo
passe para o próximo campo (nome do produto, descrição, etc)
que você designou no @ say get seguinte;
- se colocar .t., o aplicativo mostra a mensagem do mesmo jeito
e já passa automaticamente para o próximo GET. */
return (.t.)
Endif
Por enquanto é só... ah!
estou tentando transferir meu aplicativo feito em Clipper 5.2 com o auxílio do SCULPTOR 3.3 (da Squadra) para xHARBOUR mas não tá dando certo.
Se alguém tiver alguma experiência adicional em Sculptor, agradeceria, pois o amigo EOLO VENTURA me mandou informações e rotinas, mas não consegui nada, então, ainda estou no clipper, com meu aplicativa na versão 3.3.1, estou querendo inovar para 4.0 com o ambiente Windows XP/VISTA/VII.
Vlw a todos.
Walcledson de Paula.