MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


2 participantes

    [Resolvido] Tratamento Dados Duplicados

    nioxys
    nioxys
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 68
    Registrado : 04/01/2012

    [Resolvido] Tratamento Dados Duplicados Empty [Resolvido] Tratamento Dados Duplicados

    Mensagem  nioxys 20/2/2012, 21:52

    Olá a todos Smile

    Estou a desenvolver uma pequena base de dados para gerir de uma forma mais funcional um trabalho que executamos na empresa onde trabalho. Nessa mesma base de dados tenho duas tabelas, uma Cliente e outra com o nome CortesBTN e a relação entre as duas é feita através do campo instalação onde um cliente pode ter vários cortesBTN.
    Essa base de dados possuí 3 formulários, um menu inicial, um formulário de pesquisa e um formulário para visualização/edição e inserção de novos clientes/cortesbtn.

    No formulário de visualização dos dados, a que eu chamei de Detalhe, existem campos referentes à tabela cliente e campos referentes à tabela cortesbtn, sendo que os dados da tabela cortesbtn são mostrados através de um subformulário.

    Eu introduzo vários cliente e como já disse esses mesmos clientes podem ter vários cortesBTN, ou seja, o cliente pode já estar "registado" e eu apenas necessito de acrescentar o respectivo corteBTN. Então eu criei um pequeno código que na fase de inserção de um novo cliente me diga se este já existe ou não e isso é feito através da análise do campo "instalação", ou seja, aquando da inserção deste código numa caixa de texto (quando esta perde o focus) é analisado se o cliente existe ou não, aparecendo uma mensagem caso exista e onde é feita a pergunta ao utilizador se deseja editar o registo existente (inserir um novo corteBTN associado aquele cliente)ou não.

    O meu problema está aqui, consigo fazer com que seja feita essa verificação, aparece a mesnagem a dizer que a instalação x já existe mas quando clico para editar apenas consigo editar os dados da tabela Clientes porque quando clico no subformulário onde estão os dados da tabela cortesBTN aparece a seguinte mensagem,

    "As alterações pedidas para a tabela não foram bem sucedidas pois iriam criar valores duplicados no índice ou no relacionamento, altere o índice ou remova o índice para que as entradas possam ser duplicadas..."

    Eu queria que "ele" percebesse que não quero duplicar os dados mas sim editar os mesmo mas não sei como fazê-lo.

    O meu código é o seguinte,

    (eu não tenho grandes conhecimentos em VBA nem mesmo em base de dados, sou um curioso vou lendo e aprendendo)

    Código:
    Private Sub instalação_BeforeUpdate(Cancel As Integer)

    Dim rst As Recordset
    Dim banco As Database
    Dim instal, StrSQL As String
    Dim response As VbMsgBoxResult

    'Set rst = CurrentDb.OpenRecordset("Clientes", dbOpenTable)
    Set banco = CurrentDb
    Set rst = banco.OpenRecordset("Clientes")

    instal = Me.instalação

    With rst
    'Informa o nome do índice na tabela.
    .Index = "PrimaryKey"
    'Pesquisa o campo na tabela.
    .Seek "=", instal
    'Se encontrar, então...

    If Not .NoMatch Then

    response = MsgBox("A instalação '" & (instal) & "' já existe!" + Chr$(13) & "Deseja editar o registo existente ou inserir um novo? " + Chr$(13) & "Para editar clique Sim" + Chr$(13) & "Para inserir novo clique Não", vbYesNo, "Instalação Existente")

    If response = vbYes Then
    StrSQL = "SELECT cNOme, cMorada, cContacto, Concelho" & _
    " FROM clientes" & _
    " WHERE instalação = '" & instalação.Text & "';"
    Set banco = CurrentDb
    Set rst = banco.OpenRecordset(StrSQL)
    Me.AllowEdits = True
    Me.CortesBTN2.Form.AllowEdits = True
    Me.CortesBTN2.Form.AllowAdditions = True

    Me.cNome = rst.Fields("cNome").Value
    Me.cMorada = rst.Fields("cMorada").Value
    Me.cContacto = rst.Fields("cContacto").Value
    Me.CConcelho = rst.Fields("Concelho").Value

    Else
    instalação.Undo 'limpa a caixa de texto
    Cancel = True 'Cancela o evento.
    End If
    End If
    End With
    Set rst = Nothing 'Libera memória.
    End Sub

    No código e na BD tenho escrito "instalação" onde deveria ter escrito "instalacao", sei que não é uma boa prática mas é o hábito de tentar escrever de forma correcta. Smile

    Deixo também a minha base de dados (caso queiram testar podem inserir o código/instalação 0003063628, já se encontra registado)


    Desde já o meu obrigado. E desculpem o testamento. Smile

    Anexos
    [Resolvido] Tratamento Dados Duplicados AttachmentCortes.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (643 Kb) Baixado 36 vez(es)


    Última edição por nioxys em 22/2/2012, 09:11, editado 1 vez(es)
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido] Tratamento Dados Duplicados Empty Re: [Resolvido] Tratamento Dados Duplicados

    Mensagem  Dilson 21/2/2012, 05:13

    Olá nioxys, seja bem vindo ao fórum!

    O problema não é com seu subform.

    O inicio do problema está quando você aperta o botão "Novo" no menu. Veja que com isso chamas o form "Detalhe" em modo de adição. Da hora que fazes a pesquisa e diz que quer editar ele preenche neste form em modo de adição que recebe o resultado e ... realiza-se um novo registro e com isso fica emitindo a mensagem de duplicação que com toda certeza duplicou após ter preenchido um número de instalação que já existe na tabela.

    A saída será criar um form inicial somente para se consultar a instalação e caso exista e queira editar, abre o form detalhes usando um critério contendo o número da instalação algo assim:

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "Detalhe"

    stLinkCriteria = "[instalação]=" & Me![instalação]
    DoCmd.OpenForm stDocName, , , stLinkCriteria

    Caso não exista, abre em modo de adição, assim como fez:

    DoCmd.OpenForm "Detalhe", , , , acFormAdd, , "Novo"


    Rapidamente eu simulei assim na base e deu certo:

    Copiei e colei o form Detalhe e dei o nome Detalhe_Editar

    No antes de atualizar do campo instalação do form Detalhe coloquei:
    Código:
    Dim rst As Recordset
    Dim banco As Database
    Dim instal As String
    Dim response As VbMsgBoxResult

    Set banco = CurrentDb
    Set rst = banco.OpenRecordset("Clientes")

    instal = Me.instalação

    With rst
    'Informa o nome do índice na tabela.
    .Index = "PrimaryKey"
    'Pesquisa o campo na tabela.
    .Seek "=", instal
    'Se encontrar, então...

    If Not .NoMatch Then

        response = MsgBox("A instalação '" & (instal) & "' já existe!" + Chr$(13) & "Deseja editar o registo existente ou inserir um novo? " + Chr$(13) & "Para editar clique Sim" + Chr$(13) & "Para inserir novo clique Não", vbYesNo, "Instalação Existente")
       
            If response = vbYes Then
       
                Dim stDocName As String
                  Dim stLinkCriteria As String

                      stDocName = "Detalhe_Editar"
     
                        stLinkCriteria = "[instalação]=" & Me![instalação]
                            DoCmd.OpenForm stDocName, , , stLinkCriteria
                           
                        Else
              DoCmd.OpenForm "Detalhe_Editar", , , , acFormAdd, , "Novo"
            End If
        End If
    End With
    Set rst = Nothing 'Libera memória.

    Precisei ir nas tabelas e mudar o tipo de dado do campo intalação (chave primária), tava como texto, mudei para numero (isso para que o critério funcione na filtragem e abertura de registro entre forms).
    nioxys
    nioxys
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 68
    Registrado : 04/01/2012

    [Resolvido] Tratamento Dados Duplicados Empty Re: [Resolvido] Tratamento Dados Duplicados

    Mensagem  nioxys 21/2/2012, 14:37

    Olá Dilson, muito obrigado.

    Funciona muito bem. Smile

    Você mudou o tipo de dados do campo instalação para número mas agora eu não consigo limitar o número de caracteres a inserir (10) nem consigo colocar uma máscara de inserção que neste caso é útil para melhorar a leitura do número assim como os três primeiros zeros do número de instalação desaparecem, tem como dar a volta a isso?

    Tirando isso só tenho de fazer uns ajustes nos botões e em alguns acontecimentos dos formulários de forma a que o utilizador sempre que feche um formulário o menu abra.
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido] Tratamento Dados Duplicados Empty Re: [Resolvido] Tratamento Dados Duplicados

    Mensagem  Dilson 21/2/2012, 18:21

    A saída politicamente correta é promover a criação de Chave primária e chave estrangeira nas suas tabelas

    Exemplo:

    Ao invés da relação das tabelas se guiar por:

    [instalação]<>[instalação]

    Se guiaria por exemplo:

    [id]<>[id]

    - A chave primária com tipo de dado Numeração automática na tabela Clientes
    - A chave estrangeira com tipo de dado Número na tabela Cortes

    Dessa forma toda comunicação entre objetos do seu banco seria feita através dos "Id's"

    O seu campo instalação deixaria de ser chave primária que te permitiria deixá-lo na formatação que desejasse sendo ele na tabela apenas "indexado(Duplicação não autorizada)"

    nioxys
    nioxys
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 68
    Registrado : 04/01/2012

    [Resolvido] Tratamento Dados Duplicados Empty Re: [Resolvido] Tratamento Dados Duplicados

    Mensagem  nioxys 22/2/2012, 09:10

    Olá.

    Vou seguir o seu concelho e mudar a estrutura a esse nível.
    Obrigado pela ajuda. Smile

    Conteúdo patrocinado


    [Resolvido] Tratamento Dados Duplicados Empty Re: [Resolvido] Tratamento Dados Duplicados

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 28/3/2024, 09:37