Access 97, VBA .movefirst

Status
Niet open voor verdere reacties.

Jenger

Gebruiker
Lid geworden
26 jul 2012
Berichten
12
Access VBA .movefirst
Hallo allemaal!

ik heb een vraagje. De database heb ik zo aangeroffen met al zijn codes. Nu ben ik bezig het een en ander om te zien hoe ik het kan verbeteren, zoniet vervangen.

Het zit namelijk zo:
Er is een formulier welke gebruikt wordt om resultaten in te voeren die in de tabel Resultaten wordt bewaard. Door op een knop te klikken op het formulier wordt een andere formulier geopend om de resultaten in te voeren. Maar als de tabel leeg is, en je klikt op de knop om het ander formulier te openen gaat het niet. Krijg je een bericht "No current record".

In de code wordt de index eerst doorzocht, wat standaard is,nl met .index
Code:
with Rsresultaat
.index="klas_index
If .recordcount <>0 then
.movefirst
end if
Als ik dit stukje code weghaal, dan krijg je een berichtje "Operation invalid without a current index".

Maar als ik het zo herschrijf zonder de .movefirst
Code:
with Rsresultaat
.index="klas_index
If .recordcount <>0 then
msgbox "Tabel Resultaten is leeg"
end if

dan krijg je dat bericht en opent het formulier om de resultaten in te voeren. Dus het werkt normaal door Al is het leeg.

Maar ik wil weten of dat wel goed is om de methode van .movefirst weg te halen.
Of gaat dat dan later een probleem geven? Hoe kan ik toch werken ondanks dat de resultaten tabel leeg is?


Alvast bedankt!
 
Laatst bewerkt door een moderator:
Maar dat is toch onjuist?

Als recordcount <>0 is dan is de tabel NIET leeg.

movefirst zou normaal dus alleen uitgevoerd worden als er überhaupt records zijn. Wat de origine code doet is de pointer naar de eerste record zetten als er resultaten zijn
 
Ik snap niet helemaal wat je doet met de index. Je aanpassing is inderdaad niet goed, want de msgbox moet verschijnen als .RecordCount=0. Dan is je recordset leeg.
 
wampier, dat is het juist. Als recordcount<>0, betekent, er zijn records. Maar juist werkt het niet. Als ik zet

Code:
If recordcount=0 then
msgbox "leeg"
end if
dan verschijnt GEEN bericht, niets van "Leeg", kan ik normaal doorgaan, opent het ander invoer formulier. Als ik het zo laat met recordcount<>0, dan verschijnt WEL een dat bericht van "Leeg" EN opent het ander formulier.

Als ik de code zo schrijf:

Code:
If recordcount=0 then
    .movefirst
end if

gaat het formulier WEL open. Alleen bij recordcount<>0 verschijnt het MsgBox "Leeg".

Octafish, bericht verschijnt ja. Wat ik wil laten doen is, AL is mijn resultaten tabel leeg, toch moet mijn invoer formulier open gaan. Dus wat ik wilde weten is of het goed is als ik de code in een van de bovenstaande verander waar het invoer formulier toch open gaat ZONDER dat er problemen onstaan als ik de .movefirst weglaat.
 
Laatst bewerkt door een moderator:
Je geeft veel te weinig informatie; kun je de volledige code die je gebruikt niet laten zien? Of, mooier nog, een db versie die we kunnen bekijken?
 
Sorry Octafish voor een lange rust periode maar ik had het maar gelaten. Maar ik zou het wel goed vinden als ik het anders kon doen dus zal ik het weer proberen het uit te leggen. Jammer genoeg kan ik een versie van de database niet doorgegeven maar ik zal dan de hele code doorgeven. Hopelijk kom ik dan beter uit mijn woorden.


Deze stuk code is voor een knop en maakt een formulier open waar de namen van de studenten komen van een gekozen klas en kan de cijfers ingevoerd worden voor een gekozen vak. De cijfers die ingevoerd zijn, worden opgeslagen in een tabel genaamd RESULTATEN.

Nu voor elk schooljaar wordt de RESULTATEN tabel leeggemaakt. Maar nu als je opnieuw wilt beginnen cijfers in te voeren dan krijg je dat bericht van "No current Record". Wat wij dan doen is een record handmatig invoeren dan lukt het daarna wel in te voeren.

Wat ik wil doen is om zonder een record zelf te plaatsen in de RESULTATEN tabel je gewoon kan invoeren, AL is de tabel leeg.

Ik hoop dat dit uitlegje zoveel mogelijk duidelijk is :).
 
Laatst bewerkt:
Ik had bij de code gehoopt dat je die zou opmaken met de CODE knop.... Nu is het wel heel veel lastig leesbare code. Kun je hem alsnog even bijwerken en in de juiste tag zetten?
 
Oh jee, sorry daarvoor. Zal het proberen met de Tag Code. HIer is ie dan:

Code:
Public Sub ToonLijst()

KlasKeuze = Forms!Invoer.KLAS
RichtingKeuze = Forms!Invoer.Richting
PeriodeKeuze = Forms!Invoer.Periode
JaarKeuze = Forms!Invoer.Jaar
VakKeuze = Forms!Invoer.Vak
Set Db = CurrentDb
strSQl = "SELECT JaarVanInschrijving, StudieKaartNr FROM studenten WHERE ((Klas = '" & KlasKeuze & "') AND (LesPakket = '" & RichtingKeuze & "'));"
Set Rs = Db.OpenRecordset(strSQl)
Set RsResultaat = Db.OpenRecordset("Resultaten")
Set RsTempResultaat = Db.OpenRecordset("TempResultaten")

With RsResultaat
    .Index = "Klas_index"
    If .RecordCount <> 0 Then
        .MoveFirst
    End If
    .Seek "=", JaarKeuze, KlasKeuze, RichtingKeuze, PeriodeKeuze, VakKeuze
    If .NoMatch Then
        Locked = False
    Else
        Locked = True
    End If
End With
    
If Not Locked Then
    RsResultaat.Index = "Resultaat_Index"
    Rs.MoveFirst
    While Not Rs.EOF
        StudentNummer = Rs.JaarVanInschrijving & Rs.StudieKaartNr
        With RsResultaat
            .Seek "=", StudentNummer, VakKeuze, JaarKeuze, PeriodeKeuze
            If .NoMatch Then
                With RsTempResultaat
                    .AddNew
                        !student = StudentNummer
                        !Vak = VakKeuze
                        !SchoolJaar = JaarKeuze
                        !Periode = PeriodeKeuze
                        !KLAS = KlasKeuze
                        !LesPakket = RichtingKeuze
'                        !Resultaat = "-1"
                    RsTempResultaat.Update
                End With
            End If
        Rs.MoveNext
        End With
    Wend
End If

Set Rs = Nothing
Set RsResultaat = Nothing
Set RsTempResultaat = Nothing


If Not Locked Then
    strSQl = "SELECT DISTINCTROW studenten.NAAM, studenten.VOORNAAM, studenten.JaarVanInschrijving, studenten.StudieKaartNr, TempResultaten.Resultaat, TempResultaten.Vak" & _
         " " & "FROM studenten INNER JOIN Resultaten ON (studenten.JaarVanInschrijving & studenten.StudieKaartNr = TempResultaten.Student) AND (studenten.KLAS = TempResultaten.Klas) AND (studenten.RICHT = TempResultaten.Richting)" & _
         " " & "WHERE ((TempResultaten.Vak = '" & VakKeuze & "') AND (TempResultaten.Periode = '" & PeriodeKeuze & "') AND (studenten.KLAS = '" & KlasKeuze & "') AND (studenten.LesPakket = '" & RichtingKeuze & "') AND (TempResultaten.SchoolJaar = '" & JaarKeuze & "'));"
    DoCmd.OpenForm "TempSelectie", acNormal, strSQl, , acEdit, acNormal
    Forms!Tempselectie.AllowAdditions = False
Else
    strSQl = "SELECT DISTINCTROW studenten.NAAM, studenten.VOORNAAM, studenten.JaarVanInschrijving, studenten.StudieKaartNr, Resultaten.Resultaat, Resultaten.Vak" & _
            " " & "FROM studenten INNER JOIN Resultaten ON (studenten.JaarVanInschrijving & studenten.StudieKaartNr = Resultaten.Student) AND (studenten.KLAS = Resultaten.Klas) AND (studenten.RICHT = Resultaten.Richting)" & _
            " " & "WHERE ((Resultaten.Vak = '" & VakKeuze & "') AND (Resultaten.Periode = '" & PeriodeKeuze & "') AND (studenten.KLAS = '" & KlasKeuze & "') AND (studenten.LesPakket = '" & RichtingKeuze & "') AND (Resultaten.SchoolJaar = '" & JaarKeuze & "'));"
    DoCmd.OpenForm "Selectie", acNormal, strSQl, , acEdit, acNormal
    Forms!Selectie.AllowAdditions = False
End If

End Sub


Alvast bedankt :)
 
Mag je die code hierboven weer verwijderen. Scheelt weer een metertje scrollen :)
Kijk ik ondertussen even naar de code!
 
Ik snap maar weinig van de gang van zaken. Maar je gebruikt dus een tijdelijke tabel ([TempResultaten]) om de resultaten in weg te schrijven? Waarom niet gelijk in de tabel [Resultaten]? Ik zou zeggen: gebruik één formulier om te raadplegen (eventueel muteren) en invoegen, en pas de status van het formulier aan met een knop. Ofwel <Gegevenstoevoer>=Aan (toevoegen) ofwel <Gegevenstoevoer>=Uit. ik zie de noodzaak van twee formulieren echt niet...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan