zekasan Posted June 16, 2021 Report Share Posted June 16, 2021 Bom dia, poderiam me ajudar como verificar se o código de barras de um boleto de arrecadação é válido após sua leitura?? Tem que ser de arrecadação e não boletos bancários. Imensamente Grato. Quote Link to comment Share on other sites More sharing options...
alex2002 Posted June 17, 2021 Report Share Posted June 17, 2021 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 Quote Link to comment Share on other sites More sharing options...
zekasan Posted June 21, 2021 Author Report Share Posted June 21, 2021 OBRIGADO, Agradeço muito sua ajuda Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.