Vanuit 3 tabellen velden halen en 4e nieuwe tabel vullen

Status
Niet open voor verdere reacties.

BasHD

Gebruiker
Lid geworden
2 dec 2008
Berichten
99
Ik heb in 3 tabellen gegevens staan en ik wil vanuit die 3 tabellen gegevens hallen. In alle 3 de tabellen zitten 3 records die hetzelfde zijn. In 2 van de 3 zitten 4 records die gelijk zijn.

Nu wil ik in de eerste beginnen met zoeken en loop ik vast :

Code:
Private Sub Knop146_Click()

Dim DBase As DAO.Database
Dim strSQL1, MijnVar As String
Dim rst1 As DAO.Recordset
Dim Aantal, Code1, Vastlegging1, Veestapel1
Dim tmp

MijnVar = "Bex"

'strSQL1 = "Select * From UitvoerGegevensMestbeleid Where [JAAR] In ('2007','2008') AND [VeestapelN] > 0 And [Gemengd] = ""Bex"""
strSQL1 = "Select * From UitvoerGegevensMestbeleid Where [JAAR] = 2007 Or [JAAR] = 2008 AND [Gemengd] = [COLOR="red"]'" & MijnVar & "'[/COLOR] AND [VeestapelN] > 0"
    Stop
    tmp = InputBox("", "", strSQL1)

        Set DBase = CurrentDb
        Set rst1 = DBase.OpenRecordset(strSQL1)
        
        If rst1.RecordCount <> 0 Then
            rst1.MoveLast
            rst1.MoveFirst
            Do While Not rst1.EOF
                StudiegroepCode1 = rst1![StudiegroepCode].Value
                Jaar1 = rst1![Jaar].Value
Code:
                Code1 = rst1![Code].Value
                Gemengd1 = rst1![Gemengd].Value
                Vastlegging1 = rst1![VastleggingN].Value
                Veestapel1 = rst1![VeestapelN].Value
                rst1.MoveNext
            Loop
        Else
        End If
    
    rst1.Close
End Sub

Op het stukje MijnVar zou ie alleen moeten selecteren op de tekst Bex maar hij pakt ook Be1 mee. Hoe omschrijf ik beter dat alleen BEX telt? En de groter dan 0 waarde wordt ook niet meegenomen.

Heeft iemand een idee wat ik fout doe of hoe verkeer dik denk.

Dit werkt wel

Code:
If Not UitvoerGegevensMestbeleid1.EOF Then
        If (UitvoerGegevensMestbeleid1.Fields("Jaar") = 2007 Or 2008) And _
                (UitvoerGegevensMestbeleid1.Fields("GEMENGD") = "Bex") And _
                (UitvoerGegevensMestbeleid1.Fields("Code") = 1) And _
                (UitvoerGegevensMestbeleid1.Fields("VeestapelN") > 0) Then

Maar dat moet in SQL toch ook kunnen?



gr

BB
 
Laatst bewerkt:
Je criterium is niet helemaal in orde; eigenlijk gebruik je er nu twee:
Code:
Where [JAAR] = 2007 
Or [JAAR] = 2008 AND [Gemengd] = '" & MijnVar & "' AND [VeestapelN] > 0"
Je ziet zo hopelijk wel waar het fout gaat. Je moet de jaartallen ook groeperen, dus zo:

Code:
Where ([JAAR] = 2007 Or [JAAR] = 2008) AND [Gemengd] = '" & MijnVar & "' AND [VeestapelN] > 0"
 
Dank

Hallo Octafish dat was inderdaag de fout.

Ik heb een volgende vraag:

Ik heb een knop op een formulierX. Vanuit een txt worden een aantal vakjes gevuld.
Vanuit het formulier open ik een ander formulierY.
Op formulierY heb ik een knop die gegevens oproept uit de tabel die achter formulierX zit. Op het formulierX zie ik de gegevens al wel maar in de tabelX nog niet. Hoe kan ik via een soort bevestig commanda eerst de gegevens van formulierX definitief in tabelX schrijven voor ik formuliesY open?

gr

BB
 
Ik vermoed dat je beide formulieren (en dus tabellen) tegelijk open hebt staan; de twee formulieren zien dan de status van de records op het moment van openen. Niet alleen moet je de gegevens dus opslaan in formulier X, je moet daarna vermoedelijk ook formulier Y nog een Requery geven. Opslaan doe je tegenwoordig zo:

Code:
DoCmd.RunCommand acCmdSaveRecord
 
Vervolg vraag 1

Code:
Private Sub InvoerGegevensMestbeleid1(ByRef StudiegroepCode1, ByRef Jaar1, ByRef Code1, ByRef Gemengd1, ByRef Vet, ByRef Eiwit, ByRef Tekst27, _
    ByRef Tekst28, ByRef Tekst29, ByRef kVEMUTD, ByRef GrasKenKDs, ByRef MaisKenKDs, ByRef GVEAant1, ByRef GVEDag, ByRef ZomerstalMaandenVersGras, _
    ByRef MaisKAanvVem, ByRef Bijprod1VoorraadVem, ByRef Ruwvoer1VoorraadVem, ByRef Kv1VoorraadVem, ByRef GVE, ByRef AanvOrgN, ByRef AanvOrgP, _
    ByRef AfOrgP, ByRef AfOrgN, ByRef VoorraadMutN, ByRef VoorraadMutP)

Dim DatBase As DAO.DataBase
Dim strSQL2, MijnVar2, strSQL3, Gemengd2, strSQL4 As String
Dim rst2, rst3, rst4, InvoerGegevensMestbeleid As DAO.Recordset
Dim tmp1, Gemengd

 strSQL3 = "Select * From Uitvoer1997technisch Where [STUDIEGROEP] = '" & StudiegroepCode1 & "' And [JAAR] = " & Jaar1 & " And [Code1] = " & Code1 & " AND [Gemengd] = '" & Gemengd2 & "'"
   
   With DatBase.OpenRecordset(strSQL3)
                    If .RecordCount > 0 Then
                        [kVEMUTD] = .Fields("UtdHendrixBenutting").Value
                        [GVE] = .Fields("GVET/HA").Value * .Fields("HATOTAALT").Value
                    End If
                .Close
    End With

De record count geeft hier 9300 aan. Dat zou maar 20 moeten zijn. Deze lus wordt gecalld en elke keer als ik draai loop access "Vast"

Als ik teveel Set DBase. gebruik kan ik dan de database overbelasten?

gr

BB
 
Laatst bewerkt:
Er gaat nogal wat fout in je code, al weet ik niet waarom hij 9300 records geeft i.p.v. 20. Eerst maar eens een aangepaste versie....

Code:
Dim dbs As DAO.Database
Dim strSQL2 As String, MijnVar2 As String, strSQL3 As String, Gemengd2 As String, strSQL4 As String
Dim rst2 As DAO.Recordset, rst3 As DAO.Recordset, rst4 As DAO.Recordset, InvoerGegevensMestbeleid As DAO.Recordset
Dim tmp1, Gemengd

strSQL3 = "Select * From Uitvoer1997technisch Where [STUDIEGROEP] = '" & StudiegroepCode1 & "' And [JAAR] = " & Jaar1 & " And [Code1] = " & Code1 & " AND [Gemengd] = '" & Gemengd2 & "'"
   
    Set dbs = CurrentDb()
    With dbs.OpenRecordset(strSQL3)
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                .Edit
                [kVEMUTD] = .Fields("UtdHendrixBenutting").Value
                [GVE] = .Fields("GVET/HA").Value * .Fields("HATOTAALT").Value
                .Update
                .MoveNext
            Loop
        End If
        .Close
    End With

Daarbij de volgende aantekeningen:
1. Je variabelen zijn niet gedeclareerd; per regel heb je er maar één (de laatste) goed ingesteld. Vermoedelijk ging je er vanuit dat als je één keer aangeeft wat het variabele type is, dat Access de rest wel voor je invult. Niet dus: je moet elke variabele apart als type benoemen.
2. Je declareert een Database object, maar stelt hem niet in op de huidige database.
3. Je opent een query (strSQL3), maar doet daar vervolgens niks mee, behalve kijken of er records in zitten. Je probeert een record toe te voegen (?) of bij te werken (?) maar geeft daar geen commando voor.
4. En die handeling wordt vervolgens niet opgeslagen.

Kortom: bekijk het proces nog eens :D
 
Hallo OctaFish,

Deze lus wordt gecalled vanuit een hoofdlus:



Code:
Private Sub InvoerGegevensMestbeleid1(ByRef StudiegroepCode1, ByRef Jaar1, ByRef Code1, ByRef Gemengd1, ByRef Vet, ByRef Eiwit, ByRef Tekst27, _
    ByRef Tekst28, ByRef Tekst29, ByRef kVEMUTD, ByRef GrasKenKDs, ByRef MaisKenKDs, ByRef GVEAant1, ByRef GVEDag, ByRef ZomerstalMaandenVersGras, _
    ByRef MaisKAanvVem, ByRef Bijprod1VoorraadVem, ByRef Ruwvoer1VoorraadVem, ByRef Kv1VoorraadVem, ByRef GVE, ByRef AanvOrgN, ByRef AanvOrgP, _
    ByRef AfOrgP, ByRef AfOrgN, ByRef VoorraadMutN, ByRef VoorraadMutP)

Dim DatBase As DAO.DataBase
Dim strSQL2 As String, MijnVar2 As String, strSQL3 As String, Gemengd2 As String, strSQL4 As String
Dim rst2 As DAO.Recordset, rst3 As DAO.Recordset, rst4 As DAO.Recordset, InvoerGegevensMestbeleid As DAO.Recordset
Dim tmp1, Gemengd

       Set DatBase = CurrentDb()
Gemengd = "0"
Gemengd2 = CStr(Gemengd)

Dit staat bovenin de lus, dan dit

Code:
strSQL2 = "Select * From InvoerGegevensMestbeleid Where [StudiegroepCode] = '" & StudiegroepCode1 & "' And [Coode] = " & Code1 & " AND [JAAR] = " & Jaar1 & " AND [Gemengd] = '" & Gemengd1 & "'"
With DatBase.OpenRecordset(strSQL2)
                    If .RecordCount > 0 Then
                        [Tekst27] = .Fields("27").Value
                        [Tekst28] = .Fields("28").Value
                        [Tekst29] = .Fields("29").Value
                        [Vet] = .Fields("VetMelk").Value
                        [Eiwit] = .Fields("EiwitMelk").Value
                        [GrasKenKDs] = .Fields("GrasKenKDs").Value
                        [MaisKenKDs] = .Fields("MaisKenKDs").Value
                        [GVEDag] = .Fields("GVEGemiddeldAanwezig1Dag").Value
                        [GVEAant1] = .Fields("GVEGemiddeldAanwezig1").Value
                        [ZomerstalMaandenVersGras] = .Fields("ZomerstalMaandenVersGras").Value
                        [MaisKAanvVem] = .Fields("MaisKAanvVem").Value
                        [Bijprod1VoorraadVem] = .Fields("Bijprod1VoorraadVem").Value
                        [Ruwvoer1VoorraadVem] = .Fields("Ruwvoer1VoorraadVem").Value
                        [Kv1VoorraadVem] = .Fields("Kv1VoorraadVem").Value
                        [VoorraadMutN] = .Fields("VoorraadMestMutatieN").Value
                        [VoorraadMutP] = .Fields("VoorraadMestMutatieP2O5").Value
                    End If
                .Close
    End With

Dat geeft als recordCount keurig 7 of 9 wat ik verwacht en dan

Code:
strSQL3 = "Select * From Uitvoer1997technisch Where [STUDIEGROEP] = '" & StudiegroepCode1 & "' And [JAAR] = " & Jaar1 & " And [Coode] = " & Code1 & " AND [Gemengd] = '" & Gemengd2 & "'"
   
   With DatBase.OpenRecordset(strSQL3)
                    If .RecordCount > 0 Then
                        [kVEMUTD] = .Fields("UtdHendrixBenutting").Value
                        [GVE] = .Fields("GVET/HA").Value * .Fields("HATOTAALT").Value
                    End If
                .Close
    End With

Daarna komt dit.
Als DatBase wijs ik CurrentDb() aan. Maar de 2e recordcount geeft veel te veel records.
Ergens gaat er in mijn selectie iets fout. De bedoeling is dat er via de call lus een aantal waardes worden opgehaald om in de hoofdlus te gebruiken. Kun je me misschien nog eens een hint geven? Ik zie niet waar de selectie fout gaat.

gr

BB
 
Laatst bewerkt:
Maak er een voorbeeldje van, want dit is veel te abstract om er zo wat van te maken.
 
Verschil ontdekt

Beste Octafish,

Na nog eens goed gekeken te hebben blijkt het veld dat voor code zorgt de eigenschap dubbele precisie te hebben. Alle andere velden hebben lange integer. Kan het zijn dat deze eigenschap storing geeft in de volgende code:

Code:
strSQL3 = "Select * From Uitvoer1997technisch Where [STUDIEGROEP] = '" & StudiegroepCode1 & "' And [JAAR] = " & Jaar1 & " And [Coode] = " & Code1 & " AND [Gemengd] = '" & Gemengd2 & "'"
   
   With DatBase.OpenRecordset(strSQL3)
                    If .RecordCount > 0 Then
                        [kVEMUTD] = .Fields("UtdHendrixBenutting").Value
                        [GVE] = .Fields("GVET/HA").Value * .Fields("HATOTAALT").Value
                    End If
                .Close
    End With

Of moet ik Coode in dit geval benaderen met Dim as Double? Of kan een dubbele precisie geen zoekwaarde zijn in een strsql?
 
De veldeigenschap doet er in een query (bijna) niet toe, al moet je wel onderscheid maken tussen tekst- en numeriek, en datumveld. Maar een numeriekveld doe je altijd op dezelfde manier. Het probleem ligt dan ook niet in [Coode], maar meer in Code1. Vermoed ik.
 
Code1

Code1 wordt weergegeven als "1" en jaar als 2007. Beide waarde moeten opgezochten worden in nummerieke velden. Dus ik zou geen "1" maar 1 verwachten.

Is dimmen als Integer of Double?

gr

BB
 
En waar komt Code1 vandaan? Als het een variabele is, dan kun je hem als Integer declareren. Zoals ik al zei: een getal kun je prima met een ander getal matchen. Zolang het maar getallen zijn. Dat een getal met veldeigenschap Double cijfers achter de komma kan hebben, maakt het matchen wel een stuk lastiger, dus het is handiger als de te matchen getallen dezelfde opmaak hebben. Ik vermoed echter dat Code1 een tekstveld is, en die moet je dus converteren naar een getal, bijvoorbeeld met cInt(Code1).
 
Code1 verder

Hierbij de Code van de Hoofdlus, op 2 plekken staat CodeHM maar dat is in de VBA Code ik heb dit aangepast omdat ander de # functie van deze site de code niet juist weergeeft.
Code1 wordt gevuld vanuit het hokje Code in UitvoerGegevensMestbeleid en dat hokje heeft in de tabel de eigenschap lange integer.


Code:
Private Sub VullenUitvoerGegevensMestbeleid2_Click()

Dim DBase As DAO.Database
Dim strSQL1, MijnVar, strSQL4 As String
Dim rst1, UitvoerGegevensMestbeleid1 As DAO.Recordset
Dim Aantal, Vastlegging1, Veestapel1, Tekst28, kVEMUTD, Tekst29, Tekst27, Eiwit, Vet, StartTijd, EindTijd, TotalTime
Dim GrasKenKDs, VemBehoefte1, KuilVem1, KuilKgDs1, VemBehoefte, MaisKenKDs, MaisVem1, KuilDs09, MaisDs09, KuilVem09, MaisVem09
Dim tmp, NEffBex, PEffBex, VemBehoefteKgDs1, VoerEff, Vastlegging2, Veestapel2, C, BexN1, BexP1, Kuubs, NBex, PBex, VemBehoefte09
Dim WeideKgDs, GVEAant1, GVEDag, WeideDs09, WeideKgDsDag, ZomerstalMaandenVersGras, WeideVem, WeideVem09, BijpVem, RuwVem, KVVem, KuilVem, MaisVem
Dim PercVEMWeide, PercVEMKuil, PercVEMMais, PercVEMBijp, PercVEMRV, PercVEMKV, MaisKAanvVem, Bijprod1VoorraadVem, Ruwvoer1VoorraadVem, Kv1VoorraadVem
Dim VervluchtingN, VervluchtingN09, VervluchtigingMk, VervluchtigingMM, VervluchtigingGVEtot, GVE, NBedrijf, PBedrijf, AanvOrgN, AanvOrgP, AfOrgP, AfOrgN
Dim VoorraadMutatieKmN, VoorraadMutatieKmP, VoorraadMutN, VoorraadMutP, NMestBexBedrijf, PMestBexBedrijf, BedrijfsSpecifiekNettoN, BedrijfsSpecifiekNettoN09
Dim BedrijfsSpecifiekNettoP, BedrijfsSpecifiekNettoP09, Code1
'Dim Code1, Code1997 As Integer

StartTijd = Timer
'Octafish:
MijnVar = "Bex"
'Code1997 = 1

For Each C In Array(2007, 2008, 2009, 2010, 2011)

'strSQL1 = "Select * From UitvoerGegevensMestbeleid Where ([JAAR] = 2007 Or [JAAR] = 2008) AND [Gemengd] = '" & MijnVar & "' AND [VeestapelN] > 0 Order by [StudiegroepCode]"
strSQL1 = "Select * From UitvoerGegevensMestbeleid Where [JAAR] = " & C & " AND [Gemengd] = '" & MijnVar & "' AND [VeestapelN] > 0 Order by [StudiegroepCode]"
    'tmp = InputBox("", "", strSQL1)

        Set DBase = CurrentDb
        Set rst1 = DBase.OpenRecordset(strSQL1)
        
        If rst1.RecordCount <> 0 Then
            rst1.MoveLast
            rst1.MoveFirst
            Do While Not rst1.EOF
                StudiegroepCode1 = rst1![StudiegroepCode].Value
                Jaar1 = rst1![Jaar].Value
               [B] Code1 = rst1![CodeHM].Value[/B]    
            If Code1 <> 1 Then GoTo RST1MoveNext:
                Gemengd1 = rst1![Gemengd].Value
                    
                    NEffBex = 0
                    PEffBex = 0
                    VoerEff = 0
                    kVEMUTD = 0
                    NBex = 0
                    PBex = 0
                    VemBehoefte = 0
                    WeideKgDsDag = 0
                    PercVEMWeide = 0
                    PercVEMKuil = 0
                    PercVEMMais = 0
                    PercVEMBijp = 0
                    PercVEMRV = 0
                    PercVEMKV = 0
                    VervluchtigingMM = 0
                    VervluchtigingMk = 0
                    VervluchtigingGVEtot = 0
                    NMestBexBedrijf = 0
                    PMestBexBedrijf = 0
                    
                Select Case C
                
                Case 2007, 2008
                    Vastlegging1 = rst1![VastleggingN].Value
                    Veestapel1 = rst1![VeestapelN].Value
                    Vastlegging2 = rst1![VastleggingP].Value
                    Veestapel2 = rst1![VeestapelP].Value
                    BexN1 = rst1![BedrijfsSpecifiekNettoN].Value
                    BexP1 = rst1![BedrijfsSpecifiekNettoP].Value
                    Kuubs = rst1![OpslagKuub].Value
                    VemBehoefte1 = rst1![VemBehoefte].Value
                    KuilVem1 = rst1![KuilVem].Value
                    KuilKgDs1 = rst1![KuilKgDs].Value
                    WeideKgDs = rst1![WeideKgDs].Value
                    WeideVem = rst1![WeideVem].Value
                    VervluchtingN = rst1![VervluchtigingN].Value
                    BedrijfsSpecifiekNettoN = rst1![BedrijfsSpecifiekNettoN].Value
                    BedrijfsSpecifiekNettoP = rst1![BedrijfsSpecifiekNettoP].Value
                                     
                Case Else
                    Vastlegging1 = rst1![VastleggingN09].Value
                    Veestapel1 = rst1![VeestapelN09].Value
                    Vastlegging2 = rst1![VastleggingP09].Value
                    Veestapel2 = rst1![VeestapelP09].Value
                    BexN1 = rst1![BedrijfsSpecifiekNettoN09].Value
                    BexP1 = rst1![BedrijfsSpecifiekNettoP09].Value
                    Kuubs = rst1![OpslagKuub].Value
                    VemBehoefte09 = rst1![VemBehoefte09].Value
                    KuilVem09 = rst1![KuilVem09].Value
                    MaisVem09 = rst1![MaisVem09].Value
                    KuilDs09 = rst1![KuilDs09].Value
                    MaisDs09 = rst1![MaisDs09].Value
                    WeideDs09 = rst1![WeideDs09].Value
                    WeideVem09 = rst1![WeideVem09].Value
                    VervluchtingN09 = rst1![VervluchtigingN09].Value
                    BedrijfsSpecifiekNettoN09 = rst1![BedrijfsSpecifiekNettoN09].Value
                    BedrijfsSpecifiekNettoP09 = rst1![BedrijfsSpecifiekNettoP09].Value
                    
                End Select
                
                VemBehoefteKgDs1 = rst1![VemBehoefteKgDs].Value
                
                Call InvoerGegevensMestbeleid1(StudiegroepCode1, Jaar1, Code1, Gemengd1, Vet, Eiwit, Tekst27, _
                        Tekst28, Tekst29, GrasKenKDs, MaisKenKDs, GVEAant1, GVEDag, ZomerstalMaandenVersGras, _
                        MaisKAanvVem, Bijprod1VoorraadVem, Ruwvoer1VoorraadVem, Kv1VoorraadVem, _
                        VoorraadMutN, VoorraadMutP)
                
                Call InvoerGegevensMestbeleid2(StudiegroepCode1, Jaar1, Code1, Gemengd1, kVEMUTD, GVE)

                Call InvoerGegevensMestbeleid3(StudiegroepCode1, Jaar1, Code1, AanvOrgN, AanvOrgP, AfOrgP, AfOrgN)
               
                If IsEmpty(Tekst28) Then GoTo RST1MoveNext:
                If IsEmpty(kVEMUTD) Then GoTo RST1MoveNext:
                If Veestapel1 = 0 Then GoTo RST1MoveNext:

                NEffBex = (Tekst28 + Vastlegging1) / Veestapel1 * 100
                 PEffBex = Round((Tekst29 + Vastlegging2) / Veestapel2 * 100, 0)
                  VoerEff = (Tekst27 * (0.337 + (0.116 * Vet) + (0.06 * Eiwit))) / VemBehoefteKgDs1
                   NBex = BexN1 / (Kuubs * 2)
                    PBex = BexP1 / (Kuubs * 2)
                    
                If C = 2007 Or C = 2008 Then
                    If GrasKenKDs > 0 Then
                        
                        VemBehoefte = (VemBehoefte1 + KuilVem1 * (100 - KuilKgDs1 / GrasKenKDs * 100) / 100) / VemBehoefte1 * 100
                    Else
                        VemBehoefte = Empty
                    End If
                        If WeideKgDs = 0 Or GVEAant1 = 0 Or GVEDag = 0 Then
                        Else
                            WeideKgDsDag = Round(WeideKgDs / GVEDag / GVEAant1, 1)
                        End If
                                'PercVem
                                
                                PercVEMWeide = WeideVem / VemBehoefte1 * 100
                                PercVEMKuil = KuilVem / VemBehoefte1 * 100
                                PercVEMMais = MaisKAanvVem / VemBehoefte1 * 100
                                PercVEMBijp = Bijprod1VoorraadVem / VemBehoefte1 * 100
                                PercVEMRV = Ruwvoer1VoorraadVem / VemBehoefte1 * 100
                                PercVEMKV = Kv1VoorraadVem / VemBehoefte1 * 100
                                
                                If Tekst27 > 0 Then VervluchtigingMM = VervluchtingN / (Tekst27 * (0.337 + (0.116 * Vet) + (0.06 * Eiwit))) * 1000
                                If GVEAant1 > 0 Then VervluchtigingMk = VervluchtingN / GVEAant1
                                If GVE > 0 Then VervluchtigingGVEtot = VervluchtingN / GVE
                                
                                NMestBexBedrijf = BedrijfsSpecifiekNettoN + AanvOrgN - AfOrgN - VoorraadMutN
                                PMestBexBedrijf = BedrijfsSpecifiekNettoP + AanvOrgP - AfOrgP - VoorraadMutP
                                
                                If IsNull(NMestBexBedrijf) Then NMestBexBedrijf = 0
                                If IsNull(PMestBexBedrijf) Then PMestBexBedrijf = 0
                Else
                        '2009 en verder
                        If GrasKenKDs > 0 Then
                                If KuilDs09 = 0 Then
                                VemBehoefte = (VemBehoefte09 + (KuilVem09 * 0) + MaisVem09 * (100 - MaisDs09 / MaisKenKDs * 100) / 100) / VemBehoefte09 * 100
                                End If
                                If MaisKenKDs = 0 Then
                                VemBehoefte = (VemBehoefte09 + KuilVem09 * (100 - KuilDs09 / GrasKenKDs * 100) / 100 + (MaisVem09 * 0)) / VemBehoefte09 * 100
                                End If
                                If KuilDs09 = 0 And MaisKenKDs = 0 Then
                                VemBehoefte = (VemBehoefte09 + (KuilVem09 * 0) + (MaisVem09 * 0)) / VemBehoefte09 * 100
                                End If
                                If KuilDs09 > 0 And MaisKenKDs > 0 Then
                                VemBehoefte = (VemBehoefte09 + KuilVem09 * (100 - KuilDs09 / GrasKenKDs * 100) / 100 + MaisVem09 * (100 - MaisDs09 / MaisKenKDs * 100) / 100) / VemBehoefte09 * 100
                                End If
                        Else
                        VemBehoefte = Empty
                        End If
                                If WeideDs09 = 0 Or ZomerstalMaandenVersGras = 0 Or GVEAant1 = 0 Then
                                Else
                                
                                WeideKgDsDag = Round(WeideDs09 / (ZomerstalMaandenVersGras * 30.5) / GVEAant1, 1)
                                End If
                                
                                'PercVem
                                PercVEMWeide = WeideVem09 / VemBehoefte09 * 100
                                PercVEMKuil = KuilVem09 / VemBehoefte09 * 100
                                PercVEMMais = MaisVem09 / VemBehoefte09 * 100
                                PercVEMBijp = Bijprod1VoorraadVem / VemBehoefte09 * 100
                                PercVEMRV = Ruwvoer1VoorraadVem / VemBehoefte09 * 100
                                PercVEMKV = Kv1VoorraadVem / VemBehoefte09 * 100
                                
                                If Tekst27 > 0 Then VervluchtigingMM = VervluchtingN09 / (Tekst27 * (0.337 + (0.116 * Vet) + (0.06 * Eiwit))) * 1000
                                If GVEAant1 > 0 Then VervluchtigingMk = VervluchtingN09 / GVEAant1
                                If GVE > 0 Then VervluchtigingGVEtot = VervluchtingN09 / GVE
                                
                                NMestBexBedrijf = BedrijfsSpecifiekNettoN09 + AanvOrgN - AfOrgN - VoorraadMutN
                                PMestBexBedrijf = BedrijfsSpecifiekNettoP09 + AanvOrgP - AfOrgP - VoorraadMutP
                                
                                If IsNull(NMestBexBedrijf) Then NMestBexBedrijf = 0
                                If IsNull(PMestBexBedrijf) Then PMestBexBedrijf = 0
                End If
                
                strSQL4 = "Select * From UitvoerGegevensMestbeleid2 Where [StudiegroepCode] = '" & StudiegroepCode1 & "' And [CodeHM] = " & Code1 & " AND [JAAR] = " & Jaar1 & " AND [Gemengd] = '" & Gemengd1 & "'"
                        
                With DBase.OpenRecordset(strSQL4)
                    If .RecordCount > 0 Then
                        .Delete
                    End If
                   'Stop
                    .AddNew
                    .Fields("StudiegroepCode").Value = StudiegroepCode1
                    .Fields("Jaar").Value = Jaar1
                    .Fields("Code").Value = Code1
                    .Fields("Gemengd").Value = Gemengd1
                    .Fields("BerekenDatumMestbeleid").Value = Time()
                    .Fields("NEfficientBex").Value = Round(NEffBex, 0)
                    .Fields("PEfficientBex").Value = Round(PEffBex, 0)
                    .Fields("VoerEfficientBex").Value = Round(VoerEff, 2)
                    .Fields("HUTDkVEMBenutting").Value = kVEMUTD
                    .Fields("NBex").Value = Round(NBex, 1)
                    .Fields("PBex").Value = Round(PBex, 1)
                    .Fields("VEMDekkingBex").Value = Round(VemBehoefte, 0)
                    .Fields("WeideKgDsDag").Value = Round(WeideKgDsDag, 1)
                    .Fields("PercKvemWeidegras").Value = Round(PercVEMWeide, 0)
                    .Fields("PercKvemKuilgras").Value = Round(PercVEMKuil, 0)
                    .Fields("PercKvemMaïs").Value = Round(PercVEMMais, 0)
                    .Fields("PercKvemBijproducten").Value = Round(PercVEMBijp, 0)
                    .Fields("PercKvemOvRuwvoer").Value = Round(PercVEMRV, 0)
                    .Fields("PercKvemKrachtvoer").Value = Round(PercVEMKV, 0)
                    .Fields("NH3Emmissie1000KgMM").Value = Round(VervluchtigingMM, 1)
                    .Fields("NH3EmmissieMelkKoe").Value = Round(VervluchtigingMk, 1)
                    .Fields("NH3EmmissieGVEAanw").Value = Round(VervluchtigingGVEtot, 1)
                    .Fields("NMestBexBedrijf").Value = Round(NMestBexBedrijf, 0)
                    .Fields("PMestBexBedrijf").Value = Round(PMestBexBedrijf, 0)
                    .Update
                    
                .Close
                
                End With
                
RST1MoveNext:
                rst1.MoveNext
            Loop
        Else
        End If
    
    rst1.Close
Next C

    EindTijd = Timer
    TotalTime = Round((EindTijd - StartTijd) / 60, 0)
    
    MsgBox "Tabel UitvoerGegevensMestbeleid2 gevuld en duurde " & TotalTime & " minuten!"
End Sub

Hier volgen de gecallde lussen:

Code:
Private Sub InvoerGegevensMestbeleid1(ByRef StudiegroepCode1, ByRef Jaar1, ByRef Code1, ByRef Gemengd1, ByRef Vet, ByRef Eiwit, ByRef Tekst27, _
    ByRef Tekst28, ByRef Tekst29, ByRef GrasKenKDs, ByRef MaisKenKDs, ByRef GVEAant1, ByRef GVEDag, ByRef ZomerstalMaandenVersGras, _
    ByRef MaisKAanvVem, ByRef Bijprod1VoorraadVem, ByRef Ruwvoer1VoorraadVem, ByRef Kv1VoorraadVem, _
    ByRef VoorraadMutN, ByRef VoorraadMutP)

Dim DatBase As DAO.Database
Dim strSQL2 As String

Dim tmp1, Gemengd, Gemengd2

       Set DatBase = CurrentDb
Gemengd = "0"
Gemengd2 = CStr(Gemengd)

    'Stop
    strSQL2 = "Select * From InvoerGegevensMestbeleid Where [StudiegroepCode] = '" & StudiegroepCode1 & "' And [CodeHM] = " & Code1 & " AND [JAAR] = " & Jaar1 & " AND [Gemengd] = '" & Gemengd1 & "'"
    
    With DatBase.OpenRecordset(strSQL2)
                    If .RecordCount > 0 Then
                        [Tekst27] = .Fields("27").Value
                        [Tekst28] = .Fields("28").Value
                        [Tekst29] = .Fields("29").Value
                        [Vet] = .Fields("VetMelk").Value
                        [Eiwit] = .Fields("EiwitMelk").Value
                        [GrasKenKDs] = .Fields("GrasKenKDs").Value
                        [MaisKenKDs] = .Fields("MaisKenKDs").Value
                        [GVEDag] = .Fields("GVEGemiddeldAanwezig1Dag").Value
                        [GVEAant1] = .Fields("GVEGemiddeldAanwezig1").Value
                        [ZomerstalMaandenVersGras] = .Fields("ZomerstalMaandenVersGras").Value
                        [MaisKAanvVem] = .Fields("MaisKAanvVem").Value
                        [Bijprod1VoorraadVem] = .Fields("Bijprod1VoorraadVem").Value
                        [Ruwvoer1VoorraadVem] = .Fields("Ruwvoer1VoorraadVem").Value
                        [Kv1VoorraadVem] = .Fields("Kv1VoorraadVem").Value
                        [VoorraadMutN] = .Fields("VoorraadMestMutatieN").Value
                        [VoorraadMutP] = .Fields("VoorraadMestMutatieP2O5").Value
                    End If
                .Close
    End With
  
    DatBase.Close
    Set DatBase = Nothing

End Sub

Dit is de 2e :

Code:
Private Sub InvoerGegevensMestbeleid2(ByRef StudiegroepCode1, ByRef Jaar1, ByRef Code1, ByRef Gemengd1, ByRef kVEMUTD, ByRef GVE)

Dim DatBase As DAO.Database
Dim strSQL3 As String ', MijnVar2 As String, strSQL3 As String, strSQL4 As String ', Gemengd2 As String
Dim tmp1, Gemengd ', Gemengd2

       Set DatBase = CurrentDb
Gemengd = "0"
Gemengd2 = CStr(Gemengd)

    'Stop
    
     strSQL3 = "Select * From Uitvoer1997technisch Where [STUDIEGROEP] = '" & StudiegroepCode1 & "' And [JAAR] = " & Jaar1 & " And [CodeHM] = " & Code1 & " AND [Gemengd] = '" & Gemengd2 & "'"
   'Stop
   With DatBase.OpenRecordset(strSQL3)
                    If .RecordCount > 0 Then
                        [kVEMUTD] = .Fields("UtdHendrixBenutting").Value
                        [GVE] = .Fields("GVET/HA").Value * .Fields("HATOTAALT").Value
                    End If
                .Close
    End With
   
    
    DatBase.Close
    Set DatBase = Nothing
    
End Sub

en dit de 3e:

Code:
Private Sub InvoerGegevensMestbeleid3(ByRef StudiegroepCode1, ByRef Jaar1, ByRef Code1, ByRef AanvOrgN, ByRef AanvOrgP, _
    ByRef AfOrgP, ByRef AfOrgN)

Dim DatBase As DAO.Database
Dim strSQL4 As String
Dim tmp1, Gemengd ', Gemengd2

       Set DatBase = CurrentDb
Gemengd = "0"
Gemengd2 = CStr(Gemengd)

    'Stop
       
    strSQL4 = "Select * From Uitvoer1997balans Where [STUDIEGROEP] = '" & StudiegroepCode1 & "' And [JAAR] = " & Jaar1 & " And [CodeHM] = " & Code1 & " AND [Gemengd] = '" & Gemengd2 & "'"
   
   With DatBase.OpenRecordset(strSQL4)
                    If .RecordCount > 0 Then
                        [AanvOrgP] = .Fields("22B").Value
                        [AanvOrgN] = .Fields("21").Value
                        [AfOrgP] = .Fields("37B").Value
                        [AfOrgN] = .Fields("36").Value
                    End If
                .Close
    End With
    
    DatBase.Close
    Set DatBase = Nothing
    
End Sub

Ondanks dat de selectie in de gecallde lussen niet goed werkt mijns inziens ( het aantal records dat geteld wordt met record.count is te groot) worden in de tabel wel de juiste gegevens neergezet. Daar lijkt het alsof er dus wel maar 1 record geselecteerd wordt waaruit de gegevens komen.

Heb ik mogelijk een verkeerd begrip van de functie.RecordCount. Ik denk dat die functie een aantal specifieke records telt. Of geeft die functie aan hoeveel record er in en tabel zouden kunnen voldoen aan de eisen?

groet,

BB
 
Recordcount telt het aantal records dat in je geopende recordset zit, niks meer en niks minder. Afhankelijk van de manier waarop je de recordset opent leest hij het goede aantal records uit, of niet. Om er zeker van te zijn dat je altijd de juiste waarde krijgt, kun je met .MoveLast en .MoveFirst de cursor naar eind en begin van de recordset verplaatsen; daarna leest .RecordCount altijd het juiste aantal records.
 
andere manier benaderen tabellen

Ik wil in de beschreven VBA steeds een tabel openen en geef criteria via SQL. Nu zie ik hier en daar informatie over GetRows. Klopt het dat ik dan een werktabel aanmaak waarin ik ook kan zoeken met sql zonder dat ik steeds de database hoef te openen?

Ik creeer zeg maar een tijdelijke tabel op mijn computer die in geen database staat maar waarin wel gezocht kan worden?

gr

BB
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan