PDA

Vollständige Version anzeigen : Separates Zusatzfeld/Textfeld je Datensatz


DerLothringer
15.06.2012, 12:57
Hallo liebes Forum,

heute will ich wirklich alles wissen. :p

Folgendes: Ich habe ein Formular mit 4 Kombiboxen die als Parameter für eine Abfrage dienen. Habe ich in diesen 4 Kombiboxen die Werte ausgewählt und drücke auf einen Button erscheint in dem Formular die gesamt Abfrage.

Es handelt sich um ein Endlosformular.

Nun möchte ich dem Anwender die Möglichkeit bieten hintere jeden Datensatz einen Kommentar zu schreiben. Wenn ich hierfür ein Textfeld einrichte und dieses ausfülle taucht jeodch sofort neben jedem Datensatz der gleich Inhalt auf.

Wie kann ich das verhindern?

Atrus2711
15.06.2012, 12:58
Hi,

du wirst für den Kommentar ein neues Feld in der Tabelle brauchen, die dem Formular zugrundeliegt und lässt dieses Feld dann im Formular durchreichen. Bisher ist das Kommentarfeld ungebunden (= ohne Quellspalte) und wird infolgedessen stumpfsinnig für jeden Datensatz wiederholt.

DerLothringer
15.06.2012, 13:10
Das würde doch aber heißen das dieser Tabelle dann immer etwas hinzugefügt wird, oder?!

Meine Tabelle beinhaltet aber Daten die nicht verändert werden sollen. Ich möchte das dass Formular nach ausfüllen durch den Nutzer seperat gespeichert werden kann.

Das Formular basiert auf einer Abfrage, dieser wiederrum auf einer Tabelle die alle meine Datensätze enthält.

Das Formular soll nun dazu dienen die sortierten Datensätze vernünftig anzuzeigen und zu jedem Datensatz einen Kommentar zu schreiben. Wenn das passiert ist soll man es seperat, als Bericht oder was auch immer speichern können.

Wenn es gehen würde würde ich das Formular bzw. dessen Inhalt dann auch an eine neue Tabelle übergeben. Geht das vielleicht?

Atrus2711
15.06.2012, 13:15
Das würde doch aber heißen das dieser Tabelle dann immer etwas hinzugefügt wird, oder?!
Die Zeilenanzahl bleibt die gleiche, deine Kommentare kommen in die neue Spalte für jede kommentierte Zeile.

Das Formular soll nun dazu dienen ... zu jedem Datensatz einen Kommentar zu schreiben.
Hab ich verstanden. Access muss diese Information aber halt irgendwo ablegen. Das Formular ist nur Oberfläche zum Anzeigen und Bearbeiten von Daten, die aus Tabellen und/oder Abfragen stammen. Nur in Tabellen sind deine Daten auch morgen noch greifbar.

Tipp: www.access-tutorial.de

DerLothringer
15.06.2012, 13:31
Hallo,

ich hab das mal so gemacht wie von dir geschrieben, aber es passiert genau das was ich nicht wollte.

Wenn ich nun im Formular einen Kommentar neben jeden Datensatz schreibe taucht der in meiner Ursprungstabelle auf. Dies soll aber nicht passieren. Die Kommentare sollen nicht in der Tabelle landen.

Denn wenn später jemand wieder das Formular aufruft würde der jenige ja die alten Kommentare mit abrufen.

Ich hoffe ich hab das jetzt verständlich genug ausgedrückt.

Das Formular soll nur ein Feld pro Datensatz haben in dem ich einen Kommentar zu diesem schreiben kann. Dieser soll jedoch nciht in der Tabelle gespeichtert werden, er dient nur der näheren Beschreibung des Datensatzes für später.


Genau:

Das Formular zeigt Punkte an die ein Mitarbeiter abarbeiten muss, jeden dieser Punkte muss er kommentieren, zum Schluss das Formular speichern. (In welcher Form auch immer)

Wenn jetzt jemand eine neue Liste zum Abarbeiten macht würden doch die alten Kommentare in der Liste stehen... Das will ich nicht.

Atrus2711
15.06.2012, 13:37
Die Kommentare müssen in eine Tabelle, daran geht kein Weg vorbei. Das kann die bisherige Tabelle sein, oder eine neue. Eine neue Tabelle könnte sich auf den Primärschlüssel der Urtabelle beziehen, um die Kommentare dem richtige Ur-Satz zuzuordnen.

Im Formular könnte das dann so aussehen, dass der aktuelle Ur-Satz in einem Hauptformular steht und die Kommentare zum aktuellen Satz in einem Unterformular.

DerLothringer
15.06.2012, 13:49
Jetzt wird es aber knifflig. Wie verknüpfe ich denn dann meinen Datensatz mit den endlos vielen Kommentaren die mir die User dazu schreiben können?

Verknüpfung ist sicher 1:n

Wenn ich eine neue Tabelle mache auf die sich das Feld bezieht steht in diesem #Name


Vielen Dank MArtin das du so fleißig meine Fragen beantwortest. Hab Dank der Hilfe hier schon unheimlich viel aus meiner anfangs einfachen Access DB rausgeholt...

Atrus2711
15.06.2012, 13:56
Verknüpfung ist sicher 1:n
Ja. 1 Ursatz hat beliebig viele Kommentare, und jeder Kommentar betrifft max. (hier wohl eher genau) einen Ursatz.

Wenn das die Urtabelle ist: ID FeldA FeldB FeldC
dann könnte die Kommentartabelle so aussehen: ID F_Ursatz_ID Kommentar. Jeder Kommentar verweist mit der F_Ursatz_ID auf seinen Ursatz.

Eine Eingabemöglichkeit hast du genannt bekommen: Hauptform mit Ufo.

DerLothringer
21.06.2012, 09:48
Also ich habe jetzt 3 Tabellen die miteinander verknüpft werden sollen:

Anmeldemaske
KommentareFormular
Tabelle1

Tabelle1 enthält meine Datengrundlage. Jeder ID dort können n IDs in KommentareFormular zugeordnet sein. Die Daten der Anmeldemaske sollen mit dem ganzen ausgefüllten Formular nicht mit jedem einzelnen Datensatz aus diesem verknüpft sein. Die Verbindung ist mir hier nicht so klar. Wahrscheinlich wird sie aber 1:1 sein.

In meinem Endlosformular will ich Daten aus der Tabelle1 haben (läuft schon über Parameterabfrage). Neben jedem Datensatz will ich dann einen Kommentar dazu schreiben. Diese Kommentare sollen dann in der Tabelle KommentareFormular landen.

Das Ganze soll zum Schluss als ein Bericht ausgegeben werden.

Wie verknüpfe ich nun das Formular (ohne extra UFO) so das ich neben jedem Datensatz (Endlosformular, zeilenweise Datensätze) Das die Kommentare in ihrer Extra Tabelle landen?!

Erklärung siehe Grafik

gpswanderer
21.06.2012, 09:52
Hallo,
das geht nur mit einem Unterformular kompfortabel und sinnvoll.

Warum ohne Ufo?

DerLothringer
21.06.2012, 10:02
Kann ich nicht eine Abfrage von verschiedenen Tabellen machen und diese dann über das Formular füllen. Also jedes Feld füllt die entsprechende Tabelle?

gpswanderer
21.06.2012, 10:05
Hallo,
ja natürlich geht das, die Tabellen müssen aber in Beziehung stehen.

DerLothringer
21.06.2012, 10:18
Wie kann man denn bei ACC 2010 auf 1:n stellen. Bei meiner 2003er Version steht das noch über der Verbindung.

Ich denke mehrere Tabellen (bzw. 2) abfragen und nur eine davon im Formular füttern ist ganz gut, hoffe das funktioniert!

gpswanderer
21.06.2012, 10:20
Hallo,
Wie kann man denn bei ACC 2010 auf 1:n stellen.Referentielle Integrität auf ja stellen. Das war schon immer so, in jeder Access Version.

DerLothringer
21.06.2012, 10:48
Also, die Daten aus den zwei Tabellen in einer Abfragedarstellen funktioniert ohne Weiteres. Wenn ich die Abfrage erneut öffne stehen jedoch die eingetragenen Werte bereits da. Ich möchte aber in das Formular jedes Mal neue Werte eintragen, wobei die alten nicht zu sehen sein sollen.

Ich möchte jedoch später alle Daten Abfragen können wie

Datengrundlage + Kommentartabelle mit Schlüssel X
Datengrundlage + Kommentartabelle mit Schlüssel Y

nur sehe ich dann nicht die Verbindung zw. Datengrundlage und Kommentartabelle. Wie sage ich dann welcher Kommentar zu welchem Datensatz aus der Datengrundlage gehört?

gpswanderer
21.06.2012, 10:52
Hallo,
die der Abfrage geht das nicht, stelle die Formulareigenschaft auf "Daten eingeben" = Ja.

Ich müsste einen Schlüssel definieren der die Datengrundlage+Kommentare immer nur ein Mal zusammen abspeichert.Du kannst einen zusammengesetzten eindeutigen Index anlegen mit den beiden Feldern.

Aber das macht nur Sinn, wenn die Kommentare kein Freitext sind.

DerLothringer
21.06.2012, 11:45
Gibt es denn eine Möglichkeit die noch nicht fertig ausgefüllten Formulare zu speichern? So eine Prüfung dauert ja immer über einen Tag. Wenn dann der Bericht erstellt wurde ist ja alles gut.

Wenn ich das Formular wieder öffne stehen aber jedes Mal die Einträge (Kommentare) zu den Datensätzen da die von der vorherigen Prüfung stammen.

Da das mein erstes Accessprojekt in der Größe ist tu ich mich viell. ab und an etwas schwer mein Problem genau zu erklären, ich bitte das zu entschuldigen!

gpswanderer
21.06.2012, 11:49
Hallo,
jedes noch nicht fertig ausgefüllter Datensatz (nicht Formular) ist sofort gespeichert, da musst Du nix tun. Du füllts ja nicht das Formular aus, sondern die Tabelle über das Formular.

Wenn Du wie oben vorgeschlagen die entsprechende Eigenschaft einstellst siehst Du keine alten DS.

Maxel
21.06.2012, 11:53
Hallo,

Deine Vorstellung, Formulare zu speichern, zieht sich nun schon durch den gesamten Thread bzw. den "Nachbar"-Thread.

Gespeichert werden Daten allein in Tabellen, und zwar immer dann, wenn im Formular ein Datensatzwechsel erfolgt oder es geschlossen wird.

Insofern: Wenn Daten eingegeben wurden, das Formular aber noch nicht vollständig ausgefüllt wurde, sind die eingegebenen Daten gespeichert und beim nächsten Öffnen des Formulars verfügbar.

Lade doch mal eine abgespeckte 2003-Version hoch.

DerLothringer
21.06.2012, 13:39
Ich werd mal heute Abend eine bauen und die morgen im Laufe des Tages hochladen!

Danke!

DerLothringer
21.06.2012, 14:59
Ich kann das Ganze leider nicht in 2003 machen da ich dann die Meldung bekomme das einige der Feautres aus 2007 dann nicht funktionieren.

Eine 2007er Version bringt nichts?

gpswanderer
21.06.2012, 15:30
Hallo,
wirf die Features raus, die taugen sowieso nichts. :grins:

maikek
21.06.2012, 16:23
2007 kannst du natürlich auch hochladen, allerdings können diese Version dann nicht alle öffnen - ich auch nicht ;) .
maike

DerLothringer
21.06.2012, 17:43
Also das Navigationsformular find ich schon ganz nett, das macht die ganze Sache recht übersichtlich. Mal gucken ob ich im .mdb Format was bauen kann was erklärt was ich will.

Alle Teile einzeln kann ich ja bauen nur das Zusammenspiel scheint die Kür der ganzen Datenbankgeschichte zu sein!

maikek
21.06.2012, 18:03
Du kannst natürlich Dinge, die für das Problem nicht relevant sind, weglassen und Dummydaten verwenden, wenn die echten problematisch wären.
Wenn's also nur das Naviformular ist, das kann ruhig für die Demo fehlen.
Aber mit extra gebauten Teilen können wir hier wenig anfangen, es sollte schon der Version entsprechen, an der du auch gerade herumdokterst.
Ich denke auch, dass dein Datenmodell noch nicht optimal ist, also lasse möglichst alle Tabellen in der hochgeladenen Version drin, damit man sich das mal ansehen kann.
maike

DerLothringer
21.06.2012, 19:05
Das wird es, steht dann halt nur überall Testtext... :)

Atrus2711
25.06.2012, 08:44
Vielleicht kannst du ja Testdaten nehmen, die anonym und trotzdem so sinnhaft sind, dass wir das Problem erkennen können...

DerLothringer
25.06.2012, 10:17
So, nun soll es weiter gehen.

Nächste Frage. Kann ich über eine INSERT INTO Anweisung alle Daten die nach der Abfrage in meinem Formular stehen in eine neue Tabelle schreiben?
Jedes Mal nach dem in einem Datensatz etwas geschrieben wurde sollen die Daten dann gespeichert werden

Die Daten im Formular beziehe ich alle über eine Abfrage die sich aus zwei Tabellen bedient. Es ist übrigens ein Endlosformular, tabellarsich aufgebaut.

Die Parameter für die Abfrage werden im Formular aus Kombiboxen ausgewählt und über einen OK Button wird dann gestartet.

Atrus2711
25.06.2012, 10:22
Hi,
technisch geht das. Aber ein solches Formular ist "untypisch". Es dient ja dann nicht mehr zum Anzeigen und Eingaben von Daten aus Tabellen/Abfragen, sondern nur als Eingabefenster für Werte, die dann separat "weggeschrieben" werden.

Ich halte immer noch den ursprünglich geschilderten Weg für den einfachsten:

Hauptformular auf Basis der Mastertabelle
Unterformular auf Basis der Kommentartabelle. Da könnte man die vorigen Kommentare ggf. auch ausblenden.

DerLothringer
25.06.2012, 12:11
Vielleicht versuch ich meine Schilderungen mal etwas ausführlicher rüber zu bringen.

Ich habe eine Datengrundlage die aus einer Tabelle mit Punkten besteht die ein Mitarbeiter abarbeiten muss. Diese Datengrundlage soll unveränderbar sein.

Der Prozess soll dann wie folgt laufen.

Ein Mitarbeiter meldet sich in einer Maske an, dabei gibt er auch einen „speziellen Code“ ein. Wenn er alle Angaben gemacht hat bestätigt er das unten durch Klick auf einen Button. Die Daten werden dann in einer Tabelle gespeichert.

Dann kommt er in ein Formular das im Detailbereich leer ist. Im Kopfbereich sind 4 Kombiboxen, aus denen wählt er Werte aus die per Knopfdruck an eine Abfrage als Parameter übergeben werden, außerdem wurde der „spezielle Code“ aus der Anmeldemaske mitgenommen und steht im Kopf. Nach Druck auf den Button öffnen sich die Abfrageergebnisse im Detailbereich.

Diese sollen hier nun kommentiert werden. Die Datengrundlage bildet dabei die ersten 3 Spalten, die Kommentarfelder die letzten 3 Spalten. Die Kommentarfelder kommen auch über die Abfrage zu Stande. Die Abfrage fragt ja zwei Tabellen ab.

Alle 6 Spalten zusammen + der Code den der MA eingegeben hat sind mein Prüfergebnis. Dieses möchte ich auf jeden Fall zeilenweise darstellen und auch in dieser Kombination speichern, aus Dokumentationsgründen.
Das kann dann gerne in einem Bericht passieren (Ausgabe als PDF)

Wenn nun die nächste Prüfung erfolgt und die Daten wieder abgefragt werden sollen die bereits eingegebenen nicht wieder erscheinen, sie haben ja mit der neuen Prüfung nichts zu tun. Über den Code den der Mitarbeiter eingegeben hat soll nun sichergestellt werden das die Unterlage nur ein Mal vorliegt.

Von daher dachte ich mir es würde Sinn machen alle Felder in eine neue Tabelle zu schreiben, die dann mein Prüfergebnis sind + Code = einmalig bzw. absolut identifizierbar. Die Tabelle könnte dann immer heißen wie der Code… Da gibt es dann sicherlich etliche Möglichkeiten…

Ich hoffe jetzt ist klar warum ich das so machen will wie ich es will… Für mich ist dadurch eine bessere Übersichtlichkeit gegeben.

Atrus2711
25.06.2012, 12:28
Könnte man also sagen, dass

die anstehenden Prüfvorgänge feststehen (eine Art "Pflichtenheft" des Mitarbeiters)
diese Pflichten regelmäßig neu erfüllt werden müssen (d.h. mehrfach)
die Kommentare sich nur auf die Erfüllung der Pflicht beziehen?
der spezielle Code ein "Aktenzeichen der Erfüllung" ist?

DerLothringer
25.06.2012, 12:38
Alles richtig!

Die Pflichten müssen regelmäßig neu erfüllt werden, unterscheiden sich aber durch die Abfrageparameter!!! Sprich, was soll wie geprüft werden!

Atrus2711
25.06.2012, 12:46
Im Kopfbereich sind 4 Kombiboxen
Sind diese 4 Kombis Angaben zur neuzuerfassenden Erfüllung der Pflicht? Gehören sie mit zu den Kommentaren, oder sind sie "separat" zu sehen?

DerLothringer
25.06.2012, 12:50
Die 4 Kombis sind seperat zu sehen, über die wählt man nur aus was man wie zu prüfen hat (Nach Auswahl auf OK klicken). Das Abfrageergebnis was dann im Detailbereich des Formulars angezeigt wird sagt aus was wie geprüft werden soll und enthält auch die Zusatzfelder für die Kommentare.

Die Abfrage fragt ja zwei Tabellen ab. Eine enthält alle Prüfvorschriften und Merkmale über die die Abfrage gefiltert werden kann. Die andere nur die Kommentarfelder, damit diese Daten nicht mit in der Tabelle mit den Vorschriften landen!

Aufbau der Datengrundlagetabelle

ID - Kombi 1 - Kombi 2 - Kombi 3 - Kombi 4 - Prüfpunkt - Bild - Zeichnungsnr. usw.


Kombi ist unglücklich formuliert -> In diesen Feldern stehen die Werte über die später auch gefiltert wird!

Atrus2711
25.06.2012, 13:05
Von daher dachte ich mir es würde Sinn machen alle Felder in eine neue Tabelle zu schreiben, die dann mein Prüfergebnis sind + Code = einmalig bzw. absolut identifizierbar.
Ja, das klingt sinnig. Die Pflichten (der 1. Tabelle) werden erfüllt, dabei entstehen die 4 Kombifeld-Werte sowie ein Kommentar.

DerLothringer
25.06.2012, 13:10
Wie stelle ich das denn nun am besten an? Alle Werte aus dem Formular per Button an neue Tabelle schicken? Bzw. Immer eine neue Tabelle erstellen lassen?

Atrus2711
25.06.2012, 13:16
Immer eine neue Tabelle ist sicher der falsche Weg, denn Prüfergebnisse sind das allesamt.

Ich würde da eher eine Tabelle "Ergebnisse" anlegen, in die die Daten der "Pflichten", der 4 Kombis und der Kommentare reinkopiert werden. Insofern also Ja, "Alle Werte aus dem Formular per Button an neue Tabelle schicken".

DerLothringer
25.06.2012, 14:29
Dann würde ich jetzt eine Tabelle anlegen die alle Spalten hat die auch im Formular auftauchen. notfalls müssen einige noch "unsichtbar" mit ins Formular.

Wie würde denn dann ein Befehl für einen Button aussehen der Alle Datensätze aus dem Formular in eine neue Tabelle schiebt!?

Vielleicht über eine INsert Into Anweisung? ABer ich hab keine Ahnung wie ich das aus einen Formularbutton machen soll.

Jetzt scheinen wir auf jeden Fall einen ganzen Schritt weiter zu sein!

Danke für die Hilfe Martin!!!!!

Atrus2711
26.06.2012, 09:01
Eigentlich sollten die Tabellen und deren Beziehungen (=Datenmodell) als erstes entstehen, dann die Formulare. Hast du noch gar keine Tabellen?

Hier mal ein Ansatz zur Illustration.

DerLothringer
26.06.2012, 09:19
Hallo MArtin,
deine Datei kann ich aus total dämlichen Datensicherheitsgründen hier nich runterladen, mach ich heute Abend zu Hause.

Tabellen und Inhalte stehen schon.

Eine Tabelle Ergebnisse habe ich bereits angelegt. Ich versuche gerade über eine Insert Into Anweisung die auf einem Button liegt das Ganze zu realisieren.

Immerhin bin ich jetzt schon soweit das ich eine AHnung habe in welche Richtung es geht.

Hätte es jetzt so gemacht:

Private Sub Befehl136_Click()
Dim strSQL As String

strSQL = INSERT INTO Tab_Ergebnisse (Datenfeld-Nr,Anforderung,Bild,Bau-Ist-Zustand,iO,niO)&_
VALUES ('" & Prüfformular.Datenfeld-Nr & "','" & Prüfformular.Anforderung & "','" & Prüfformular.Bild & "','" & Prüfformular.Bau-Ist-Zustand & "',
'" & Prüfformular.iO & "', '" & Prüfformular.niO & "')

DoCmd.RunSQL strSQL
End Sub

Zeigt mir zur Zeit aber noch Syntaxfehler an. Wenn ich mehrere Datensätze in die Tabelle schreiben will muss glaube ich auch noch eine Select Anweisung rein.

Ich will ja immer alle aus dem Forumlar übertragen...

Atrus2711
26.06.2012, 09:34
Tabellen und Inhalte stehen schon.
Dann zeig doch mal her...

Der Ansatz mit dem Insert-Into...Values kann immer nur einen Datensatz auf einmal einfügen, nämlich den, der sich aus den aktuellen Inhalten (daher: Values) der Formular-Steuerelemente (Textfelder, Kombis etc) ergibt. Ist das Absicht? Wäre es nicht sinnvoller, z.B. die 4 anstehenden Prüfungen abzurufen (mit leeren Ergebnissen) und diese 4 Zeilen dann um die Ergebnisse zu ergänzen? So läuft meine Demo...

Dein Ansatz müsste etwa so lauten:

strSQL = INSERT INTO Tab_Ergebnisse " _
& "([Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO) " _
& "VALUES ('" & Prüfformular![Datenfeld-Nr] & "', " _
& "'" & Prüfformular!Anforderung & "', " _
& "'" & Prüfformular.Bild & "', " _
& "'" & Prüfformular.[Bau-Ist-Zustand] & "', " _
& "'" & Prüfformular.iO & "', " _
& "'" & Prüfformular.niO & "'")
Currentdb.Execute strSQL, dbFailOnError

Und das auch nur, wenn alle Felder Textfelder sind (was ich nicht weiß).

DerLothringer
26.06.2012, 09:46
Hallo Martin,

im Anhang mal ein Bild vom Formularaufbau zur bessern Verdeutlichung.


Die Datensätze die hier angezeigt werden entstehen erst nachdem man oben in den Kombiboxen Werte ausgewählt hat und dann auf Prüfliste erstellen geklickt hat.

Diese möchte ich dann auch so an die Tabelle Ergebnisse übergeben. Jede Zeile stellt dabei einen Datensatz dar.

Ich denke jetzt müsste klar sein was ich will :)

Atrus2711
26.06.2012, 10:11
Nicht so ganz... wie entstehen aus 4 Kombis 7 Datensätze?
Kannst du mal ein Foto der Tabellenentwürfe und der Beziehungen hochladen?

DerLothringer
26.06.2012, 10:18
Die Kombis geben nur Parameter an eine Abfrage weiter. Wenn man also die Werte in den Kombis anklickt und dann aus Prüfliste erstellen geht wird die Abfrage einfach im Form geöffnet.

Es sind sogar wesentlich mehr als 7 Datensätze... Am rechten Rand entsteht noch ein Scrollbalken... Je nach eingestelltem Parameter tauchen mehr oder weniger Datensätze in der Abfrage auf...

Atrus2711
26.06.2012, 10:34
Die Kombis geben nur Parameter an eine Abfrage weiter.
Wenn diese Abfrage die auszuführenden Prüfungen ergibt, dann sollte diese Abfrage als Basis der Anfügeabfrage dienen. Der Abruf der Prüfung erzeugt dann die Sätze in der Ergebnistabelle, die natürlich noch keine Ergebnisse haben - die füllst du dann einfach aus.

Es ist dann aber eben kein Insert Into...VALUES..., sondern ein Insert Into ... FROM ...: das FROM ist die Parameterabfrage.

DerLothringer
26.06.2012, 10:42
Also soll hinter den Knopf "Prüfliste erstellen" noch ein Befehl der gleichzeitig die Abfrage mit diesen Parametern in die Ergebnisstabelle schreibt?!

Wie kommen dann die zusätzlichen Werte in diese Ergebnisstabelle?

Wie kommen die Parameter aus den Kombis in die From Klausel?

Das scheint jetzt ja echt extrem knifflig zu werden...

DerLothringer
26.06.2012, 11:09
Private Sub Befehl136_Click()
Dim strSQL As String

strSQL = "INSERT INTO Ergebnisse " & _
"([Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO) " & _
"Select(([Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO) " & _
"From ([Datengrundlagge Abfrage]);"

CurrentDb.Execute strSQL, dbFailOnError

End Sub

Liefert mir jetzt den Laufzeitfehler 3075 "Fehlender Operator in Abfrageausdruck"

Kann es daran liegen das die Werte aus den Kombifeldern nicht erkannt oder übergeben werden?!

Atrus2711
26.06.2012, 11:14
Du warst zu freizügig mit den Klammern.
strSQL = "INSERT INTO Ergebnisse " & _
"([Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO) " & _
"Select [Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO " & _
"From [Datengrundlagge Abfrage];"
Damit würden alle Felder aus der Abfrage kommen. Die Kombis müssten da ja eh jetzt schon einfließen.

Die resultierenden Sätze kommen in die Ergebnistabelle, die auch im Formular gezeigt werden sollte. Dort kannst du die Ergebnisse dann nachtragen.

DerLothringer
26.06.2012, 11:17
Jetzt sagt er er findet die Eingabetabelle oder Abfrage "Datengrundlage Abfrage" nicht mehr und ich soll sicherstellen das diese auch da ist...?!?!?

Also die Abfrage ist natürlich da und ich sehe sie auch...

Atrus2711
26.06.2012, 11:19
Die Namen der Tabellen, Abfragen und Felder kennst nur du... Lad mal hoch, wenn das Forum mal drübersehen soll... rein syntaktisch ist die SQL ok.

Sind da wirklich 2 g bei Datengrundlagge Abfrage?

DerLothringer
26.06.2012, 11:20
Vergiss es, war ein Rechtschreibfehler im Code, wurde behoben. Jetzt sagt der dafür das 4 Parameter erwartet wurden, es wurden aber null übergeben...

Also muss ich die Parameter aus den Kombis noch an den Code übergeben?!

Atrus2711
26.06.2012, 11:23
Ich seh halt nix... :grins: Die Meldung sagt, dass 4 als Feldnamen gedeutete Namen nicht exisieren. Entweder sind das Tippfehler, oder die Parameterabfrage zieht ihre Daten nicht richtig aus den Formular-Kombis.

Lad halt mal hoch.

DerLothringer
26.06.2012, 12:46
So,

hab die Daten durch Unsinn ersetzt, das sollte dem Funktionsprinzip aber keinen Abbruch tun. Vielleicht findest du ja den Grund aus dem die Daten nicht in der Ergebnisstabelle landen.

Wahrscheinlich wird dir aber schlecht wenn du das Chaos siehst :)

DerLothringer
27.06.2012, 10:02
Kann mir jemand den Syntaxtfehler aufzeigen bzw. erklären wie ich die Where Klauses richtig formuliere. Beabsichtigt ist das die Abfrage ihre Parameter aus den Kombiboxen des Formulars nimmt.

Hier mein Code:


Private Sub Befehl136_Click()
Dim strSQL As String

strSQL = "INSERT INTO Ergebnisse " & _
"([Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO) " & _
"Select [Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO " & _
"From [Datengrundlage Abfrage]" & _
"Where [Datengrundlage.Land] Like IIf " & Me!Kombinationsfeld121 & "="Alle"," * "," & Me!Kombinationsfeld121 & " & _
And [Datengrundlage.Vorschriftenbereich] Like II " & Me!Kombinationsfeld125 & "="Alle","*"," & Me!Kombinationsfeld125 & " & _
And [Datengrundlage.Fahrzeugklasse] Like IIf " & Me!Kombinationsfeld127 & "="Alle","*"," & Me!Kombinationsfeld127 & " & _
And [Datengrundlage.Fahrzeug] Like IIf " & Me!Kombinationsfeld123 & "="Alle","*"," & "*" & Me!Kombinationsfeld123 & "*" & ");"

CurrentDb.Execute strSQL, dbFailOnError

End Sub

Atrus2711
27.06.2012, 12:03
Achso.
http://www.donkarl.com?FAQ6.16
Die Paranmeter sind hier die 4 Formularzugriffe.

Alternativ könntest du die SQL auch per VBA zusamensetzen.

DerLothringer
28.06.2012, 08:44
Private Sub Befehl136_Click()
Dim strSQL As String
strSQL = "INSERT INTO Ergebnisse " & _
"([Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO) " & _
"Select [Datenfeld-Nr], Anforderung, Bild, [Bau-Ist-Zustand], iO, niO " & _
"From [Datengrundlage Abfrage] " & _ 'Ist eine Abfrage
"Where (Datengrundlage.Land = '" & Forms!Prüfformular!Kombinationsfeld121 & "') _ ' Hiermit sollen die Parameter für die Abfrage vorgegeben werden, sie stammen aus Kombiboxen eines Formulars
AND (Datengrundlage.Vorschriftenbereich = '" & Forms!Prüfformular!Kombinationsfeld125 & "') _
AND (Datengrundlage.Fahrzeugklasse = '" & Forms!Prüfformular!Kombinationsfeld127 & "') _
AND (Datengrundlage.Fahrzeug = '" & "*" & Forms!Prüfformular!Kombinationsfeld123 & "*" & "') ;"
CurrentDb.Execute strSQL, dbFailOnError
End Sub



Zeigt mir immer Syntaxfehler an. Kann ich die Abfrage hier nicht behandeln wie eine Tabelle? Ich möchte ja nur das Abfrageergebnis in die Tabelle schreiben.

Ohne die Where Klausel kommt die Meldung "4 Parameter wurden erwartet, aber zu wenig übergeben". Über gebe ich die Parameter mit Where nicht auf die richtige Art?

Atrus2711
28.06.2012, 09:19
Hast du den Donkarl-Link mal gelesen?! Parameterabfragen lassen sich per VBA nicht einfach per Execute ausführen, da die Parameter dann auch per VBA übergeben werden müssen. Der Link zeigt dir, wie.

DerLothringer
28.06.2012, 09:29
Hab ich gelesen, werd aber nicht so richtig schlau draus.

Sehe ich das richtig das bei

qdf.Parameters!MeinParameter1

MeinParameter1 der Text aus der Kriterienzeile meiner Abfrage ist?

"Wert_für_Parameter1_in_Anführungszeichen_falls_er_ein_Text_ist" soll ja mein Kombifeld aus dem Formular sein, darauf habe ich so verwiesen:

= Forms!Prüfformular!Kombinationsfeld121

Kann ich hier später auch noch Mit Wildcards und "Wie" und "Wenn" arbeiten?

Atrus2711
28.06.2012, 09:54
Habs jetzt mal ganz anders aufgesetzt. Die SQL der Datengrundlage wird neugeschrieben, und darauf kann auch die Insert-Anweisung dann zugreifen.

DerLothringer
28.06.2012, 10:14
So schon ganz gut denke ich, funktioniert aber irgendwie nicht immer.

Denkst du es ist möglich die Abfrage mit Parameterzugriff über die Kombifelder im FOrm laufen zu lassen und den INsert into dann seperat auf die Kombifelder zugreifen lassen. Where als str zu deklarieren und für die insert into zu verwenden...

Mal gucken ob ich das mit meinen extrem beschränkten VBA Fähigkeiten hinbekomme

Atrus2711
28.06.2012, 10:22
So schon ganz gut denke ich, funktioniert aber irgendwie nicht immer.
Habs mit ECE/Brennbarkeit/T/M1 probiert. Da gings. Wo denn nicht?

Dein Vorschlag ist sicher machbar, birgt aber (neben dem Umstand) auch die Gefahr, dass der Nachbau der Parameterabfrage doch nicht genau das gleiche macht. Das könnte dazu führen, dass du eben nicht genau das anfügst, was du siehst ("11 sehen, 18 anfügen").

Im übrigen sind Parameterabfragen "unbeliebt": klick! (http://www.dbwiki.net/wiki/Access_Design:Parameterabfrage)

DerLothringer
28.06.2012, 10:24
Wie wäre es denn wenn ich die Abfrage die ich fürs Formular verwende (die mir die Daten im Form anzeigt) kopiere und den Button dann auf die zweite Abfrage zugreifen lasse.

Mit dem DonKarl Ding, kombiniert mit insert into?
in die Kriterienzeile der Abfrage kommt dann [Parameter1] [...2] usw.

ginge das?

Atrus2711
28.06.2012, 10:30
Geht sicher. Es gehen auch noch andere Varianten. Willst du jetzt einen Technikexkurs, oder genügt das Funktionieren?

Ich würde Formularbezüge in Abfragen ganz vermeiden. Filtere die Tabellenfelder dort auf Parameter, und belege diese Parameter beim qdf.Execute mit den Formularwerten. Heikel ist bei der Eine-Abfrage-Lösung halt die "Weitergabe" der parametrisierten Abfrage an die darauf aufbauende Abfrage.

DerLothringer
28.06.2012, 12:15
Habs ENDLICH hinbekommen!!!

Die Daten werden jetzt über eine zweite Abfrage die auf die gleichen Kombifelder zugreift als Anfügeabfrage in eine Tabelle geschrieben.

Die nachgetragenen Daten gehen dann über Insert Into in diese Tabelle! Die frage ich dann wiederrum mit einem Bericht ab...

Das einfachste hab ich also einfach übersehen... Ergebnisse passen auch immer!