Gå til innhold

duplikatkontroll i accesstabell


Anbefalte innlegg

Jeg har nå en tabell som er satt til å ikke kunne ha dublikat i feltene ID og type.

 

Altså kan ikke 2 varer ha samme id eller samme type.

 

Id er grei, for den er satt til autoincrement.

 

Det jeg må få til er en rutine som sjekker om type ligger inne fra før. type er en streng.

 

Hvordan fikser jeg det lettest?

 

Må gjøre et søk på dette feltet gjennom alle radene i tabellen og sammenligne med den nye inputen som skal inn?

 

Ettersom type er indexert, kan jeg sjekke duplikat på noen enklere måte?

Lenke til kommentar
Videoannonse
Annonse

Det enkleste blir nok å rett og slett søke igjennom tabellen (beklager de engelske kommentarene, benyttet et kodeksempel fra et gammelt prosjekt):

    On Error Resume Next

    Dim Types As Object, Values As New Collection, bFound As Boolean, sType As String

 

    ' Open the recordset

    Set Types = CurrentDb.OpenRecordset("Types")

 

    ' Move to the first element

    Types.MoveFirst

   

    ' Loop through all the current elements

    Do Until Types.EOF Or Types.BOF

   

        ' Retrieve the current index

        sType = Types("Type")

   

        ' Reset and query the collection

        bFound = False

        bFound = Values(sType)

       

        ' See if the value already exits, if so, delete it

        If bFound Then

       

            ' Delete the current element

            Types.Delete

 

        Else

       

            ' Use a collection to save the found values

            Values.Add True, sType

       

        End If

 

        ' Move to the next element

        Types.MoveNext

 

    Loop

   

    ' Close it

    Set Types = Nothing

Lenke til kommentar
Det enkleste blir nok å rett og slett søke igjennom tabellen (beklager de engelske kommentarene, benyttet et kodeksempel fra et gammelt prosjekt):
    On Error Resume Next

    Dim Types As Object, Values As New Collection, bFound As Boolean, sType As String

 

    ' Open the recordset

    Set Types = CurrentDb.OpenRecordset("Types")

 

    ' Move to the first element

    Types.MoveFirst

   

    ' Loop through all the current elements

    Do Until Types.EOF Or Types.BOF

   

        ' Retrieve the current index

        sType = Types("Type")

   

        ' Reset and query the collection

        bFound = False

        bFound = Values(sType)

       

        ' See if the value already exits, if so, delete it

        If bFound Then

       

            ' Delete the current element

            Types.Delete

 

        Else

       

            ' Use a collection to save the found values

            Values.Add True, sType

       

        End If

 

        ' Move to the next element

        Types.MoveNext

 

    Loop

   

    ' Close it

    Set Types = Nothing

6320290[/snapback]

 

 

OK.

I eksempelet ditt her heter tabellen types, og feltet type.

Hva skjer her:

sType = Types("Type")

 

og her:

 

bFound = False

bFound = Values(sType)

 

Er sType verdien f.eks brukeren taster inn, som det sjekkes mot?

 

Får denne til å gå i uendelig løkke uansett om typen dfinnes eller ikke...

 

( og hvorfor Do Until mat.EOF Or mat.BOF ? Holder det ikke med EOF? )

Endret av [space]
Lenke til kommentar
Hva skjer her:

sType = Types("Type")

6321580[/snapback]

Den henter ut den nåværende verdien i kolonnen Type.

og her:

bFound = False

bFound = Values(sType)

6321580[/snapback]

Først tilbakestiller vi verdien i variablene som viser hvorvidt vi har funnet verdien eller ei. Neste linje søker opp i Collection-objektet etter en gitt indeks (sType). Dersom indeksen eksisterer i objektet, returneres True.

 

Er sType verdien f.eks brukeren taster inn, som det sjekkes mot?

6321580[/snapback]

Vel, ikke helt. sType inneholder som nevnt den markerte celles verdi i kolonne Type.

 

Får denne til å gå i uendelig løkke uansett om typen dfinnes eller ikke...

6321580[/snapback]

Fjern "On Error Resume Next" og se hvilken feilmelding som oppstår først. Jeg utformet koden hovedskalig med VBA-modulen i Access i tankene, men det skulle gå med alle VB-versjoner mellom og inklusiv VB4 og VB6.

 

( og hvorfor Do Until mat.EOF Or mat.BOF ? Holder det ikke med EOF? )

6321580[/snapback]

Det er kun for å forhindre en uendelig løkke dersom tabellen er tom. Da vil ikke EOF returnere True.

Lenke til kommentar

Tja, i så fall kan du muligens bruke noe så som dette:

Sub Main()

 

    ' See whether or not the input is already present

    If IsPresent(CurrentDb, "SELECT Type FROM Types WHERE Type='" & txtType.txt & "'") Then

        ' If so, don't add it.

    Else

        ' Add it.

        ' *code to add the element here*

    End If

 

End Sub

 

Public Function IsPresent(Database As Object, Query As String) As Boolean

 

    Dim Table As Object

 

    ' Execute the query

    Set Table = Database.OpenRecordset(Query)

   

    ' See if we have selected any elements

    IsPresent = Not (Table.EOF Or Table.BOF)

   

End Function

Endret av aadnk
Lenke til kommentar
Jeg har nå en tabell som er satt til å ikke kunne ha dublikat i feltene ID og type.

 

Altså kan ikke 2 varer ha samme id eller samme type.

 

Id er grei, for den er satt til autoincrement.

 

Det jeg må få til er en rutine som sjekker om type ligger inne fra før. type er en streng.

 

Hvordan fikser jeg det lettest?

 

Må gjøre et søk på dette feltet gjennom alle radene i tabellen og sammenligne med den nye inputen som skal inn?

 

Ettersom type er indexert, kan jeg sjekke duplikat på noen enklere måte?

6318906[/snapback]

 

Jeg ville vel bare ha prøvd å kjøre en INSERT og så fanget opp exception'en som kastes dersom du prøver å sette inn en type som eksisterer.

 

Øyvind.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...