Create Table Clientes ( Codigo Int Identity Constraint Clientes_Codigo_PK Primary Key, Cpf Char(14) Constraint Clientes_Cfp_Formato Check (Cpf Like '[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9]-[0-9][0-9]') NOT NULL Constraint Clientes_CPF_Unico Unique NonClustered, Nome Char(50) NOT NULL, Endereco Char(50), Ocupacao Char(50) Constraint Clientes_Ocupacao_Default Default 'Consultor Independente' )Com esta tabela criada no banco de dados Estudo do SQL Server, vou tentar fazer algumas inclusões no VFP:
nConn = SQLStringConnect("driver={sql server};server=(local);database=estudo") ? SQLExec(nConn,[Insert Into Clientes (Cpf, Nome) Values ('000.000.000-00','Meu Primeiro Cliente')]) ? SqlDisconnect(nConn)Ok - Até aqui tudo perfeito... Inclui meu primeiro cliente. Vamos continuar!
nConn = SQLStringConnect("driver={sql server};server=(local);database=estudo") ? SQLExec(nConn,[Insert Into Clientes (Cpf, Nome) Values ('00.000.000-00','Meu Segundo Cliente')]) * Erro: O Formato do Campo está fora das regras... ? Str(SqlError[1,1])+" - "+SqlError[1,3] * A mensagem é essa: * 1526 - [Microsoft][ODBC SQL Server Driver][SQL Server]INSERT statement conflicted with COLUMN CHECK constraint 'Clientes_Cfp_Formato'. The conflict occurred in database 'Estudo', table 'Clientes', column 'Cpf'. ? SQLExec(nConn,[Insert Into Clientes (Cpf, Nome) Values ('000.000.000-00','Meu Segundo Cliente')]) * Erro: O campo CPF foi duplicado! * A mensagem é essa: * 1526 - [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of UNIQUE KEY constraint 'Clientes_CPF_Unico'. Cannot insert duplicate key in object 'Clientes'. ? SqlDisconnect(nConn)Bom, agora o bicho pegou... Eu entendi perfeitamente o que aconteceu, mas o usuário não vai entender isso de jeito nenhum. Preciso de uma mensagem amigável, algo como: Erro 1526 - Formato do CPF inválido! ou então ,Erro 1526 - CPF já cadastrado!
Function ChecarClientes m.MsgErro = Iif(Empty(Nome),'Nome não informado'+Chr(13),'')+; Iif(FormatoInvalidoCPF(Cpf),'Formato do CPF inválido'+Chr(13),'') Return Empty(m.MsgErro) EndFuncEntão, a variável m.MsgErro já foi declarada anteriormente e se um trigger falhar, basta pegar a mensagem nesta variável e exibir para o usuário.