CRIAR UM VERIFICADOR COM CONDI?ÃO DE DUAS TABELAS
Criei uma constraint na tabela dos usuários:
ALTER TABLE USUARIOS
ADD CONSTRAINT fk_Usuarios_Perfis
FOREIGN KEY (id_perfil)
REFERENCES PERFIS(id_perfil);
Só preciso mesmo encontrar uma maneira para que isso dê certo, que o sistema emita uma mensagem de erro quando o perfil estiver vinculado a um usuário, o que atualmente eu não consegui montar no app.
Try
MsgBox [Ô]Registro excluido com sucesso![Ô]
Catch ex As Exception
MsgBox [Ô]Erro ao tentar excluir registro[Ô] & ex.Message
End Try
Meu código atual:
Private Sub RotinaExcluir()
Dim lsql As String
If lvwLista.ListItems.Count = 0 Then
MensagemDoSistema [Ô]Erro! Selecione um registro para fazer a exclusão![Ô]
txtDescricaoPerfil.Text = [Ô][Ô]
txtDescricaoPerfil.SetFocus
Exit Sub
End If
If MsgBox([Ô]Excluir o registro Nº [ô][Ô] & lvwLista.SelectedItem & [Ô][ô]?[Ô], vbQuestion + vbYesNo, [Ô]Exclusão - Sistema Integrado :: Versão: [Ô] & App.Major & [Ô].[Ô] & App.Minor & [Ô].[Ô] & App.Revision) = vbNo Then
Exit Sub
End If
If MsgBox([Ô]Confirma a exclusão do registro?[Ô], vbQuestion + vbYesNo, [Ô]Confirmar - Sistema Integrado :: Versão: [Ô] & App.Major & [Ô].[Ô] & App.Minor & [Ô].[Ô] & App.Revision) = vbNo Then
Exit Sub
End If
lsql = [Ô]DELETE FROM PERFIS WHERE id_perfil=[Ô]
lsql = lsql & lvwLista.SelectedItem
gBDSistemaIntegrado.Execute lsql
[ô]MsgBox [Ô]Registro removido![Ô]
lvwLista.ListItems.Remove (lvwLista.SelectedItem.Index)
txtDescricaoPerfil.Text = [Ô][Ô]
lvwLista.ListItems.Clear
lblContador.Caption = [Ô][Ô]
txtDescricaoPerfil.SetFocus
End Sub
Citação:A lógica é a seguinte:
1º - Usuário vai selecionar o perfil no listview
2º - Usuário vai no botão excluir
[txt-color=#e80000]3º - Sistema precisa entender se já existe algum usuário para aquele perfil, e se sim vai emitir mensagem bloqueando a exclusão
4º - Caso não exista nenhum usuário cadastrado com aquele perfil, continua as rotinas seguintes[/txt-color]
Assim por diante...
Quando falei sobre o [txt-color=#e80000]try catch[/txt-color], que na verdade é da plataforma .Net, não significa que ela possa ser usada somente no .Net. No VB6 a função [txt-color=#e80000]On Error GoTo[/txt-color] faz a mesma coisa, pois ambas são tratamentos de erro, de sintaxes distintas, mas a lógica é sempre a mesma.me desculpe pela resposta de forma grosseira que te dei antes. Mas as vezes agente precisa sacudir um pouco as pessoas pra pelo menos tentar ver se existe outra solução talvez até mais fácil, mesmo que tenha que excluir várias e várias linhas de codificação! é isso mesmo! E esse é exatamente o seu caso! Por favor leia novamente sua colocação que citei logo acima depois acompanhe meu raciocÃcio abaixo.
Sua codificação é em VB6 portanto esquece Try Catch, vamos trabalhar com On Error GoTo. Na sua ultima resposta você me perguntou em qual parte colocaria o código, mas você não vai encaixar em lugar algum! vai substituir todo ele! Olhe bem:
Private Sub RotinaExcluir()
On Error GoTo trata_erro
If MsgBox([Ô]Confirma a exclusão do registro?[Ô], vbQuestion + vbYesNo, [Ô]Confirmar - Sistema Integrado :: Versão: [Ô] & App.Major & [Ô].[Ô] & App.Minor & [Ô].[Ô] & App.Revision) = vbNo Then
lsql = [Ô]DELETE FROM PERFIS WHERE id_perfil=[Ô]
lsql = lsql & lvwLista.SelectedItem
gBDSistemaIntegrado.Execute lsql
MsgBox [Ô]Registro removido![Ô]
lvwLista.ListItems.Remove (lvwLista.SelectedItem.Index)
txtDescricaoPerfil.Text = [Ô][Ô]
lvwLista.ListItems.Clear
lblContador.Caption = [Ô][Ô]
txtDescricaoPerfil.SetFocus
End If
Exit Sub
trata_erro:
MsgBox [Ô]Você não pode excluir este perfil pois o mesmo pertence a um ou mais usuários![Ô]
Resume Next
End Sub
Pronto meu irmão! isso já é suficiente. Como pode ver não há necessidade alguma de fazer uma verificação pra saber se na entidade filha existem atributos da entidade pai! Porque? Ao tentar excluir um atributo pai com atributos filhos em outras tabelas é gerado um erro. A linha [txt-color=#e80000]On Error GoTo[/txt-color] significa em caso de erro vá para. Então ele vai percorrer todas as linhas entre On Error GoTo e Exit Sub. Se entre essas linhas ocorrer um erro qualquer, que nesse caso só pode ser gerado pelo banco, vai direto pra mensagem de que não pode excluir o registro e tal... A ultima linha [Ô]Resume Next[Ô] serve pra que a aplicação não Feche!
Ufa! espero que tenha entendido! em todo caso dá uma olhada nesse tuto do macoratti: http://www.macoratti.net/erros.htm
Substitui todo esse seu código por esse depois me diz como ficou
Té Mais
Porém, note que se eu montar da maneira que você disse, quando o usuário selecionar o perfil que está vinculado a algum usuário o sistema acaba emitindo as duas mensagens:
[ô]MsgBox [Ô]Registro removido![Ô][ô] e logo em seguida aparece a outra abaixo:
[ô]MsgBox [Ô]Você não pode excluir este perfil pois o mesmo pertence a um ou mais usuários![Ô] [ô] aparece 2x daà se eu tirar o [ô]Resume Next[ô] ele só aparece uma vez, mas mesmo se o registro não pode ser excluÃdo, a rotina de exclusão não pode aparecer, correto?
Sei que tá complicado, mas falta pouco...
Private Sub RotinaExcluir()
dbname = App.Path & [Ô]\BDSistemaIntegrado.mdb[Ô]
Dim lsql As String
Dim lTBPerfis As Recordset
Set db = DBEngine.Workspaces(0).OpenDatabase(dbname)
Set rs = db.OpenRecordset([Ô]PERFIS[Ô])
If lvwLista.ListItems.Count = 0 Then
MsgBox [Ô]Erro! Selecione um registro para fazer a exclusão![Ô]
Exit Sub
End If
If rs.RecordCount > 1 Then
MsgBox [Ô]Você não pode excluir este perfil pois o mesmo pertence a um ou mais usuários![Ô]
Else
lsql = [Ô]DELETE FROM PERFIS WHERE id_perfil=[Ô]
lsql = lsql & lvwLista.SelectedItem
gBDSistemaIntegrado.Execute lsql
MsgBox [Ô]Registro removido![Ô]
Exit Sub
End If
End Sub
O select que estava pensando é tipo assim:
SELECT USUARIOS.descricao_perfil, PERFIS.descricao_perfil
FROM USUARIOS INNER JOIN PERFIS
WHERE USUARIOS.descricao_perfil = PERFIS.descricao_perfil;
Citação:Execelente tua explicação ACCIOLLY!!!
Porém, note que se eu montar da maneira que você disse, quando o usuário selecionar o perfil que está vinculado a algum usuário o sistema acaba emitindo as duas mensagens:
[ô]MsgBox [Ô]Registro removido![Ô][ô] e logo em seguida aparece a outra abaixo:
[ô]MsgBox [Ô]Você não pode excluir este perfil pois o mesmo pertence a um ou mais usuários![Ô] [ô] aparece 2x daà se eu tirar o [ô]Resume Next[ô] ele só aparece uma vez, mas mesmo se o registro não pode ser excluÃdo, a rotina de exclusão não pode aparecer, correto?
Sei que tá complicado, mas falta pouco...
Não é que a rotina de exclusão não possa aparecer, ela na verdade tem que ser executada para gerar ou não um erro. Em caso de erro, vai para a linha [Ô]trata_erro:[Ô], senão ele prossegue até exit sub. Quanto ao resume next, você pode estar trocando também por exit sub, que ele vai sair da subrotina.
No mais não posso te dizer que esteja certo ou errado o que te passei, até porque não trabalho mais com o vb6 e portanto não posso testar essas codificações. O que fiz alà é só das minhas lembranças...
Mas se a mensagem de erro foi retornada, já que você testou, significa que o tratamento de erro funciona, só não foi montado corretamente. Por isso que te passei aquele tutorial do macoratti.
Quanto aquelas linhas selecionadas na imagem em anexo, o erro que posso te falar agora pra é trocar o 1 po 0.
if rs.RecordCount > 0
Pois do jeito que você deixou, mesmo se o resultado da pesquisa retornar 1 registro, ainda vai dar erro ao tentar apagar do banco.
PS. por essas e outras que larguei do VB6 e fui pro .Net
SELECT USUARIOS.descricao_perfil, PERFIS.descricao_perfil
FROM USUARIOS INNER JOIN PERFIS
WHERE USUARIOS.descricao_perfil = PERFIS.descricao_perfil;
para que ele pegasse somente os registros vinculados no perfil, mas isso não consigo entender a lógica para formar.
apenas faça isso:
SELECT descricao_perfil FROM usuarios WHERE descricao_perfil LIKE [ô][Ô] & lvwLista.SelectedItem & [Ô][ô]
Troque [Ô]PERFIS[Ô] dentro dos parenteses de db.OpenRecordSet por esse select. E mesmo assim ele deve estar dentro da estrutura de decisão que pede pra selecionar um perfil na listview