Access2000 SELECT Om du inte behöver uppgifterna väldigt sällan får du troligtvis (marginellt) bättre prestanda med dolda fält som du har gjort... Men det ska ju fungera i vilket fall. Hej, Tack för era svar. Ah, Hmm, detta ser ut att vara en konstig blandning av ADO och DAO, mest DAO med lite ADO-inslag... Vet att just Access 2000 hade lite problem med detta och att det saknades vissa referenser ibland (om det var till ADO eller DAO kommer jag inte ihåg). Bra påpekande om mitt variabelnamn. Utifrån vad du har skrivit tidigare så antar jag att din parametertabell innehåller en enda post. Jag skulle skriva något i den här stilen: Hej Åsa!AccessSQL
Har gjort ett formulär som hämtar uppgifter från 3 st tabeller.
Formulärets datakälla:
SELECT Manadsuppgifter.*, Personer.*, Parametrar.* FROM Personer INNER JOIN (Parametrar INNER JOIN Manadsuppgifter ON Parametrar.PmeterNyckel=Manadsuppgifter.ParameterNyckel) ON Personer.Anstallningsnr=Manadsuppgifter.Anstallningsnr;
Jag behöver komma åt endel fält i tabell Parametrar och det har jag löst genom att plocka in fälten som ”ej synliga” fält i formuläret. På så sätt kan jag från programmet nå (referera) till fälten och göra beräkningar mm.
Parameterfälten behöver jag använda enbart vid beräkningar som jag gör i programrutiner.
Skulle hellre plocka fram parametervärdena med hjälp av en SQL-sats.
Jag vill alltså referera till de i tabell Parametrar namngivna fälten.
Antar att jag då först skall plocka bort Parametrar.* ur den ovanstående SELECT-satsen
Formulärets datakälla blir då:
SELECT Manadsuppgifter.*, Personer.* FROM Personer INNER JOIN Manadsuppgifter ON Personer.Anstallningsnr=Manadsuppgifter.Anstallningsnr;
Därefter anropar jag InitieraParametrar i början av rutin
Private Sub Form_Current() 'vid Ny post
Call InitieraParametrar 'sätt upp parametervärden
.
.
Public Sub InitieraParametrar() 'Testa värden i Parameter- tabellen
Dim tstDate As Date
Dim Param As Recordset
Param.OpenRecordset _
"SELECT * FROM Param", _
CurrentProject.Connection
tstDate = Param.Fields("PmIkraftDatum")
End Sub
Vid körning får jag felmeddelande körfel 91:
Objektvariabel eller With-block variabel har inte angetts.
FRÅGA 1:
Var ligger felet?
-----------------------------------------------------------------------------------------
Följer jag ett ”bokexempel” så skulle det se ut såhär:
Public Sub InitieraParametrar() 'Testa värden i Parameter- tabellen
Dim tstDate As Date
Dim Param As New Recordset
Param.Open _
"SELECT * FROM Param", _
CurrentProject.Connection
tstDate = Param.Fields("PmIkraftDatum")
End Sub
Vilket ger felmeddelandet:
Kompileringsfel:
Ogiltig användning av Nyckelordet New
FRÅGA 2:
Var ligger felet?
--------------------------------------------------------------------------------
Eller
Fråga 3:
Är det bättre att jag går runt problemet genom att peta in alla Parameterfält jag behöver som osynliga fält i formuläret?
Tacksam för svar /HarrySv: AccessSQL
I första exemplet saknas det New, det borde alltså vara såhär:
Dim Param As New Recordset
Men det fungerar ju inte i exempel 2, alltså klagar den säkert på det här med, därför kan du testa såhär och se om detta blir bättre:
Dim Param As Recordset
Set Param = New Recordset
/JohanSv:AccessSQL
Ditt problem ligger i att du inte har någon connection. Ditt recordset måste ju köras mot en databs, således glöm inte att skapa din connection först.
// JohanSv:AccessSQL
Provade:
Dim Param As Recordset
Set Param = New Recordset , men det gav mig samma felmeddelande:
Ogiltig användning av Nyckelordet New
Avseende saknad connection, så trodde jag att
CurrentProject.Connection var det som behövdes. I "bokexemplet" har man ingen annan connection.
Visa gärna hur det skall se ut.
Tackar på förhand.
mvh / HarrySv: AccessSQL
du hade smugit in en connection som jag missade... Har du kollat att den är öppen?
Sedan det du skall göra är att använda execute metoden på ditt connection objekt som i sin tur returnerar det recordset du behöver. Om du gör så skall det lösa sig.
Sedan kan jag inte låta bli att kommentera ditt dåliga variabelnamnsval. Att kalla en recordset variable för parameter är inte så lyckat då man lätt kan tro att det är en parameter till databasanropet istället.
// JohanSv: AccessSQL
En grej kan vara att testa med DAO-varianten istället.
<code>Public Sub InitieraParametrar() 'Testa värden i Parameter- tabellen
Dim tstDate As Date
Dim db As Database
Dim Param As Recordset
Set db = CurrentDB
Set Param = db.OpenRecordset("SELECT * FROM Param")
tstDate = Param.Fields("PmIkraftDatum")
End Sub</code>
/JohanSv:AccessSQL
Har nu försökt med connection.execte, men resultatet bli samma felmeddelande som tidigare
Ogiltig användning av Nyckelordet New
Dim ParameterRecord As Recordset
Set ParameterRecord = New Recordset
CurrentProject.Connection
Set ParameterRecord = Connection.Execute("SELECT * FROM ParameterRecord")
tstDate = ParameterRecord.Fields("PmIkraftDatum")
Problemet är ju egentligen av typ elementärt.
D.v.s Formulär som hanterar innehåll från en tabell och där man önskar via pgmrutin läsa innehållet även från en annan tabell i samma databas. Men även det tycks gå att "röra till".
Avseende Johan Djupmarkers DAO förslag så har jag inte provat det ännu. Skall prova, men enligt boken jag tar mitt exempel ur (Access2000 programming for Dummies sid 151 ), så är det i fallet Access2000 fråga om ADO.
Till saken hör att den Accessversion jag använder är Access 2003, men enligt uppgift så är databasupplägget i Access2003 detsamma som i Access2000. Kanske det är det som ställer till det för mig.
Jag läste annars din artikel Johan Djupmarker ang. utskrift av Access DB innehåll till Word dokument. Artikeln var bra och jag skulle gärna se en liknande uppdaterad variant för hantering avseende ADO.
Tack för era goda råd. Fler mottages med tacksamhet.
Glad Valborg /HarrySv: AccessSQL
<code>
Public gdtTestDate as Date
Public Sub InitieraParametrar()
Dim rst As ADODB.Recordset
On Error Goto InitieraParametrar_Err
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM Param", CurrentProject.Connection, adOpenKeyset, _
adLockReadOnly, adCmdText
If Not rst.EOF Then
If Not IsNull(rst("PmIkraftDatum")) Then gdtTestDate = rst("PmIkraftDatum")
End If
InitieraParametrar_End:
If Not rst Is Nothing Then
If rst.State = adStateOpen Then rst.Close
Set rst = Nothing
End If
Exit Sub
InitieraParametrar_Err:
MsgBox "Fel!"
Goto InitieraParametrar_End
End Sub
</code>Sv:AccessSQL
Ditt förslag fungerar perfekt! Tackar!!!
Efter att jag konstaterat att ditt förslag fungerar började jag "laborera" med bokens förslag för att försöka få reda på varför det inte fungerade.
Det visar sig att om jag ändrar de två nedanstående pgm raderna:
Dim ParameterRecord As Recordset
Set ParameterRecord = New Recordset
såhär:
Dim ParameterRecord As ADODB.Recordset
Set ParameterRecord = New ADODB.Recordset
så fungerar även bokens förslag:
ParameterRecord.Open _
"SELECT * FROM Parametrar ", _
CurrentProject.Connection
Alltså deklarationen As Recordset
skall deklareras AS ADODB.Recordset.
Tack igen. Må så gott / Harry