Avatar billede Slettet bruger
10. august 2005 - 12:28 Der er 85 kommentarer og
1 løsning

Brug af SELECT forespørgsel i vba

SELECT TOP 1 Left([PalleNr],1) AS pnrs
FROM Registrering
WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie]) AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold]) AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]));

Jeg skal bruge pnrs i vba'en til:
Me.PalleNr = pnrs & "SA"

Hvordan?~)
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:10 #1
Dim Db as database, Rs as Recordset, StrSQL as string
Db=CurrentDB

strSql=" X SELECT TOP 1 Left([PalleNr],1) AS pnrs
FROM Registrering
WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie]) AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold]) AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]));"

Set rs = db.OpenRecordset(strSQL)

me.pallenr=rs.fields("pnrs") & "SA"
Avatar billede Slettet bruger
10. august 2005 - 13:16 #2
Det er vist mere end en kommentar, nåh men jeg prøver lige. Så må jeg også se om jeg kan finde ud af at "knække" linien i vba'en, altså med & _

Jeg prøver!~)
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:22 #3
strSql=" X SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering" & _
"WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie])" & _
"AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold])" & _ "AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]));"


Alternativt kan du bruge:
Strsql="Selec....."
Strsql=strsql & "næste linie"

o.s.v.
Avatar billede Slettet bruger
10. august 2005 - 13:23 #4
Jeg kan ikke finde ud af at få strsql'en sat sammen i vba!~(
Avatar billede Slettet bruger
10. august 2005 - 13:24 #5
Hov, jeg prøver lige dit forslag!~)
Avatar billede Slettet bruger
10. august 2005 - 13:25 #6
Det er stadigvæk rød skrift...
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:30 #7
StrSql="SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering"
strsql=strsql & " WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie])"
strsql=strsql & " AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold])"
strsql=strsql & " AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]));"
Avatar billede Slettet bruger
10. august 2005 - 13:31 #8
og der er invalid use of property ved Db = CurrentDb
Avatar billede sjap Praktikant
10. august 2005 - 13:31 #9
Det skyldes en forkert placeret _ i den sidste linie. Prøv med

strSQL = " X SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering" & _
"WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie])" & _
"AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold])" & _
"AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]));"
Avatar billede Slettet bruger
10. august 2005 - 13:32 #10
13:30:56> det åd den!~)
Avatar billede Slettet bruger
10. august 2005 - 13:33 #11
sjap> det virkede også!~)
Avatar billede Slettet bruger
10. august 2005 - 13:34 #12
Så er der bare den compile error med invalid use of property...
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:34 #13
Jeg tror nok, at du skal ha' reference til DAO3.6
Avatar billede Slettet bruger
10. august 2005 - 13:36 #14
Først beklagede den sig om Dim Db as database, men den gik videre til Db = CurrentDb, da jeg lavede en reference til DAO 3.6
Avatar billede Slettet bruger
10. august 2005 - 13:36 #15
hov, ja det virkede jo så ikke?~)
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:37 #16
Du skal tilføje reference til Microsoft DAO 3.6 object library
Avatar billede Slettet bruger
10. august 2005 - 13:37 #17
Det er irriterende at man ikke kan opdatere siden inden man sender sin kommentar uden at skulle copy/paste....
Avatar billede sjap Praktikant
10. august 2005 - 13:37 #18
Den sætning skal vist skrives som:

Set Db = CurrentDb()
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:38 #19
set db=currentdb
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:38 #20
20 sek for langsom!
Avatar billede sjap Praktikant
10. august 2005 - 13:39 #21
;0)
Avatar billede Slettet bruger
10. august 2005 - 13:39 #22
13:37:00> det har jeg gjort, men det virker ikke se 13:36:07, men skal jeg prioritere DAO 3.6 object library højere end nogle af de andre referencer?
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:40 #23
Og for en god ordens skyld skal du afslutte med
set rs=nothing
set db=nothing
Avatar billede Slettet bruger
10. august 2005 - 13:40 #24
Jeg var vist også lidt langsom!~)
Avatar billede sjap Praktikant
10. august 2005 - 13:41 #25
Det er korrekt madschristensen - og vigtigt!
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:43 #26
Virker det nu ?
Avatar billede Slettet bruger
10. august 2005 - 13:46 #27
Nej, lige et øjeblik...
Avatar billede Slettet bruger
10. august 2005 - 13:48 #28
Den påstår at jet database maskinen ikke kan finde input tabellen eller forespørgslen?~(
Avatar billede Slettet bruger
10. august 2005 - 13:49 #29
Hvis jeg sætter den oprindelige sql ind i en forespørgsel kommer det rigtige svar..
Avatar billede Slettet bruger
10. august 2005 - 13:51 #30
Den stopper i vba'en ved Set Rs = Db.OpenRecordset(StrSql)
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:55 #31
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Avatar billede sjap Praktikant
10. august 2005 - 13:55 #32
Prøv lige at sammenligne den oprindelige SQL med den i vba! Hvad er det for et X, der har sneget sig ind allerførst?
Avatar billede Slettet bruger
10. august 2005 - 13:58 #33
Det har jeg også undret mig over!~)
Avatar billede madschristensen Nybegynder
10. august 2005 - 13:58 #34
*smiler* Troede i havde set det - det var bare mig...... Genvejstaster kan være gode - og.... øh.... ;O))
Avatar billede sjap Praktikant
10. august 2005 - 13:59 #35
;0)
Avatar billede Slettet bruger
10. august 2005 - 14:01 #36
Der er en syntaksfejl i FROM-sætningen
Avatar billede sjap Praktikant
10. august 2005 - 14:02 #37
Der mangler vist lidt mellemrum. Prøv med

strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie]) " & _
"AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold]) " & _
"AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]));"
Avatar billede Slettet bruger
10. august 2005 - 14:04 #38
Ja, nu er  den gået videre til Set Rs = Db.OpenRecordset(strSQL) og siger at den forventede 3 parametre...
Avatar billede madschristensen Nybegynder
10. august 2005 - 14:08 #39
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Avatar billede Slettet bruger
10. august 2005 - 14:09 #40
Det har jeg også prøvet..
Avatar billede sjap Praktikant
10. august 2005 - 14:10 #41
Jeg ved ikke lige om det gør nogen forskel, men prøv lige

Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
Avatar billede madschristensen Nybegynder
10. august 2005 - 14:13 #42
Jeg kan ikke huske hvad den som standard er... Forventer 3 parametre ???

For QueryDef, Recordset, and TableDef objects:

Set recordset = object.OpenRecordset (type, options, lockedits)

The OpenRecordset method syntax has these parts.

Part Description
recordset An object variable that represents the Recordset object you want to open.
object An object variable that represents an existing object from which you want to create the new Recordset.
source A String specifying the source of the records for the new Recordset. The source can be a table name, a query name, or an SQL statement that returns records. For table-type Recordset objects in Microsoft Jet databases, the source can only be a table name.
type Optional. A constant that indicates the type of Recordset to open, as specified in Settings. 
options Optional. A combination of constants that specify characteristics of the new Recordset, as listed in Settings.
lockedits Optional. A constant that determines the locking for the Recordset, as specified in Settings.
Avatar billede madschristensen Nybegynder
10. august 2005 - 14:15 #43
Så jeg kan ikke helt forstå de 3 parametre?
Avatar billede sjap Praktikant
10. august 2005 - 14:17 #44
Prøv lige den her

strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering" & _
"WHERE (((Registrering.VaelgLinie)=" & [Forms]![oppetid]![subformoppetid]![vaelglinie] & ") " & _
"AND ((Registrering.VaelgHold)=" & [Forms]![oppetid]![subformoppetid]![vaelghold] & ") " & _
"AND ((Registrering.GrafDato)=" & [Forms]![oppetid]![subformoppetid]![grafdato] & "));"
Avatar billede sjap Praktikant
10. august 2005 - 14:20 #45
Mit gæt er, at de 3 parametre er de tre referencer til felter på en formular. Umiddelbart en lidt kryptisk fejlmeddelelse, men et eller andet sted er den nok ok.
Avatar billede Slettet bruger
10. august 2005 - 14:22 #46
syntaksfejl i FROM sætningen
Avatar billede sjap Praktikant
10. august 2005 - 14:23 #47
der måske lige et mellemrum, der stadig spøger?

strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)=" & [Forms]![oppetid]![subformoppetid]![vaelglinie] & ") " & _
"AND ((Registrering.VaelgHold)=" & [Forms]![oppetid]![subformoppetid]![vaelghold] & ") " & _
"AND ((Registrering.GrafDato)=" & [Forms]![oppetid]![subformoppetid]![grafdato] & "));"
Avatar billede madschristensen Nybegynder
10. august 2005 - 14:25 #48
Det er jeg enig i!
Avatar billede Slettet bruger
10. august 2005 - 14:27 #49
Nu siger den at der er en syntaksfejl, fordi der mangler en operator i forespørgselsudtrykket "(((registrering.vaelglinie)=Linie 70) AND ((Registrering.vaelghold)=Dagshold) AND ((Registrering.Grafdato)=10-08-2005))"
Avatar billede Slettet bruger
10. august 2005 - 14:28 #50
Den har da ellers fundet rigtig linie/hold/dato?
Avatar billede sjap Praktikant
10. august 2005 - 14:32 #51
Du bliver da også ved! ;0)

Hvis vaelglinie er en streng, Vaelghold er en streng og grafdato er en dato, skal SQL'en ændres til:

strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)='" & [Forms]![oppetid]![subformoppetid]![vaelglinie] & "') " & _
"AND ((Registrering.VaelgHold)='" & [Forms]![oppetid]![subformoppetid]![vaelghold] & "') " & _
"AND ((Registrering.GrafDato)=#" & [Forms]![oppetid]![subformoppetid]![grafdato] & "#));"
Avatar billede Slettet bruger
10. august 2005 - 14:35 #52
sjap>ja!~(

Nu er der type mismatch og jeg har prøvet dbopensnapshot, dbopendynaset og uden...
Avatar billede madschristensen Nybegynder
10. august 2005 - 14:40 #53
Ok - gør noget andet. Gem forespørgslen med et sigende navn - eks: test
Skriv så:
Dim Db As Database
Dim Rs As Recordset

    Set db = currentDb
    Set rs=db.openrecordset("Test", dbOpenSnapShot)

me.pallenr=rs.fields("pnrs") & "SA"

set rs=nothing
set db=nothing


Så slipper du for vba syntax til forespørgslen.
Avatar billede sjap Praktikant
10. august 2005 - 14:43 #54
Er du sikker på at
  Vaelglinie er en streng?
  Vaelghold er en streng?
  Grafdato er en dato? - og ikke blot en streng, der ligner en dato?
Avatar billede sjap Praktikant
10. august 2005 - 14:44 #55
én af dem må være forkert - det tyder fejlmeddelelsen på.
Avatar billede Slettet bruger
10. august 2005 - 14:51 #56
hvis jeg prøver 14:40:06 så begynder den på det med de forventede 3 parametre. Hvis jeg dbl klikker på forespørgslen, så kommer den med det rigtige svar (nemlig 4)..
Avatar billede Slettet bruger
10. august 2005 - 14:54 #57
vaelghold og vaelglinie er text
grafdato er date/time (short date)
Avatar billede madschristensen Nybegynder
10. august 2005 - 14:55 #58
Dim Db As Database
Dim Rs As Recordset

    Set db = currentDb
    Set rs=db.openrecordset("Test")

me.pallenr=rs.fields("pnrs") & "SA"

set rs=nothing
set db=nothing
Avatar billede Slettet bruger
10. august 2005 - 14:59 #59
sorry!~(
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:00 #60
hmm ???
Avatar billede Slettet bruger
10. august 2005 - 15:01 #61
Der er for få parametre. Der var ventet 3.
og så stopper debug ved
Set Rs = Db.OpenRecordset("PalleNrSampak") også selvom jeg bruger dbopensnapshot eller dbopendynaset...
Avatar billede Slettet bruger
10. august 2005 - 15:03 #62
Too few parameters. Expected <number>. (Error 3061)
This parameter query requires the specified number of parameters, which you did not supply. Provide the expected number of parameters, and run the query again.

In some cases, this message is generated when unknown field names or expressions are interpreted as query parameters. Be sure to enclose field names containing spaces or punctuation with square brackets [ ].
Avatar billede sjap Praktikant
10. august 2005 - 15:03 #63
strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)='" & [Forms]![oppetid]![subformoppetid]![vaelglinie] & "') " & _
"AND ((Registrering.VaelgHold)='" & [Forms]![oppetid]![subformoppetid]![vaelghold] & "') " & _
"AND ((Registrering.GrafDato)=#" & DateValue([Forms]![oppetid]![subformoppetid]![grafdato]) & "#));"
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:04 #64
Hvad nummer har den runtime error ?
Avatar billede sjap Praktikant
10. august 2005 - 15:05 #65
Hov det var lige hurtigt nok. Prøv i stedet med

strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)='" & [Forms]![oppetid]![subformoppetid]![vaelglinie] & "') " & _
"AND ((Registrering.VaelgHold)='" & [Forms]![oppetid]![subformoppetid]![vaelghold] & "') " & _
"AND ((Registrering.GrafDato)=DateValue(" & [Forms]![oppetid]![subformoppetid]![grafdato] & ")));"
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:05 #66
;O)
Avatar billede sjap Praktikant
10. august 2005 - 15:10 #67
Ja og så skal der faktisk lige en rettelse mere til. Funktionen Datavalue skal have en streng at arbejde med, så

strSQL = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)='" & [Forms]![oppetid]![subformoppetid]![vaelglinie] & "') " & _
"AND ((Registrering.VaelgHold)='" & [Forms]![oppetid]![subformoppetid]![vaelghold] & "') " & _
"AND ((Registrering.GrafDato)=DateValue('" & [Forms]![oppetid]![subformoppetid]![grafdato] & "')));"


spg > Hvis du foretrækker at fortsætte med madschristensens forslag, så sig lige til. Så er der jo ikke nogen grund til at jeg fortsætter med den anden løsning ;0)
Avatar billede Slettet bruger
10. august 2005 - 15:13 #68
jeg kæmper med begge...
Avatar billede sjap Praktikant
10. august 2005 - 15:16 #69
Hvis det er muligt for dig at sende databasen, kan jeg godt kigge nærmere på den. Du kan evt. "strippe" den, så den kun indeholder det der kræves for at undersøge problemet. Jeg kan dog kun læse Access 97 og 2000 ;(
Avatar billede Slettet bruger
10. august 2005 - 15:16 #70
Dim Db As database, Rs As Recordset, strsql As String

Set Db = CurrentDb

strsql = "SELECT TOP 1 Left([PalleNr],1) AS pnrs FROM Registrering " & _
"WHERE (((Registrering.VaelgLinie)='" & [Forms]![Oppetid]![SubformOppetid]![VaelgLinie] & "') " & _
"AND ((Registrering.VaelgHold)='" & [Forms]![Oppetid]![SubformOppetid]![VaelgHold] & "') " & _
"AND ((Registrering.GrafDato)=DateValue('" & [Forms]![Oppetid]![SubformOppetid]![GrafDato] & "')));"

Set Rs = Db.OpenRecordset(strsql, dbOpenSnapshot)
Me.PalleNr = Rs.Fields("pnrs") & "SA"
Set Rs = Nothing
Set Db = Nothing

Giver type mismatch..

og forresten skal jeg lige have en desc med:~)

SELECT TOP 1 Left([PalleNr],1) AS pnrs
FROM Registrering
WHERE (((Registrering.VaelgLinie)=[forms]![oppetid]![subformoppetid]![vaelglinie]) AND ((Registrering.VaelgHold)=[forms]![oppetid]![subformoppetid]![vaelghold]) AND ((Registrering.GrafDato)=[forms]![oppetid]![subformoppetid]![grafdato]))
ORDER BY Left([PalleNr],1) DESC;
Avatar billede Slettet bruger
10. august 2005 - 15:17 #71
det er xp
Avatar billede sjap Praktikant
10. august 2005 - 15:22 #72
Kan jeg få dig til at stoppe programmet (med et breakpoint umiddelbart efter den har lavet strSQL - dvs. i linien med Set Rs = Db.OpenRecordset(strsql, dbOpenSnapshot)

Og så skal du gå over i vinduet Fejlfinding (eller Immediate hedder det vist på engelsk), og skal du skrive

?strsql
og trykke på Enter. Så skriver den værdien af strsql. Kopier den herud, så kan vi se hvad der står.
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:23 #73
Dim DB As DAO.Database, Def As DAO.QueryDef, Rs As DAO.Recordset
  Set DB = CurrentDb()
  Set Def = DB.QueryDefs("Query1") '<---Her skriver du forespørgselsnavn
  Set Rs = Def.OpenRecordset(dbOpenDynset)

 
  Rs.Close
  Rs.Close
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:23 #74
Ja - god ide!
Avatar billede Slettet bruger
10. august 2005 - 15:30 #75
Den med parametrene igen...
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:33 #76
http://support.microsoft.com/default.aspx?scid=kb;en-us;210244 fortæller om den fejl. Men løsningen burde være der...
Avatar billede Slettet bruger
10. august 2005 - 15:39 #77
Jeg kan løse det på en anden måde, der står en formular åben med svaret i.

Dim prns
DoCmd.GoToRecord acDataForm, "SubformOppetid", acLast
prns = Left(Form_SubformOppetid.PalleNr, 1)

Det eneste problem her er at debuggen påstår at subformoppetid ikke er åben, formularen oppetid er åben og her ligger subformoppetid..
Avatar billede madschristensen Nybegynder
10. august 2005 - 15:56 #78
Har lige en hasteopg.... så jeg er lige væk et stykke tid...
Avatar billede Slettet bruger
10. august 2005 - 15:56 #79
Jeg er nød til at gå nu, men jeg bukker og takker for indsatsen og ligger nogle points ud imorgen. Men der altså 30 point til den der lige kan løse 15:39:23
Formularen oppetid, som er åben indeholder en underformular kaldet subformoppetid og her er der et felt, der hedder pallenr og hvis man står i sidste post, så skal jeg bruge tallet til venstre i pallenr!~)

madschristensen> !~)
sjap> !~)
Avatar billede Slettet bruger
11. august 2005 - 08:18 #80
madschristensen> http://www.eksperten.dk/spm/639174
sjap> http://www.eksperten.dk/spm/639175

Og så vil jeg selv kæmpe med om den endelige løsning, som udløser de oprindelige 30 point!~)
Avatar billede madschristensen Nybegynder
11. august 2005 - 09:44 #81
M.h.t. 15:39:23 - Hvad hedder den forespørgsel der ligger bag formularen?
Avatar billede madschristensen Nybegynder
11. august 2005 - 09:44 #82
spg - kan du ikke maile databasen ?
Avatar billede sjap Praktikant
11. august 2005 - 10:23 #83
spg > Hvis det er muligt for dig, kan det være en rigtigt god ide at sende mailen til madschristensen (min Access er jo desværre for gammel). Hvis ikke så synes jeg du skulle prøve det som jeg skrev 10/08-2005 15:22:45  Det giver en bedre mulighed for os "herude" at se, hvad det er, der sker.
Avatar billede Slettet bruger
11. august 2005 - 12:57 #84
Jeg har besluttet mig for at lukke spørgsmålet, fordi at jeg forudser andre problemer efter at dette er løst, så jeg omstrukturerer lidt. Det har noget at gøre med sortering af tal, defineret som tekst. Det har noget at gøre med de her pallenumre, når de bliver på flere cifre. I det hele taget laver jeg det lidt om for at gøre hovedformularen, så entydig som mulig. (Samtidig kan jeg gøre det simplere for mig selv!~)

Det er dog hårdt at skulle lade et problem ligge uløst og jeg håber ikke i ligger vågne i nat, men vi har sikkert alle andre projekter, der kunne bruges lidt tid på!~)

Takker, over & out........
mvh spg
Avatar billede madschristensen Nybegynder
11. august 2005 - 13:02 #85
Ok - håber du finder en god løsning ;O))
Avatar billede sjap Praktikant
11. august 2005 - 13:14 #86
Bare rolig. Nattesøvnen kunne det ikke forstyrre. Der skal mere til ;0)
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