acces formulier > rapport factuur

Status
Niet open voor verdere reacties.

hagazan

Gebruiker
Lid geworden
18 dec 2010
Berichten
12
Goedeavond,

Op het moment dat ik bij een formulier het factuur wil uit laten printen (afdrukvoorbeeld) print hij alle facturen uit. Terwijl ik alleen het factuur uitgeprint wil hebben dat op het formulier zichtbaar is.

Ik heb het forum doorgelezen en heb een aantal oplossingen gevonden onderandere het volgende code dat toegewezen moest worden aan het afdrukknop
Code:
Private Sub Command101_Click()
On Error GoTo Err_Command101_Click

    If Me.Dirty Then Me.Dirty = False

    Dim sFilter As String, stDocName As String
        stDocName = "Factuur"
        sFilter = "Factuurnr=" & Me.FactuurNR
        DoCmd.OpenReport stDocName, acPreview, , , , sFilter
    Exit Sub


Exit_Command101_Click:
    Exit Sub

Err_Command101_Click:
    MsgBox Err.Description
    Resume Exit_Command101_Click
    
End Sub

ook dit heeft niet geholpen. Hoe kan ik dit oplossen?

databse http://www.2shared.com/file/6xiNI_u4/Thuiszorg.html?

het lukt trouwens wel met een criteria vanuit het query. Maar op die manier moet telkens het factuurnummer worden ingetypd, wat ik graag liever niet heb.

Met vriendelijke groeten, hagazan
 
Laatst bewerkt:
Je had dit bestand makkelijk kunnen toevoegen bij de post; dus die externe opslag had niet gehoeven ;)

Je hebt een paar foutjes gemaakt, waarvan de belangrijkste zijn: het filter staat op de verkeerde plek, en filter was verkeerd. Dat laatste had als oorzaak dat je het FactuurID uit twee tabellen had gebruikt in de query; één keer uit de tabel Facturen (correct) en één keer uit de tabel Factuurregels (overbodig; dit factuurid is namelijk hetzelfde als het factuurid in Facturen).
Hierbij de aangepaste versie.
 

Bijlagen

Heel erg bedankt voor het snelle hulp :) nu weet ik waar ik fout zat
Ik heb het niet als bijlage niet kunnen toevoegen omdat het dan telkens aangeefte dat het bestand te groot was :))
 
Laatst bewerkt:
Je kunt bestanden eerst comprimeren en herstellen, voordat je ze zipt. Dan krijg je 'm ruim onder de 100kb. Zoals bij mij.
 
Bekijk bijlage Thuiszorg.rar

aha op die manier :)

Ik heb nu het zelfde als u geprobeerd met het filteren op clientnr (zie bijlage). Zodat er een overzicht verschijnt met de openstaande saldo van het klant wanneer er op het knopje wordt gedrukt. Echter krijg ik helemaal geen response.

En wanneer er op een nieuwe record wordt geprobeerd uitteprinten geeft hij een fout melding aan. Kan ik dat tekst (te veel in query....) veranderen naar vul volledig in?
 
Laatst bewerkt:
Ik zie niet helemaal wat je gedaan hebt; wel een extra formulier Client... Wat is de bedoeling?
 
In het formulier facturen heb ik een knop naast de clientnummer geplaatst. Wanneer er een clientnummer is geslecteerd moet men via dat knop het overzicht van klant op het rapport [Specifiek klantoverzicht] kunnen bekijken.
 
Je hebt weer een paar (andere, deze keer...) foutjes gemaakt. Om te beginnen: de veldnaam op het formulier klopt niet met de naam die je voor het filter gebruikt. En dan kan hij uiteraard de waarde niet goed in het filter zetten. Ten tweede: deze keer probeer je te filteren op een Tekstwaarde (de vorige keer was het een getal). De string moet dan worden opgemaakt als tekst, niet als getal. In het voorbeeld is e.e.a. weer aangepast.

Overigens gebruik je in je tabel uiterst ongelukkige veldnamen; niet alleen spaties (VBA houdt daar helemaal niet van) maar ook nog dubbele punten! Ik zou die namen zeker aanpassen, en in elk geval de dubbele punt uit de veldnaam weghalen.
 

Bijlagen

Heel erg bedankt. Dat klopt ik zal het even moeten verbeteren. En als laatste wil ik bij de facturen die betaald zijn bij het rapport een tekst met BETAALD.
Ik dacht dat het kon met de iff functie op het rapport te zetten
Code:
=IIf([Ontvangen]="YES";"BETAALD";"nee")

Echter met deze code geeft hij bij alles nee aan, terwijl er wel facturen zijn die inmiddels al betaald zijn
 
Je maakt weer een nieuwe fout (zo ga je wel snel door alle soorten fouten heen :) ) Een Ja/Nee veld heeft de waarde True of False; "YES" als criterium is een tekststring. Filter een Ja/Nee veld bij voorkeur op de opgeslagen waarden: 0 (Nee) of -1 (Ja). Overigens ben je een beetje dubbelop bezig: als het vinkje is gezet, is de rekening betaald.... Of, als je een betaaldatum hebt, is de rekening ook betaald.... Waarom zou je dat nog eens extra in een tekstveld zetten?
 
ja ik maak wel veel fouten zeg , zo blijkt dat ik nog een leek ben in acces :P .. dankjewel
ja dat klopt het is eigenlijk een soort extratje voor de administratie van de betaalde facturen.

mvg,
 
Laatst bewerkt:
Zet niet teveel in je tabellen, en al helemaal geen data die elkaar tegen kunnen spreken. Als er bijvoorbeeld geen betaaldatum is ingevuld, maar het vinkje betaald staat aan, is een rekening dan betaald of niet? Kijk je dan naar de datum, of het vinkje? Dit soort constructies kan elke database onderuit halen! Oftewel: zorg dat de gegevens die je opslaat eenduidig zijn...
 
Dan is het volgens mij handiger om het vinkje wegtehalen en het datum te behouden?

Ik heb nog iets uitgeprobeerd wat me maar niet wil lukken. Dit keer heb ik weer een knop onder de formulier facturen geplaatst wat het factuur moet versturenvia het email met de indeling snapshot.

Daarbij heb ik de volgende
Code:
Private Sub verzenden_Click()
On Error GoTo Err_verzenden_Click

    If Me.Dirty Then Me.Dirty = False
    
        Dim sFilter As String, stDocName As String

        stDocName = "Factuur"
        sFilter = "Factuurid=" & Me.FactuurId
    DoCmd.SendObject acReport, stDocName, , sFilter

Exit_verzenden_Click:
    Exit Sub

Err_verzenden_Click:
    MsgBox Err.Description
    Resume Exit_verzenden_Click
    
End Sub

code voor gebruikt. Helaas werkt het filter niet en worden alle facturen verstuurd, waarbij eerst een keuze moet gemaakt worden welke indeling er opgestuurd moet worden. (Het zou ook fijn zijn om meteen de email adres te gebruiken van de client wat bij de tabel client opstaat )Enig idee waar het mis gaat?

mvg,
 
Laatst bewerkt:
Ik ken het probleem :) Deze keer niet zozeer een foutje in je opzet of code, maar een actie die nu eenmaal niet kan zo. Het probleem is (zoals je gemerkt hebt) dat je een gefilterd rapport wel kunt mailen, maar dat je dan het hele rapport krijgt, niet het uitgezochte record. Ik heb hetzelfde probleem ook moeten oplossen, en dat doe ik nu met onderstaande code(s). Ik zal de blokken apart coderen, en een kleine toelichting geven.

Code:
Private Sub cmdEmail_Click()

    stDocName = "Factuur"
    sBon = Me.FactuurId.Value

    '--------------------------------------------------------------------------------------------
    ' Eerst moet het rapport worden aangepast; anders wordt de volledige query verstuurd.
    ' We moeten dus eerst een selectie maken en opslaan. Dat gebeurt met de volgende functie.
    ' De functie krijgt de naam van het rapport mee, en het factuurnummer.
    '--------------------------------------------------------------------------------------------
    Call RapportCode(stDocName, sBon)
    '--------------------------------------------------------------------------------------------

    '--------------------------------------------------------------------------------------------
    ' Ik haal het emailadres uit de keuzelijst waarin ik het bedrijf selecteer.
    ' Het email adres staat in de vierde kolom, en dat vraag je op de volgende manier op.
    ' De functie Column(#) begint namelijk bij 0 met tellen; de eerste kolom is dus 0, de tweede 1.
    '--------------------------------------------------------------------------------------------
    sEmail = Me.cboBedrijf.Column(3)
    sEmail = Replace(sEmail, "#", "")
    sEmail = Mid(sEmail, 8, Len(sEmail) - 7)
    sTekst = "Hierbij willen wij de volgende artikelen bestellen. Zie bijgaande bestelbon." _
        & vbCrLf & "Bestelling " & sBon
    '--------------------------------------------------------------------------------------------

    '--------------------------------------------------------------------------------------------
    ' Ik zet een verzenddatum in de tabel; dit stuk kun je eventueel weglaten. Of aanpassen...
    '--------------------------------------------------------------------------------------------
    Me.txtVerzonden = Date
    dtDatum = CDate(Date)
    iDatum = CDbl(dtDatum)
    strSQL = "UPDATE tBestellingen SET Verzonden = CDate(" & iDatum & ") " & vbCrLf
    strSQL = strSQL & "WHERE (BonID=" & sBon & ");"
    DoCmd.RunSQL strSQL
    '--------------------------------------------------------------------------------------------

    '--------------------------------------------------------------------------------------------
    ' Dan kunnen we de mail nu versturen!
    '--------------------------------------------------------------------------------------------
    Call SendEmail(stDocName, sEmail, sBon, sTekst)
    '--------------------------------------------------------------------------------------------
    
End Sub

Dit is de hoofdroutine, die aan een knop hangt. De code roept twee aparte functies aan; één om het rapport te filteren, en één om de mail te versturen. Als je wilt, kun je de codes wel in één routine mergen, maar dan is hij veel minder flexibel. Nu gebruik ik ze vrij makkelijk; je hoeft maar op een paar plekken aan te geven welke tabel/rapport of velden je wilt gebruiken.


Code:
Function RapportCode(sRapport As String, sBon As String)
Dim sTabel As String, strSQL As String, sFilter As String

    '--------------------------------------------------------------------------------------------
    ' Eerst wordt het rapport geopend in Hidden Design modus, en de bron in een variabele gezet.
    '--------------------------------------------------------------------------------------------
    DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
    sTabel = Reports(sRapport).RecordSource
    '--------------------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------------------
    ' Dan wordt de recordbron aangepast. De bron kan een query of een tabel zijn.
    ' Daarom eerst checken wat het is. Daarna het filter toevoegen aan de variabelen.
    '--------------------------------------------------------------------------------------------
    If InStr(1, sTabel, "WHERE") > 0 Then
        strSQL = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
    Else
        If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
            sTabel = "[" & sTabel & "]"
        End If
        strSQL = "SELECT * FROM " & sTabel & " "
    End If
    sFilter = "WHERE (BonID=" & sBon & ");"
    strSQL = strSQL & sFilter
    '--------------------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------------------
    ' Dan wordt de recordbron opgeslagen in het rapport, en het rapport opgeslagen.
    '--------------------------------------------------------------------------------------------
    Reports(sRapport).RecordSource = strSQL
    DoCmd.Close acReport, sRapport, acSaveYes
    '--------------------------------------------------------------------------------------------

End Function

Deze functie past het rapport aan; zoals je ziet krijgt de functie een aantal variabelen mee in de aanroep (zie code in het eerste blok). Op basis daarvan wordt het rapport geopend, en de query aangepast.

Code:
Function SendEmail(Optional Bijlage, Optional Email, Optional Bon, Optional Tekst)
Dim sAdres As String

    '--------------------------------------------------------------------------------------------
    ' Eerst controleren of we wel een email adres hebben; zo niet, dan een Inputbox.
    '--------------------------------------------------------------------------------------------
    If Email = "" Then
        sAdres = InputBox("Typ een email adres", "Email adres", "mailme@stupid.com")
    Else
        sAdres = Email
    End If
    sAdres = Replace(sAdres, "Malto", "Mailto")
    '--------------------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------------------
    ' Vervolgens het rapport 'eindelijk' versturen als snapshot.
    '--------------------------------------------------------------------------------------------
    DoCmd.SendObject acSendReport, Bijlage, "SnapshotFormat(*.snp)", sAdres, , , "Bestelling " _
        & Bon, Tekst, False
    '--------------------------------------------------------------------------------------------

End Function

En dit stuk is uiteindelijk verantwoordelijk voor het versturen. Ook hier worden weer een aantal variabelen meegegeven, zodat de functie universeel is te gebruiken.
Hopelijk kun je het aanpassen naar je eigen situatie; ik heb alvast de rapportnaam en factuurveld voor je ingevuld.
 
damn haha dit is nu puur codeprogrameren waarbij ik helemaal geen ervaring mee heb.

De codes heb ik toegevoegd bij gebeurtenis opbouwen maar het werkt natuurlijk niet. Dus ga ik je weer lastig vallen met mijn vragen :)

bij deze stukje waar het email adres wordt gehaald weet ik niet wat ik moet wijzigen. Het klanten email adres staat op het tabel client met de veldnaam Email. Moet ik dit veld aan het factuur query toevoegen?

Code:
    '[B]
    sEmail = Me.cboBedrijf.Column[/B](3)
    sEmail = Replace(sEmail, "#", "")
    sEmail = Mid(sEmail, 8, Len(sEmail) - 7)
    sTekst = "Hierbij willen wij de volgende artikelen bestellen. Zie bijgaande bestelbon." _
        & vbCrLf & "Bestelling " & sBon

vervolgens heb ik het verzenddatum in een tabellaten plaatsen weggelaten en komt er een stukje dat automatisch rood wordt. Betekent dit dat het fout is? Het gaat om de volgende:
Code:
[COLOR="red"]End SubFunction RapportCode(sRapport As String, sBon As String)[/COLOR]

totaal:
Code:
Private Sub verzenden_Click()

    stDocName = "Factuur"
    sBon = Me.FactuurId.Value

    '--------------------------------------------------------------------------------------------
    ' Eerst moet het rapport worden aangepast; anders wordt de volledige query verstuurd.
    ' We moeten dus eerst een selectie maken en opslaan. Dat gebeurt met de volgende functie.
    ' De functie krijgt de naam van het rapport mee, en het factuurnummer.
    '--------------------------------------------------------------------------------------------
    Call RapportCode(stDocName, sBon)
    '--------------------------------------------------------------------------------------------

    '--------------------------------------------------------------------------------------------
    ' Ik haal het emailadres uit de keuzelijst waarin ik het bedrijf selecteer.
    ' Het email adres staat in de vierde kolom, en dat vraag je op de volgende manier op.
    ' De functie Column(#) begint namelijk bij 0 met tellen; de eerste kolom is dus 0, de tweede 1.
    '--------------------------------------------------------------------------------------------
    sEmail = Me.cboBedrijf.Column(3)
    sEmail = Replace(sEmail, "#", "")
    sEmail = Mid(sEmail, 8, Len(sEmail) - 7)
    sTekst = "Hierbij willen wij de volgende artikelen bestellen. Zie bijgaande bestelbon." _
        & vbCrLf & "Bestelling " & sBon

    '--------------------------------------------------------------------------------------------
    ' Dan kunnen we de mail nu versturen!
    '--------------------------------------------------------------------------------------------
    Call SendEmail(stDocName, sEmail, sBon, sTekst)
    '--------------------------------------------------------------------------------------------
    
End SubFunction RapportCode(sRapport As String, sBon As String)

Dim sTabel As String, strSQL As String, sFilter As String

    '--------------------------------------------------------------------------------------------
    ' Eerst wordt het rapport geopend in Hidden Design modus, en de bron in een variabele gezet.
    '--------------------------------------------------------------------------------------------
    DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
    sTabel = Reports(sRapport).RecordSource
    '--------------------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------------------
    ' Dan wordt de recordbron aangepast. De bron kan een query of een tabel zijn.
    ' Daarom eerst checken wat het is. Daarna het filter toevoegen aan de variabelen.
    '--------------------------------------------------------------------------------------------
    If InStr(1, sTabel, "WHERE") > 0 Then
        strSQL = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
    Else
        If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
            sTabel = "[" & sTabel & "]"
        End If
        strSQL = "SELECT * FROM " & sTabel & " "
    End If
    sFilter = "WHERE (BonID=" & sBon & ");"
    strSQL = strSQL & sFilter
    '--------------------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------------------
    ' Dan wordt de recordbron opgeslagen in het rapport, en het rapport opgeslagen.
    '--------------------------------------------------------------------------------------------
    Reports(sRapport).RecordSource = strSQL
    DoCmd.Close acReport, sRapport, acSaveYes
    '--------------------------------------------------------------------------------------------

End Sub
Function SendEmail(Optional Bijlage, Optional Email, Optional Bon, Optional Tekst)
Dim sAdres As String

    '--------------------------------------------------------------------------------------------
    ' Eerst controleren of we wel een email adres hebben; zo niet, dan een Inputbox.
    '--------------------------------------------------------------------------------------------
    If Email = "" Then
        sAdres = InputBox("Typ een email adres", "Email adres", "mailme@stupid.com")
    Else
        sAdres = Email
    End If
    sAdres = Replace(sAdres, "Malto", "Mailto")
    '--------------------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------------------
    ' Vervolgens het rapport 'eindelijk' versturen als snapshot.
    '--------------------------------------------------------------------------------------------
    DoCmd.SendObject acSendReport, Bijlage, "SnapshotFormat(*.snp)", sAdres, , , "Bestelling " _
        & Bon, Tekst, False
    '--------------------------------------------------------------------------------------------

End Function



End Sub
 
Laatst bewerkt:
Ik heb vanavond hard gewerkt aan een versie voor Access 2010 voor een andere topic. Die db vind je hier. De code die ik heb gepost was nog wel een beetje specifiek voor waarvoor ik 'm geschreven had, dus er moet inderdaad nog wat in worden aangepast.

In de db in de andere draad zit de knop Email op het formulier [Fadressen]. Er wordt gemaild op basis van een tekstvak met een email adres, wat jij ook gebruikt. Ook is de code dus wat verbeterd. Ik zou zeggen: kijk in de module Mailen voor de functies die ik nu heb, en op het formulier voor de code onder de knop cmdMailen. Dan kom je een heel eind... Oh ja, het rapport dat gemaild wordt heet [rBrief_eMail]. Maar daar zit verder weinig code in.
 
Het openen van een rapport in ontwerpweergave kan niet altijd (mde/accde of runtime versie van Access).
Beter is het dan om een andere oplossing te kiezen. Dat kan vrij eenvoudig door te kiezen voor een functie als criterium.
In mijn optiek is een productie Access database altijd een gesplitste database met als frontend een mde/accde bestand.
 
Laatst bewerkt:
Dat is inderdaad een waar woord... Ik heb deze routine gemaakt voor een Access 2003 db, die wat minder mogelijkheden heeft voor PDF verwerking, en voor een bepaalde werksituatie. In 2007/2010 kun je wel PDF-jes versturen, en een rapport met OpenArgs filteren bijvoorbeeld. Aan die variant wordt nog gewerkt...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan