Namen met een ' en selectie via insert into

  • Onderwerp starter Onderwerp starter BasHD
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

BasHD

Gebruiker
Lid geworden
2 dec 2008
Berichten
99
Hallo Ik het volgende stuk VBA wat werkt :

Code:
Private Sub Selectie_Click()

DoCmd.RunSQL "DELETE * From SelectieAantalKoefamilie"

Dim DBase As DAO.Database

   
    Nummer = -1
    
    For teller = 1 To 100
    
    MyKoeNaam = Array(Naam1, Naam2, Naam3, Naam4, Naam5, Naam6, Naam7, Naam8, Naam9, Naam10, Naam11, Naam12, Naam13, Naam14, Naam15, Naam16, Naam17, Naam18, Naam19, Naam20, Naam21, Naam22, Naam23, Naam24, Naam25, Naam26, Naam27, Naam28, Naam29, Naam30, Naam31, Naam32, Naam33, Naam34, Naam35, Naam36, Naam37, Naam38, Naam39, Naam40, Naam41, Naam42, Naam43, Naam44, Naam45, Naam46, Naam47, Naam48, Naam49, Naam50, Naam51, Naam52, Naam53, Naam54, Naam55, Naam56, Naam57, Naam58, Naam59, Naam60, Naam61, Naam62, Naam63, Naam64, Naam65, Naam66, Naam67, Naam68, Naam69, Naam70, Naam71, Naam72, Naam73, Naam74, Naam75, Naam76, Naam77, Naam78, Naam79, Naam80, Naam81, Naam82, Naam83, Naam84, Naam85, Naam86, Naam87, Naam88, Naam89, Naam90, Naam91, Naam92, Naam93, Naam94, Naam95, Naam96, Naam97, Naam98, Naam99, Naam100)
    MyAantal = Array(TellerNaam1, TellerNaam2, TellerNaam3, TellerNaam4, TellerNaam5, TellerNaam6, TellerNaam7, TellerNaam8, TellerNaam9, TellerNaam10, TellerNaam11, TellerNaam12, TellerNaam13, TellerNaam14, TellerNaam15, TellerNaam16, TellerNaam17, TellerNaam18, TellerNaam19, TellerNaam20, TellerNaam21, TellerNaam22, TellerNaam23, TellerNaam24, TellerNaam25, TellerNaam26, TellerNaam27, TellerNaam28, TellerNaam29, TellerNaam30, TellerNaam31, TellerNaam32, TellerNaam33, TellerNaam34, TellerNaam35, TellerNaam36, TellerNaam37, TellerNaam38, TellerNaam39, TellerNaam40, TellerNaam41, TellerNaam42, TellerNaam43, TellerNaam45, TellerNaam45, TellerNaam46, TellerNaam47, TellerNaam48, TellerNaam49, TellerNaam50, TellerNaam51, TellerNaam52, TellerNaam53, TellerNaam54, TellerNaam55, TellerNaam56, TellerNaam57, TellerNaam58, TellerNaam59, TellerNaam60 _
    , TellerNaam61, TellerNaam62, TellerNaam63, TellerNaam64, TellerNaam65, TellerNaam66, TellerNaam67, TellerNaam68, TellerNaam69, TellerNaam70 _
    , TellerNaam71, TellerNaam72, TellerNaam73, TellerNaam74, TellerNaam75, TellerNaam76, TellerNaam77, TellerNaam78, TellerNaam79, TellerNaam80 _
    , TellerNaam81, TellerNaam82, TellerNaam83, TellerNaam84, TellerNaam85, TellerNaam86, TellerNaam87, TellerNaam88, TellerNaam89, TellerNaam90 _
    , TellerNaam91, TellerNaam92, TellerNaam93, TellerNaam94, TellerNaam95, TellerNaam96, TellerNaam97, TellerNaam98, TellerNaam99, TellerNaam100)
    
    Nummer = Nummer + 1
    
    Naam = MyKoeNaam(Nummer)
    Aantal = MyAantal(Nummer)
     
    Set DBase = CurrentDb
    
         DBase.Execute " INSERT INTO SelectieAantalKoefamilie " _
        & "(AantalDierenAanwFam,NaamKoeFam) VALUES " _
        & "('" & Aantal & "',  '" & Naam & "');"
        
    DBase.Close

    Next teller
    
    
    MsgBox "Records geselecteerd!"
    
End Sub

Echter als de naam die opgezocht is in een txt een ' bevat loopt de formule fout.

Is er iemand die me wil helpen om
Code:
 DBase.Execute " INSERT INTO SelectieAantalKoefamilie " _
        & "(AantalDierenAanwFam,NaamKoeFam) VALUES " _
        & "('" & Aantal & "',  '" & Naam & "');"

dit stukje te herschrijven zodat ook namen met een ' er in meegenomen kunnen worden?

De VBA loopt hierop namelijk vast.

Ik gebruik deze code om een tabel te vullen die ik later weer uitlees. Ik moet de tabel selecteren op de naam die het meeste voorkomt. Echter als ik in de tabel instel sorteren A tot Z bij Aantal dan doet ie dat niet. Ik maak er eerst een query van daar blijft de sortering wel. Kan ik via insert into selecteren of kan dat gewoon niet?


Groet,

BB
 
Ik heb ontzag voor al je typwerk, maar volgens mij kan het met deze constructie ook:

Code:
        Set DBase = CurrentDb
        With CurrentDb.OpenRecordset("SelectieAantalKoefamilie", dbOpenTable)
            For i = 1 To 100
                .AddNew
                .Fields("AantalDierenAanwFam").Value = Me("Tellernaam" & i)
                .Fields("NaamKoeFam").Value = Me("Naam" & i)
                .Update
            Next i
            .Close
        End With

Verder zet ik mijn vraagtekens bij de manier waarop je het veld AantalDieren vult; dat doe je namelijk met een tekststring, en niet met een getal. Vreemd...
 
gtetest

Hallo OctaFish,

Je stuk VBA werkt is inderdaad veel sneller.

Typewerk is knippen en plakken.

Waarom getal als tekst ingevoerd.......? Omdat het bleef werken. Logisch, nee!

Andere vraag :

Ik wil van een formulier in Access een PDF afdruk maken. Alleen als ik access via externe gegevens en dan PDF of XPS kies dan gooit ie alle records uit dat formulier in de PDF. Kan ik ook ergens ingeven dat ik maar van 1 record een PDF kan maken?

gr

BB
 
Bij een rapport (wat een veel logischere optie is voor export) kun je nog eenvoudig filteren, zodat de output overeenkomt met de records op het rapport. Ook daarvoor geldt overigens dat je bij de export het rapport een filter moet meegeven. Bij formulieren zou ik het eerlijk gezegd niet weten; misschien als je het formulier eerst filtert op één record. Een export doet namelijk niet wat je ziet op het scherm, maar wat er in de recordset zit. Maar leg jezelf eerst de vraag voor waarom je in hemelsnaam een formulier wilt exporteren; daar zijn ze absoluut niet voor bedoeld! Maak dus een rapport....
 
Rapport maken

Heldere uitleg. Ga een rapport proberen.

Heb een vervolg vraag. Hoop dat ik niet irritant wordt.

zie volgende stuk vba

Code:
Private Function MeerDan20Namen(ByRef Naam, ByRef AantalPresent, ByRef AantalDagen, ByRef KgMelk, ByRef KGvet, ByRef KGeiwit, ByRef LW, ByRef TKT, ByRef LeeftijdNaam, ByRef NaamNummer)

Dim DBase As DAO.Database


    Set DBase = CurrentDb
        With CurrentDb.OpenRecordset("MprJaarFamilieAanwezigProductie2", dbOpenTable)
            
                
                If NaamNummer = 21 Then
                    .AddNew
                    .Fields("Gestopt").Value = Forms!MprJaarFamilieAanwezigProductie!Gestopt
                    .Fields("JAAR").Value = Forms!MprJaarFamilieAanwezigProductie!Jaar
                    .Fields("StudiegroepCode").Value = Forms!MprJaarFamilieAanwezigProductie!StudiegroepCode
                    .Fields("Code").Value = Forms!MprJaarFamilieAanwezigProductie!Code
                    .Fields("Gemengd").Value = Forms!MprJaarFamilieAanwezigProductie!Gemengd
                    .Fields("InvoernaamMpr").Value = Forms!MprJaarFamilieAanwezigProductie!InvoernaamMpr
                    .Fields("OpstuurDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!OpstuurDatumMpr
                    .Fields("OntvangstDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!OntvangstDatumMpr
                    .Fields("InvoerDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!InvoerDatumMpr
                    .Fields("BerekenDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!BerekenDatumMpr
                    .Fields("BerekendDoorMpr").Value = Forms!MprJaarFamilieAanwezigProductie!BerekendDoorMpr
                    .Fields("NaamCRD").Value = Forms!MprJaarFamilieAanwezigProductie!NaamCRD
                    .Fields("Naam21").Value = Naam
                    .Fields("TellerNaam21").Value = AantalPresent
                    .Fields("KGvet21").Value = KGvet / AantalPresent
                    .Fields("KGeiwit21").Value = KGeiwit / AantalPresent
                    .Fields("LW21").Value = LW / AantalPresent
                    .Fields("TKT21").Value = TKT / AantalPresent
                        Call LeeftijdOmzet(LeeftijdNaam, LeeftijdNaamNaOm)
                    .Fields("LeeftijdNaam21").Value = LeeftijdNaamNaOm
                    .Fields("KgMelk21").Value = KgMelk / AantalPresent
                    .Fields("AantalDagen21").Value = AantalDagen / AantalPresent
                    .Fields("KgMelkDag21").Value = Round(KgMelk / AantalDagen, 1)
                    .update
                End If
                
            
            .Close
        End With
    
End Function

In de code zijn de volgende velden uniek

.Fields("JAAR").Value = Forms!MprJaarFamilieAanwezigProductie!Jaar
.Fields("StudiegroepCode").Value = Forms!MprJaarFamilieAanwezigProductie!StudiegroepCode
.Fields("Code").Value = Forms!MprJaarFamilieAanwezigProductie!Code

Hoe kan ik voordat ik de lus in ga controleren of dat er al een record is die aan deze eisen voldoet en dus verwijdert moet worden?

StrSQL = Select * from MprJaarFamilieAanwezigProductie2 where ????
If.RecordCount > 0 Then delete record?

Is dat de juiste insteek?

gr
BB
 
De where heb je zelf al ingetypt, dus dat ga ik hier niet herhalen; maar er een mooie string van, zou ik zeggen!
Ik controleer 'm meestal zo:

Code:
    With CurrentDb.OpenRecordset("SELECT * FROM Bestanden WHERE Klantnr=" & Me.KlantNr)
        If .RecordCount = 0 Then
            .AddNew
            ...
            .Update
        Else
            .Close
            Exit Function
        End If
        .Close
    End With

Oftwel: alleen een record toevoegen als de recordcount 0 is. Het record bestaat dan namelijk nog niet.
 
Heb dit ervan gemaakt en het werkt.

Code:
Private Function MeerDan20Namen(ByRef Naam, ByRef AantalPresent, ByRef AantalDagen, ByRef KgMelk, ByRef KGvet, ByRef KGeiwit, ByRef LW, ByRef TKT, ByRef LeeftijdNaam, ByRef NaamNummer)


Dim DBase As DAO.Database
Dim StrSQL As String

    C = NaamNummer
    If IsEmpty(AantalDagen) Then Exit Function
    Select Case C
    
    Case 21
        Set DBase = CurrentDb
        
        StrSQL = "Select * FROM MprJaarFamilieAanwezigProductie2 WHERE [StudiegroepCode]= '" & [Forms]![Leden]![StudiegroepCode] & "' and [NaamCRD]= '" & [Forms]![MprJaarFamilieAanwezigProductie]![NaamCRD] & "' and [JAAR] = " & [Forms]![MprJaarFamilieAanwezigProductie]![Jaar] & ""
        With DBase.OpenRecordset(StrSQL)
                If .RecordCount > 0 Then
                    .Delete
                End If
                .Close
        End With
        With CurrentDb.OpenRecordset("MprJaarFamilieAanwezigProductie2", dbOpenTable)
            
                    .AddNew
                    .Fields("Gestopt").Value = Forms!MprJaarFamilieAanwezigProductie!Gestopt
                    .Fields("JAAR").Value = Forms!MprJaarFamilieAanwezigProductie!Jaar
                    .Fields("StudiegroepCode").Value = Forms!MprJaarFamilieAanwezigProductie!StudiegroepCode
                    .Fields("Code").Value = Forms!MprJaarFamilieAanwezigProductie!Code
                    .Fields("Gemengd").Value = Forms!MprJaarFamilieAanwezigProductie!Gemengd
                    .Fields("InvoernaamMpr").Value = Forms!MprJaarFamilieAanwezigProductie!InvoernaamMpr
                    .Fields("OpstuurDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!OpstuurDatumMpr
                    .Fields("OntvangstDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!OntvangstDatumMpr
                    .Fields("InvoerDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!InvoerDatumMpr
                    .Fields("BerekenDatumMpr").Value = Forms!MprJaarFamilieAanwezigProductie!BerekenDatumMpr
                    .Fields("BerekendDoorMpr").Value = Forms!MprJaarFamilieAanwezigProductie!BerekendDoorMpr
                    .Fields("NaamCRD").Value = Forms!MprJaarFamilieAanwezigProductie!NaamCRD
                    .Fields("Naam21").Value = Naam
                    .Fields("TellerNaam21").Value = AantalPresent
                    .Fields("KGvet21").Value = KGvet / AantalPresent
                    .Fields("KGeiwit21").Value = KGeiwit / AantalPresent
                    .Fields("LW21").Value = LW / AantalPresent
                    .Fields("TKT21").Value = TKT / AantalPresent
                        Call LeeftijdOmzet(LeeftijdNaam, LeeftijdNaamNaOm)
                    .Fields("LeeftijdNaam21").Value = LeeftijdNaamNaOm
                    .Fields("KgMelk21").Value = KgMelk / AantalPresent
                    .Fields("AantalDagen21").Value = AantalDagen / AantalPresent
                    .Fields("KgMelkDag21").Value = Round(KgMelk / AantalDagen, 1)
                    .update
            .Close
        End With
        DBase.Close
        
    Case Else
    
        NaamVak = "Naam" & C
        TellerNaamVak = "TellerNaam" & C
        KGvetVak = "KGvet" & C
        KGeiwitVak = "KGeiwit" & C
        LWVak = "LW" & C
        TKTVak = "TKT" & C
        LeeftijdNaamVak = "LeeftijdNaam" & C
        KgMelkVak = "KgMelk" & C
        AantalDagenVak = "AantalDagen" & C
        KgMelkDagVak = "KgMelkDag" & C
    
        Set DBase = CurrentDb
        StrSQL = "Select * FROM MprJaarFamilieAanwezigProductie2 WHERE [StudiegroepCode]= '" & [Forms]![Leden]![StudiegroepCode] & "' and [NaamCRD]= '" & [Forms]![MprJaarFamilieAanwezigProductie]![NaamCRD] & "' and [JAAR] = " & [Forms]![MprJaarFamilieAanwezigProductie]![Jaar] & ""
        With DBase.OpenRecordset(StrSQL)
                If .RecordCount > 0 Then
                    .Edit
                    .Fields(NaamVak).Value = Naam
                    .Fields(TellerNaamVak).Value = AantalPresent
                    .Fields(KGvetVak).Value = KGvet / AantalPresent
                    .Fields(KGeiwitVak).Value = KGeiwit / AantalPresent
                    .Fields(LWVak).Value = LW / AantalPresent
                    .Fields(TKTVak).Value = TKT / AantalPresent
                        Call LeeftijdOmzet(LeeftijdNaam, LeeftijdNaamNaOm)
                    .Fields(LeeftijdNaamVak).Value = LeeftijdNaamNaOm
                    .Fields(KgMelkVak).Value = KgMelk / AantalPresent
                    .Fields(AantalDagenVak).Value = AantalDagen / AantalPresent
                    .Fields(KgMelkDagVak).Value = Round(KgMelk / AantalDagen, 1)
                   .update
                 End If
                .Close
        End With
            
    End Select
End Function

Bedankt voor de input. Ik heb nu de volgende vraag over het volgende stukje code:

Code:
StrSQL = "Select * FROM MprJaarFamilieAanwezig WHERE [StudiegroepCode]= '" & [Forms]![Leden]![StudiegroepCode] & "' and [NaamCRD]= '" & [Forms]![MprJaarFamilieAanwezigProductie]![NaamCRD] & "' and [JAAR] = " & [Forms]![MprJaarFamilieAanwezigProductie]![Jaar] & ""
    With DBase.OpenRecordset(StrSQL)
        If .RecordCount > 0 Then
            [AantalKoeFamilies2] = .Fields("AantalFamilieNamen").Value
        End If
        .Close
    End With
DBase.Close

Naam en studiegroepcode zijn in de brontabel tekst velden en jaar numeriek. De formulie geeft bij recordcount het aantal records aan dat aan de teksteigenschappen voldoet. De jaarcriteria wordt niet gebruikt. Toch geeft ie bij koefamilies2 wel het aantal koefamilies wat ik zoek in het betrefende jaar zonder dat ik de brontabel op jaar heb geselecteerd. Hoe kan ik de formule zo maken dat ie de criteria Jaar wel meeneemt.
Ik heb de '""' etc weggehaald maar dat is het niet. dan krijg ik nog teveel records.
Hoe moet ik het schrijven?

gr

BB
 
Dus het probleem zit 'm denk je in de query?
Code:
StrSQL = "Select * FROM MprJaarFamilieAanwezig WHERE [StudiegroepCode]= '" & [Forms]![Leden]![StudiegroepCode] & "' and [NaamCRD]= '" & [Forms]![MprJaarFamilieAanwezigProductie]![NaamCRD] & "' and [JAAR] = " & [Forms]![MprJaarFamilieAanwezigProductie]![Jaar] & ""
In deze query gebruik je wel degelijk het Jaar als filter; als je de output niet klopt, kun je hem eens checken in een nieuwe query door hem uit een Inputbox te kopieëren:

Code:
Dim tmp
tmp=Inputbox("","",strSQL)
De sql code plak je in een nieuwe query; je kunt nu vrij snel zien of de selectie wel goed is of niet.
 
vervolg

De code tmp = Inputbox etc geeft nu aan wat de string is.

De numerieke waarde staat als getal en de rest typetekst velden staan tussen 'waarde'
[Jaar] = 2010 and [StudiegroepCode] = '123456-01 and [Gemengd] = '0' etc

Op basis van deze selectie zou die alleen de records met het jaar 2010 mogen pakken maar hij geeft in de .recordCount 15 aan. Dat zijn alle jaren die de betrefeende studiegroepcode hebben. Maar daar zitten ook records bij die 2008 en 2009 als jaar hebben. Toch pakt ie het aantal dieren uit de records waar het jaar 2010 is.

Ik zou graag willen dat .RecordCount 1 gaf en niet 15.
 
Ik kan er eerlijk gezegd weinig chocola van maken; als de query werkt, en dat doet hij dus blijkbaar, dan mag hij niet de waarde laten zien die bij alle records hoort. Weliswaar is je code wel heel basic; ik zou zelf eerst de cursor nog goed zetten:

Code:
    With DBase.OpenRecordset(StrSQL)
[B]        .MoveLast
        .MoveFirst[/B]
        If .RecordCount > 0 Then
            [AantalKoeFamilies2] = .Fields("AantalFamilieNamen").Value
        End If
        .Close
    End With

En je moet, met jouw code, ook wel heel zeker weten dat er maar één uitkomst is...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan