CRIAR UM VERIFICADOR COM CONDI?ÃO DE DUAS TABELAS

MILTONSILVA94 25/02/2016 08:27:36
#458190
Eu quis dizer que a lógica é esta... Fazer um SELECT para verificar o nº dos registros...
ACCIOLLY 25/02/2016 13:06:26
#458196
O que aconteceria se você tentasse apagar um registro pai com registros filhos em outra tabela sem que fizesse essa contagem de registros?
MILTONSILVA94 25/02/2016 20:46:07
#458222
Conforme disse, no meu código o máximo que consegui fazer nesta parte é que ele exclui o registro se não está vinculado em algum usuário, se tiver ele não vai excluir daí.
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.
MILTONSILVA94 25/02/2016 20:59:15
#458224
ACCIOLLY o código abaixo eu coloco em qual parte:

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
ACCIOLLY 25/02/2016 22:40:37
#458226
MILTONSILVA94 segundo o estudo do seu caso de uso em uma resposta anterior, que dizia o seguinte:

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
MILTONSILVA94 26/02/2016 12:47:19
#458247
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...
MILTONSILVA94 26/02/2016 13:51:44
#458250
Montei a rotina do anexo, e única coisa que falta arrumar é a linha que está marcada, pois se eu conseguir montar um select para ele contar os registros dentro daquela condição para os usuários para cada perfil, já resolve o problema. A rotina bem dizer é esta:

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;

ACCIOLLY 26/02/2016 14:46:51
#458260
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
MILTONSILVA94 26/02/2016 15:31:11
#458263
Sim sim, aquele if que está grifado eu queria colocar um select do tipo:

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.
ACCIOLLY 26/02/2016 15:37:45
#458264
Não precisa fazer um select com inner join
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
Página 3 de 4 [36 registro(s)]
Tópico encerrado , respostas não são mais permitidas