Avatar billede doto Nybegynder
25. maj 2011 - 14:07 Der er 10 kommentarer og
1 løsning

Forespørgsel som kan tælle

I en database har jeg lavet en formular hvor man i et felt skal indtaste 'Hold nr'.
Indtastes der f.eks. 18-22 betyder det at der er tale om Hold nr. 18, 19, 20, 21 og 22 dvs. 5 hold i alt.
Jeg har ved siden af dette felt brug for et felt, 'Antal hold i alt', som automatisk kan regne ud at der er tale om 5 hold.
Hvordan skal denne forespørgsel se ud.
Jeg anvender Access 2010
Avatar billede mugs Novice
25. maj 2011 - 14:37 #1
I Access 2003:

SELECT Tabel1.hold, (Right([hold],2)-Left([hold],2))+1 AS udtryk1
FROM Tabel1;


Selve udtrykket ser således ud:

udtryk1: (Right([hold];2)-Left([hold];2))+1
Avatar billede hnteknik Novice
25. maj 2011 - 14:37 #2
Der er måske to muligheder,

enten kan udtrykket konverteres til 'tal',
så Antal = 1 - konverteret ("18-22")

eller opdele det i elementer right fra "-" minus left for "-" plus 1

Men hvorfor ikke lave f.eks. et antal ja/nej felter

18-19 check etc. og så tælle dem sammen, for hvad hvis der er et ledigt hold ind i mellem ?
Avatar billede Slettet bruger
25. maj 2011 - 15:12 #3
På EfterOpdateringshændelsen for dit indtastningsfelt vælger du kodegenerator og indsætter flg. kode:

Private Sub IndtastningsFelt_AfterUpdate()
On Error GoTo ErrHandling
Me.DitAntalHoldFelt = Mid(Me.IndtastningsFelt, (InStr(Me.IndtastningsFelt, "-") + 1)) - Left(Me.IndtastningsFelt, (InStr(Me.IndtastningsFelt, "-") - 1)) + 1
Exit Sub
ErrHandling:
If Err.Number = 5 Then
Me.DitAntalHoldFelt = 1
ElseIf Err.Number = 94 Then
Me.DitAntalHoldFelt = Null
Else
MsgBox "Forkert indtastning"
Me.DitAntalHoldFelt.SetFocus
Me.DitAntalHoldFelt = Null
Me.IndtastningsFelt = Null
Me.IndtastningsFelt.SetFocus
End If
End Sub
Avatar billede Slettet bruger
25. maj 2011 - 15:13 #4
Den løsning du har valgt virker ikke hvis du f.eks. skriver 7-11
Avatar billede mugs Novice
25. maj 2011 - 15:14 #5
Grundlæggende er det vel, at designet er forkert. Der burde være en separat tabel til holdnumrerne samt andre relevante data om holdet. i en situation med f.eks. en turnering, kan disse data så ved hjælp af combo's hentes ind i en turneringstabel. Derefter er det en smal sag at tælle hold i f.eks. en pulje.

hnteknik > Hvis der er et ledigt hold mellem holdene 18-22 er indtastningen jo forkert, så kan det ALDRIG hedde 18-22
Avatar billede Slettet bruger
25. maj 2011 - 15:14 #6
Nedenstående udtryk kan du også bruge direkte i et felt eller i en forespørgsel, du skal bare erstatte , med ;

Mid(Me.IndtastningsFelt, (InStr(Me.IndtastningsFelt, "-") + 1)) - Left(Me.IndtastningsFelt, (InStr(Me.IndtastningsFelt, "-") - 1)) + 1
Avatar billede doto Nybegynder
25. maj 2011 - 15:15 #7
Hej hnteknik og spg,

Tak for jeres forslag. Jeg forsøgte først mugs forslag og det virkede.

Og mugs: Tak for svaret!
Avatar billede mugs Novice
25. maj 2011 - 15:19 #8
Selv tak og tak for point.

spg > du har ret i 7-11, men det fungerer med 07-11. En vis indtastningsdisciplin må påregnes for en database.
Avatar billede Slettet bruger
25. maj 2011 - 16:54 #9
i lyset af hvor meget bredere 1-eval("7-11") tolker brugerinput, ser det i #8 ud til at være noget om graden af bortforklaringer der må påregnes ;)
Avatar billede mugs Novice
25. maj 2011 - 23:18 #10
brugerekspert > Sikke noget pladder at skrive!
Avatar billede hnteknik Novice
26. maj 2011 - 10:42 #11
Så så mugs - jeg syntes nu at 1-eval("7-11") er mere elegant.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester