SQL Server ACCESS

Status
Niet open voor verdere reacties.

Michel1955

Gebruiker
Lid geworden
28 feb 2014
Berichten
57
Hi,

Ik heb MS Access gekoppeld aan SQL Server. De basis werkt goed maar nu wil ik in Access (VBA) in een bepaalde tabel een selectie doen van bijvoorbeeld :
"SELECT * FROM vw_Produktregistraties WHERE [TAG] = " & Chr(34) & Tag & Chr(34) & " And Done = False ;"
Het lukt mij niet om de geselecteerde records verder te gebruiken.
Hoe doe ik dit.
Tx
 
Met behulp van een recordset op basis van de query?
 
Het is overigens wel de vraag wat je nu echt wil weten gezien je vraag elders.

How to set a filter on a SQL Server table in Access.
This works, but takes a very long time.

If rsPRD.State = 0 Then
rsPRD.Open "Produktregistraties", cnThisConnect, adOpenKeyset, adLockOptimistic, adCmdTableDirect
End If
strFilter = "[TAG] = " & Chr(39) & Tag & Chr(39) & " And Done = False"
rsPRD.Filter = strFilter


If Not rsPRD.EOF Then

This line : rsPRD.Filter = strFilter is the problem.

The SQL Server is on a Hosting Server.
 
@xps351:
In plaats van die blauwe letters kan je beter de Code tag gebruiken.
Die is er speciaal voor.
 
als je de SQL doorstuurt naar de server moet je wel T-SQL gebruiken. Ik heb een handleiding T-SQL in de databases sectie van dit forum geplaatst. In jou geval: maak een procedure op SQL server en laat die de records weergeven.
Wat betreft de snelheid: SQL server is een mean machine en geeft razendsnel de resultaten, maar je moet die wel op de juiste wijze tunen, anders is het als een slecht afgestelde race wagen. De query store (beschikbaar sinds versie 2016) is een uitstekende plaats om daarmee te beginnen.
Probeer ook niet voor elke recordset een nieuwe connectie te openen, en programmeurs die RBAR (denk aan dingen zoals while not .EOF ... next) gebruiken worden bij zonsopgang neergeschoten door de DBA, alhoewel kokende olie ook wel eens een optie is.
 
Zo bijvoorbeeld:
Code:
Dim rst As DAO.Recordset, strSQL as String
     strSQL = [COLOR=#333333]"SELECT * FROM vw_Produktregistraties WHERE [TAG] = "[/COLOR][COLOR=#333333]"[/COLOR][COLOR=#333333]"[/COLOR][COLOR=#333333] & Tag & [/COLOR][COLOR=#333333]"[/COLOR][COLOR=#333333]"[/COLOR][COLOR=#333333]" [/COLOR][COLOR=#333333]And Done = False"[/COLOR]
     Set rst = CurrentDB.Open(strSQL)
     With rst
          Do While Not .EOF
               ‘Hier de acties die je wilt doen 
               .MoveNext
          Loop
     End With
 
yep, dan kan je lekker een bakje koffie gaan drinken, en vergeet dan ook niet het isolatie level op repeatable read te zetten, dan blokkeer je de hele boel.
 
… (denk aan dingen zoals while not .EOF ... next) gebruiken worden bij zonsopgang neergeschoten door de DBA, alhoewel kokende olie ook wel eens een optie is.
Ik douche met kokende olie, en eet kogels bij het ontbijt. Wát een nutteloze en overbodige bangmakerij is dit nu weer? Tenzij jij volledig op de hoogte bent van de situatie van TS is er niks mis mee om TS eerst de basis acties te laten uitvoeren. Ik geef gewoon antwoord op de vraag van TS. Bang maken kan later altijd nog…
 
Geen bangmakerij, jammer genoeg realiteit waar ik maar al te vaak mee geconfronteerd ben. In 90% van de gevallen waar ik bijgeroepen word is de oorzaak van de miserie slechte developers code, en je kan best geen slechte gewoontes aanleren. Als je overschakelt naar SQL Server, kan je best even tijd nemen om de engine en mogelijkheden te leren kennen. Je wil vermijden dat je er een boel code op ontwikkelt die je later moet gaan herschrijven.
 
om naar het voorbeeld terug te keren: je gaat niet eerst de hele view (het predikaat vw wijst erop dat het basis object een view is en niet een tabel) over het netwerk trekken om er dan een filter op te zetten. Probeer zoveel mogelijk de selectie te laten beperken op de server zelf en vraag dan alleen de records die je nodig hebt. De procedure op SQL server kan je aanmaken zoals in het volgend voorbeeld:
Code:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		NGA
-- Create date: 2022-08-13
-- Description:	Demo
-- =============================================
CREATE PROCEDURE p_getDataDemo 
	-- Add the parameters for the stored procedure here
	@pTag varchar(50) = '', 
	@pDone bit = 0
AS
BEGIN
	
	SET NOCOUNT ON;

    
	SELECT * FROM vw_Produktregistraties WHERE [TAG] like '%' + @pTag + '%' and [Done] = @pDone

END
GO

Je kan in dit geval ook opteren voor een table-valued function, maar ik werk liever met procedures omdat ze meer flexibel zijn.

Voorbeelden hoe je stored procs kan oproepen vanuit access vind je op:

https://oakdome.com/programming/MSAccess_StoredProcedureDataSource.php
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan