Tche, eu tenho essa PRA IE.....mas nunca usei.
Código: Selecionar todos
* Enviado por: Carlos Eduardo Brock - Email: brock_carlos@yahoo.com.br
#include "inkey.ch"
Cls
aIePict :={ {"AC", "@R 99.999.999/999-99"},;
{"AL", "@R 999999999"},;
{"AM", "@R 99.999.999-9"},;
{"AP", "@R 999999999"},;
{"BA", "@R 999999-99"},;
{"DF", "@R 99.999999.999-99"},;
{"CE", "@R 99999999-9"},;
{"ES", "@R 999999999"},;
{"GO", "@R 99.999.999-9"},;
{"MA", "@R 999999999"},;
{"MG", "@R 999.999.999/9999"},;
{"MS", "@R 99999999-9"},;
{"MT", "@R 9999999999-9"},;
{"PA", "@R 99-999999-9"},;
{"PB", "@R 99999999-9"},;
{"PE", "@R 99.9.999.9999999-9"},;
{"PI", "@R 999999999"},;
{"PR", "@R 999.99999-99"},;
{"RJ", "@R 99.999.99-9"},;
{"RN", "@R 99.999.999-9"},;
{"RO", "@R 999.99999-9"},;
{"RR", "@R 99.999.999-9"},;
{"RS", "@R 999/9999999"},;
{"SC", "@R 999.999.999"},;
{"SE", "@R 99999999-9"},;
{"SP", "@R 999.999.999.999"},;
{"TO", "@R 99.99.999999-9"} }
cIe := " "
cUF := " "
Do while LastKey() <> K_ESC
@ 09, 10 Say "Uf :" Get cUF Picture "@!" Valid AScan( aIePict, {|nI| cUf == nI[ 1 ]} ) <> 0
Read
@ 10, 10 Say "I.E.:" Get cIe Picture aIePict[ AScan( aIePict, {|nI| cUf == nI[ 1 ]} ) ][ 2 ]
Read
@ 11, 10 Say "I.E.: " + Transform( cIe, aIePict[ AScan( aIePict, {|nI| cUf == nI[ 1 ]} ) ][ 2 ] ) +;
" - Esta: " + If ( TestaIe( cIe, cUF ), "Certa", "Errada" )
EndDo
********************************************/
Function TestaIe( cIe1, cUF )
Local nI, nX, cTemp := "", nT2, nMod := 11
local cIe2 := "", nSoma := 0, cProd := "", aUF
Local nD1, nD2
Local aP1, aP2, nPt
Private nACt, nALt, nAMt, nAPt, nBAt, nCEt, nDFt, nESt, nGOt
Private nMAt, nMGt, nMSt, nMTt, nPAt, nPBt, nPEt, nPIt, nPRt
Private nROt, nRRt, nRSt, nSEt, nSCt, nSPt, nTOt, nRJt, nRNt
Private aAC1, aAL1, aAM1, aAP1, aBA1, aCE1, aDF1, aES1, aGO1
Private aMA1, aMG1, aMS1, aMT1, aPA1, aPB1, aPI1, aPE1, aPR1
Private aRJ1, aRN1, aRO1, aRR1, aRS1, aSE1, aSC1, aSP1, aTO1
aUf:= { "AC", "AL", "AM", "AP", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MS",;
"MT", "PA", "PB", "PE", "PI", "PR", "RJ", "RN", "RO", "RR", "RS", "SC",;
"SE", "SP","TO", }
cUf := Upper( cUf )
If AScan( aUf, {|nI| cUf == nI} ) == 0
Return( .F. )
EndiF
// Tamanho da IE
nACt := 13; nALt := 09; nAMt := 09; nAPt := 09; nBAt := 08; nCEt := 09
nDFt := 13; nESt := 09; nGOt := 09; nMAt := 09; nMGt := 13; nMSt := 09
nMTt := 11; nPAt := 09; nPBt := 09; nPEt := 14; nPIt := 09; nPRt := 10
nRJt := 08; nRNt := 09; nROt := 09; nRRt := 09; nRSt := 10; nSEt := 09
nSCt := 09; nSPt := 12; nTOt := 11
// Pesos da multiplicao para IE
aAC1 := { { 04, 03, 02, 09, 08, 07, 06, 05, 04, 03, 02 },;
{ 05, 04, 03, 02, 09, 08, 07, 06, 05, 04, 03, 02 } }
aAL1 := { { 02, 03, 04, 05, 06, 07, 08, 09 }, }
aAM1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aAP1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aBA1 := { { 07, 06, 05, 04, 03, 02}, { 08, 07, 06, 05, 04, 03, 02 } }
aCE1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aDF1 := { { 04, 03, 02, 09, 08, 07, 06, 05, 04, 03, 02 },;
{ 05, 04, 03, 02, 09, 08, 07, 06, 05, 04, 03, 02 } }
aES1 := { { 09, 09, 09, 09, 09, 09, 09, 09, 09 }, }
aGO1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aMA1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aMG1 := { { 01, 02, 01, 02, 01, 02, 01, 02, 01, 02, 01, 02 },;
{ 03, 02, 11, 10, 09, 08, 07, 06, 05, 04, 03, 02 } }
aMS1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aMT1 := { { 03, 02, 09, 08, 07, 06, 05, 04, 03, 02 }, }
aPA1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aPB1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aPI1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aPE1 := { { 05, 04, 03, 02, 01, 09, 08, 07, 06, 05, 04, 03, 02 }, }
aPR1 := { { 03, 02, 07, 06, 05, 04, 03, 02 },;
{ 04, 03, 02, 07, 06, 05, 04, 03, 02 } }
aRJ1 := { { 02, 07, 06, 05, 04, 03, 02 }, { } }
aRN1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aRO1 := { { 06, 05, 04, 03, 02 }, }
aRR1 := { { 01, 02, 03, 04, 05, 06, 07, 08 }, }
aRS1 := { { 02, 09, 08, 07, 06, 05, 04, 03, 02 }, { } }
aSE1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aSC1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aSP1 := { { 01, 03, 04, 05, 06, 07, 08, 10 },;
{ 03, 02, 10, 09, 08, 07, 06, 05, 04, 03, 02 } }
aTO1 := { { 09, 08, 07, 06, 05, 04, 03, 02 }, }
aP1 := &("a"+cUF+"1")[1]
aP2 := &("a"+cUF+"1")[2]
nPt := &("n"+cUF+"t")
For nI := 1 To Len(cIe1)
cTemp += If( SubStr( cIe1, nI, 1 ) $ "0123456789", SubStr( cIe1, nI, 1 ), "" )
Next
cIe1 := cTemp
If Len( cIE1 ) <> nPt
Return .F.
EndIf
// A partir de alguns pontos já da pra fazer a validacao das IEs, mas sao + 3 linhas de codigo q quer queira, quer nao, vao gerar mais simblolos dentro do obj.
Do Case
Case cUF == "AC"
cIe2 := SubStr( cIe1, 1, 11 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Ltrim( Str( Int( nD1 ) ) )
nSoma := 0
AEval( aP2, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD2 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Ltrim( Str( Int( nD2 ) ) )
Case cUF == "AL"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := Mod( nSoma, nMod )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "AP"
Do Case
Case cIe1 >= "03000001" .and. cIe1 <= "03017000"
nSoma := 5; nT2 := 0
Case cIe1 >= "03017001" .and. cIe1 <= "03019022"
nSoma := 9; nT1 := 1
Case cIe1 >= "03019023"
nSoma := 0; nT2 := 0
EndCase
If Substr(cIe1, 1, 2) <> "03"
Return(.F.)
EndIf
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := nMod - Mod( nSoma, nMod )
nD1 := If( nD1 == 10, 0, nD1)
nD1 := If( nD1 == nMod, nT2, nD1)
cIe2 += AllTrim( Str( Int( nD1 ) ) )
Case cUF == "AM"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( nSoma < nMod, nMod - nSoma,;
If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) ) )
cIe2 += AllTrim( Str( Int( nD1 ) ) )
Case cUF == "BA" // tem q ser baiano pra ser do contra, eles calculan o 2 dig prim, e usam pro 1 dig
nMod := If( SubStr( cIe1, 1, 1 ) $ "0123458", 10, 11 )
cIe2 := SubStr( cIe1, 1, 6 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD2 := If(nMod == 10, nMod - Mod( nSoma, nMod ),;
If( nMod - Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) ) )
cIe2 += AllTrim( Str( Int( nD2 ) ) )
nSoma := 0
AEval( aP2, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If(nMod == 10, nMod - Mod( nSoma, nMod ),;
If( nMod - Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) ) )
cIe2 := SubStr( cIe1, 1, 6 ) + AllTrim( Str( Int( nD1 ) ) ) + AllTrim( Str( Int( nD2 ) ) )
Case cUF == "DF"
cIe2 := SubStr( cIe1, 1, 11 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := nMod - Mod( nSoma, nMod )
nD1 := If( nD1 >= 10, 0, nD1 )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
nSoma := 0
AEval( aP2, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD2 := nMod - Mod( nSoma, nMod )
nD2 := If( nD2 >= 10, 0, nD2 )
cIe2 += Right( Str( Int( nD2 ) ), 1 )
Case cUF == "CE"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := nMod - Mod( nSoma, nMod )
nD1 := If( nD1 >= 10, 0, nD1 )
cIe2 += AllTrim( Str( Int( nD1 ) ) )
Case cUF == "ES"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "GO" // Essa foi a mais anormal de todas
nD2 := Val( Right( cIe1, 1 ) )
cIe2 := SubStr( cIe1, 1, 2 )
If cIE2 == "10" .OR. cIE2 == "11" .OR. cIE2 == "15"
cIe2 := SubStr( cIe1, 1, 8 )
If cIe1 == "110944020" .OR. cIe1 == "110944021"
cIe2 := cIe1
Else
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
Do Case
Case Mod( nSoma, nMod ) == 0
nD1 := 0
Case Mod( nSoma, nMod ) == 1 .AND. cIE2 >= "10103105" .AND. cIE2 <= "10119997"
nD1 := 1
Case Mod( nSoma, nMod ) == 1 .AND. cIE2 < "10103105" .AND. cIE2 > "10119997"
nD1 := 0
Case Mod( nSoma, nMod ) > 1
nD1 := nMod - Mod( nSoma, nMod )
EndCase
cIe2 += Right( Str( Int( nD1 ) ), 1 )
EndIf
EndIf
Case cUF == "MA"
If Left( cIe1, 2 ) == "12"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += AllTrim( Str( Int( nD1 ) ) )
EndIf
Case cUF == "MG"
cIe2 := SubStr( cIe1, 1, 3 ) + "0" + Substr( cIe1, 4, 8 ) //0 inutil, 0*2 = 0, pq? 4o. peso.
AEval( aP1, { |nI, nX| cProd += LTrim( Str( Int( Val( SubStr( cIe2, nX, 1) ) * nI ) ) ) } )
For nI := 1 to Len( cProd )
nSoma += Val( SubStr( cProd, nI, 1 ) )
Next
cProd := StrZero( nSoma, 3 )
nD1 := ( Val( SubStr( CProd, 2, 1 ) + "0" ) + 10 )
nD1 -= nSoma
cIe2 := SubStr( cIe1, 1, 11 ) + Right( Str( Int( nD1 ) ), 1 )
nSoma := 0
AEval( aP2, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD2 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD2 ) ), 1 )
Case cUF == "MS"
cIe2 := SubStr( cIe1, 1, 08 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += LTrim( Str( Int( nD1 ) ) )
Case cUF == "MT"
cIe2 := SubStr( cIe1, 1, 10 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += LTrim( Str( Int( nD1 ) ) )
Case cUF == "PA"
If Left(cIe1, 2) == "15"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 := SubStr( cIe1, 1, 8) + AllTrim( Str( Int( nD1 ) ) )
EndIf
Case cUF == "PB"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "PE"
cIe2 := SubStr( cIe1, 1, 13 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "PI"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += AllTrim( Str( Int( nD1 ) ) )
Case cUF == "PR"
cIE2 := SubStr( cIe1, 1, Len( cIe1 ) - 2 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := nMod - Mod( nSoma, nMod )
nD1 := If( nD1 == 10, 0, nD1 )
cIe2 += AllTrim( Str( Int( nD1 ) ) )
nSoma := 0
AEval( aP2,{ |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD2 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "RJ"
cIe2 := SubStr( cIe1, 1, 7 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "RN"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "RO"
cIe2 := SubStr( cIe1, 4, 5 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod )>= 10, 10, 11 ) - Mod( nSoma, nMod )
cIe2 := SubStr( cIe1, 1, 8) + AllTrim( Str( Int( nD1 ) ) )
Case cUF == "RR"
If Substr( cIe1, 1 , 2 ) == "24"
nMod := 9
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := Mod( nSoma, nMod )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
EndIf
Case cUF == "RS"
cIe2 := SubStr( cIe1, 1, 9 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "SC"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "SE"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 += Right( Str( Int( nD1 ) ), 1 )
Case cUF == "SP"
cIe2 := SubStr( cIe1, 1, 8 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := Mod( nSoma, nMod )
cIe2 += Right( Str( Int( nD1 ) ), 1 ) + SubStr( cIe1, 10, 2 )
nSoma := 0
AEval( aP2, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD2 := If( Mod( nSoma, nMod )>= 10, 10, 11 ) - Mod( nSoma, nMod )
cIe2 += Right( Str( Int( nD2 ) ), 1 )
Case cUF == "TO"
altd()
cIe2 := SubStr( cIe1, 1, 2 ) + SubStr( cIe1, 5, 6 )
AEval( aP1, { |nI, nX| nSoma += Val( SubStr( cIe2, nX, 1) ) * nI } )
nD1 := If( Mod( nSoma, nMod ) <= 1, 0, nMod - Mod( nSoma, nMod ) )
cIe2 := SubStr( cIe1, 1, 10 ) + Right( Str( Int( nD1 ) ), 1 )
Otherwise
Return .F.
EndCase
Return( cIe1 == cIe2 )
Tah na mão Vô Eolo !!!.....