[accessXP] query vanuit vba, result in label/textfield

Pagina: 1
Acties:

  • B3U5
  • Registratie: December 2001
  • Laatst online: 09-08 19:30
ik ben met access aan het ouwehoeren en ook al heb ik de indruk dat ik er bijna ben kom ik er toch niet uit.

Het komt er min of meer op neer dat ik een query wil doen vanuit vba
dus iets als
<code>
Private Sub SetKrantIDField()
Dim SQL As String
Set SQL = "SELECT ID FROM tblKranten WHERE Jaar=Forms!frmAddArtikelToKrant!jaar AND Naam=Forms!frmAddArtikelToKrant!krantnaamLijst AND Type=Forms!frmAddArtikelToKrant!foldertypeLijst"
Forms!frmAddArtikelToKrant!KrantID = DoCmd.RunSQL(SQL)
End Sub
</code>

moet ik nog moeilijk gaan doen met een resultset of vergeet ik iets als een refrash/repaint?

  • Bu588
  • Registratie: Maart 2000
  • Laatst online: 22-12-2025
Je moet inderdaad "moeilijk" gaan doen met een Recordset, en dan Forms!frmAddArtikelToKrant!KrantID = Recordset!ID.

Nothing is fool-proof to a sufficiently talented fool...


  • B3U5
  • Registratie: December 2001
  • Laatst online: 09-08 19:30
hmm volgens mij gaat er nog wat anders fout, ik krijg de msgbox niet...

<code>
Private Sub SetKrantIDField()
Dim SQL As String
Dim Db As Database
Dim Rs As Recordset
Set SQL = "SELECT ID FROM tblKranten WHERE Jaar=Forms!frmAddArtikelToKrant!jaar AND Naam=Forms!frmAddArtikelToKrant!krantnaamLijst AND Type=Forms!frmAddArtikelToKrant!foldertypeLijst"
Set Db = CurrentDb
Set Rs = Db.OpenRecordset(SQL)

MsgBox "Testje"

Forms!frmAddArtikelToKrant!KrantID = Rs!ID
End Sub

Private Sub ArtNr_AfterUpdate()
LeverancierVeld.Requery
Call SetKrantIDField
End Sub
</code>

maar dit is wat je bedoelt? met resultset en dan eruithalen enzo?
Forms!frmAddArtikelToKrant!KrantID is trouwens een tekstvak.

  • Bu588
  • Registratie: Maart 2000
  • Laatst online: 22-12-2025
Waarom niet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub ArtNr_AfterUpdate()
LeverancierVeld.Requery

Dim SQL As String
Dim Rs As Recordset

SQL = "SELECT ID FROM tblKranten WHERE Jaar=Forms!frmAddArtikelToKrant!jaar AND Naam=Forms!frmAddArtikelToKrant!krantnaamLijst AND Type=Forms!frmAddArtikelToKrant!foldertypeLijst"
Set Rs = CurrentDb.OpenRecordset(SQL)
' Controleren of de Recordset wel inhoud heeft....
If Not RS.EOF Then Forms!frmAddArtikelToKrant!KrantID = Rs!ID

MsgBox "Testje"

End Sub

Verschillen:
  • Ik heb Db niet meer gedeclareerd omdat je hem toch maar 1x gebruikt.
  • Je moet geen 'SET SQL = ' gebruiken omdat de variabele SQL geen object is. Gebruik gewoon 'SQL = '.

Nothing is fool-proof to a sufficiently talented fool...


  • B3U5
  • Registratie: December 2001
  • Laatst online: 09-08 19:30
heh, ik voel me betrapt op vbs noobheid ;)

ten eerste hij deed het niet omdat ik de call vanuit de verkeerde event aanriep <doh>
maargoed, hij vind "Set Rs = CurrentDb.OpenRecordset(SQL) niet lief", hij wil 3 parameters... :(


uit de help:
Syntaxis
Voor Connection en Database-objecten is dit:
Set recordset = object.OpenRecordset (bron, type, opties, bewerkingenvergrendelen)

Voor QueryDef-, Recordset- en TableDef-objecten is dit:
Set recordset = object.OpenRecordset (type, opties, bewerkingenvergrendelen)

volgens de VBE moet het de eerste zijn...
maareh, dat zijn wat opties die voor mij een beetje uit de lucht komen vallen.

  • B3U5
  • Registratie: December 2001
  • Laatst online: 09-08 19:30
maargoed al het voorgaande was in verband met een workarround voor het volgende.
Dit werkt qua vba wel, alleen slikt ie de sql niet goed blijkbaar.

<code>
Dim SQL As String

SQL = "INSERT INTO tblKrantArtikelen ( ArtID, KrantID ) SELECT (SELECT tblArtikelen.ID FROM tblArtikelen WHERE tblArtikelen.ArtikelNummer = Forms!frmAddArtikelToKrant!ArtNr AND tblArtikelen.LeverancierID= (SELECT tblLeveranciers.ID FROM tblLeveranciers WHERE tblLeveranciers.Naam = Forms!frmAddArtikelToKrant!LeverancierVeld AND tblLeveranciers.Plaats = Forms!frmAddArtikelToKrant!leveranciersPlaats )) AS ArtID, (SELECT tblKranten.ID FROM tblKranten WHERE tblKranten.jaar = Forms!frmAddArtikelToKrant!jaar AND tblKranten.Naam=Forms!frmAddArtikelToKrant!krantnaamLijst AND tblKranten.Type=Forms!frmAddArtikelToKrant!foldertypeLijst ) AS KrantID"

DoCmd.RunSQL (SQL)
</code>

bij deze krijg ik: "Fout 3000 tijdens uitvoering:
Er is een gereserveerde fout (-3025) opgetreden. Er is geen bericht voor deze fout."
kan verder zo niet even snel de betekenis opzoeken, maar voor een oude versie staat ie hier: http://www.aocweb.org/crp...ehelp/sa/html/sys105b.htm

<edit>
SQL = "INSERT INTO tblKrantArtikelen ( ArtID, KrantID ) SELECT 3 AS ArtID, 7 AS KrantID"
doet het wel... moet ik bij bovenstaande nog de eerste eraf halen, type casten oid?

[ Voor 10% gewijzigd door B3U5 op 27-02-2003 16:08 ]


  • B3U5
  • Registratie: December 2001
  • Laatst online: 09-08 19:30
ter volledigheid en om de deze post handig te maken voor de search hier de oplossing:

code:
1
2
3
4
strSQL = "INSERT INTO tblKrantArtikelen ( ArtID, KrantID ) " & _
    "SELECT " & intArtikelId & " AS ArtID, " & _
    intKrantId & " AS KrantID"
DoCmd.RunSQL strSQL


voor het uitlezen van je fields op het formulier vanwaar je deze gebeurtenis triggert:
code:
1
2
3
4
5
6
7
strSQL = "SELECT tblKranten.ID FROM tblKranten " & _
    "WHERE tblKranten.jaar=" & Me![jaar].Value & " " & _
    "AND tblKranten.Naam='" & Me![krantnaamLijst].Value & "' " & _
    "AND tblKranten.Type='" & Me![foldertypeLijst].Value & "'"
Set rst = New ADODB.Recordset
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
intKrantId = rst![ID].Value

en dan natuurlijk de dingen wel netjes initten...
Pagina: 1