PDA

Vollständige Version anzeigen : Letzte drei Datensätze eines Uform drucken


free.surfer
25.01.2008, 20:03
Hallo Profis,
ich hab da ein kleines Problem das zur Lösung ausgeschrieben wird:

Ich habe ein Form [KUNDE] mit dem U-Form [DIENSTLEISTUNG], Verknüpft über Kd-Nr. Soweit einfach und OK!
Nun möche ich einen Bericht drucken der mir [Kunde] anzeigt und die letzten drei Datensätze aus [DIENSTLEISTUNG]. Mögliches Kreterium ist nur das (Datum) der Dienstleistung, Primärschlüssel ist ein Rep-ID.

Habe die Abfrage jetzt durch " >datum ()-150 " begernzt, bringt aber nicht das was ich eigentlich will.

Habe schon viel rumgefragt, immer nur Achselzucken!!

mfg arne

hcscherzer
25.01.2008, 20:28
Moin Arne,
wenn Du aus dem Haupt-Formular (per Button) den Bericht anstossen willst, dann versuch es mal so (mit einer Ereignisprozedur für den Button 'Beim Klicken'):sub druckknopf_click()
docmd.openreport "deinbericht"
reports("deinbericht").recordsource = "select top 3 * from berichtsabfrage where kdnr = " & me!kdnr & " order by ddatum desc;"
end subDie Namen müsstest Du auf Deine Gegebenheiten anpassen und ein Abfrage 'berichtsabfrage', die alle zu druckenden Felder enthält, solltest Du vorher erstellt haben.
Im Bericht sollte ein Gruppenkopf für Kunde eingerichtet sein und die Dienstleistungsdatensätze kommen in den Detailbereich.

free.surfer
26.01.2008, 09:18
moin Hans,
so sieht mein Code aus:
Private Sub Befehl58_Click()
On Error GoTo Err_Befehl58_Click

Dim stDocName As String

stDocName = "KundeArbeitszettel"
DoCmd.OpenReport stDocName
Reports("KundeArbeitszettel").RecordSource = "select top 3 * from A-Dienstleistung where [kdnr] = " & Me![kdnr] & " order by [datum] desc;"
Exit_Befehl58_Click:
Exit Sub
aber die datensätze werden nicht eingegrenzt, kannst du mal gucken wo mein fehler liegt!

mfg arne

free.surfer
26.01.2008, 09:21
klappt nicht!

--------------------------------------------------------------------------------

moin Hans,
so sieht mein Code aus:
Private Sub Befehl58_Click()
On Error GoTo Err_Befehl58_Click

Dim stDocName As String

stDocName = "KundeArbeitszettel"
DoCmd.OpenReport stDocName
Reports("KundeArbeitszettel").RecordSource = "select top 3 * from A-Dienstleistung where [kdnr] = " & Me![kdnr] & " order by [datum] desc;"
Exit_Befehl58_Click:
Exit Sub
aber die datensätze werden nicht eingegrenzt, kannst du mal gucken wo mein fehler liegt!

mfg arne

Louisleon
26.01.2008, 09:36
Hallo,

du hast im HF ein Feld "[kdnr]" ?
Du fast in deiner Abfrage ein Feld "datum" (ungünstig, reservierter Name besser in myDatum oder wie HC in ddatum ändern)?
Dann sollte das ganze schon funktionieren!

Gruß

LL

free.surfer
26.01.2008, 12:49
Hallo LL,
ich habe das Feld [datum] im der Haupttabelle "Dienstleistungen" in [dienstdatum] umbenannt, hat sich auch überall aktualisiert, aber am ergebnis ändert es nichts.

Ferner erhalte ich auch immer eine fehlereldung:
Der Berichtsname "KundeArbeitszettel" den sie eingegeben haben, ist entweder falsch geschrieben oder verweist auf einen Bericht der nicht geöffnet ist oder nicht existiert."

Der Bericht wird aber ausgedruckt mit allen datensätzen des kunden.

Als Anlage Bildschirm kopien!!!

mfg arne

Louisleon
26.01.2008, 13:02
Hallo Arne,

hab mir deinen Code wohl nicht richtig genug angesehen ;)
aus der OH:
OpenReport-Methode
Die Methode OpenReport führt die Aktion ÖffnenBericht in Visual Basic aus.
Ausdruck.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)

und versuch es mal so:
Private Sub Befehl58_Click()
On Error GoTo Err_Befehl58_Click

Dim stDocName As String

stDocName = "KundeArbeitszettel"
Reports(stDocName).RecordSource = "select top 3 * from A-Dienstleistung where [kdnr] = " & Me![kdnr] & " order by dienstdatum desc;"
DoCmd.OpenReport stDocName
Exit_Befehl58_Click:
Exit Sub


macht immer Sinn die Recordsource vor dem öffnen des Berichtes zu setzen ;)

Gruß

LL

free.surfer
26.01.2008, 13:18
Hallo LL,
Als Anlage noch eine Kopie.

Erhalte jetzt nur die Fehlermeldung aber keinen Druck!

ah

borisrisker
26.01.2008, 13:24
Hallo zusammen,

eine alternative Methode (wenn auch eher unelegante) Methode wäre, die Datensätze in eine Zwischentabelle zu schreiben und diese als Datenquelle für den Bericht zu verwenden ... Hätte den Vorteil, daß du genauer steuern kannst, in welcher Reihenfolge die Datensätze erscheinen ... Du kannst dir ja einfach das RecordsetClone des Forumlares in eine Recordset-Variable schnappen und mit MovePrevious, MoveNext usw. im REocrdset rumspazieren und die Datensätze in die Tabelle schreiben ...

Louisleon
26.01.2008, 13:26
Klar, sorry Objekt (Bericht) ist noch nicht vorhanden!
Dann setzt doch die Recordsource im Bericht, oder lade kurz eine BSP-DB hoch.
Recordsource im Berichtsteil setzen:
Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = "select top 3 * from A-Dienstleistung where [kdnr] = " & Forms!MyForm![kdnr] & " order by dienstdatum desc;"
End Sub


Gruß

LL

free.surfer
26.01.2008, 13:41
Hallo LL,
Mit deiner Lösung kann ich leider nichts anfangen, da ich so gut wie kein VBA kann. Kannst du mir eine kpl. Anweisung vorgeben die ich dann nur kopiere.

Danke!! arne

Louisleon
26.01.2008, 14:17
Hallo Arne,

im Formular beim Button:

Private Sub Befehl58_Click()
On Error GoTo Err_Befehl58_Click
Dim stDocName As String
stDocName = "KundeArbeitszettel"
DoCmd.OpenReport stDocName
Exit_Befehl58_Click:
Exit Sub
Err_Befehl58_Click:
'Fehlerbehandlung
End Sub


im Bericht, Ereignis "Beim Öffnen":
Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = "select top 3 * from A-Dienstleistung where [kdnr] = " & Forms!MyForm![kdnr] & " order by dienstdatum desc;"
End Sub
Statt "MyForm" mußt Du noch das Formular angeben auf welchem sich das Feld [KdNr] befindet (vermutlich das gleiche aus dem der bericht gerufen wird).

Kannst du mir eine kpl. Anweisung vorgeben
lad eine BSP-DB hoch (mit Datenquellen, Formular und Bericht)!

Gruß


LL

free.surfer
26.01.2008, 18:18
Hallo LL
Ich habe die Fehlerunterdrückung noch nicht aktiviert damit ich das Problem zeigen kann.

Das Druckfenster kommt kurz, aber es geht kein befehl an den Drucker.

Danach kommt die Fehlermeldung.

gruß arne

borisrisker
26.01.2008, 18:24
Ich glaube, du musst eckige Klammern um den Tabellen-namen im SQL-Statement machen ...

also so:

Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = "select top 3 * from [A-Dienstleistung] where [kdnr] = " & Forms!MyForm![kdnr] & " order by dienstdatum desc;"
End Sub

der comp sagt ja auch, daß es ein Problem in der FROM-Klausel ist ...

gpswanderer
26.01.2008, 18:27
Hallo,
das wird es wohl sein. Das ist auch der Grund, warum man auf Sonderzeichen (auch Leerzeichen) in Objektnamen grundsätzlich versichten sollte.

Louisleon
26.01.2008, 18:30
Hallo Arne,

nimm doch mal das SQL-Statement und füge es im Abfrage-Editor ein und ersetze die Kundennummer mit einem festen Wert.
Bekommst Du dann ein Ergebnis?
Dann solltest Du prüfen (Breakpoint auf die Anweisung im Report) ob Du im Direktfenster für "Forms!FormKunde.[kdnr]" auch den Wert bekommst.
Was für ein Feld ist "kdnr" eigentlich? Wenn es sich um ein Stringfeld handelt müßtest Du es noch in Hochkomma setzen:
Me.RecordSource = "select top 3 * from [A-Dienstleistung] where [kdnr] = '" & Forms!MyForm![kdnr] & "' order by dienstdatum desc;"

Dann auch Boris Hinweis beachten!
Ansonsten wie gesagt Beispiel-DB


Gruß

LL

free.surfer
26.01.2008, 18:47
:) :) :)
Danke an Alle,
die Lösung ist da!!!

Ich kipp ne´ Buttel Schnaps in den Rechner, die ist für euch!!

1000 Dank!!

arne

Louisleon
26.01.2008, 20:42
@gpswanderer
Das ist auch der Grund, warum man auf Sonderzeichen (auch Leerzeichen) in Objektnamen grundsätzlich versichten sollte.
Ob der Bindestrich darunter fällt ist fraglich ;)
Eventuell geht sogar dann "A_Dienstleistung", zumindest wird es bei einem Feldbezug entsprechend umgesetzt.

Gruß

LL

gpswanderer
26.01.2008, 21:15
@Louisleon,
der Bindestrich fällt darunter. Access macht 2 Felder daraus und fragt diese als Parameter ab. Mit dem Unterstrich funktioniert alles einwandfrei. Der Unterstrich ist auch der einzige optische Trenner den ich verwende.

free.surfer
26.01.2008, 23:56
Hallo LL,
noch mal danke für dein Fachwissen!
kdnr= Kundennummer
Die DB ist jetzt fertig, nur geht es an die Syncronisierung, dh. drei Replikate die via modem an eine Master senden und der Master wieder die aktuelle DB an die Rep. sendet.
Wird meine nächste Fragestunde!
gute nacht

arne

free.surfer
27.01.2008, 15:19
Hallo,
Hier moch mal die Lösung zum Anschauen.
Ausgeführt im Bericht unter:
Ereignis;beim öffnen

Gruß arne

Louisleon
27.01.2008, 18:13
@gpswander
Hallo Klaus,
wie sollen es die Rookies richtig machen, wenn es Ihnen MS schon falsch vormacht (Nordwind-DB). Schau dir dort mal die Personalnummer an. ;)
Was ich meinte und feststellte nachdem ich mich mal mit einem Beispiel gespielt habe war, dass z.b. beim setzen eines Ereignises auf einem Feld "Personal-Nr" dieses von Access in "Personal_Nr" umgesetzt wurde (Try it :)).
Was wieder mal nur zeigt, dass MS in vielen Dingen nicht konsequent ist (Auch wenn das nicht direkt verglichen werden kann!).
Ebensowenig in Ihrem Beispielcode auf der KB .

Gruß

LL