Neuigkeiten:

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

Mobiles Hauptmenü

Formular zeigt falsche Anzahl an Datensätzen

Begonnen von AllenWalker, August 12, 2013, 14:17:26

⏪ vorheriges - nächstes ⏩

AllenWalker

Hallo,

Ich habe folgendes Problem. Ich rufe über ein Formular ein neues Formular auf.
Der Inhalt des neuen Formulars wird mit Hilfe von VBA Code und einigen Abfragen
mit Parameter des ersten Formulars bestimmt. Auf dem Endformular wird unten in der
Leiste wo man zwischen den Datensätzen wechseln kann die falsche Anzahl angezeigt.
Aus dem Quellcode heraus soll nur ein einziger Datensatz auf dem Endformular erscheinen.


Private Sub GesprDatum_DblClick(Cancel As Integer)
  Dim SQLAbfrageKontakt As String
 
  ' Kontaktdaten abfragen
  SQLAbfrageKontakt = "SELECT K.kliName, K.kliVorname " & _
                      "FROM Kontakte AS K " & _
                      "WHERE K.KliID = " & Me.KliID & ";"
                     
  ' Protokolldaten abfragen
  SQLAbfrageProtokoll = "SELECT * " & _
                        "FROM Protokolle AS P " & _
                        "WHERE P.KliID = " & Me.KliID & " " & _
                        "AND CDbl(P.GesprDatum) = " & CDbl(Me![GesprDatum]) & ";"
  MsgBox (SQLAbfrageKontakt)
 
  DoCmd.OpenForm "Protokolle"
 
  ' Menue: Extras -> Verweise Microsoft DAO 3.xx Object Library muss aktiv sein!
  Dim db As DAO.Database
  Dim rs As DAO.Recordset

  Set db = CurrentDb                 ' Datenbank definieren
 
  ' Kontaktdaten
  Set rs = db.OpenRecordset(SQLAbfrageKontakt)  ' Recordset öffnen
  Forms!Protokolle!txtNameProtokoll = rs!kliName
  Forms!Protokolle!txtVornameProtokoll = rs!kliVorname
 
  ' Protokolldaten
  Set rs = db.OpenRecordset(SQLAbfrageProtokoll)
  Forms!Protokolle!txtSitzDatumProtokoll = rs!GesprDatum
  Forms!Protokolle!txtSitzHonorar = rs!Honorar
  Forms!Protokolle!cbDauerSitzung = rs!Problemdauer ' Sitzungsdauer
  Forms!Protokolle!txtGesprWer = rs!GesprWer

  rs.Close
  Set rs = Nothing
  Set db = Nothing
 
End Sub


Danke sehr,
Gruß,
AllenWalker

DF6GL

Hallo,

ist das "Endlos-Formular" das erste oder das zweite Formular??

Was ist eine "falsche Anzahl " ??

Wenn es das "Zweite" (Endlos)-Form ist, das mittels Zuweisungen "gefüllt" wird, dann gibt es für dieses Formular keine "Anzahl" (von Datensätzen).

Bitte beschreibe die Situation(en) immer eindeutig, sonst stochert man im Nebel herum.


Ich stelle die Frage nochmal, auch wenn es (Dich) nervt:   WARUM benutzt Du nicht die Standard-Funktionalitäten von Access??  (Gebunden Formulare, über die Schlüsselfelder verknüpfte Unterformulare, an Tabellenfelder  gebundene Steuerelemente , etc...)  .
Mit diesen "Sachen" liesse sich die Aufgabenstellung in Null Komma Nix und (fast)  ohne  eine Zeile VBA-Code erledigen.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AllenWalker

Ich habe ein Formular, wo die relevanten Kundendaten angezeigt werden. In einem Unterformular werden zu dem Kunden seine Gesprächstermine aufgelistet.
Das Unterformular wird über eine SQL-Abfrage mit Daten gefüllt. Wenn ich auf ein Datum eines gewissen Termins klicke wird ein Formular geöffnet welches zu eine
detaillierte Ansicht zu dem ausgewählten Termin gibt. Mittels VBA Code und der SQL Abfragen werden die Kundendaten und die Daten des Termins für das detaillierte
Formular bestimmt. Das Ergebnis für das Formular mit den detaillierten Termindaten soll nur ein Datensatz sein.

In der Leiste wo man zwischen den Datensätzen wechseln kann bekomme ich angezeigt x von Gesamtanzahl aller Datensätze wobei als Ergebnis aus den Abfragen im
VBA Code nur ein Datensatz kommen soll.

DF6GL

Hallo,


fassen wir mal zusammen:


Zitat
Ich habe ein Formular, wo die relevanten Kundendaten angezeigt werden. In einem Unterformular werden zu dem Kunden seine Gesprächstermine aufgelistet.

Ok, solange das Ufo-Steuerelement über seine Eigenschaften "Verknüpfen von/nach" mit dem Hauptform verbunden ist.


ZitatDas Unterformular wird über eine SQL-Abfrage mit Daten gefüllt.

Es reicht die Angabe des entspr. Tabellennamens, es sei denn, man möchte die Datensätze von vornherein nach einer gewissen Spalte sortieren.

ZitatWenn ich auf ein Datum eines gewissen Termins klicke wird ein Formular geöffnet welches zu eine
detaillierte Ansicht zu dem ausgewählten Termin gibt.

Ok.

ZitatMittels VBA Code und der SQL Abfragen werden die Kundendaten und die Daten des Termins für das detaillierte Formular bestimmt.

Hier kommt's:  Warum mit VBA und den SQL-Abfragen?

Mach ein Formular, das alle die gewünschten Detail-Felder anzeigt und setze in seine Datenherkunft den Tabellennamen (vermutlich "Protokolle"). Mit der nachfolgenden Prozedur öffnet sich das Form und zeigt die Details des Gesprächs an:



Code im UFO:

Sub Gesprdatum_DblClick()
Docmd.Openform "frmProtokollDetails",,,"GesprDatum= " & Format(Me!GesprDatum,"\#yyyy-mm-dd\#")
End Sub

(Je nach Aufbau der Tabellen wäre hier der Einsatz des Primärschlüsselwertes zu empfehlen)

Voraussetzung ist, dass die Tabellen ordnungsgemäß (mit Primärschlüssel, normalisiert) aufgebaut sind und "GesprDatum" vom Datentyp "Datum/Uhrzeit ist und auch NUR das Datum und keine Uhrzeit enthält.


Wie gesagt, das ganze VBA-Getöns der Wertzuweisungen kannst Du den Hasen geben.....
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AllenWalker

Zitat
Code im UFO:

Sub Gesprdatum_DblClick()
Docmd.Openform "frmProtokollDetails",,,"GesprDatum= " & Format(Me!GesprDatum,"\#yyyy-mm-dd\#")
End Sub

(Je nach Aufbau der Tabellen wäre hier der Einsatz des Primärschlüsselwertes zu empfehlen)

Voraussetzung ist, dass die Tabellen ordnungsgemäß (mit Primärschlüssel, normalisiert) aufgebaut sind und "GesprDatum" vom Datentyp "Datum/Uhrzeit ist und auch NUR das Datum und keine Uhrzeit enthält.

Danke sehr,
Hab die Codezeile noch etwas angepasst mit dem Primärschlüssel. Eine Frage dazu hätte ich noch. Wie kann ich auf den Namen und Vornamen des Kunden aus der Kundentabelle zugreifen? Bisher werden nur die Protokolldaten angezeigt und der Fremdschlüssel, welcher mit dem Primärschlüssel aus der Kundentabelle verbunden ist.

Am Rande möchte ich gerne noch erwähnen, dass ich meine letzte Erfahrungen mit Access 2002 in der Schule erworben hatte und da hatten wir ähnliche Sachen mit VBA Code und SQL gelöst. Seit dem Schuljahr hatte ich bisher nichts mit Access mehr zu tun bis heute wo ich mich halt für eine Arbeit damit auseinandersetzen soll. So gesehen bin ich ein Wiedereinsteiger und kenne mich nicht mit allen Bordmitteln von Access 2010 aus. 

DF6GL

Hallo,


3 (es gibt noch weitere) Möglichkeiten:

1) Mit Dlookup() im Steuerelementinhalt eines Textfeldes
2) Mit einem Kombifeld, das seine Daten aus der Kundentabelle bezieht.
3) In diesem Fall durchaus eine Abfrage für das Form, die über die benötigten Tabellen verknüpft. Dann kann man ein Textfeld an die gewünschten Tabellenfelder binden.


Am Rande:  Es ist ja nichts Schlimmes, wenn die Erfahrungen vor längerer Zeit gemacht wurden.. Es wäre nur vorteilhafter, etwas empfänglicher mit den gegebenen Ratschlägen und Tipps umzugehen ..

Die "Bordmittel" hier sind nicht unterschiedlich zwischen den Access-Versionen. Man macht sich halt das Leben leichter, als wenn man Access neu erfinden will.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AllenWalker

Habe Möglichkeit 3 umgesetzt. Habe es anhand eines Recordset umgesetzt.
Hier der Code dazu

Private Sub GesprDatum_DblClick(Cancel As Integer)

  Dim Abfrage As String
  Dim SQLAbfrageKontakt As String
   
  Abfrage = "KliID = " & Me!KliID & "AND GesprDatum = " & Format(Me!GesprDatum, "\#yyyy-mm-dd\#")
 
  DoCmd.OpenForm "Protokolle", , , Abfrage
 
  ' Kontaktdaten abfragen
  SQLAbfrageKontakt = "SELECT K.kliName, K.kliVorname " & _
                      "FROM Kontakte AS K " & _
                      "WHERE K.KliID = " & Me.KliID & ";"
                     
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
 
  Set db = CurrentDb
 
  ' Kontaktdaten
  Set rs = db.OpenRecordset(SQLAbfrageKontakt)  ' Recordset öffnen
  Forms!Protokolle!txtNameProtokoll = rs!kliName
  Forms!Protokolle!txtVornameProtokoll = rs!kliVorname
 
  rs.Close
  Set rs = Nothing
  Set db = Nothing 
End Sub


Oder geht es vielleicht noch kürzer?^^

DF6GL

#7
Hallo,

Im Steuerelementinhalt eines Textfeldes , das den Nachnamen anzeigen soll:


=Domwert("kliName";"Kontakte";"KliID = [KliID])

Voraussetzung ist, dass [KliID] im Formular vorhanden ist.


Noch einfacher wird die Sache, wenn für das "DetailFormular" dieselbe(!) Formularkonstruktion wie für das Ausgangsform verwendet wird. Lediglich haben die daran beteiligten Formulare  dann eben alle Tabellenfelder zur Anzeige.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AllenWalker

Zitat von: DF6GL am August 12, 2013, 17:19:43
Hallo,

Im Steuerelementinhalt eines Textfeldes , das den Nachnamen anzeigen soll:


=Domwert("kliName";"Kontakte";"KliID = [KliID])

Voraussetzung ist, dass [KliID] im Formular vorhanden ist.


Noch einfacher wird die Sache, wenn für das "DetailFormular" dieselbe(!) Formularkonstruktion wie für das Ausgangsform verwendet wird. Lediglich haben die daran beteiligten Formulare  dann eben alle Tabellenfelder zur Anzeige.

Habe die Zeile entsprechend dem Textfeld zugeordnet. Die kliID wird korrekt übernommen aus dem vorherigen Formular nur bekomme im "Detailformular" den falschen Namen zugewiesen.

DF6GL

Hallo,

nun, so meinte ich das nicht ganz...

Das "Detailformular" muss mit Docmd.Openform und Übergabe des passenden Primärschlüssels geöffnet werden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AllenWalker


Abfrage = "KliID = " & Me!KliID & "AND GesprDatum = " & Format(Me!GesprDatum, "\#yyyy-mm-dd\#")

Mit dieser Zeile öffne ich das "Detailformular" und die KliID wird korrekt übernommen.


=DomWert("kliName";"Kontakte";" KliID = [KliID]")

Diese Zeile habe ich bei dem Textfeld für den Nachnamen bei Steuerelementinhalt eingegeben.

Als Ergebnis bekomme ich zu der KliID den falschen Namen aus der Kontakttabelle.

AllenWalker

Weiß keiner eine Antwort? Müsste auch noch weitere Felder (Textfelder, Combo Boxen und Check Boxen) auf die Art füllen. ???
Sonst verbleibe ich bei den Recordsets.

DF6GL

Hallo,

Zitat"Als Ergebnis bekomme ich zu der KliID den falschen Namen aus der Kontakttabelle."

das glaube ich nicht...




Welchen Datentyp hat das Tabellenfeld "KliID"  ?
Welcher Wert steht im Form-Textfeld "KliID" ?



Und hier fehlt ein Leerzeichen vor "AND":

Abfrage = "KliID = " & Me!KliID & "AND GesprDatum = " & Format(Me!GesprDatum, "\#yyyy-mm-dd\#")
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AllenWalker

Zitat
Welchen Datentyp hat das Tabellenfeld "KliID"  ?
In der Tabelle Kunde hat das Feld den Datentyp "Auto-Wert" und in der Tabelle Protokolle den Datentyp "Zahl"

Zitat
Welcher Wert steht im Form-Textfeld "KliID" ?
Nach dem Aufruf des detaillierten Protokollformulars steht im Textfeld die KliID des Kunden als Zahl.
Als Format ist "Allgemeine Zahl" angegeben.

DF6GL

Hallo,

dann sehe ich keinen Grund, warum der gelieferte Wert falsch sein sollte...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access