Hallo zusammen,
ich bin langsam am verzweifeln. Ich habe eine recht umfangreiche Datenbank geerbt, die ich seit einem Jahr betreue. Bin langsam in das Thema reingewachsen und somit kein Frischling mehr. Trotzdem komme ich hiermit nicht weiter klar.
Folgendes Problem:
die Datenbank dient zur Versuchsverwaltung. Dabei kommt es immer wieder vor das etliche Randbedingungen sich stark ähneln und man sich mal schnell über eine Halbe Stunde Zeit sparen könnte wenn man bestimmte Parameter aus einer Abfrage kopieren und mit EINEM geänderten Bezugsfeld wieder speichern könnte. (soviel zur Relationalen Datenbank)
ich finde leider keine Sinnvolle Möglichkeit zum Kopieren und wieder Einfügen dieser Daten. Nochmal zur Erklärung das Szenario.
Tabelle1 wird mit Abfrage1 aufgerufen und nach kriterium1 gefiltert. Dies wirft ca. 1-50 Datensätze aus, oder auch mehr. Diese möche ich ans Ende von Tabelle1 anfügen und SpalteXY für alle kopierten Datensätze mit einem festen Wert versehen, den ich Per Variable eingebe.
sorry für den langen text, aber ich weiss im Moment weder mit VBA, noch Abfragen bzw. Kombination der beiden das Problem zu lösen. Bitte innigst um Hilfe :-\
Danke im Vorraus - bin offen für alles
Hallo,
du könntest die Anfügeabfrage per VBA dynamisch erzeugen und ausführen.
Beispiel:strSQL = "Insert Into tabelle1 (feld1, feld2, ...) " & _
"Select feld1, '" & variable1 & "', ..." & _
"From abfrage1 " & _
"Where " & kriterium1
CurrentDB.Execute strSQL, dbFailOnError
Hinweis:
bei Zahlen werden keine Hochkommata gesetzt.
Prinzipiell hört sich das gut an, habe es auch schon in die Richtung hin probiert.
Mein Problem ist aber gerade noch folgendes. Wenn Angenommen meine Abfrage hat 5 Datensätze, wie kann ich dann zuweisen das ich den wert des ersten, bzw. zweiten oder... Datensatzes auslesen /kopieren möchte?
Und kann ich bei der Gelegenheit auch sagen das Spalte 5 beim Einfügen bereits einen gezielten Wert zugewiesen bekommt? Im Zweifelsfall könnte ich das damit lösen das ich Spalte 5 einfach nicht mitkopiere, und später mit einer Aktionsabfrage per VBA einfach nach Kriterium "Null" filtere und da den Variablenwert setze.
Hi,
das Auslesen (und Kopieren) der einzelnen Datensätze wird durch das Select-Statement gewährleistet und die Zuweisung eines konstanten Wertes zu einer Spalte ist in meinem Beispiel ebenfalls enthalten.
sorry,
das ist mir gerade zu abstrakt, obwohl ich das selbst so geschrieben habe ;)
hab ich das so richtig verstanden?
"Insert Into tabelle1 (feld1, feld2, ...) " & _
"Select feld1, '" & variable1 & "', ..." & _
"From abfrage1 " & _
"Where " & kriterium1
tabelle 1 = Tabellenname - klar
feld1 = [Spaltenname]
variable1 = ist hier anstelle von Spalte2?
Kann ich hier bei Kriterium eingeben Datensatz(x) der Abfrage1? da ich mit dcount die menge der gefilterten datensätze rausfinden kann, könnte ich so sauber eine schleife laufen lassen. geht sowas?
Mein Beispiel bezieht sich auf deine eigenen Worte:
ZitatTabelle1 wird mit Abfrage1 aufgerufen und nach kriterium1 gefiltert. Dies wirft ca. 1-50 Datensätze aus, oder auch mehr. Diese möche ich ans Ende von Tabelle1 anfügen und SpalteXY für alle kopierten Datensätze mit einem festen Wert versehen, den ich Per Variable eingebe.
wobei "SpalteXY" im Beispiel "feld2" ist und ich davon ausgegangen bin, dass alle Bausteine (Name von Tabelle und Abfrage, Variable zur Übergabe des festen Wertes, sowie der Kriterienstring) verfügbar sind.
Was hast du mit der Schleife vor? Die Abfrage macht eine Verarbeitungsschleife überflüssig, weil sie automatisch die ausgewählten Datensätze berücksichtigt.
ich glaub jetzt versteh ich worauf die hinaus willst. D.h. wenn ich diesen string benutze, dann wird bereits der GESAMTE Inhalt der Abfrage an die Tabelle angefügt. Das ist natürlich genau das was ich will :D ich bin von einzelnen Datensätzen ausgegangen. Also mit
for n = 1 to Dcount
insert Datensatz to tabelle
next n
das ist natürlich schick. Das werde ich dann gleich mal testen. Besten Dank.
Noch rein informativ. Gibt es denn die Möglichkeit z.B. Datensatz3 der AbfrageX direkt anzusprechen? wenn man das passende Kriterium nicht kennt?
Wenn du bspw. ein Formular so filterst, dass es nur die gesuchten Datensätze enthält, so kannst du eine Verarbeitungsschleife über das Recordset laufen lassen:Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
For i = 1 to rs.RecordCount ' alternativ: Do While Not rs.EOF
If i = 3 Then
' mach was mit dem Datensatz
Exit For ' fertig!
End If
rs.MoveNext
Next i
Der x-te Datensatz ist aber keine gute Wahl, da x von der aktuellen Sortierung abhängt. Gezielte Zugriffe auf bestimmte Datensätze macht man tunlichst über die Datensatz-ID, den Primärschlüssel.
So, ich war mal eben fleissig.
Das ist gerade mein Code, hat noch eine Fehlermeldung:
Public Sub test()
Dim db As DAO.Database
Dim strSQL As String
Dim Nummer_neu As Long
Dim nummer_alt As Long
Set db = CurrentDb
nummer_alt = "1261"
Nummer_neu = "1262"
strSQL = "Insert Into Programme ([BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], [Nummer]) " & _
"Select [BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], '" & Nummer_neu & "'" & _
"From A_Erprobungsparameter_Programme_Basis " & _
"Where [Nummer] = '" & nummer_alt & "'"
CurrentDb.Execute strSQL, dbFailOnError
'Abschluss Variable leeren
Set db = Nothing
End Sub
Laufzeitfehler '3061': 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
Wenn "Nummer" den Datentyp "Zahl" hat, so lass die Hochkommata weg.
jetzt bekomme ich Laufzeitfehler '3075':
Syntaxfehler (fehlender Operator) in Abfrageausdruck '5245From A_Erprobungsparameter_Programme_Basis Where [Nummer] = 5244'
mit folgendem Code:
Public Sub test()
Dim db As DAO.Database
Dim strSQL As String
Dim Nummer_neu As Long
Dim nummer_alt As Long
Set db = CurrentDb
nummer_alt = "5244"
Nummer_neu = "5245"
strSQL = "Insert Into Programme ([BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], [Nummer]) " & _
"Select [BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], " & Nummer_neu & _
"From A_Erprobungsparameter_Programme_Basis " & _
"Where [Nummer] = " & nummer_alt
CurrentDb.Execute strSQL, dbFailOnError
'Abschluss Variable leeren
Set db = Nothing
End Sub
Hallo,
wenn Du die Fehlermeldung (oder die Codezeile) genau ansiehst, kommst Du auch auf den Fehler....
ok, also wenn du den Leerraum meintest nach Nummer_neu, so ist dieser jetzt drin.
zusätzlich war noch ein Ei mit eingelegt welches ich vom Ersteller der Datenbank geerbt habe in der Spaltenbenennung. Nachdem ich das korrigiert habe bin jetzt einen schritt weiter.
normal wäre noch eine weitere spalte die ich hier nicht mit kopiere. der Primärindex. (den nehme ich absichtlich nicht mit um Probleme mit dem Primärschlüssel zu vermeiden (so mein Gedankengang).
Jetzt bekomme ich aber den Laufzeitfehler '3022':
die von Ihnen vorgenommenen Änderungen an der Tabelle konnten nicht vorgenommen werden, d der Index, Primärschlüssel oder die Beziehung mehrfach vorkommende Werte enthalten würde. Ändern Sie die Daten in den Feldern die gleiche Daten enthalten, entfernen sie den Index, oder definieren sie den Index neu, damit doppelte einträge möglich sind, und versuchen sie es erneut.
Wie kann ich da was sinnvolles in meinen Code einbauen um dieses Problem zu lösen?
Sorry das ich da so nervig bin, komme mir vor wie ein kleines Kind. Aber die Funktion ist mir sehr wichtig das ich sie sauber einbaue. Danke nochmal für eure Geduld.
Hallo,
ein zusätzlicher Code wird wohl nicht viel helfen.. Knackpunkt ist wiederum die Fehlermeldung... Es wird wohl eines oder mehrere der benutzten Felder ([BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], [Nummer]) einen eindeutigen Index (d. h. Index ohne Duplikate) besitzen, wodurch eine Mehrfachspeicherung desselben Wertes nicht möglich ist.
BTW: diese Zuweisungen
nummer_alt = "5244"
Nummer_neu = "5245"
sind definitiv falsch...
Komme ich jetzt leider nicht ganz nach.
Also meine Tabelle hat folgende Inhalte:
BlockNr - Long
Dys_Name - String
Durchläufe - Long
BlockCnt - Long
StufeNr - Long
Nummer - Long
ID_Programme - Autowert (Primärschlüssel)
Aus diesen Feldern ist praktisch folgende Aufteilung:
ID_Programme Systemrelevant, aber für mich vom inhalte einfach irgendeine hochzählende Nummer.
Gefiltert wird nach "Nummer". Dieser Wert wird in einer anderen Tabelle einem bestimmten Ojekt zugewiesen, und ich möchte alle Inhalte der gleichen "Nummer" in dem Formular mit angezeigt bekommen, aufsteigend sortiert nach den ID_Programmen.
Alle weiteren Haben definitiv keinen Erkennungscharakter, sondern sind ausschliesslich Daten.
Wie bereits im allerersten Beitrag beschrieben, soll beim kopieren des Anderen Datensatzes, welcher die Nummer erzeugt, auch angestoßen werden dass alle Datensätze dieser Tabelle mit dem entsprechenden Wert für Nummer kopiert werden, und diesen der entsprechende neue Wert gegeben wird. Das ist auch nicht redundant, sondern einfach notwendig. Nur will ich mir halt jedes mal eine halbe stunde händischer Eingaben sparen. Dies betrifft nämlich 8 weitere Tabellen welche nach dem gleichen Schema laufen. Alle haben den Bezugswert "Nummer" und eine Tabellen_ID mit Autowert.
die Abfrage aus welcher ich die Daten nehme bezieht sich wie oben beschrieben auf die gleiche Tabelle wo ich meine Daten nach einer Bedingung ruasfiltere (der "Nummer) und dann laut Ratschlag mit obigem SQL in die gleiche Tabelle wieder unten anfügen möchte. Dabei ist ja gewollt das die ID_Programme (Primärschlüssel) hochzählt.
ich hoffe ich konnte mein Problem halbwegs erklären. Die Nummer welche oben im Code ist, wird nur beispielhaft direkt gesetzt, natürlich ist dies eine Variable die eben aus dem alten, bzw. neuen Formular nach generierung der Nummer in der Abfrage angewendet wird.
Gibt es denn noch weitere Indizes in der Tabelle? Die Meldung kommt ja nicht ohne Grund...
Nachtrag:
ZitatDie Nummer welche oben im Code ist, wird nur beispielhaft direkt gesetzt, natürlich ist dies eine Variable
Es sollte "natürlich" sein, dass du hier den Original-Code zeigst, oder tritt der Fehler auch bei deinem Testbeispiel auf?
Nein, das ist das einzige. Hab nochmal nachgeschaut
Edit: Sorry, hab den unteren part übersehen. Ich arbeite gerade nur im Testbeispiel. Der Wert der hier eingefügt wird ist einfach eine 4-stellige Zahl. Also das ist autentisch. Der code kann 1:1 eingestzt werden mit Ausnahme das die Beiden Variablen aus nem Feld eingelesen werden und per Variable in die Prozedur übergeben werden wenn diese mal funktionier (hoffe ich).
Ich weiß langsam nicht mehr, was es noch sein könnte, daher dieser leicht "verzweifelte" Versuch:
Zitat von: bmwoholic am Oktober 23, 2014, 13:25:59Also meine Tabelle hat folgende Inhalte:
BlockNr - Long
Dys_Name - String
Durchläufe - Long
BlockCnt - Long
StufeNr - Long
Nummer - Long
ID_Programme - Autowert (Primärschlüssel)
Das passt aber nicht zu dem zuletzt von dir gezeigten Code:
Zitat von: bmwoholic am Oktober 23, 2014, 06:59:23
strSQL = "Insert Into Programme ([BlockNr], [color=red][Profilname][/color], [Durchläufe], [BlockCnt], [StufeNr], [Nummer]) " & _
"Select [BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], " & Nummer_neu & _
"From A_Erprobungsparameter_Programme_Basis " & _
"Where [Nummer] = " & nummer_alt
das ist richtig - den Fehler hatte ich Anfangs drin - das war einer der Variablenfehler. Der ist im letzten code auch korrigiert.
Allerdings ist mir dabei gerade aufgefallen, das Dys-Namen ein Dropdownfeld ist mit bezug auf Primärschlüssel einer anderen Liste. wäre das vielleicht ein Problem?
Ich weiss nicht wieso mir das vorhin nicht aufgefallen ist, da ich ja schon 10 mal drüber geschaut hab - aber Dys-Namen ist indiziert und Duplikate möglich.
ich habe mal ne kleine db angehängt wo die zwei notwendigen Tabellen und der Code enthalten sind. Allerdings habe ich die Datensätze auf ein paar wenige reduzieren müssen wegen der Dateigröße (und Datenschutz). Hoffe das hilft bei der Fehlersuche. Danke euch allen für die kräftige Unterstützung nochmal!
Hi,
fehlt nicht ein Leerzeichen vor "From"?
strSQL = "Insert Into Programme ([BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], [Nummer]) " & _
"Select [BlockNr], [Profilname], [Durchläufe], [BlockCnt], [StufeNr], " & Nummer_neu & _
"From A_Erprobungsparameter_Programme_Basis " & _
"Where [Nummer] = " & nummer_alt
Harald
siehe Anhang im letzten Beitrag, ist der Leerraum schon eingefügt. - das war es leider nicht2 :-\
Hallo,
"Dys-Namen ein Dropdownfeld ist mit bezug auf Primärschlüssel einer anderen Liste. wäre das vielleicht ein Problem?"
Das IST ein Problem, wenngleich es auch nicht die Ursache für den gemeldeten Fehler sein muss. Zudem passen in diesem Fall die Datentypen nicht überein.
Um die ganze Rätselraterei abzukürzen: Lad die DB hier mal hoch (komprimiert/repariert und gezippt, evtl. auf ein paar konsistente Daten reduziert)
Die GANZE datei kann ich leider nicht hochladen - weil ich das aus Datenschutzgründen nicht darf. Dadurch diese zwei Tabellen WIRKLICH autonom sind und keinerlei Verbindung haben mit etwas anderem wärede das auch irrelevant. Die "test.mdb" ist ein wenig weiter oben bereits angehängt und entspricht bis auf die Anzahl der Datensätze genau dem was in meiner Datenbank auch benutzt wird. Aufgrund des Datenschutzes habe ich die Inhalte der Dys-Namen "Beschreibung" gelöscht, das sollte aber nichts weiter zur Sache tun.
Also die oben angehängte Datei hat einfach mal 60 Tabellen, 80 Abfragen und einige Tausend Datensätze weniger. Alles was sonst irgendwie in Verbindung zu dieser Tabelle steht ist drin! Sprich: Tabelle Programme und Dys-Namen, sowie der Code. ansonsten wird Ausschliesslich über ein Formular mit dem gefilterten Datensatz gearbeitet, welches jedoch zum Zeitpunkt des Kopiervorgangs nicht geöffnet ist!
Hi,
dann zeig doch wenigstens noch den Code der Abfrage "A_Erprobungsparameter_Programme_Basis", damit man sich ein Bild machen kann, wozu sie dient und was darin passiert.
PS:
Es macht eigentlich keinen Sinn, eine Test-DB hochzuladen, mit der der Fehler nicht reproduziert werden kann. Etwas wesentliches ist also an deiner DB anders - was, das kannst nur du wissen.
Die ganzen Zahlenfelder stehen doch sicherlich in Beziehung zu anderen Tabellen, das könnte bspw. ein Punkt sein, wo es Probleme gibt.
Tut mir leid mit der Abfrage. Die ist untergegangen.
Ich würde ja gerne die DB ins netz stellen, aber das geht leider nicht. ich arbeite für ein großes Unternehmen, dessen Daten blöderweise der Geheimhaltung unterliegen. Ausserdem ist die Datenbank so komplex das man da ne Stunde braucht um überhaupt zu verstehen was wo wie geht. Wie bereits oben beschrieben ist dieser Teil autonom. Es geht um die Verwaltung von Versuchen. Vieles Teile der Datenbank haben archiv-charakter und in diesem Speziellen Teil geht es um die Versuchsbeschreibung zu einem Versuch. Der Versuch hat eine ID, wenn sich wenige Parameter des Versuches ändern, muss bereits ein neues Dokumentationsblatt erstellen welches ausgedruckt am Prüfstand liegt. Dadurch das der Großteil identisch bleibt, ist es sinnvoll diese Dinge einfach zu kopieren. Durch dieses Vorgehen ist allerdings reproduzierbar, wann was mit dem Versuchsträger angestellt wurde, wo er erprobt wurde und mit welchen Parametern, da dieses Blatt jederzeit erneut generiert werden kann. Die Daten die hier eingegeben werden, werden zu späterem Zeitpunkt mittels Abfrage in einem Bericht ausgedruckt. Wie bereits oben gesagt ist es ansonsten nicht in Verbindung der restlichen Datensätze. Zu meinem Glück. ansonsten könnte ich das gar nicht aus den Anderen Tabellen ausklammern um euch das zu präsentieren.
Ich entschuldige mich das es etwas kompliziert ist in diesem Fall, bin auch kein Anfänger mehr, aber ich komme einfach nicht weiter und es liegt mir sehr am Herzen dieses Problem zu lösen. Sitze bereits seit über einer Woche daran und alles was ich probiere klappt nicht.
Das schlimme ist, das du anscheinend recht hast, da ich soeben in genau der Testdatenbank den Code nochmal probiert habe. und hier läuft er :'(
Ich versteh die Welt nicht mehr.
Noch als Nachtrag.
Nochmal herzlichen Dank für eure Hilfe. Ihr hattet Recht das es irgendwie an der Datenbank liegen muss. Dadurch das ich jetzt festgestellt habe das die Testdatei läuft, hab ich nochmal die einzelnen Tabellen in meine Datenbank zurückkopiert (Testdatei ist MDB, bei mir ACCDB - Vielleicht ist da irgendwas beim speichern wieder hingebogen worden)
Sobald die Tabelle Programme aus der MDB wieder zurückkopiert wurde, geht der Code. habe somit die 5500 Datensätze wieder reinkopiert und ausprobiert. Jetzt läuft der Code. Danke nochmal. Echt ein tolles Forum.
Gruß as Bayern
Danijel
-- Beitrag gelöscht --
Ok, dann ist ja alles gut.