Hallo und danke schon mal für die Hilfe hab noch wenig erfahrung in Access VBA und bekomme es einfach nicht zum laufen.
Ich habe ein Formular in dem eine Tabelle ist. Über die funktion Datensatz duplizieren werden die Kopfdaten des Formulars dupliziert jedoch bleiben die einträge in der Tabelle leer. Diese sollten auch dupliziert werden
Option Compare Database
Option Explicit
______________________________________________________________________________________________________
Private Sub Befehl43_Click()
Option Compare Database
Option Explicit
Dim sichBGID As Long
On Error GoTo Fehler
'*** Prozedur, aktuelles Rezept duzplizieren ***
'Sichern der alten RezeptID
If Not IsNull(Me.BG_Pos) Then
sichBGID = Me.BG_Pos
End If
If MsgBox("Soll der Rahmen " & sichBGID & " kopiert werden?", vbQuestion + vbYesNo, "Kopieren bestätigen") = vbNo Then
Exit Sub
End If
'Markieren
DoCmd.DoMenuItem acFormBar, acEditMenu, acSelectRecord, , acMenuVer70
'Kopieren
DoCmd.DoMenuItem acFormBar, acEditMenu, acCopy, , acMenuVer70
DoEvents
'Am Ende anfügen
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, 0, acMenuVer70
MsgBox "Rahmen wurde kopiert!", vbInformation, "Meldung!"
'kopierten Datensatz endgültig sichern
DoCmd.RunCommand acCmdSaveRecord
'Zum letzten Datensatz wechseln (=neu kopierter)
DoCmd.RunCommand acCmdRecordsGoToLast
'Kopieren der Tabelle
Dim sql As String
Dim dbs As DAO.Database
Set dbs = CurrentDb
sql = "INSERT INTO Bauteile (Anz in BG, Bezeichnung, Beschichtung, Fertigung) " & _
"SELECT Anz in BG, Bezeichnung, Beschichtung,Fertigung FROM Bauteile WHERE auf Rahmen =" & sichBGID & "))"
MsgBox sql
dbs.Execute (sql) '
FehlerExit:
Exit Sub
Fehler:
If Err Then
MsgBox "Fehler: " & Err.Number & " / " & Err.Description & vbCrLf & "letzter SQL: " & sql, vbExclamation, "Fehler!"
Resume FehlerExit
End If
_______________________________________________________________________________________________________
Der Fehler liegt ganz klar in meiner SQL Anweisung vl kann mir da jemand auf die Sprünge helfen. Im Anhang noch ein Bild der Tabelle (Diese soll beim klick auf den Button auch dupliziert werden)
Hallo,
ohne auf die fragwürdige Methode der ganzen Kopiererei weiter einzugehen, fehlen vermutlich die Eckklammern bei Namen, die Sonder- und/oder Leerzeichen enthalten.
Zudem sind die Feldnamen suboptimal benannt.
sql = "INSERT INTO Bauteile ([Anz in BG], Bezeichnung, Beschichtung, Fertigung) " & _
"SELECT [Anz in BG], Bezeichnung, Beschichtung,Fertigung FROM Bauteile WHERE [auf Rahmen] =" & sichBGID & "))"
noch ein paar Wort zwecks Klarheit:
"ein Formular in dem eine Tabelle ist"
Ein Form beinhaltet keine Tabelle... Ein (gebundenes) Form zeigt (neben anderen Steuerelementen) die Daten (in gebundenen Feldern) an, die in seiner Eigenschaft "Datenherkunft" definiert sind (Tabellennamen, Abfragenamen, SQL-String).
"die Kopfdaten des Formulars dupliziert"
Ein Form kann einen "Kopfbereich" enthalten, in dem Steuerelemente platziert sein können.
Nur weil in der Formular-Darstellung (am Monitor) irgendwelche Daten "oben" zu sehen sind, sind das keine "Kopfdaten". Im Beispielbild ist ein Kopfbereich nicht zu erkennen, lediglich ist der Detailbereich zu sehen, der jeweils einen Datensatz aus der Datenherkunft (siehe oben) anzeigt. Daneben gibt es (sehr vermutlich) ein UFO-Steuerelement, das ein weiteres Formular in Datenblattansicht darstellt.
Danke für die Antwort und die Hilfe !
Der Sinn dahinter ist dass ein Rahmen sehr oft aus den selben teilen besteht und man so das ganze einfach über Button kopieren kann ohne die Tabelle nochmal händisch ausfüllen zu müssen.
Leider funktioniert der insert der Zeilen noch immer nicht..
Führt das Makro zwar aus aber meine Tabelle bleibt leer...
Kann es sein dass ich nicht in Bauteile importieren kann da diese ja durch das offene Formular schreibgeschützt ist
Hallo,
ich sagte ja schon: fragwürdig....
Ich habe auch nicht den Sinn des Kopierens bezweifelt, lediglich die Methode (Docmd....).
Zeige mal einen Screenshot des Beziehungsfensters mit allen Tabellen und dass alle Tabellenfeldnamen zu erkennen sind.
Ah ok.. Hab einfach keine bessere Möglichkeit gefunden.
Ich häng einfach mal die DB an. Geht glaube ich am einfachsten
Jedenfalls vielen Dank schon mal !
Hallo,
vergiss erst mal die Formulare (lösche sie) und modifiziere die Tabellen so wie im angehängten Bild.
Verwende vernünftige Benamsung ohne Sonder- und Leerzeichen
Setze ref. Integrität zwischen "QSID" und "RaQSID" (bedeutet, korrigiere vorher die Tabellendaten )
Wo tblStammdaten angebunden werden soll, musst Du bestimmen.
Erstelle für jede Tabelle ein Formular. Für die "Haupttabelle" (z.B. tblRahmen) ein Einzelform ("frmRahmen"), für jede der n-Tabellen je ein Endlosform. ("frmBauteile","tblEinzelteile", etc.)
Im "Hauptform" ("frmRahmen") befinden sich für die Auswahl der Querschnitte ein Kombifeld mit Datensatzherkunft zu "tblQuerschnitte", Textfelder für die restlichen Felder und ein UFO-Steuerelement mit Eigenschaft "Herkunftsobjekt" zu "frmBauteile". Die Eigenschaften "Verknüpfen von/nach" werden auf die Schlüsselfelder gesetzt ("BT_RaID"--"RaID").
Das Endlosform "tblBauteile" enthält wiederum ein UFO-Steuerelement für "frmEinzelteile" (Doch, doch, das geht schon (im Formularfuß) auch wenn Access da meckert. Einfach ignorieren und das Form wieder auf "Endlos" zurückstellen).
Soweit zur Grundstruktur..
Bestimmte Arbeitsabläufe (die Kopiererei) kommen später zum Zuge.
Hallo danke für die Antwort..
Mache mich daran :)
Habs.. ist ja logisch -.-
Hallo Franz,
Wäre es nicht besser die Beziehungen von Rahmen zu Bauteile und
Bauteile zu Einzelteile jeweils mit einer n:m-Tabelle herzustellen?
gruss ekkehard
Hallo hab das jetzt glaube ich soweit zusammen .. Kann man die darstellung am Hauptformular noch etwas verschönern ?
Kann sein dass ich dich da bei den Textfeldern falsch verstanden habe hab versucht mir hier die anderen Felder aus Querschnitt herzuziehen
@xxfreestyle20xx Vorab, ändere die Namen der Steuerelemente. Es ist nicht gut, wenn die
genauso heissen wie die Tabellenfelder.
Dann ändere dein Form wie folgt.
Das Kombi für den Querschnitt und das Bezeichnungsfeld schmeisst du weg.
Die funktionieren so eh nicht.
Dafür machst du aus "Ra_QSID" ein Kombi. Dieses Feld ist ja an den FK
gebunden (bleibt auch so).
DS-Herkunft
SELECT Q.QSID, Q.QS_Bezeichnung, Q.QS_Anz
FROM tblQuerschnitte AS QSpalten 3
Spaltenbreiten 0cm;4cm;2cm
Das Feld für die Anzahl bekommt dann als Steuerelementinhalt
=DomWert("QS_Anz";"tblQuerschnitte";"QSID=" & [Ra_QSID])Somit hast du den FK im Datensatz, die Bezeichnung wird im Kombi
angezeigt und die Anzahl in dem Textfeld.
gruss ekkehard
Hallo,
@Ekkehard:
natürlich, wenn es den Gegebenheiten besser oder "richtiger" entspricht. Ich weiß ja nicht, wie die "Rezepturen" bei den Stahlkochern aussehen müssen... 8)
PS:
ZitatVorab, ändere die Namen der Steuerelemente. Es ist nicht gut, wenn die
genauso heissen wie die Tabellenfelder.
das ist eine von mehreren Meinungen. Ich gehe damit nicht konform. Wenn die (gebundenen!) Steuerelemente nicht genau so heißen wie die dazu gehörenden Tabellenfelder, ist das gelinde gesagt irritierend und frustrierend, zumindest bei denen, die solche DBs nacharbeiten müssen. Ist dann kein einheitliches Konzept bei der Namensgebung vorhanden, dann ist das Chaos vollständig.
Bei mir zumindest ist noch nie(!) ein Problem bei der Entwicklung oder dem Betrieb (meiner) DBs aufgetaucht, wenn die Tabellenfelder und Form-Felder gleich benannt wurden.
Ungebundene(!) Formfelder hingegen bekommen (bei mir) einen entspr. aussagekräftigen Prefix, gefolgt vom Tabellenfeldnamen, falls sich das Steuerelement auf ein Tabellenfeld bezieht. Z. B. bei einem Kombi, mit dem nach dem Namen (der ID natürlich) in Tabelle tblPersonen gesucht werden soll: cmbPersID
@ xxfreestyle20xx:
siehe Db anbei.
Das Kombifeld im frmRahmen ist korrigiert. Die Formatierung des Autowertes in tblBauteile ist entfernt. Eine Formatierung in der Tabelle an sich und speziell bei einem ID-Feld ist "ungut".
Ansonsten beachte den Hinweis von Ekkehard: Überprüfe die Datenzusammenhänge, bzw. erweitere die Tabellen so, dass es zu einer Stücklistenstruktur kommt.
(Ein Bauteil hat bestimmte Einzelteile, ein Einzeilteil kann zu mehreren Bauteilen gehören, falls so etwas bei Euch zutreffend ist.)
Hallo und vielen vielen Dank schon mal euch beiden !
Muss mich da selbst noch etwas durchfragen wie sie es genau haben wollen. Sollte nur das Thema mit dem kopieren übernehmen... Felder und bezeichnungen muss ich natürlich noch ändern damit sich die Leute auskennen.
Könntet ihr mir bei dem kopier problem vl noch behilflich sein.
und ja natürlich kommen bei verschiedenen Bauteilen oft gleiche einzelteile vor genau wie es bei den Rahmen auch oft selbe bauteile u einzelteile gibt. deshalb möchte ich ja frm.Bauteile inkl frm.einzelteile per Button in einen neuen Rahmen kopieren.
Hallo,
Zitatkommen bei verschiedenen Bauteilen oft gleiche einzelteile vor genau wie es bei den Rahmen auch oft selbe bauteile u einzelteile gibt.
Das muss\darf nicht mit Kopieren gelöst werden, dafür nutzt man (wie beschrieben) Stammdatentabellen (Nachschlagetabellen -->tblTeile), die alle möglichen vorkommenden Teile beinhaltet.
Mit Hilfe von 1:n, bzw. von n:m-Tabellen werden bestimmte Teile dann den Bauteilen (---> "tblBauteilEinzelteile"), bzw. den Rahmen (--> "tblRahmenEinzelteile") zugeordnet (z. B. mittels besagter Kombis) ausgewählt und nicht kopiert.
Weiterhin denkbar ist, die Einzelteile ("tblTeile") noch mit einer weiteren Tabelle ("tblTeileArt") weiter zu kategorisieren).
Das ist aber Aufgabe einer Datenanalyse und den Datenzusammenhängen, die am besten vor der eigentlichen Tabellenerstellung durchgeführt werden sollte (muss).
ZitatFelder und bezeichnungen muss ich natürlich noch ändern damit sich die Leute auskennen. [/qoute]
Die (schönen) User-Bezeichnungen finden in den Formularen/Berichten(!) mit Hilfe der Bezeichnungsfelder statt, nicht in Tabellen oder bei Tabellenfeld-Bezeichnungen oder Formatierungen (so wie geschehen)
Wenn der user einen neuen Rahmen anlegt der z.b 30 Bauteile und x viele einzelteile hat wäre es ja sinnvoll den bestehenden rahmen klonen zu können ?
klonen im sinne von zeige gleiche teile bei neuen rahmen. wenn der user dann ein BT oder ET ändert soll dieses natürlich als neue Zeile angefügt werden
Hallo,
dem steht ja nichts entgegen... Ein "Rahmen" in Gänze (mit seinen Bauteilen und Einzelteilen, ---> "Template") kann ja mit enstpr. Insert-SQL-Statements als neue DS angelegt werden.... Dieser Vorgang ist dann als "Arbeitsablauf" zu sehen und hat mit der grundlegenden statischen Tabellenstruktur zunächst nichts zu tun. Der Vorgang macht im wahrsten Sinne des Wortes "Datenverarbeitung", aber auf Grundlage des definierten und korrekten Tabellenaufbaus.
Beim Klick auf einen Button in frmRahmen:
1) Füge die Daten eines als Vorlage ausgewählten Rahmens als neuen DS in tblRahmen ein. Merke dabei den neu entstandenen Primärschlüsselwert.
2) Füge die DS der Vorlage aus tblBauteile in tblBauteile hinzu und verwende den gemerkten Primärschlüsselwert des Rahmen-DS. Merke jetzt den neu entstandenen Primärschlüsselwert aus tblBauteile.
3) Füge die DS der Vorlage aus tblBauteilEinzelteile in tblBauteilEinzelteile (mit einer gejointen Abfrage über tblBauteile und tblBauteilEinzelteile) unter Verwendung des gemerkten PKs hinzu.
4) Führe ein Me.Requery aus und positioniere das Form auf den neuen Rahmen-DS.
5) Korrigiere die Daten in Bezug auf sich ändernde Angaben, z. B. Datum, Bezeichnung und Ähnliches, wenn dies nicht gleich mit den SQL-Statements (Abfragen) erfolgt sein sollte.
Fertig.
Hallo komme nicht weiter.. Hab das frmRahmen so hergerichtet wie es aussehen soll und kann nun auch über meinen Button die Bauteile übernehmen jedoch bekomme ich das mit den Einzelteilen nicht hin .. Hab meinen 2. SQL Befehl vorerst auskommentiert ( syntax error aber keine ahnung was genau nicht stimmt)
Gibt es noch eine Möglichkeit die Daten zu aktualisieren ohne das man über die Vor / Zurück button gehen muss ?
Hallo,
hast Du überhaupt schon über die letzten Vorschläge nachgedacht und die auch verstanden?
Die ID-Felder (Werte) sind immer noch formatiert.
Stimmen die Beziehungen? Hat ein Bauteil immer nur "seine" Einzelteile oder gehört ein Einzelteil zu mehreren Bauteilen?
Was ist mit tblStammdaten?
Hinter dem "Button47" steht immer noch der anfängliche Code und ohne Bezug auf meinen Vorschlag, wie das Ganze zu kopieren wäre.
Hallo,
Ohne n:m-Tabellen wird es nicht gehen, denke ich.
@franz Habe mal zwei Bilder dran gehängt, da ich nicht sicher bin,
wie man die Beziehungen da einstellt.
Über einen Kommentar deinerseits würde ich mich freuen.
gruss ekkehard
Hallo danke für die Antwort .. Hab gedacht du meintest damit eben SQL über Makro.. Also kurz gesagt nein.. habe die Idee hinter deinem Vorschlag nicht verstanden.. Natürlich kann es sein dass ein Einzelteil bei mehreren Bauteilen vorkommt aber das gäbe dann ja wieder ein problem wenn ich einen Rahmen dupliziere und dann abändere da mir ja dann überall das Einzelteil geändert wird
tblStammdaten wird derzeit noch nicht berücksichtigt..
Was heißt "formatiert" in dem zusammenhang ?
Bin wirklich nicht fit in Access ..
Hallo,
habe im Moment keine Zeit,
nur kurz:
ZitatNatürlich kann es sein dass ein Einzelteil bei mehreren Bauteilen vorkommt aber das gäbe dann ja wieder ein problem wenn
Kein "aber".. das gilt nicht, es muss die Tabellenkonstruktion stimmen, und zwar 100-prozentig!
@Ekkehard
zunächst würde ich TblBauteileRahmen entfernen und tblRahmen mit tblbauteile verbinden in dem Fall, dass es zu einem Rahmen nur individuelle Bauteile gibt. Alles Andere wäre IMHO ok.
Zitat von: DF6GL am Mai 31, 2021, 21:31:32Kein "aber".. das gilt nicht, es muss die Tabellenkonstruktion stimmen, und zwar 100-prozentig!
Hallo, für mein verständnis ist es ja in access so... wenn ich einen Datensatz dupliziere und dann ändere wird ja der Datensatz mit der ID für alle Bauteile geändert also müsste man die Einzelteile mittels makro immer neu anlegen also beim "kopieren" gibt es eine neue BTID mit neuen ETID ?
Führt dann halt dazu das es sehr viele ET und eben manche auch doppelt in der ET Tabelle gibt.
Da ja ET-> Schraube im Bauteil 1,3 vorkommt aber bei BT nr 2 keine schrauben benötigt werden
Somit ist mein makro für "mich" schon mal nicht ganz falsch weil ich ja die Bauteile mit neuer ID kopieren kann und jetzt nur noch die Einzelteile mittels join kopieren muss .. oder?
Hallo,
Deine Annahmen in #21 sind schlichtweg alle falsch. Es werden ja nur die Fremdschlüssel kopiert, da ändert sich nichts an den Originaltabellen.
Das Datenmodell passt noch nicht. Sieh Dir mal die Bilder von Ekkehard in #18 an. Ich denke das linke Bild ist richtig.
Ohne Grundlagen zu Access kann man keine DAtenbank erstellen. Und da fehlt Dir noch einiges.
Beschreibe bitte mal die Zusammenhänge genau, ohne mal an eine DAtenbank zu denken.
Hier noch ein Link für die Grundlagen:
https://www.access-tutorial.de/
Hallo,
Auf Grund von Franz' Anmerkungen habe ich noch das Modell (s. Anlage)
umgestellt. Obwohl ich dies
Zitatin dem Fall, dass es zu einem Rahmen nur individuelle Bauteile gibt.
nicht wirklich verstanden habe.
@franz Ist das was du gemeint hast?
gruss ekkehard
Sorry, Anlage vergessen.
Hallo,
ich meinte damit, dass es ein "Rahmenbauteil" nur für jeweils einen Rahmen gibt. Das ist aber nur meine Interpretation der Beschreibungen des TS. Ob das stimmt oder ob hierfür auch eine n:m-Beziehung in Frage kommt, muss der TS nun selber darstellen, bzw. eruieren und das Datenmodell mal genau klarlegen.
Wenn so, wäre Deine erste Version "richtiger", mit ein paar Korrekturen an den Beziehungen.
BauteilID_f zu BTID löschen
BauteileInRahmenID zu tbl.Einzelteilbauteil.BauteileInRahmenID_f
Das würde dann so aussehen?
Hi,
lad mal die DB, die Du jetzt gemacht hast, hier hoch, damit ich daran basteln kann.
Falls du mich meinst, bitte schön.
Hallo,
anbei mal ein Vorschlag, wie ich es mir vorstelle. Ob das der Situation gerecht wird, muss der TA beantworten.
(Hab's mir nicht verkniffen, die Benamsung nach meinen Regeln zu korrigieren. Die Formulare habe ich auch gelöscht, weil die nicht mehr gepasst haben.)
Hallo hab mir eure Vorschläge angeschaut und glaube jetzt soweit zu verstehen.
Damit der Querschnitt Nr 2 auch die Rahmen 1,2,3 aus der kopie bekommt brauche ich auch die Fremdschlüssel..
@DF6GL Das ich mir die Schlüssel merken muss ist mir klar "nur wie" ein Querschnitt mit z.b 3 Rahmen gibt mit z.b Me!RaID immer den gerade selektierten und -> select RaID from frmRahmen where RaQSID = "gemerkterQSID:Wert" bringt 3 Ergebnisse welche ich zwar als neuen DS anfügen aber nicht merken kann...
Bitte seid mir nicht böse hab Access zuletzt vor 13 Jahren gebraucht und denke entweder zu kompliziert oder keine Ahnung
Hab nochmal die DB angehängt fürs Verständnis.. Über frmQuerschnitte fügt der User seine Daten ein und soll diese "kopieren/ändern" können...
Hallo,
niemand ist dir böse.... :)
Nur entspricht dein Beispiel nicht unseren (meinen) Vorschlägen und kann so nicht verwendet werden. (AOM.png)
Schau dir mal meine zuletzt gepostete Db an und prüfe nach, ob die Datenverhältnisse so stimmen. (AOM1.png)
Speziell dahingehend, ob
ein Rahmen mehrere Bauteile haben kann
und
ein Bauteil zu mehreren Rahmen gehören kann.
Zitat von: DF6GL am Juni 04, 2021, 09:45:10ein Rahmen mehrere Bauteile haben kann
und
ein Bauteil zu mehreren Rahmen gehören kann.
Hallo,
ein Rahmen besteht immer aus mehreren Bauteilen und das Bauteil wiederum aus Einzelteilen
und ein Bauteil kann natürlich in mehreren Rahmen vorkommen ..
Der Ablauf bzw die Struktur eines Rahmens ist genau so wie in meinem frmQuerschnitte formular
werden aber immer neu angelegt bzw über den Button würde der Querschnitt mit seinen Rahmen/Bauteilen und Einzelteilen "kopiert" u bearbeitet werden..
Wozu brauche ich tblRahmenbauteile Menge und Info diese wären ja bereits mit tbl Rahmen bezeichnung und Anzahl abgedeckt .. bzw wie wäre dein gedanke dazu über deine Struktur wieder zu meiner ursprünglichen eingabemaske zu kommen
Vielen Dank!
Hallo,
Zitatein Rahmen besteht immer aus mehreren Bauteilen und das Bauteil wiederum aus Einzelteilen
und ein Bauteil kann natürlich in mehreren Rahmen vorkommen ..
Ok, das ist eine Aussage und deckt sich mit (meiner) Tabellenstruktur.
ZitatDer Ablauf bzw die Struktur eines Rahmens ist genau so wie in meinem frmQuerschnitte formular
An diesem Form sehe ich nur, dass die Rahmen angezeigt werden, die einen bestimmten Querschnitt haben..
werden aber immer neu angelegt bzw über den Button würde der Querschnitt mit seinen Rahmen/Bauteilen und Einzelteilen "kopiert" u bearbeitet werden..
Was ist das jetzt? Willst Du nun "Rahmen" bearbeiten oder "Querschnitte"?
ZitatWozu brauche ich tblRahmenbauteile Menge und Info diese wären ja bereits mit tbl Rahmen bezeichnung und Anzahl abgedeckt .. bzw wie wäre dein gedanke dazu über deine Struktur wieder zu meiner ursprünglichen eingabemaske zu kommen
Meine Gedanken dazu sind, dass es evtl. möglich wäre, dass ein bestimmter Rahmen mehrere gleichartige Bauteile haben könnte.... Wenn das verneint wird, kann die Menge entfallen, bzw. wäre immer 1.
Das Info-Feld ist Spaß an der Freude, es könnte ja sein, dass es besondere Hinweise für ein bestimmtes Bauteil in einem bestimmten Rahmen geben könnte. Auch das kann weggelassen werden, wenn es nicht gebraucht wird (aber wer weiß das schon?) .
Bei den Eizelteilen kann es m. M. nach sein, dass z. B. eine M10x100-Schraube 10 mal in einem Rahmenbauteil verbraucht wird.
Vergiss mal deine Formulare.... die sind nebensächlich und erstmal falsch, solange die Tabellenkonstruktion nicht korrekt ist, d. h. die reale Datenkonstellation nicht korrekt abbildet.
PS: Ich biete dir eine halbe Stunde (kostenloses) Telefongespräch an, um die Sachlage final zu klären.
Schau in der Jobbörse bezgl. Email-Adresse nach.
Hallo danke nochmal an alle die mir geholfen haben !
Spezielles dank an dich
@DF6GL !!
Das Thema kann als gelöst betrachtet werden kann jedoch besagten "Button" nicht finden
Sg