Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Evangelion

Evitar duplicação de registo na base de dados

Mensagens Recomendadas

Evangelion

:wallbash: boas, gostaria de saber se alguém me poderia dar uma ajudinha  :)

Ando aqui ás voltas a procura da validação correcta para quando for a gravar um numero de BI não haja um registo com o mesmo número do BI na base de dados ..

Não consigo de maneira nenhuma encontrar maneira de dar volta ao problema  🤔

Se alguém souber agradeço  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FreiNando

Cria um Indíce Único no Campo da tabela da base de dados onde ficará guardado o número de BI.

Isso evitará duplicação de valores.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

Pois já percebi, e depois o que é que meto no código ? é que se fizer guardar e houver outro registo igual vai dar debug ..  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FreiNando

Podes usar o On Error Goto para passar o erro, mostrando uma mensagem a avisar o utilizador que o número já existe.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

Também pensei nisso, e fiz, mas não deu, pois o que falta é a validação.. se calhar até é uma validação simples, mas eu não sei ou não aprendi, porque o que eu dou na escola é muito limitado  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FreiNando

Posso te ajudar, mas preciso saber que base de dados usas e quais os objectos que tens no programa para ligar à base de dados.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

eu não sei se é possível fazer isto, mas eu deixava o programa num site e tu ias lá busca-lo e assim percebias melhor, ainda dizia para aqui alguma asneira  :dontgetit:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

http://fenix.esal.edu.pt/~11mn6/Nova%20pasta/

é só clicares no unknown.gifTrabalho4 Programa.rar que aparece logo para fazer download :)

Ainda estou a acabar o trabalho, mas o que me falta é mesmo na form5 no Guardar que está por detrás do Editar no meio das validações no txtcc.text validar de maneira que não deixe repetir o "CC" da Base de dados .. não sei se me estou a fazer entender :S

Ah e se vires alguma coisa de patético não gozes, ainda sou inexperiente  :cheesygrin:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FreiNando

Já olhei para o teu programa. Para evitares registos com duplicação de CC(Cartão do Cidadão) deves fazer o seguinte:

1- Inserir no Campo [CC] da tabela [Clientes] o indice unico,

    para isso basta executares este código uma só vez,

    colocando-o por exemplo no evento Click de um botão e depois remover:

    Dim db As Database
    Set db = OpenDatabase("D:\Internet\Downloads\Trabalho4 Programa\Dados.mdb")
    db.Execute "CREATE UNIQUE INDEX idxClientesCC ON Clientes (CC)"

2- A validação podes inserir antes da pergunta        mens = "Deseja guardar os novos dados?" o seguinte:

        Dim db As Database
        Dim rst As Recordset
        Set db = OpenDatabase("D:\Internet\Downloads\Trabalho4 Programa\Dados.mdb")
        'Nota: CC deveria ser Numero inteiro, mas como é texto....
         Set rst = db.OpenRecordset("SELECT * FROM Clientes WHERE CC LIKE'" & txtcc.Text & "'")
        If Not rst.EOF Then
            MsgBox "Número Cartão do Cidadão Já Existe"
            'Opcional:  serve para selecionar o texto a fim de ser alterado
             txtcc.SetFocus
            txtcc.SelStart = 0
            txtcc.SelLength = Len(txtcc.Text)
            Exit Sub
        End If
        
        'Simplificando
         If MsgBox("Deseja guardar os novos dados?", _
            vbYesNo + vbQuestion, "Confirmação") <> vbYes Then Exit Sub
        Data1.Recordset.Update
        

Se queres trabalhar com bases de dados convém aprenderes um pouco de SQL.  Também deves ponderar a hipótese de mudares para .NET , se queres aprender programação não comeces por uma desactualizada e sem futuro (sem ofensa aos que a usam), eu comecei na versão 4.0 e agora uso o Visual Studio 2008.

Para testar o teu programa usei o VB6 Portable, embora ainda tenha os CDs do Visual Studio 6 comprado em 1998.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

Bem, desculpa só responder agora, mas só tive possibilidade de vir a Internet agora..

Vou então tentar implementar o teu código, pois eu não sou realmente o melhor nestas coisas  👎

E em questões de mudares de programa isso não é comigo, pois no ano passado (10 ano) comecei com Pascal e ainda passei por Lazarus, este ano (11 ano) passei para o Visual Basic 6.0, e para o ano penso que vou para C++ ou lá o que é ..

Por isso não me cabe a mim decidir  :)

Agradeço desde já a tua dedicação em tentares me ajudar, obrigado  :D :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

Bem, está tudo bem, és um campeão FreiNando  :cheesygrin:

Só dá problema numa parte, é quando faço editar, e faço guardar sem mexer no cartão de cidadão vai dizer "Número Cartão do Cidadão Já Existe" , bem, tenho que tentar resolver esse problema  :)

abraço a todos  :cheesygrin:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FreiNando

Há vários modos de resolver isso.

O mais simples (na minha opinião) é criar uma variavel de texto no no inicio do código ex.: NumCC as String  , e na Sub cmdAdicionar_Click() logo depois de  Data1.Recordset.AddNew inserir NumCC = "", e na Sub cmdEditar_Click() após Data1.Recordset.Edit  inserir NumCC = txtcc.Text.

Com isto temos NumCC com o valor de CC antes de qualquer alteração. quando for feita a actualização basta verificar se o valor de txtcc.Text=NumCC e se for diferente então fazer a verificação que indiquei anteriormente, o deverá ficar assim:

'ElseIf Not rst.EOF Then  ''Linha existente
ElseIf NumCC <> txtcc.Text Then
    If Not rst.EOF Then
        MsgBox "Cartão do Cidadão já existente", vbOKOnly + vbExclamation, "Aviso"
        'Opcional:  serve para selecionar o texto a fim de ser alterado
         txtcc.SetFocus
        txtcc.SelStart = 0
        txtcc.SelLength = Len(txtcc.Text)
        Exit Sub
    End If

Desta forma se o numero de CC for alterado, é feita uma pesquisa a ver se existe repetição, caso contrário nem é preciso fazer pesquisa.

Não sei se estou sendo claro, por isso  em caso de dúvida, pergunta.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Evangelion

Bem, optei por criar uma variável global que ao iniciar é igual a 0, e quando faço editar é = 1 e bloqueia a txtcc.

Se quiseres ver como está o programa agora força :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.