Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Evangelion

Evitar duplicação de registo na base de dados

Recommended Posts

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  :)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 ..  :)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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  :)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.