Sorteren formulier

Status
Niet open voor verdere reacties.

Tvhouwel

Gebruiker
Lid geworden
2 apr 2002
Berichten
258
Hallo allemaal
Vanuit een selectieformulier, waarin een aantal waarden opgegeven kunnen worden, open ik een rapportformulier met de uitslag.
Als ik de recordsource van dat formulier altijd hetzelfde houdt, dan is er geen probleem.

Maar nu heb ik in het selectieformulier een tabel gecreeerd, daarna open ik het rapportformulier en ik wil de recordsource van dat rapportformulier de naam van die tabel geven.
Dat lukt als ik het rapportformulier open met de code
Code:
Me.RecordSource = OpenArgs()
Het voordeel hiervan is dat meerdere gebruikers tegelijkertijd met het formulier kunnen werken en dus met hun eigen onderliggende tabel werken want de gebruikersnaam van deze mensen zit in de tabelnaam verwerkt.
Maar in het rapportformulier heb ik ook knoppen gemaakt om de sortering te wijzigen. Deze werken dan opeens niet meer.
De code hiervan is
Code:
Private Sub lblKlantnaam_DblClick(Cancel As Integer)
   If vl_sort = "oplopend" Then
         Forms!frmBegrotingRapport.OrderBy = "[Klantnaam] Desc"
         vl_sort = "aflopend"
    Else
        Forms!frmBegrotingRapport.OrderBy = "[Klantnaam] Asc"
        vl_sort = "oplopend"
    End If
    Me.Requery
    Call fmo_ClearFields
    Me!lblKlantnaam.BorderStyle = 1
End Sub
En om het nog vreemder te maken, als ik in het formulier 1 keer met mijn rechtermuisknop klik en op die manier de sortering aanpas, dan werken daarna mijn knoppen die de sortering kunnen wijzigen ook weer.
Iemand enig idee wat ik fout gedaan heb ?
 
Haal je niet een aantal begrippen door elkaar? Je hebt ofwel een rapport, ofwel een formulier. Access kent volgens mij geen rapportformulieren. En ook geen formulierrapporten :) Aan je code kan ik ook niet zien wat er nu precies fout gaat, want ik neem aan dat je objecten gewoon dezelfde naam houden.
Overigens snap ik niet hoe je het voor elkaar krijgt dat je binnen één database een formulier door verschillende gebruikers laat openen; ik weet niet beter of een formulier kan maar één keer geopend zijn. Wil je hetzelfde formulier twee keer of meer openen, dan moet je meerdere objecten aanmaken van dat formulier. En dat doe je zo te zien niet.

Daarnaast gebruik ik nooit een aparte (wisselende) tabel voor een rapport of formulier, maar altijd een vaste query. M.b.v. het selectieformulier verander ik dan de SQL van die query, zodat het formulier altijd de correcte data gebruikt. Een volgende gebruiker die zijn eigen selectie maakt, maakt dus geen nieuwe tabel, maar verandert slechts de SQL string van de gebruikte query. Werkt veel beter, vind ik.
Maar dat kan nooit werken als meerdere gebruikers hetzelfde formulier openen (wat dus, ben ik van overtuigd, niet kan :)).

Ik zou zeggen: post een voorbeeldje :)
 
Ok, ik zal proberen wat duidelijker te zijn.
Ik heb het hieronder alleen maar over formulieren. Ik gebruik een formulier waar de gebruiker bepaalde selectie criteria op kan geven. Als hij daarna op ok klikt opent er een ander formulier met daarin een weergave van records die aan deze criteria voldoen. Het eerste noem ik een selectieformulier en het tweede noem ik een rapportformulier.

Het volgende punt wordt wat lastiger, iedere gebruiker, heeft zijn eigen Access versie. Het is toch zo dat 2 gebruikers tegelijkertijd hetzelfde Formulier op kunnen vragen? De onderliggende database is uiteraard wel een gezamenlijke, dat is een mysql database met naar Access gelinkte tabellen.
Ik werk al jaren met een heel grote database met gemiddeld zeker 15 personen tegelijk ingelogd. Ik weet bijna zeker dat ze bepaalde formulieren met meerdere personen tegelijk open hebben staan en hoor hier nooit klachten over.
Als ik dit fout zie, dan heeft het bouwen van ieder zijn eigen tabel inderdaad geen nut en ga ik werken met een vaste tabel voor dit formulier.

Over het gebruik van de aparte wisselende tabel voor dit formulier. Ik doe dat omdat het maken van deze tabel, (of van een query als ik dat zou gebruiken) zo'n 8 seconden duurt.
Als je het met een eigen tabel doet dan heb je die pijn maar 1 keer, zodra het formulier opgestart is, en de tabel is gemaakt, kan je wijzigen wat je wil (sortering, extra filtering enz) en dat is supersnel want de tabel is altijd kleiner dan een paar honderd records. Doe je het met een query, (wat ik in andere situatie's ook vaak doe) dan heb je bij iedere wijziging, de pijn dat de query opnieuw gemaakt moet worden en duurt het dus weer 8 seconden.

Het posten van een voorbeeld is wat lastig, alle tabellen komen uit een grote externe database.
 
Het probleempje uit de eerste post, dat de buttons met vba code die het formulier in verschillende sorteringen moest zetten niet werkten, is opgelost.
Bij het openen van het form de code
Code:
Me.OrderByOn = True
deed wonderen.
 
Het volgende punt wordt wat lastiger, iedere gebruiker, heeft zijn eigen Access versie. Het is toch zo dat 2 gebruikers tegelijkertijd hetzelfde Formulier op kunnen vragen? ... Ik weet bijna zeker dat ze bepaalde formulieren met meerdere personen tegelijk open hebben staan en hoor hier nooit klachten over.
Je praat duidelijk over een BE-FE (Backend + Frontend) situatie. Daarbij heb je, normaal gesproken, in de BE de tabellen en vaste queries staan, en in de FE de formulieren en user specifieke queries. Elke gebruiker heeft dus zijn eigen formulier, en wat je zegt klopt dus niet: geen enkele gebruiker heeft tegelijkertijd hetzelfde formulier open als een andere gebruiker. Want in de FE werkt maar één gebruiker. En daarmee los je dus het probleem op dat meerdere mensen tegelijkertijd hetzelfde formulier zouden willen openen. Dat daarbij meerdere gebruikers in dezelfde tabel zitten te grutten, is uiteraard geen enkel probrleem. Dat kan de database prima aan. Worden het honderden gebruikers tegelijkertijd, dan zou ik naar een zwaarder systeem overstappen.

Mijn ervaring is dat het werken met een vaste query met wisselende SQL sneller werkt als steeds maar weer nieuwe tabellen erin rossen. 8 Seconden zou absoluut niet nodig hoeven te zijn met de jusite query. En je houdt de databases compact. Maar als je tevreden bent met je huidige constructie, moet je uiteraard vooral zo doorgaan. :)
 
Laatst bewerkt:
OctaFish, bedankt weer voor het meedenken en je duidelijke uitleg.
 
Hallo,enkele tips/bedenkingen:
- Als je spreekt over een grote, externe database, neem ik aan dat je het niet over een Access database hebt. In de meeste database systemen kan je schema's per user aanmaken met daarin de nodige views/procedures die alleen deze gegevens aanleveren die de gebruikers nodig hebben. Dit versnelt de databases al een stuk en is bovendien veel veiliger.
- wat je kan doen is de formulieren als recordsource de expressie select * from [tablename] where 1 = 0 mee te geven. Zo wordt initieel geen enkel record over de netwerkverbinding gesleurd. Met het resultaat van de zoekactie kan je dan de recordsource opbouwen met de juiste WHERE clause. Zo haal je slechts die records die nodig zijn over de net verbinding.
- als de query traag is, bekijk dan eerst en vooral het gebruik van indexen. PK velden zijn automatisch geïndexeerd, FK velden niet. Deze indexeren kan veel tijdswinst opleveren. Zorg er ook voor dat je indexen niet te gedefragmenteerd raken.
- ook nooit doen: berekeningen in de WHERE clause gebruiken bv. niet WHERE XXX = functie(YYY), lookup functies in queries gebruiken.
- Best ook niet de syntax van je meest gebruikte queries gebruiken. Eens een query uitgevoerd is dan is ze geparsed en gecompileerd en het zoekplan wordt gecashed. Telkens je een nieuwe query gebruikt moet dit proces van 0 opnieuw beginnen, wat tijd vraagt.

succes
Noëlla
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan