Printen van 1 record vanuit formulier op een rapport.

Status
Niet open voor verdere reacties.

Berry18

Gebruiker
Lid geworden
5 dec 2014
Berichten
12
Ik heb een tabel met de naam "bezoekrapport", met als sleutelveld [Volgnummer1], welke is gebaseerd op een module, om jaar, datum, tijd en 4cijferig nummer tot Volgnummer te maken! Dit functioneert goed!

En ik heb een rapport "rptbezoekrapport"

Nu wil ik ook graag, dat als ik op mijn formulier een record bekijk, via een knop, de data uit deze record en uit gerelateerde tabellen op het betreffende rapport krijgen,
Ik heb al allerlei VBA-codes geprobeerd, maar niets werkt. Of ik krijg expressiefoutmeldingen of ik krijg een leeg rapport te zien!

Nu vroeg ik me af heeft iemand van jullie een goed werkende VBA-code, zodat ik d.m.v. knop mijn rapport kan openen en vullen met een record uit een formulier
Liefst aan de hand van het sleutelveld [Volgnummer1].

Voorbeelddatabase heb ik zo even niet snel bij de hand.

Alvast bedankt
 
Momenteel zit huidige codering onder de knop:

Private Sub Knop258_Click()

On Error GoTo Err_Knop258_Click

DoCmd.OpenReport "rptLeghennen", acViewPreview, , "[Volgnummer1] = '" & Me.Volgnummer1 & "'"

Exit Sub

Err_Knop258_Click:
MsgBox Error$

End Sub
 
Je code zou er zo uit moeten zien (inclusief Code opmaak ;) )
Private Sub Knop258_Click()
DoCmd.OpenReport "rptLeghennen", acViewPreview, , "[Volgnummer1] = " & Me.Volgnummer1
End Sub
Althans: als je volgnummer een getal is, wat logisch zou zijn. Bij tekst heb je wel de goede syntax wel te pakken. Het oogt overigens wel als een gruwelijk ingewikkeld volgnummer...
 
Mijn volgnummer is inderdaad een nummer!
EN is gebaseerd op de deze vraag alleen uitgebreid met maand en dag.

Als ik nu de aangegeven CODE probeer, krijg ik de volgende melding.

De expressie Bij klikken die u hebt opgegeven als instelling voor de gebeurteniseigenschap, heeft de volgende fout veroorzaakt: Er is een fout opgetreden in de communictie tussen Microsoft Acces en het OLE_bronprogramma of het ActiveX-besturings element
*De expressie geeft niet de naam van een macro, de naam van een door de gebruiker gedefinieerde functie of een [gebeurtenisprocedure] als resultaat.
*Er is een fout opgetreden bij het evalueren van een functie, gebeurtenis of macro.
 
Zonder jouw aangepaste functie te zien is het lastig; de functie in het aangehaalde draadje is nogal gemankeerd, en zelf heb ik een betere. Die ziet er ter vergelijking zo uit:
Code:
Function NieuwVolgNummer(Veld As String, Tabel As String) As String
Dim strVolgNummer As String
Dim strSQL As String
Dim tmpNum As Variant

    '----------------------------------------------------------------------------------------------------
    ' Huidige volgnummer uit tabel lezen die als parameter is meegegeven.
    '----------------------------------------------------------------------------------------------------
    If InStr(1, Veld, " ") > 0 And InStr(1, Veld, "[") = 0 Then Veld = "[" & Veld & "]"
    If InStr(1, Tabel, " ") > 0 And InStr(1, Tabel, "[") = 0 Then Tabel = "[" & Tabel & "]"
    strSQL = "SELECT TOP 1 " & Veld & " FROM " & Tabel & " "
    strSQL = strSQL & "ORDER BY " & Veld & " DESC"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
            strVolgNummer = .Fields(0).Value
        Else
            NieuwVolgNummer = Year(Date) & "-0001"
            Exit Function
        End If
    End With
    
    '----------------------------------------------------------------------------------------------------
    ' Volgend volgnummer genereren door het ingelezen nummer te splitsen
    '----------------------------------------------------------------------------------------------------
    tmpNum = Split(strVolgNummer, "-")
    If CInt(tmpNum(LBound(tmpNum))) = Year(Date) Then
        NieuwVolgNummer = tmpNum(LBound(tmpNum)) & "-" & Right("0000" & tmpNum(UBound(tmpNum)) + 1, 4)
    Else
        NieuwVolgNummer = Year(Date) & "-0001"
    End If

End Function

Deze code doet het perfect, maar maakt een volgnummer aan in een tekstveld (anders kan je geen koppelteken gebruiken) en is dus gebaseerd op een jaartal en een volgnummer. Maar met een beetje vba kennis is hij uiteraard wel om te bouwen naar een nummer met Jaar+Datum+Tijd+Volgnummer. Overigens krijg je dan een volgnummer als: 2014051220142355120003. 22 (ik herhaal: twee en twintig!) cijfers. Maak je écht maximaal 9.999 records per seconde (of, als je de secondes weglaat per minuut) dat je zo'n lang nummer nodig hebt? Voor welk bedrijf werk je dan :D
 
Als Volgnummer heb ik onderstaande codering

Option Compare Database
Option Explicit

Function VolgNummer(veld As String, Tabel As String) As String
Dim strSQL As String
Dim sFilter As String
Dim sNum As String
Dim iNum As Integer

If InStr(1, veld, " ") > 0 And Left(veld, 1) <> "[" Then veld = "[" & veld & "]"
If InStr(1, Tabel, " ") > 0 And Left(Tabel, 1) <> "[" Then Tabel = "[" & Tabel & "]"

sFilter = Format(Date, "yyyy") & Format(Date, "mm") & Format(Date, "dd")
strSQL = "SELECT DISTINCT Max(" & veld & ") AS MaxNummer FROM " & Tabel _
& " GROUP BY Nz(Left(" & veld & ",4))" _
& " HAVING Nz(Left(" & veld & ",4))=Year(Date())"

With CurrentDb.OpenRecordset(strSQL)
If .RecordCount > 0 Then
On Error Resume Next
sNum = Mid(.Fields(0), InStrRev(.Fields(0), 0) + 1)
iNum = CInt(sNum) + 1
sNum = Right("000" & iNum, 3)
VolgNummer = sFilter & sNum
Else
VolgNummer = sFilter & "001"
End If
End With

End Function


Dit geeft een getal met 11 cijfers! 22 Cijfers is wel wat gortig, dat hebben we inderdaad niet nodig. De tijd hoeft ook niet in de codering meegenomen te worden!
Alleen jaar, maand, dag en 3-cijferig nummer.

BIj de door jou aangegeven codering krijg ik een foutmelding op
If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
Omdat er geen huidig nummer is denk ik!
 
Even een tip: code maak je op met de CODE knop (te vinden als je <Ga geavanceerd> gebruikt) of door de tag [ code ] vóór de code te plaatsen, en [ /code ] ná de code (zonder de spaties, want anders gebruik ik de code i.p.v. dat ik hem laat zien). Dan is hij een stuk leesbaarder (vergelijk die van jou maar met die van mij).
Volgens mij gebruik je een ander format voor je nummer dan je in je eerste berichtje schreef:
... welke is gebaseerd op een module, om jaar, datum, tijd en 4cijferig nummer tot Volgnummer te maken!
Als ik jouw opmaak volg, dan kom ik echt tot 22 cijfers, en niet tot 11. Overigens kun je een getal van 11 cijfers al niet kwijt in een numeriek veld dat je als Lange Integer instelt, dus je zit ook nog eens vast aan een gegevenstype dat onnodig groot is. Ik zou hem dus in een tekstveld zetten, zeker omdat het verder niet gebruikt wordt om mee te rekenen.
Overigens werkt jouw functie bij mij net zo goed als mijn functie, dus het ligt niet aan de functie.
 
Dank je voor je antwoord!
Ik heb als ik jouw code invoer in de module.
En de velden aanpas voor mijn situatie.
En het veld [Volgnummer1] als tekstveld instel

Met als standaardwaarde voor [Volgnummer1] --> =NieuwVolgNummer("Volgnummer1";"Bezoekrapport leghennen") (Veldnaam; Tabel)

Dan krijg ik foutmelding waarbij hij verwijst naar onderstaande stuk codering:
Code:
 If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
 
Laatst bewerkt:
Ik kan die fout niet reproduceren, wat ik ook doe. Ik heb de functie in meerdere databases gehad, in verschillende uitvoeringen en met verschillende voorwaarden, en nooit problemen. Ik denk dat het tijd word om jouw db er eens bij te halen...
 
Ik heb slecht nieuws voor je... de functie doet het prima. Geen foutmelding derhalve. Ik denk dat je in je werkomgeving een probleem hebt. Al zou het ook kunnen doordat je op de verkeerde manier naar nummers kijkt, want dat wordt niet helemaal duidelijk uit je voorbeeld omdat er maar één record in zit. Sowieso vraag ik me af of je wel het juiste volgnummer ophaalt om op te hogen. Ik denk dat je dit moet gebruiken:
Code:
Function Volgnummer(Veld As String, Tabel As String) As String
Dim strSQL As String, sNummer As String
    If InStr(1, Veld, " ") > 0 And InStr(1, Veld, "[") = 0 Then Veld = "[" & Veld & "]"
    If InStr(1, Tabel, " ") > 0 And InStr(1, Tabel, "[") = 0 Then Tabel = "[" & Tabel & "]"
    sNummer = Format(Date, "yyyymmdd")
    strSQL = "SELECT TOP 1 " & Veld & " FROM " & Tabel & " " _
        & "WHERE Left(" & Veld & ",8)='" & sNummer & "' " _
        & "Order By " & Veld & " DESC"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount > 0 Then
            Volgnummer = sNummer & Right("000" & CInt(Right(.Fields(0), 3)) + 1, 3)
        Else
            Volgnummer = sNummer & "001"
        End If
    End With
End Function
Deze code maakt een nieuw volgnummer voor elke dag. Dus elke dag begint weer bij 001.
 
Ik heb nu de Code voor het volgnummer aangepast zoals jij in je laatste reactie aangeeft!
Deze functioneert ook goed!

Echter als ik nu op knop258 druk -->

Geeft hij de melding Fout 3075 tijdens uitvoering:
Syntaxisfout (operator ontbreekt) in query-expressie [Volgnummer]=.

Enig idee?

En waar zou het in mijn werkomgeving fout kunnen zijn?
 
Bij het record waar ik in werk geeft hij fout 3075.
Bij een eerder opgeslagen record, geeft hij fout 3464 (Gegevenstypen komen niet overeen in criteriumexpressie)
 
Daar met je natuurlijk ook niet op klikken :D. Even zonder gekheid: als je een tekstveld gebruikt om een volgnummer te genereren, moet je ook een tekstfilter meegeven in de opdracht.
Code:
     DoCmd.OpenReport "rptLeghennen", acViewPreview, , "[Volgnummer] = '" & Me.Volgnummer & "'"
 
We zijn in ieder geval nu een stapje dichterbij! Dank je!!
Hij geeft nu namelijk geen foutmeldingen meer weer!
Ook opent hij het betreffende rapport!

Alleen vult hij de gegevens uit het formulier/tabel niet op het rapport in!
 
Dat doet-ie bij mij wel, dus dan moet je nog eens naar je rapport kijken denk ik. Ik heb overigens (zowel bij formulier als rapport) de query die je als Recordbron had gemaakt eruit gemieterd en vervangen door de tabel [Bezoekrapport leghennen]. Er is geen enkele reden om daar een query te gebruiken.
 
Ik denk dat het gaat functioneren, als ik mijn rapport even opnieuw maak! En alle velden opnieuw instel! Ik heb namelijk 1 veld even opnieuw ingestelde en daar geeft hij nu wel weer de waarde van!

Super OctafFish!! Dank je voor je hulp!

Nog even een vraag:
Maakt hij in de ontwerpweergavefunctie van een rapport, niet altijd automatisch een soort van query?

Of doet hij dat alleen als ik in de toekomst gegevens uit andere tabellen ook in hetzelfde rapport wil hebben? Door te linken aan andere tabellen d.m.v. sleutelnummer van elke tabel?
 
Nog even een vraag: Maakt hij in de ontwerpweergavefunctie van een rapport, niet altijd automatisch een soort van query?
Niet in mijn versie :). Ik gebruik alleen een query (en dat is dan meestal een opgeslagen query) als ik voor het rapport meerdere tabellen nodig heb. Dan ontkom je er niet aan. Maar dan nog: altijd de query opslaan, omdat je anders functionaliteit mist zoals het kunnen zoeken binnen het rapport of formulier.
 
Nog een vraag:

Ik kan nu vanuit het formulier bezoekrapport Leghennen, het rapport Rptleghennen openen met het Volgnummer.
Nu wil ik echter vanuit dit formulier een rapport openen, maar het rapport aanvullen met gegevens uit drie andere tabellen. Zoals adresgegevens e.d. die altijd hetzelfde zijn, zodat ik deze niet iedere keer helemaal hoef in te vullen
Als ik nu een query maak van de 4 tabellen en hier het rapport op baseer!

Hoe kan ik dan vanuit het formulier Bezoekrapport Leghennen het rapport RptLeghennen openen met het volgnummer, terwijl het rapport nu op een query is gebaseerd?
Hij toont nu namelijk geen gegevens meer
 
In beginsel maakt het niet uit of je het rapport baseert op één tabel of op meerdere tabellen. En voor het openen vanuit het formulier mag het ook niet uitmaken of er een tabel of een query achter het rapport hangt. Enige voorwaarde is, dat de koppeling tussen formulier en rapport bestaat. Dus het veld dat je op het formulier gebruikt als filter moet ook in het rapport bestaan. Kortom: je rapport zou moeten werken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan