Juni 21, 2021, 03:45:04

Neuigkeiten:

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


Formular mit Verknüpfter Tabelle Duplizieren

Begonnen von xxfreestyle20xx, Mai 29, 2021, 09:04:30

⏪ vorheriges - nächstes ⏩

xxfreestyle20xx

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)

DF6GL

Mai 29, 2021, 09:27:04 #1 Letzte Bearbeitung: Mai 29, 2021, 09:57:54 von DF6GL
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.


xxfreestyle20xx

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

DF6GL

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.

xxfreestyle20xx

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 !

DF6GL

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.

xxfreestyle20xx

Hallo danke für die Antwort..
Mache mich daran :)

xxfreestyle20xx

Mai 29, 2021, 11:35:33 #7 Letzte Bearbeitung: Mai 29, 2021, 11:42:30 von xxfreestyle20xx Grund: Erledigt..
Habs.. ist ja logisch -.-

Beaker s.a.

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
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

xxfreestyle20xx

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

Beaker s.a.

@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 Q
Spalten 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
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

DF6GL

Mai 29, 2021, 13:22:51 #11 Letzte Bearbeitung: Mai 29, 2021, 13:37:56 von DF6GL
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.)

xxfreestyle20xx

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.

DF6GL

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)

xxfreestyle20xx

Mai 29, 2021, 15:14:59 #14 Letzte Bearbeitung: Mai 29, 2021, 15:43:43 von xxfreestyle20xx Grund: änderung
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