Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Fehler bei acViewNomal

Begonnen von lenssen, Februar 14, 2017, 11:21:37

⏪ vorheriges - nächstes ⏩

lenssen

Hallo, komme irgendwie nicht weiter.
Ich möchte aus einem Formular einen Bericht drucken.
Solange ich folgenden Befehl nutze wird der Bericht korrekt geöffnet mit dem entsprechenden Datensatz. Allerdings muss ich dann das drucken gesondet über rechte Maustaste anstossen

DoCmd.OpenReport "rpt_besucherschein",acViewPreview, , "besucherscheinnr = " & Me!

Daher habe ich acViewPreview ersetzt durch acViewNormal. Jetzt druckt er zwar direkt, allerdings steht überall #Typ! in den Felder anstatt des gewünschten Datensatzes

besucherscheinnrDoCmd.OpenReport "rpt_besucherschein", acViewNormal, , "besucherscheinnr = " & Me!besucherscheinnr

Was mache ich falsch. Danke im Voraus

MzKlMu

Hallo,
wie ist denn der Datetyp der besucherscheinnr ?

PS:
Prüfe bitte Deine Beiträge vor dem Senden. Und verwende für Codedarstellungen die Codetags des Forums.
Gruß Klaus

lenssen

Hallo, sorry. Hab mich grade erst registriert und kenne mich noch nicht so gut aus.
Der Dateityp ist integer
DoCmd.OpenReport "rpt_besucherschein",acViewPreview, , "besucherscheinnr = " & Me!

Ist es so richtig?

DF6GL

Hallo,

man kann immer nur noch vermuten:

So muss der Aufruf lauten (und womit wird der Bericht aufgerufen?  Nachfolgend ist eine Schaltfläche mit Namen "btnDrucken" angenommen.):

Sub btnDrucken_Click()
DoCmd.OpenReport "rpt_besucherschein", acViewNormal, , "besucherscheinnr = " & [color=red]Me!besucherscheinnr
[/color]
End Sub



Sofern im aktuellen Formular sich ein Textfeld mit Namen "besucherscheinnr" befindet, das eben eine Besucherscheinnr anzeigt.

Datentyp Integer ist eher mit Vorsicht zu genießen, weil nur Zahlen zwischen -32.768 bis +32.767  zulässig sind.

lenssen

Hi, hier mal der vollständige Code. besucherscheinnr ist ein longinteger (mein Fehler) bei der ersten Angabe.
Die Prüfungen ob eine Nr bereits im Jahr vergeben ist usw. funktioniert einwandfrei.
Das einzige Problem ist wirklich, je nachdem ob ich acViewPreview oder acViewNormal eingebe. Bei dem einen bekomme ich den korrekt ausgefüllten Besucherschein, bei dem anderen eben nur #Typ!. Sind diese beiden Befehle denn so unterschiedlich?


Private Sub Besucherschein_drucken_Click()
Dim strPrüfNr As Long
Dim AktuellesJahr As Long
     
'Aus der qry_maxnr wird die bisher höchste vergebene Besucherscheinnr (aus qry_besucherscheinvorbereiten) ausgelesen und dem Feld strPrüfNr zugewiesen
'Dem Feld AktuellesJahr wird das aktuelle Jahr zugewiesen

   strPrüfNr = DMax("MaxNr", "qry_maxnr")
   AktuellesJahr = Year(Now)
 
'Prüfung, ob ein neues Jahr betroffen ist
'Wenn ja, dann wird die AkkrNr auf 0 zurückgesetzt und eine neue AkkrNr (Jahr0001) wird vergeben
   If ((AktuellesJahr * 10000) - strPrüfNr) > 1000 Then
      besucherscheinnr = 0
      besucherscheinnr = besucherscheinnr + (AktuellesJahr * 10000) + 1
'Wenn nicht, wird geprüft, ob bereits ein Wert vorhanden ist.
'Wenn noch kein Wert vorhanden ist wird die aktuelle AkkrNr (höchster vorhandener Wert) um 1 erhöht
   Else
      If IsNull(besucherscheinnr) Then
         besucherscheinnr = strPrüfNr + 1
'Ist bereits eine Nr vergeben worden, wird eine Fehlermeldung ausgegeben
      Else
         MsgBox "Eine bereits vergebene Besucherscheinnummer kann nicht verändert oder gelöscht werden"
      End If
   End If
   DoCmd.OpenReport "rpt_besucherschein", acViewPreview, , "besucherscheinnr = " & Me!besucherscheinnr
   End Sub

MzKlMu

Hallo,
möglicherweise muss der Datensatz erst gespeichert werden. Füge mal vor DoCmd.... noch folgende Zeile ein:
DoCmd.RunCommand acCmdSaveRecord
Ist aber nur raten.
Gruß Klaus

Beaker s.a.

Hallo lenssen,
Versuche mal in diesem Teil das Steuerelement vollständig zu referenzieren
   If ((AktuellesJahr * 10000) - strPrüfNr) > 1000 Then
'     besucherscheinnr = 0   <-- unnötig, warum nicht gleich
      Me!besucherscheinnr = 0 + (AktuellesJahr * 10000) + 1    ' <---
   Else
      If IsNull(Me!besucherscheinnr) Then    ' <---
         Me!besucherscheinnr = strPrüfNr + 1    ' <---

Klaus' Vorschlag würde ich an den Anfang der Prozedur setzen, allerdings
so
If Me.Dirty Then Me.Dirty = False

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
ZitatKlaus' Vorschlag würde ich an den Anfang der Prozedur
wieso an den Anfang ?
Die Prozedur erzeugt doch eine neue Nummer und da kann ja erst gespeichert werden, wenn dies Nummer erstellt ist. Die sicherste Stell ist daher unmittelbar vor dem Aufruf von DoCmd ...
Ob jetzt mit meinem Vorschlag oder mit dem Dirty halte ich für egal. Oder wießt Du da mehr (durchaus ernstgemeinte Rückfrage) ?
Gruß Klaus

Joss

Hallo lenssen,

ZitatBei dem einen bekomme ich den korrekt ausgefüllten Besucherschein, bei dem anderen eben nur #Typ!.

nur so ein "Schuss ins Blaue":
Sind irgendwo im Bericht vielleicht berechnete Felder mit "im Spiel"?

Gruß
Josef

Beaker s.a.

Hallo Klaus,
Klar  >:(
ZitatOb jetzt mit meinem Vorschlag oder mit dem Dirty halte ich für egal. Oder wießt Du da mehr (durchaus ernstgemeinte Rückfrage) ?
Ich denke nicht. Durch das Erzeugen der neuen Nr. ist ja klar, dass
Form.Dirty True ist; brauch ich gar nicht prüfen. Also speichern wie von
dir vorgeschlagen und gut ist.  :)

@lenssen
Sorry für Verwirrung.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

lenssen

Hallo, Danke erst einmal für die antworten. Leider musste ich kurzfristig verreisen und kann so erst am Montag testen. Trotzdem schon mal vielen Dank. Ich melde mich wieder.

lenssen

Hallo Zusammen und nochmals vielen Dank
DoCmd.RunCommand acCmdSaveRecord
vor dem Druck hat meine Probleme gelöst.
Ich verstehe zwar nicht, wieso der eine Befehl eine Speicherung vorab durchführt und der andere nicht, aber das Ergebnis ist ja entscheidend. Und das lautet: Es geht jetzt!  :D
Bestimmt bis bald wieder.
Ach so, wie kann ich dieses Thema als gelöst markieren, oder ist das nicht erforderlich?

MzKlMu

Hallo,
bei einen neuen Datensatz steht dieser erst in der Tabelle wenn entweder der Datensatz verlassen wird oder explizit gespeichert wird. Das Speichern passiert mit acCmdSaveRecord. Erst dann kann der Datensatz auch gedruckt werden. Wenn ein bestehender DS aufgerufen wird ist der ja schon da und nur das Feld muss aktualisiert werden. Das geschieht automatisch wenn man auf einen Button klickt.
Gruß Klaus