August 11, 2022, 05:12:13

Neuigkeiten:

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


Formular Daten mit Unterformular Daten kopieren im neuen Datensatz (als Vorlage)

Begonnen von Rimondo, Mai 30, 2022, 15:08:06

⏪ vorheriges - nächstes ⏩

Rimondo

Hallo zusammen,

habe mit Access eine Datenbank aufgebaut um ein Artikel zu kalkulieren, habe das ganze soweit geschafft ohne/wenig VBA. Die Datenbank an sich läuft jedoch könnte denke ein paar VBA Anweisungen das Arbeiten erleichtern. 
Paar einfache VBA Anweisungen habe ich ohne große Kenntnisse hinbekommen.

Jetzt würde ich gerne, wenn ich einen neuen Datensatz/Artikel erstelle einen ähnlichen Artikel als Vorlage nehmen und nur die entsprechenden Daten anpassen. So weit so gut, jedoch bekomme ich es nicht hin, dass die Werte aus dem Hauptformular und 2x Unterformular übernommen werden. Es werden nur die Werte aus dem Hauptformular übernommen.

Der Aufbau ist so das im Hauptformular die Stammdaten wie Maße, Name, Typ etc. stehen und das Unterformular dient als Stückliste und Arbeitsgänge.

Hauptformular -> Tab_Artikel
Unterformular1-> Tab_Artikel_Material
Unterformular2-> Tab_Artikel_Arbeitsgang

Welche VBA Anweisungen wäre Sinnvoll bzw. wonach muss ich suchen. Was ich gefunden habe hat nicht geklappt oder es war mir zu kompliziert es nachzuvollziehen bzw umzusetzen :)

Ich habe per Screenshot die Beziehungen der Datenbank hochgeladen.
Sie dürfen in diesem Board keine Dateianhänge sehen.

Vielen Dank

Köbi


Rimondo

Hallo Köbi,

vielen Dank für die schnelle Reaktion :),

Habe mir dein Beispiel angeschaut und so habe ich es mir vorgestellt, jedoch müsste es die Werte aus 2 Unterformularen übernehmen. Ich werde mir die Tage den VBA Code mal genauer anschauen und versuchen den entsprechend anzupassen. Der Code ist doch länger als gedacht  ;D

Wenn ich nicht weiterkomme oder es geklappt hat werde ich mich dann wieder melden.

Soweit erstmal vielen Dank


Rimondo

Hallo zusammen,

ich habe das Beispiel erweitert. Habe auch jetzt den VBA Code versucht anzupassen, jedoch bekomme ich es nicht hin dass beide UF mit in die neue Datensatz übertragen werden, entweder nur eines von beiden oder es werden 2 neue Datensätze angelegt mit jeweils den Daten aus den UF1 und eines mit Daten aus UF2.

Wo müsste der Code sinnvollerweise angepasst werden, damit nicht das Oben genannte passiert.
Muss ich neue Variablen deklarieren?

Habe die erweiterte Beispieldatenbank hochgeladen.

Vielen Dank im voraus

Gruß

Köbi

Hallo Rimondo
Hier ein neues Beispiel, welches auch die Datensätze aus ZWEI Unterformularen dupliziert.
Im Code habe ich das entsprechend kommentiert.

Rimondo

Hallo Köbi,

nochmals vielen Dank, habe jetzt versucht den Code bei mir zu übernehmen und anzupassen, bekomme aber immer die Fehlermeldung dass die Daten nicht in Beziehung stehen. Die 2 UF haben zwar eine nm Beziehung aber sollte eigentlich kein Problem sein oder?

Habe eine Testversion mit angehängt, vllt kann mir jemand weiterhelfen.

Vielen Dank

Gruß
Rimondo

DF6GL

Hallo,

anderes Konzept und ohne dieses aufwendige Recordset-Getöns..:

Aufgabe:
Es soll der im Form aktuell angezeigte Datensatz (Artikel) mit seinen Detaildaten (Artikel_Material und Artikel_Arbeitsgang) in einen neuen Artikel übernommen werden.

Ablauf:

mit SQL: Selektiere den aktuellen DS und füge die Daten (ohne PK "ID_Artikel") an die Tabelle tab_Artikel an.

mit SQL: bestimme den neuen aktuellen PK  (Select @@Identity) und lege den in eine Variable

mit SQL: Selektiere die zum im Form angezeigten Artikel zugehörenden Materialien-Daten (Tab_Artikel_Material) und füge die an diese Tabelle an. Verwende für das Feld Tab_Artikel_Material.ID_Artikel die o. g. Variable mit dem neuen Artikel-PK-Wert (ID_Artikel).

mit SQL: dito für Tab_Artikel_Arbeitsgang.


Anschließend kann das Form ( nach einem Requery) auf den neuen Artikel positioniert/gefiltert werden

Rimondo

Hallo DF6GL,

vielen Dank für deine Antwort, leider kann ich mit SQL Anweisungen weniger anfangen, da ich wie gesagt noch recht neu in der Materie bin. Eine Datenbank mit Beziehungen etc. in Access zusammenzubauen ist "relative schnell" erlernbar und sind auch schon viele Funktionen vorhanden die die meisten Anforderungen abdecken zumindest in meinem Fall.

Nur mit dem SQL Anweisungen tue ich mir etwas schwer, habe da jetzt versucht mich einlesen nur komme da konkret nicht weiter bzw. mir fehlen da noch einige Basics.

Vllt könnte Sie mit dem Aufbau etwas tiefer ins Detail gehen :), weil mit dem "Recordset-Getöns" hat bisher auch nicht geklappt, bekomme dort die Fehler Meldung -> fehlender Parameter Wert.

Vielen Dank und wünsche ein schönes baldiges Wochenende :)

Gruß

Rimondo

DF6GL

Hallo,



na denn, hier etwas "tiefer":


1) Zuerst ordnen wir das Beziehungsfenster nach den Beziehungshierarchien, damit ein klares Bild der Abhängigkeiten entsteht.

2) Im Abfrageentwurf eine Anfügeabfrage bzgl. der Tab_Artikel erstellen und den String aus der SQL-Ansicht in die Ereignisprozedur kopieren und syntaktisch mit einer Where-Condition anpassen, bzw. erweitern

3) Mit Execute die Abfrage ausführen und gleich danach den neu generieren PK in eine Variable auslesen (@@Identity)

4) Anfügeabfrage für Tabl_Artikel_Material wie oben beschrieben erstellen und in die Prozedur kopieren. Die Where-Condition erweiteren und den neuen PK-Wert (Variable) in den SQL-String integrieren.

5) Mit Execute die Abfrage ausführen.

6) Das Gleiche mit Tab_Artikel_Arbeitsgang durchführen.


7) Die Daten mit Requery in das Form neu einlesen und auf den neuen Artikel positionieren (, falls das gewünscht ist).


BeginTrans und ComitTrans sorgen dafür, dass entweder alle Daten in die jeweiligen Tabellen fehlerfrei kopiert wurden oder bei einer Fehlersituation gar keine Daten kopiert werden.


PS:  Einen Errorhandler habe ich nicht eingebaut, das kannst Du selbst erledigen.
Die Benamsung der Felder bietet Verbesserungspotential, habe ich aber nicht bearbeitet.

Köbi

@ Franz vom Bodensee

Deine SQL-Lösung, verpackt in eine Transaktion, ist natürlich viel eleganter als mein Vorschlag. Vielen Dank, ich habe davon Einiges gelernt. Vor allem, weil ich mich mit Transaktionen bisher nur am Rande beschäftigt habe.

Ein kleiner Hinweis: Dim db sollte als DAO.Database deklariert werden, nicht einfach als Database.

Was mir nicht klar ist, wie die Variable lngArtIDNew gefüllt wird. Ich verstehe diesen Code nicht
        lngArtIDNew = db.OpenRecordset("Select @@Identity")(0)

Kannst du mir den erklären? Woher kommt("Select @@Identity")(0). Was bedeutet @@Identity")(0)?

@Rimondo
Die Datenquelle der Unterformulare enthält 2-mal "ID_Artikel". Das führt in der späteren Verwendung zu Expr1000.
Damit erfolgt in deiner Version auch die Verknüpfung zwischen HF und UF.
Mein Tipp: Verwende in der Datenquelle nur einmal "ID_Artikel". Und verknüpfe dann HF und UF direkt über ID_Artikel. Das ist lesbarer.

@ Franz vom Bodensee
Grüsse vom anderen Ufer des Bodensees.

DF6GL

Hallo Köbi,


ZitatDim db sollte als DAO.Database deklariert werden, nicht einfach als Database.

Das ist nicht unbedingt erforderlich, weil "Database" nur in der DAO-Library vorkommt und somit eindeutig ist. Aber Du hast Recht, zwecks Transparenz kann/sollte man den Qualifizierer durchaus dazu schreiben.

"@@Identity"  kommt aus T-SQL und enthält als "SQL-Variable" den Wert des neu angelegten Primärschlüssels (ID_Artikel). Das gilt allerdings über alle Tabellen gesehen in der aktuellen DBEngine-Instanz (Set db = Currentdb), so dass man den richtigen Wert nur dann erhält, wenn zwischenzeitlich kein weiterer/anderer Insert erfolgt ist.  Also sofort nach dem db.Execute auslesen.


Das "(0)" ist lediglich die Referenz auf das erste (0) Feld im geöffneten Recordset und ist  gleichbedeutend mit
lngArtIDNew = db.OpenRecordset("Select @@Identity").Fields(0)

 oder:
.
Set rs = db.Openrecordset("Select @@Identity")
lngPKWert = rs.Fields(0) 
.
.


@Köbi

wir kennen uns schon lange, zumindest namentlich.  ;)

und ebenso Grüße vom nördlichen Ufer.

Vom "anderen Ufer"  sehe ich mich nicht  ;D  ;D  ;D  ;D  ;D

Rimondo

Hallo,

vielen Dank für die Unterstützung, hat jetzt alles geklappt.

@Köbi hatte mich schon gewundert wo der Begriff "Expr1000" herkommt. Hab jetzt auch die Bezeichnungen angepasst.

Gruß
Rimomndo