Jump to content
Fivewin Brasil

Ajuda - Validar código de barras de boletos de arrecadação


zekasan

Recommended Posts

Olá amigo, 

Vou postar aqui a função que uso no caixa dos bancos que são meus clientes:

 

 
////////////////////////////DADOS DA FUNCAO//////////////////////////////////
// NOME       : DigitaConta                                               ///
// FINALIDADE : Digitação Manual da Linha Digitável das Contas            ///
// PARAMETROS : cDados (passar por referencia)                            ///
// RETORNO    : lOk                                                       ///
/////////////////////////////////////////////////////////////////////////////
function DigitaConta( cDadosDoc )
 
local aBlocos, aoGetBloc
local lSair := .f., lOk := .t.
local oIco, oDlg, oBtn01, oBtn10
local nVezes := 1
 
aBlocos   := { space(13), space(13), space(13), space(13) }
aoGetBloc := array( len( aBlocos ) )
set confirm off
 
DEFINE DIALOG oDlg RESOURCE 'DIGITACONTA' 
oDlg:lHelpIcon := .f.
                                                                    
redefine get aoGetBloc[1] VAR aBlocos[1] ID 101 of oDlg picture '@K 99999999999-9'     
redefine get aoGetBloc[2] VAR aBlocos[2] ID 102 of oDlg picture '@K 99999999999-9'   
redefine get aoGetBloc[3] VAR aBlocos[3] ID 103 of oDlg picture '@K 99999999999-9' 
redefine get aoGetBloc[4] VAR aBlocos[4] ID 104 of oDlg picture '@K 99999999999-9' 
 
redefine buttonBMP obtn01     bitmap "ok16"    ID 501 of oDlg TEXTRIGHT ACTION if( ProcessaConta( aBlocos, @cDadosDoc )(lSair := .t., lOk := .t.oDlg:End() )xSetFocus(aoGetBloc[1]) ) 
redefine buttonBMP obtn10     bitmap "sai16"   ID 510 of oDlg TEXTRIGHT ACTION ( lSair := .t., lOk := .f., oDlg:End() ) CANCEL
ACTIVATE DIALOG oDlg CENTERED valid lSair 
 
return lOk
 
////////////////////////////////////////////////////
static function ProcessaConta( aBlocos, cDadosDoc )
local cDigErro := ''
local lOk := .t.
local x
 
cDadosDoc := substr( aBlocos[1],1, 11 )
cDadosDoc += substr( aBlocos[2],1, 11 )
cDadosDoc += substr( aBlocos[3],1, 11 )
cDadosDoc += substr( aBlocos[4],1, 11 )
 
for x=1 to 4
   if substr( aBlocos[x], 13,1 ) <> Modulo10( substr( aBlocos[x],1, 11 ) ) .and. substr( aBlocos[x], 13,1 ) <> Modulo11( substr( aBlocos[x],1, 11 ) ) .and. substr( aBlocos[x], 13,1 ) <> Modulo11Old( substr( aBlocos[x],1, 11 ) )
      cDigErro += str(x,1)+' '
   endif
next
 
if !empty( cDigErro )
 MsgStop( 'Dígito(s) do(s) bloco(s) '+cDigErro+' não confere(m)', 'Verique.' )
 cDadosDoc := 'ERRO'
 lOk       := .f.
endif
 
return lOk
 
 
////////////////////////////DADOS DA FUNCAO//////////////////////////////////
// NOME       : modulo10                                                  ///
// FINALIDADE : calcular o digito verificador no modulo resto 10          ///
// PARAMETROS : <1> numero a ser calculado                                ///
// RETORNO    : digito verificador  em string                             ///
/////////////////////////////////////////////////////////////////////////////
function Modulo10(xNumero, cSeq)
 
local cNumero, cDV
local nLen, nTotal:=0, x, nResto, nResultado
 
DEFAULT cSeq:='121212121212'
 
cNumero:=iif( valtype(xNumero)='N',alltrim( str(xNumero,12) ),xNumero )
nLen:=len(cNumero)
cSeq:=right(cSeq,nLen)
for x=1 to nLen
        nResultado:=val( substr(cNumero,x,1) )*val( substr(cSeq,x,1) )
        nTotal+=( val( substr( str(nResultado,2),1,1 ) )+val( substr( str(nResultado,2),2,1 ) ) )
next
nResto:=nTotal%10
cDV:=substr( str(10-nResto,2),2,1 )
 
return cDV

 
//////////////////////////DADOS DA FUNCAO////////////////////////////////////
// NOME       : modulo11Old                                               ///
// FINALIDADE : calcular o digito verificador no modulo 11                ///
// PARAMETROS : <1> numero/string contendo os algarismos para calculo     ///
//              [2] aSequencia de conferência (vetor com 12 elementos)    ///
// RETORNO    : string contendo o digito verificador                      ///
/////////////////////////////////////////////////////////////////////////////
function Modulo11Old( xNumero, aSeq )
 
local cNumero, nLen:=51, nTotal:=0, x, cDV
 
DEFAULT aSeq:={ 4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2 }
 
cNumero:=iif( valtype(xNumero)='N'padl( alltrim( str(xNumero,nLen) ), nLen )padl( xNumero, nLen ) )
for x=1 to nLen
        nTotal+=val( substr(cNumero,x,1) )*aSeq[x]
next
 
cDV := if(nTotal % 11 < 2"0"str(11-(nTotal%11), 1 ))
 
return cDV
 


 
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...