[space] Skrevet 16. juni 2006 Del Skrevet 16. juni 2006 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
aadnk Skrevet 16. juni 2006 Del Skrevet 16. juni 2006 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
[space] Skrevet 16. juni 2006 Forfatter Del Skrevet 16. juni 2006 (endret) 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 16. juni 2006 av [space] Lenke til kommentar
aadnk Skrevet 16. juni 2006 Del Skrevet 16. juni 2006 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
[space] Skrevet 16. juni 2006 Forfatter Del Skrevet 16. juni 2006 Jeg må jo sammenligne med verdien brukeren har skrevet inn. Hvor skjer dette? (inputfeltet mitt heter txtType.Text) Ser ut til at den går gjennom med false på 1. gjennomkjøring. Neste loop så blir bFound = True, og den går i uendelig loop. Lenke til kommentar
aadnk Skrevet 16. juni 2006 Del Skrevet 16. juni 2006 (endret) 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 16. juni 2006 av aadnk Lenke til kommentar
[space] Skrevet 20. juni 2006 Forfatter Del Skrevet 20. juni 2006 Funka bra den siste der ja! Flotte saker. Lenke til kommentar
oyvind_b Skrevet 23. juni 2006 Del Skrevet 23. juni 2006 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå