Oi, Pablo César,
Resolvido !
Peço desculpas por não colocado antes as funções necessárias a checagem do CNPJ ou CPF inseridos.
Coloco novamente o trecho alterado com a colocação do NIL conforme você sugeriu.
Incluo agora as funções que consistem o CNPJ/CPF pois podem ser úteis a colegas que trabalham com sistemas administrativos.
Informo que o programa agora está conferindo o valor informado, tanto em registro novo como em alteração de já existente.
O trecho do programa onde a variável
TxtCGC_CPF é inserida/alterada está desta forma:
@030,250 LABEL Lb_CGC_CPF;
VALUE 'CNPJ/CPF' ;
WIDTH 60 ;
HEIGHT 30 ;
FONT 'ARIAL' SIZE 9
@ 020,310 TEXTBOX TxtCGC_CPF;
HEIGHT 25 ;
WIDTH 130 ;
FONT 'ARIAL' SIZE 9;
TOOLTIP "Digite o CNPJ ou CPF do Cliente";
MAXLENGTH 20 ;
ON LOSTFOCUS CriaMascara();
ON ENTER Iif (conf_CGC_CPF(Novo_Cliente.TxtCGC_CPF.Value ), Novo_Cliente.TxtNOME.SetFocus,;
NIL)
onde: TxtNOME é o próximo campo a ser inserido/editado.
As função (
CriaMascara) exigida no caso de LOSTFOCUS é esta:
/*
Funcão que cria máscara para CNPJ e CPF e atualiza TextBox
*/
FUNCTION CriaMascara()
Local i := 0
Local cCGC := AllTrim( Novo_Cliente.TxtCGC_CPF.Value ) && Pega dados digitados no TextBox sem nenhum espaço
Local cNewCGC := ""
*** Entra no contador de 1 até o Tamanho da varivel cCGC
For i := 1 To Len( cCGC )
*** Acumula na Variável cNewCGC apenas os Digitos de 0 - 9
cNewCGC += Iif( IsDigit( Substr( cCGC , i , 1 ) ) , Substr( cCGC , i , 1 ) , "" )
Next
*** Se Cliente for pessoa Juridica coloca máscara para CGC
If Novo_Cliente.Pessoa_Juridica.Value
Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 99.999.999/9999-99" ) )
Else
*** Caso contrário, coloca máscara para CPF
Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 999.999.999-99" ) )
EndIf
Return Nil
Já a função (
Conf_CGC_CPF) da cláusula ON ENTER está assim criada:
FUNCTION conf_CGC_CPF
Local i := 0
Local cCGC := AllTrim( Novo_Cliente.TxtCGC_CPF.Value ) && Pega dados digitados no TextBox sem nenhum espaço
Local cNewCGC := ""
*** Entra no contador de 1 até o Tamanho da variável cCGC
For i := 1 To Len( cCGC )
*** Acumula na Variável cNewCGC apenas os DÃgitos de 0 - 9
cNewCGC += Iif( IsDigit( Substr( cCGC , i , 1 ) ) , Substr( cCGC , i , 1 ) , "" )
Next
*** Se Cliente for pessoa JurÃdica coloca máscara para CGC
If Novo_Cliente.Pessoa_Juridica.Value
Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 99.999.999/9999-99" ) )
Else
*** Caso contrário, coloca máscara para CPF
Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 999.999.999-99" ) )
EndIf
if len(cNewCGC) == 0 // aceita digitação vazia para casos que não se conhece o CNPJ ou o CPF
return .t.
endif
if len(cNewCGC) > 0 .and. len(cNewCGC) < 12 // tratamento para CPF
if (! cic(cNewCGC))
msgstop("C.P.F. inválido ! ")
return .f.
endif
else
if (! cic(cNewCGC))
msgstop("C.N.P.J. inválido ! ")
return .f.
endif
endif
return nil
A função auxiliar (
CIC) que realmente confere os dois últimos algarismos de um CNPJ ou CPF está assim:
FUNCTION cic() // função que confere os dois últimos algarismos do número informado
PARAMETER c_ic
LOCAL d_1, d_2, x_x, con_ta, digito, res_to
d_1 := 0
d_2 := 0
x_x := 1
for con_ta := 1 TO len(c_ic) - 2
if at(subs(c_ic,con_ta,1),"/-.") == 0
d_1 := d_1+(11-x_x) * val(substr(c_ic,con_ta,1))
d_2 := d_2+(12-x_x) * val(substr(c_ic,con_ta,1))
x_x := x_x + 1
endif
next
res_to := d_1 - (int(d_1/11)*11)
dig_ito := iif(res_to < 2,0,11-res_to)
d_2 := d_2 + 2 * dig_ito
res_to := d_2 - (int(d_2/11) * 11)
dig_ito := val(str(dig_ito,1) + str(iif(res_to < 2,0,11-res_to),1))
if dig_ito <> val(substr(c_ic,len(c_ic)-1,2))
msgstop("CNPJ/CPF não conferiu")
return .f.
else
msgstop("CNPJ/CPF conferiu")
return nil
endif
return nil