Pass Through Query(PTQ) in (PTQ)

RobertJB66

Gebruiker
Lid geworden
2 feb 2022
Berichten
132
Ik ben mijn access queries aan het omzetten naar Pass Through Queries i.v.m. snelheid van de SQL data naar de Access app.

Voor het merendeel van de queries is dit geen probleem ik heb echter een aantal queries die in de query velden hebben van een andere query.

Hoe is dit te realiseren met een PTQ?
 
Ik ben mijn access queries aan het omzetten naar Pass Through Queries i.v.m. snelheid van de SQL data naar de Access app.

Voor het merendeel van de queries is dit geen probleem ik heb echter een aantal queries die in de query velden hebben van een andere query.

Hoe is dit te realiseren met een PTQ?
Ik denk dat ik zelf het antwoord al heb, want the PTQ staat natuurlijk niet op de SQL server en geeft daarom mogelijk een probleem.
 
Gemakkelijkste manier: schrijf je queries allemaal op SQL server in de SSMS en test ze in de SQL server omgeving uit. Maak daar eventueel de nodige indexes voor aan op de server. Dan kan je voor de queries die geen parameters gebruiken een view maken en deze view als een tabel vanuit Access linken. Als je parameters nodig hebt, zet je de queries in een procedure en roep je deze procedure via een PTQ in Access aan.
Een SQL handleiding vind je op dit forum in de eerste post op het databases forum: https://www.helpmij.nl/forum/threads/sql-queries.963453/
 
Ik begrijp dat dit een optie is echter gaat dit voor mij niet echt werken.
De access app gaat uitbreidingen krijgen o.b.v. wensen van de gebruikers.
Het is dan niet handig om dit dan ook nog te moeten aanpassen in SQL server omgeving.
 
Als je kiest voor een gemixte omgeving SQL Server/Access zal je toch bij elke wijziging aan de structuur, bv een extra veld toevoegen, of de beveiliging: een nieuwe user, de wijziging op SQL server moeten doorvoeren. Dat is nu eenmaal de gekozen database. Bij veranderingen van het gebruik zal je ook de indexen moeten aanpassen. Beheer je zelf de database (backups , onderhoud statistieken/indexen) of wordt dat voor jou gedaan? In het laatste geval zou ik eens gaan praten met de DBA die de SQL servers beheert.
 
Het heeft even wat tijd gekost, maar ik heb het voor elkaar. Ik wil jullie bedanken voor het duwen in de juiste richting.

Wat heb ik gedaan.

Ik heb in SMMS van diverse Query's aan View gemaakt.
Vervolgens voer ik de onderstaande code uit in Access VBA

Code:
Set db = CurrentDb
Set qdf = db.QueryDefs("EECQ_PTQ")

If sFilter = "" Then
    qdf.SQL = "SELECT Top 5000 * FROM EECQ_View"
Else
    qdf.SQL = "SELECT Top 5000 * FROM EECQ_View WHERE " & ptFilter & ""
End If

Set qdf = Nothing

    Me.[EECQ_Sub].Form.Requery
    Me.[EECQ_RapportBottum].Form.Requery

Set qdf = Nothing
Set db = Nothing

Er zou wel eens een betere manier om dit te doen, maar voor mij niet een die ik snel genoeg onder de knie krijg.
 
Top dat je het probeerde in SQL met een procedure. Ik begrijp dat ontwikkelen op SQL server wel een zekere leercurve met zich meebrengt, maar eenmaal onder de knie schept het een hoop nieuwe mogelijkheden, en bovendien is het heel boeiend en leuk werk. Als je geïnteresseerd bent kan je inschrijven op de nieuwsbrief van SQL tips waar dikwijls beginners tutorials zijn te vinden: https://www.mssqltips.com. Succes
 
Ik denk dat ik zelf het antwoord al heb, want the PTQ staat natuurlijk niet op de SQL server en geeft daarom mogelijk een probleem.
Zitje nou je eigen antwoorden/vragen te citeren? Het moet niet gekker worden :).
 
Als je een script stuurt van de gebruikte tabellen + wat insert statements om wat gegevens erin te krijgen en ook van de gemaakte views op SQL server. Dan zal ik eens kijken of ik een SQL procedure kan schrijven voor je. Ik stuur je mijn mailadres in een PM.
 
Ík wil hier toch nog even op terugkomen om er zeker van te zijn dat ik het juist doe.

Ik heb in SMMS een View gemaakt EECQ_View en in Access een Pass Through Query EECQ_PTQ.

De code in EECQ_PTQ is
Code:
SELECT Top 3000 * FROM EECQ_View

Mijn vraag is of ik hem met de onderstaande code wel juist doe naar mijn idee maak ik geen gebruik van de Pass Through Query en voer ik de Query uit op de EECQ_View?

De data in ptFilter werkt goed

Code:
Public rs As DAO.Recordset, db As DAO.Database, qdf As DAO.QueryDef

    Set db = CurrentDb
    
    ' Pass Through Query
    Set qdf = db.QueryDefs("EECQ_PTQ")
    
    If ptFilter = "" Then
        qdf.SQL = "SELECT Top 3000 * FROM EECQ_View"
    Else
        qdf.SQL = "SELECT Top 3000 * FROM EECQ_View WHERE " & ptFilter & ""
    End If
    
    Set qdf = Nothing

    ' Requery
    Me.EECQ_Sub.Form.Requery
    Me.EECQ_RapportBottum.Form.Requery
 
volgens mij wel, maar ik ben geen Access programmeur en als ik al iets in Access VB doe, dan gebruik ik ADODB (ontwikkeld voor gebruik met externe data sources zoals SQL server, MySQL enz.) en niet DAO. Om te zien waar de query naartoe gaat kan je de connectiestring van het object opvragen.
 
Het kan allemaal wat compacter, en ik zie nergens een (DAO)recordset gebruikt worden, maar die komt wellicht nog ergens anders aan bod. Als je de Pass Through query daarmee aanroept, kan dat uiteraard prima. De korte variant:

Code:
Public rs As DAO.Recordset, qdf As QueryDef

    ' Pass Through Query
    Set qdf = CurrentDb.QueryDefs("EECQ_PTQ")
    qdf.SQL = "SELECT Top 3000 * FROM EECQ_View" & IIf(ptFilter <> ""," WHERE " & ptFilter,"")
 
als je wil testen of de query wel degelijk als passthrough wordt uitgevoerd kan je de sql gelijk stellen aan select getdate() , wordt de SQL herkend en zonder fouten uitgevoerd dan wordt deze als PTQ op de server uitgevoerd, krijg je een foutmelding dat de functie niet herkend wordt, dan wordt de query door Access geëvalueerd.
 
Dank je wel, ik kom toch nog even terug.

Als ik het voor b.v. een grafiek doe dan ziet de code er als hieronder uit.

Code:
Me.TrendGrafiek.RowSource = "SELECT REFW, Gemm, Range FROM TrendQ_PTQ WHERE " & ptFilter & ""

De code in de PTQ is
Code:
SELECT * FROM Trend_View

Misschien vraag ik te veel, maar waarom wordt in dit deel voor de Grafiek de PTQ aan geroepen en in het voorbeeld ervoor de EECq_View wat hierbij een gelinkte tabel lijkt te zijn. In de EECQ_PTQ is toch al de EECQ_View opgenomen?
Gebruik ik nu wel echt de Pass Through Query?
 
Gebruik ik nu wel echt de Pass Through Query?
Dat kan je testen door de rowsource aan te passen naar

Code:
SELECT getdate(), REFW, Gemm, Range FROM TrendQ_PTQ WHERE " & ptFilter & ""

Getdate() is een functie die alleen de server kent.
Wat ik niet begrijp is waarom je een view op SQL server gebruikt en geen stored procedure op de server maakt waarin je de filterwaarde als parameters kan meegeven. Dan ben je zeker dat je alles op de server uitvoert en je hebt een hoop meer mogelijkheden.
 
Terug
Bovenaan Onderaan