Krijg het openen van een bepaald raport niet voor elkaar

Status
Niet open voor verdere reacties.

jvrooij

Gebruiker
Lid geworden
25 mrt 2009
Berichten
44
Ik wil graag vanuit een formulier een raport openen met de gegevens die ik net heb ingevoerd

Als ik op de knop klik krijg ik de volgende melding " kan het veld | niet vinden waarnaar wordt verwezen in de expresie "

Hieronde heb ik de code staan die onder de knop zit

Code:
Private Sub cmdOpenEmb_Click()

Dim stDocName As String
Dim stLinkCriteria As String

    stDocName = "rptEmballge"
    
    stLinkCriteria = "[EmbID] = " & Me.[frmEmballageInvoeren].Form.[EmbID].Value

    DoCmd.OpenReport stDocName, acViewPreview, , stLinkCriteria, , acDialog

 
End Sub

Ik hoop dat jullie een oplosing voor me hebben
 
Code:
Private Sub cmdOpenEmb_Click()

Dim stDocName As String
Dim stLinkCriteria As String

    stDocName = "rptEmball[COLOR="DarkRed"]a[/COLOR]ge"
    
    stLinkCriteria = "[EmbID] = " & Me.[EmbID] & ""

    DoCmd.OpenReport stDocName, acViewPreview, , stLinkCriteria, , acDialog

 
End Sub

Als dat niet werkt, kijk dan hier eens

http://support.microsoft.com/kb/142477

Tardis
 
Deze regel is niet helemaal jofel:

Code:
    stLinkCriteria = "[EmbID] = " & Me.[EmbID] & ""
Is het veld EmbID een tekstveld, dan moet de code er zo uitzien:
Code:
    stLinkCriteria = "[EmbID] =" & Me.[EmbID]
Is het veld een tekstveld, dan zo:
Code:
    stLinkCriteria = "[EmbID] = '" & Me.[EmbID] & "'"
 
Bedankt,

Inderdaad nu werkt het.

Kan ik door met het volgende :) nu moet ik namelijk nog een waarde opgeven en ik zou het liest hebben dat dat vanzelf ging zodat met 1 klik op de knop de zaak werkt en ik niet een waarde hoef oop te geven.

Code:
Private Sub cmdMailRapport_Click()
Dim strSQL As String, strSQL_Rapport As String
Dim sFilter as String,  sTabel as String, sKlantNr as String
Dim x As Integer
strSQL = "SELECT * FROM qRapport"
sRapport = "rptPeriodiek"
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
  sKlantNr=rst.Fields("KlantID").Value
  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 (KlantID=" & sKlantNr & ");"
  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

Het liefst zou ik deze code gebruiken van jou OctaFish om ook het raport te kunnen verzenden alleen ik ben zo nieuw dat ik gewoon niet weet wat ik moet veranderen om het werkend te krijgen
 
Laatst bewerkt:
De code is als je niks van VBA weet inderdaad een beetje lastig te doorgronden. Ik zal 'm proberen wat duidelijker te maken. Om te beginnen: deze code is bedoeld om een rapport te versturen naar alle records die in een bepaalde recordset van een query zit. Er zit dus een structuur extra in, die alle records doorloopt. Als je op een formulier een rapport wilt sturen naar bijvoorbeeld de klant die je op een formulier hebt geselecteerd, dan is die loop uiteraard niet nodig. Je weet namelijk dan al welk record je moet gebruiken. Ik zal de code dus laten zien voor die situatie.
Code:
[FONT=Courier New][/FONT] 
[FONT=Courier New]Private Sub cmdMailRapport_Click()
Dim strSQL_Rapport As String
Dim sFilter as String,  sTabel as String, sKlantNr as String
Dim x As Integer

[/FONT]De code begint met het vastleggen van een aantal variabelen. Hierin worden tijdelijke waarden opgeslagen, die later worden gevuld en gebruikt. Als je in de code de regel Option Explicit weghaalt, hoef je dit niet te doen, maar het is beter om het wel te doen, vandaar dat je bijna altijd code ziet met de declaratie van de variabelen. Het vullen van de variabelen zie je in de code bij de rood gekleurde teksten. Deze waarden moet je uiteraard aanpassen aan je eigen situatie. De variabele sRapport bijvoorbeeld bevat de naam van het rapport dat je wilt versturen.

Code:
[FONT=Courier New]  sRapport = "[B][COLOR=#ff0000]rptPeriodiek[/COLOR][/B]"
  DoCmd.Echo False, "Bezig met openen van recordset."
  sKlantNr=Me.[B][COLOR=#ff0000]txtKlantID[/COLOR][/B].Value[/FONT]

De variabele sKlantNr bevat de waarde van het veld dat je uit het rapport wilt filteren. In het voorbeeld filteren we op een Klantnummer. De variabele sKlantNr haalt van het formulier dus het KlantID op. Je ziet dat ik altijd via aanduidingen probeer aan te geven wat iets voorstelt. In de tabel heb ik bijvoorbeeld het veld KlantID. Op het formulier het ik het veld vervolgens txtKlantID genoemd. Nu kan ik bijna blindelings in VBA mijn velden en objecten etc. terugvinden, wat uiteraard veel tijd scheelt!

Code:
  DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
  sTabel = Reports(sRapport).RecordSource

Het rapport wordt onzichtbaar in Ontwerpmodus geopend, zodat je niet ziet dat er iets gebeurt. Er gebeurt ook niets zichtbaars, vandaar.... Ik haal dus de recordbron op van het rapport. Dit is vaak een query, maar kan uiteraard ook een tabel zijn. In alle gevallen moet ik iets doen om te controleren wat er gebruikt wordt. En dat gebeurt in de volgende code.
Code:
[FONT=Tahoma][/FONT] 
  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

De code hierboven werkt altijd; omdat ik met variabelen werk, en niet met de letterlijke tekst, hoeft de code in beginsel niet te worden aangepast. Altijd handig... De bron van het rapport is nu aan een variabele toegekend. Dee volgende stap is om het filter er aan toe te voegen. We willen tenslotte één record hebben op het rapport dat we kunnen mailen.

Code:
  'Klantfilter op rapport zetten
  sFilter = " WHERE ([B][COLOR=#ff0000]KlantID[/COLOR][/B]=" & sKlantNr & ");"

De code hierboven werkt prima voor een Numeriek veld. Als KlantID (of uiteraard een ander veld) een Tekstveld is, moet de code iets worden aangepast:

De code hierboven werkt
Code:
  sFilter = " WHERE ([B][COLOR=#ff0000]KlantID[/COLOR][/B]='" & sKlantNr & "');"

De laatste stap is nu de volledige query weer op het rapport zetten, en het rapport opslaan.

Code:
  strSQL_Rapport = strSQL_Rapport & sFilter
  Reports(sRapport).RecordSource = strSQL_Rapport
  DoCmd.Close acReport, sRapport, acSaveYes

En daarna kan het rapport worden verzonden. In het voorbeeld als PDF, maar in oudere access versies kan dat nog niet. Je kunt dan bijvoorbeeld als Snapshot (acFormatSNP). Microsoft Word kan ook, maar raad ik niet echt aan. Daarmee verschuift de tekst op een vervelende manier.

Code:
  DoCmd.SendObject acSendReport, sRapport, acFormatPDF,  [COLOR=#417394]"mailadres@mail.com"[/COLOR][FONT=Courier New]", , , "[B][COLOR=#ff0000]Onderwerp[/COLOR][/B]", "[COLOR=#ff0000][B]Tekst van mail[/B][/COLOR]", False
End With
DoCmd.Echo True
End Sub[/FONT]

En dat is dus de hele code... Heb je hier wat meer aan?
 
Laatst bewerkt:
Bedankt voor de uitleg zeer duidelijk.
Ik loop echter wel tegen wat problemen aan

Ik krijg telkens een foutmelding ik heb een plaatje toegevoegd zodat je kan zien wat ik bedoel

voorbeeld 1.jpg


Deze melding krijg ik ook bij de volgende regel

Nu wordt de informatie van het raport uit een query gehaald moet ik dan nog in de code van jou daarna een verwijzing maken?
 
De regels .MoveNext en .Close mogen (nee, moeten ...) weg. Die horen bij een routine waarin een query gebruikt wordt als basis voor het rapport, en niet een formulier.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan