Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Datensatzquelle im Formular wird automatisch ergänzt und führt zu Fehlern?

Begonnen von Tanja1990, Oktober 28, 2014, 18:13:27

⏪ vorheriges - nächstes ⏩

Tanja1990

Hallo liebes Forum,

in einem Formular habe ich zwei Kombinationsfelder, die sich gegenseitig bedingen. Wähle ich in dem einen zum Beispiel die Marke ,,Audi" steht in dem zweiten nur noch das Modell ,,A1", ,,A2", ,,...
Umgekehrt funktioniert das genauso.

Die Kombinationsfelder haben eine Abfrage als Datensatzherkunft, die ich per Requery nach Aktualisierung neu einlese. Der Code sieht so aus:


Me.RecordSource = "SELECT * FROM tbl1 WHERE (([Marke] LIKE [Formulare]![Formular1]![txtMarke]) AND ([Modell] LIKE [Formulare]![Formular1]![txtModell])"
                                         
                                      Me![cboMarke].Requery
                                      Me![cboModell].Requery




Je nachdem, was ausgewählt wurde, werden im Formular die passenden Datensätze angezeigt, zwischen denen ich dann komfortabel über ,,Vor" und ,,Zurück"-Buttons wechseln kann. Die Unterformulare habe ich ebenfalls über die Eigenschaft verknüpfen von /verknüpfen nach-Eigenschaft verbunden.
Hierzu habe ich die Ursprungstabelle als Datensatzquelle definiert, dann über die Eigenschaft ,,verknüpfen von /verknüpfen nach" die Ufos verbunden und anschließend die Datensatzquelle des Hauptformulars wieder gelöscht, weil diese ja über die Kombinationsfelder ausgewählt werden soll.

Es funktioniert soweit alles wie es soll.

Allerdings öffnet sich das Formular manchmal und läuft ins leere, d.h. es werden  keine Datensätze ausgewählt. Habe dann festgestellt, dass Access automatisch einen Eintrag in der Datensatzquelle gemacht hat. Nachdem ich diesen wieder gelöscht habe geht alles wieder.

Habt Ihr eine Idee, wieso das Formular manchmal nicht mehr funktioniert bzw. wo ich suchen kann?

Vielen Dank im voraus!

Tanja

DF6GL

Hallo,

vermutlich sind die Textfelder oder Kombifelder (so genau verstehe ich nicht, mit was Du filterst) an Tabellenfelder gebunden, was zur Folge hat, dass eingetragene oder ausgewählte Werte gnadenlos in die Tabelle geschrieben werden und so den aktuellen DS verändern.

"Umgekehrt funktioniert das genauso."   Wie ist das zu verstehen?

[Formulare]![Formular1]![txtMarke]) AND ([Modell] LIKE [Formulare]![Formular1]![txtModell])"


was sind das für Textfelder?
Wo finden sich die Kombifelder (zum Filtern) wider?

Tanja1990

Hallo!

Die Textfelder sind nur dazu da, den Wert des Kombifeldes zu übernehmen. Diese Felder haben als Steuerelementinhalt eine Funktion, die bei Auswahl von "alle" ein "*" übernimmt und ansonsten den gewählten Namen:

=Wenn([cboMarke]="<alle>";"*";[cboMarke])

Diesen Wert nutze ich ja dann für die Abfrage der jeweiligen Datensätze...


Tanja1990

Ach ja..
ZitatUmgekehrt funktioniert das genauso.

Als Standard ist bei beiden Kombifeldern "alle" ausgewählt und damit steht im zugehörigen textfeld "*". Wenn ich nun zunächst im zweiten einen Wert auswähle. passt sich das erste Kombifeld auch an.

Also Auswahl von "A1" würde dazu führen, dass im ersten Kombifeld nur noch die Auswahl "Audi" möglich ist...

Oh mann, hoffe Ihr könnt mir hier weiterhelfen :o)

MaggieMay

Hallo Tanja,
ZitatHierzu habe ich die Ursprungstabelle als Datensatzquelle definiert, dann über die Eigenschaft ,,verknüpfen von /verknüpfen nach" die Ufos verbunden und anschließend die Datensatzquelle des Hauptformulars wieder gelöscht
das macht keinen Sinn, weil du das Unterformular über die Kombifelder verknüpfen musst, im HF hast du dann ja keine Datenfelder mehr und die Auswahl von Nicht-Datenfeldern wird vom Verknüpfungsassistenten nicht unterstützt. Du kannst das aber manuell eintragen.
Freundliche Grüße
MaggieMay

Tanja1990

Zitatdas macht keinen Sinn, weil du das Unterformular über die Kombifelder verknüpfen musst, im HF hast du dann ja keine Datenfelder mehr und die Auswahl von Nicht-Datenfeldern wird vom Verknüpfungsassistenten nicht unterstützt. Du kannst das aber manuell eintragen.

...im Hauptformular habe ich die beiden Felder txtModell und txtMarke, die durch die Kombinfelder gefüllt werden. Bei Aktualisierung wählt mir die Select Anweisung die jeweiligen Datensätze aus...Wie gesagt. Es funktioniert ja im Prinzip, aber leider läuft das Formluar manchmal ins leere..

Schwer zu beschreiben :(

Trotzdem schonmal Danke für die Mühe!


MaggieMay

Vielleicht kannst du ja mal eine Beispiel-DB hochladen (mit Testanleitung), an der man das Verhalten nachvollziehen kann.
Freundliche Grüße
MaggieMay

Tanja1990

Hallo zusammen,

sorry für die Verzögerung...war im Urlaub  ;)

Habe aber leider immer noch das gleiche Problem. Leider kann ich kein Beispiel hochladen, die DB ist einfach zu groß.

Vielleicht könnt Ihr mir trotzdem nochmal einen Tip geben:

Wie schon beschrieben habe ich abhängige Kombifelder, die im Ereigbnis "Nach Aktualisierung" die Funktion requery für die anderen Kombifelder ausführen und eine select-Anweisung für die Auswahl der Datensätze ausführt.

Mein Problem ist:
So lange die Datenherkunft/Datensatzquelle meines Hauptformulars leer ist (also nichts eingetragen) funktioniert der Aufruf der Unterformluare problemlos.  Wenn ich an der Datenbank Anpassungen vornehme (mein Eindruck ist, immer wenn ich Tabellen oder Abfragen ergänze/ lösche), Schreibt mir Access selbstständig (?!)  >:( die Select-Anweisung aus meiner Ereignisprozedur in die Datenherkunft/Datensatzquelle. Komischerweise ist mein Formular (und die Ufos) dann bei Aufruf leer. Auch zumachen/aufmachen bzw. die Anwahl der Kombifelder ändert daran nichts mehr.

Erst wenn ich die Datensatzquelle im Formular wieder lösche, läuft alles wieder...

Habt Ihr eine Idee, wo ich suchen kann?
:'(

DF6GL

Hallo,


--- hast Du die DB vor dem Hochladen  komprimiert/repariert und gezippt?

--- vielleicht ist auch eine Datenreduzierung möglich...


Zitat
Schreibt mir Access selbstständig (?!)  >:( die Select-Anweisung aus meiner Ereignisprozedur in die Datenherkunft/Datensatzquelle.


Wenn die Zuweisung des SQL-String an die Datenherkunft-Eigenschaft des Forms tatsächlich nicht doch per Code passiert, könnte das

---   auf eine "defekte" Datenbank hinweisen. Dann alle Objekte in eine neue, leere Datenbank(-Datei) importieren

---- auf einen Bug in Access hinweisen. Mir selber ist es auch schon des Öfteren passiert, dass beim Ändern im Formularentwurf die Datenherkunft mit unbrauchbarem Text (nicht unbedingt SQL)  zermüllt wurde. Es könnte sich dabei um Inhalt aus der Zwischenablage handeln.  Auch hier könnte der Import in eine neue leere DB helfen.






Tanja1990

Hallo!

Danke für den Hinweis!

Ich habe die DB schon in eine Neue importiert. Die Größe reduziert sich, aber immer noch >20MB und der Fehler ist auch noch da.  :-[

Dass die Datensatzquelle sich per Code ändert, glaube ich nicht. Hier steht nur dieser Code nach Aktualisierung der Kombifelder:

Me.RecordSource = "SELECT * FROM tblAuto WHERE (([Status] LIKE [Formulare]![Hauptformular]![txtStatus]) AND ([Marke] LIKE [Formulare]![Hauptformular]![txtMarke]) AND ([Modell] LIKE [Formulare]![Hauptformular]![txtModell]) AND ([Fahrer] LIKE [Formulare]![Hauptformular]![txtFahrer])) ORDER BY tblProjekte.Status"                         
 


Woran könnte es sonst noch liegen?

DF6GL

Hallo,

Naja, 


ZitatDass die Datensatzquelle sich per Code ändert, glaube ich nicht.

aber ich (und auch Access  ;) )


Me.RecordSource = "SELECT * FROM tblAuto WHERE (([Status] LIKE [Formulare]![Hauptformular]![txtStatus]) AND ([Marke] LIKE [Formulare]![Hauptformular]![txtMarke]) AND ([Modell] LIKE [Formulare]![Hauptformular]![txtModell]) AND ([Fahrer] LIKE [Formulare]![Hauptformular]![txtFahrer])) ORDER BY tblProjekte.Status"                         
 

IST doch die Datenherkunft des Formulars...


Wobei eine solche Zusammensetzung des SQL-Strings für die Datenherkunft recht problematisch ist...
Weiterhin ist "tblProjekte.Status"  offensichtlich nicht in "tblAuto"  enthalten...

Es wäre besser, so zu schreiben:

Me.RecordSource = "SELECT * FROM tblAuto WHERE [Status] = "' & [Forms]![Hauptformular]![txtStatus] & "' AND [Marke] = '"  & [Forms]![Hauptformular]![txtMarke] & "' AND [Modell] = '" &  [Forms]![Hauptformular]![txtModell] & "' AND [Fahrer] = '" &  [Forms]![Hauptformular]![txtFahrer] & "' ORDER BY Status"

wenn sich die Codezeile nicht im Formular "Haupformular" befindet und alle Tabellenfelder den Datentyp Text aufweisen.

Es deutet  auch alles darauf hin, dass die DB nicht den Normalisierungsregeln entspricht.


Tanja1990

Zitataber ich (und auch Access  )
:-[ :-[ :-[

;)

Anfänger halt  :-\

ZitatWeiterhin ist "tblProjekte.Status"  offensichtlich nicht in "tblAuto"  enthalten...
War mein Fehler: Richtig muss es tblAuto.Status heißen...

ZitatEs wäre besser, so zu schreiben:


Code: [Auswählen]
Me.RecordSource = "SELECT * FROM tblAuto WHERE [Status] = "' & [Forms]![Hauptformular]![txtStatus] & "' AND [Marke] = '"  & [Forms]![Hauptformular]![txtMarke] & "' AND [Modell] = '" &  [Forms]![Hauptformular]![txtModell] & "' AND [Fahrer] = '" &  [Forms]![Hauptformular]![txtFahrer] & "' ORDER BY Status"
wenn sich die Codezeile nicht im Formular "Haupformular" befindet und alle Tabellenfelder den Datentyp Text aufweisen.

Doch, die Codezeile befindet sich im Hauptformular...geht aber trotzdem so (gerade ausprobiert). Oder?

ZitatEs deutet  auch alles darauf hin, dass die DB nicht den Normalisierungsregeln entspricht.
Das ist leider so (DB baut auf bereits vorhandenen Tabellen auf). Bin aber dabei, dies anzupassen, soweit praktikabel.

Werde berichten, ob diese Anpassung das Problem löst. Vielen Dank!!!

8)

DF6GL

Hallo,

wenn sich der Code im selben Formular befindet wie die Kriterien(Such-)Felder, dann sollte es so lauten:

Me.RecordSource = "SELECT * FROM tblAuto WHERE [Status] = "' & Me![txtStatus] & "' AND [Marke] = '"  & Me![txtMarke] & "' AND [Modell] = '" &  Me![txtModell] & "' AND [Fahrer] = '" &  Me![txtFahrer] & "' ORDER BY Status"