Formulier individueel verzenden

Status
Niet open voor verdere reacties.

gangstalaz

Gebruiker
Lid geworden
13 sep 2010
Berichten
131
Hallo,

Ik gebruik access 2003 en heb een database die als doel heeft om materialen bij leveranciers te bestellen voor eigen gebruik.

Mijn formulier bestaat uit een hoofdformulier en een subformulier.
Ik kan hier in de database een rapport maken, printen en versturen.
Alleen doe ik het niet op de juiste manier volgens mij.
Ik krijg een goed rapport als ik altijd een rapport baseer op BestellingID --> 1. Dus op het formulier krijg ik altijd eerst de gegevens van de vorige keer te zien. Deze vervang ik dan met de gegevens die ik dan nodig heb (nieuwe bestelling).
Dus alle bestellingen zijn dan BestellingID 1.

Ik heb ook geprobeerd om een schoon formulier te gebruiken (pijltje onderin). Maar als ik het formulier invul en daarna naar het rapport kijk, krijg ik de artikelen van het vorige formulier en van het huidige formulier te zien.
Ook worden de formulieren met dezelfde leveranciers_ID samengevoegd in het rapport.

Volgens mij moet ik gebruik maken van BestellingID om het formulier naar het rapport te kunnen verwijzen.

Ik had een tijdje geleden de volgedne code nog gekregen. Deze heb ik proberen aan te passen voor mijn situatie maar het lukt maar niet. Ik krijg telkens een foutmelding.

Code:
Private Sub Rapport_Verzenden_Click()

Dim strSQL As String, strSQL_Rapport As String
Dim sFilter As String, sTabel As String, sBestelRegel_ID As String
Dim x As Integer
strSQL = "SELECT * FROM tblBestellingen"
sRapport = "rpt_tblBestellingen"
DoCmd.Echo False, "Bezig met openen van recordset."
With CurrentDb.OpenRecordset(strSQL)
 'Records doorlopen, en rapport voor elk record instellen en mailen
 iAantal = .RecordCount
 If iAantal > 0 Then
  x = x + 1
  [COLOR="red"]sBestelRegel_ID = rst.Fields("BestellingID").Value[/COLOR]
  DoCmd.Echo False, "Samenvoegen van Record " & x & " van " & iAantal & " records..."
  DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
  sTabel = Reports(sRapport).RecordSource
  If InStr(1, UCase(sTabel), "WHERE") > 0 Then
   strSQL_Rapport = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
  Else
   If InStr(1, UCase(sTabel), "SELECT") = 0 Then
    If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
     sTabel = "[" & sTabel & "]"
    End If
    strSQL_Rapport = "SELECT * FROM " & sTabel & " "
   Else
    strSQL_Rapport = sTabel
   End If
  End If
  'Extra loopje, om de punt-komma's te verwijderen.
  Do Until Right(strSQL_Rapport, 1) <> ";"
   strSQL = Left(strSQL_Rapport, Len(strSQL_Rapport) - 1)
  Loop
  'Klantfilter op rapport zetten
  sFilter = " WHERE (BestellingID=" & sBestelRegel_ID & ");"
  strSQL_Rapport = strSQL_Rapport & sFilter
 ''tmp = InputBox("", "", strSQL)
  Reports(sRapport).RecordSource = strSQL_Rapport
  DoCmd.Close acReport, sRapport, acSaveYes
  DoCmd.SendObject acSendReport, sRapport, acFormatPDF, "mailadres@mail.com", , , "Subject", "Message", False
  .MoveNext
 End If
 .Close
End With
DoCmd.Echo True

End Sub

Is er misschien een ander goedwerkende methode? Of kan iemand dit voor mijn situatie aanpassen?

Op dit moment worden de rapporten in Snapshot Format verstuurd. Snapshot format is toch te openen bij de meeste computers?

Alvast bedankt!
 
Vervang deze regel:
Code:
        sBestelRegel_ID = [B]rst[/B].Fields("BestellingID").Value
door deze regel.
Code:
        sBestelRegel_ID = .Fields("BestellingID").Value
 
Nu ik dat heb aangepast. Loopt access helemaal vast. Ik krijg een zandloper te zien en kan voorderest niks doen.
Bij taakbeheer zie ik ook dat het programma ook niet meer reageerd.

Ergens zit denk een grote fout dan.
 
Kun je de db weer even mailen/posten? Kijk ik er wel even naar.
 
Heel erg bedankt voor de moeite octafish!

Nu wordt er een BestellingID geselecteerd en in het rapport weergegeven. Maar wordt elke keer de eerste Bestelling verstuurd.
Dus ik heb bijv de volgende:
BestellingID 21
BestellingID 22
BestellingID 23

De keuze gaat elke keer uit naar de eerste bestelling. Dus elke keer wordt BestellingID 21 verstuurd.
Als ik dan een juiste bestelling wil hebben, moet ik elke keer het eerste ingevulde subformulier opnieuw invullen.

Dat zal toch niet zo moeten?
 
Nee, dat hoeft ook niet. In je voorbeeld zit maar één bestelling, dus dat kijkt niet zo jofel. Ik heb er een bijgemaakt, en voor de zekerheid (bij mij deed-ie het namelijk prima) de code nog wat strakker gemaakt:

Code:
Private Sub Rapport_Verzenden_Click()
Dim strSQL As String, strSQL_Rapport As String, sEmail As String
Dim sFilter As String, sTabel As String, BestelID As String
Dim x As Integer
BestelID = Me.BestellingID
strSQL = "SELECT * FROM tblBestellingen " & vbCrLf
sFilter = " WHERE (BestellingID=" & BestelID & ");"
strSQL = strSQL & sFilter
sRapport = "rpt_tblBestellingen"
DoCmd.Echo False, "Bezig met openen van recordset."
With CurrentDb.OpenRecordset(strSQL)
    'Records doorlopen, en rapport voor elk record instellen en mailen
    iAantal = .RecordCount
    If iAantal > 0 Then
        DoCmd.Echo False, "Rapport openen voor bestelling " & BestelID
        DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
        sTabel = Reports(sRapport).RecordSource
        If InStr(1, UCase(sTabel), "WHERE") > 0 Then
            strSQL_Rapport = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
        Else
            If InStr(1, UCase(sTabel), "SELECT") = 0 Then
                If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
                    sTabel = "[" & sTabel & "]"
                End If
                strSQL_Rapport = "SELECT * FROM " & sTabel & " "
            Else
                strSQL_Rapport = sTabel
            End If
        End If
        'Extra loopje, om de punt-komma's te verwijderen.
        Do Until Right(strSQL_Rapport, 1) <> ";"
         strSQL_Rapport = Left(strSQL_Rapport, Len(strSQL_Rapport) - 1)
        Loop
         
         'Klantfilter op rapport zetten
        strSQL_Rapport = strSQL_Rapport & sFilter
        ''tmp = InputBox("", "", strSQL)
        Reports(sRapport).RecordSource = strSQL_Rapport
        DoCmd.Echo False, "Rapport opslaan ...."
        DoCmd.Close acReport, sRapport, acSaveYes
        If Me.txtEmail = "" Then
            sEmail = InputBox("Wat is het emailadres?", "Email adres controleren", "[EMAIL="mail@bedrijf.nl"]mail@bedrijf.nl[/EMAIL]")
        Else
            sEmail = Me.txtEmail.Value
        End If
        DoCmd.SendObject acSendReport, sRapport, acFormatPDF, sEmail, , , "Subject", "Message", False
    End If
    .Close
End With
DoCmd.Echo True
End Sub
 
Klopt, in me voorbeeld zat er maar ��n, maar ik had ook meerdere bestellingen aan toegevoegd maartoch werd altijd de eerste bestelling verzonden.

MAAR nu doet tie het perfect! Bedankt!

Voor printen had ik ook wat gevonden en aangepast.
Daarvoor heb ik deze code gebruikt:

Private Sub Rapport_Printen_Click()
On Error GoTo Err_cmdrpt_tblBestellingen_Click

Dim stDocname As String

stDocname = "rpt_tblBestellingen"
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenReport stDocname, , , "[BestellingID]=" & Me.BestellingID

Exit_cmdrpt_tblBestellingen_Click:
Exit Sub

Err_cmdrpt_tblBestellingen_Click:
MsgBox Err.Description
Resume Exit_cmdrpt_tblBestellingen_Click

End Sub

Heb ik hier een klein foutje? Want bestelling met BestellingID 20 wordt wel geprint. Maar als ik een ander bestelling (BestellingID 22) wil printen, krijg ik een leeg rapport.
 
Als andere bestellingen wel goed worden afgedrukt, dan ligt de fout eerder in de bestelgegvens dan in het rapport. Ik kan er zo niet zo heel veel van zeggen, zonder de feitenlijke gegevens te zien.
 
Wil je die code in de database die ik jou vorige week had gestuurd anders even testen?
Want met andere codes krijg ik het ook niet aan de praat.
Eerst werd alleen de eerste bestelling (BestellingID 20) geprint. En nu wordt en kan ik alleen de derde bestelling geprint (BestellingID 22).

Ik heb er echt lang mee zitten prutsen maar het lukt me niet.

Als dit ook lukt, kan een begin maken met het kopieren van de huidige database:$
 
De filtering van het rapport lukt niet goed met een printopdracht; overigens wel met een Preview gek genoeg. Met een paar kleine aanpassingen moet het wel kunnen.

Om te beginnen: op het rapport moet je deze code toevoegen.
Code:
Private Sub Report_Open(Cancel As Integer)
If Not Nz(Me.OpenArgs, "") = "" Then
    Me.Filter = Me.OpenArgs
    Me.FilterOn = True
Else
    Me.Filter = ""
    Me.FilterOn = False
End If
End Sub

De Printopdracht moet ook worden aangepast:
Code:
    DoCmd.OpenReport stDocname, , , , , "[BestellingID]=" & Me.BestellingID/CODE]
 
Bedankt voor je hulp Octafish!

Ik heb de code op het rapport gezet.

De printopdracht heb ik ook aangepast. Maar ik kan weer alleen BestellingID 22 uitprinten.:(
 
Ik heb 'm in de laatste versie gezet, en die doet het prima. Geen idee dus waarom hij bij jou niet werkt.... Mail 'm dus maar weer door!
 
De code moest er zo uitzien:

Private Sub Rapport_Printen_Click()
On Error GoTo Err_cmdrpt_tblBestellingen_Click
Dim stDocname As String

stDocname = "rpt_tblBestellingen"
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenReport stDocname, , , , , "[BestellingID]=" & Me.BestellingID
Exit Sub

Err_cmdrpt_tblBestellingen_Click:
MsgBox Err.Description

End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan