Neuigkeiten:

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

Mobiles Hauptmenü

Datensätze kopieren und Fremdschlüssel vergeben

Begonnen von AlexC75, Februar 24, 2018, 15:24:17

⏪ vorheriges - nächstes ⏩

AlexC75

Hallo liebe Access und VBA Gemeinde,

ich bin leider ein völliger Neuling in Access und kam auf die fixe Idee meinem Vorgesetzten einen Vorschlag zur Aufgabenabverfolgung zu unterbreiten. Damit habe ich natürlich dieses Projekt gewonnen und soll die Idee in Access umzusetzen.  :o

Es geht im Detail um ein Aufgabenverwaltungsprogramm das die Kollegen dabei unterstützen soll vordefinierte Qualitätsaufgaben auf standardisiert Weise abzuverfolgen. Das Programm soll dabei den Fortschritt der Aufgabe unter Berücksichtigung des Zieltermins berücksichtigen. In jedem übergeordneten Projekt müssen ca. 50 Aufgaben abverfolgt werden.
Die tlbAufgaben beinhaltet folgende Splatenüberschriften:
- Aufgaben_ID => Primärschlüssel => verknüpft mit tblAufgabendetails (Spalte: Status und HeutigesDatum)
- Aufgaben_IDFS => Zahl => Fremdschlüssel zum Primärschlüssel tblProjektübersicht (beinhaltet alle übergeordneten projektrelevanten Daten)
- Aufgaben_Nr => Kurzer Text
- Aufgaben_Beschreibung => Kurzer Text
- Zieldatum => Datumsfeld
- Projekt Phase 0 bis 6 => insg 14 Kombinationsfelder => Benutzer gibt hier den aktuellen Aufgabenstatus in der jeweiligen Phase an (rot, gelb, grün, N/A).

Wenn ich nun in die leere Tabelle Daten eintrage, werden diesen auch ohne Probleme ein Fremdschlüssel zugeordnet und ich habe die Möglichkeit mittel Formular eine hübsche anwenderfreundliche Oberfläche anzulegen.

Nun möchte ich natürlich nicht immer diese 50 Datensätze für jedes Projekt von Hand neu eintragen. Dies soll automatisiert erfolgen z.B. einmalig mittel Knopfdruck oder beim erstmaligen öffnen des Formulars.
Nun habe ich mir gedacht, dass eine Referenztabelle (tblAufgabenRef) mit den vollständigen Datensätzen einfach in die aktuelle Tabelle hineinkopiert werden könnte. Aber anscheinend falsch gedacht.

Habe hier schon mittel VBA "INSERT INTO"-Befehl versucht zu arbeiten aber bin immer wieder auf Probleme gestoßen, unter anderem, dass der Fremdschlüssel nicht vergeben wurde oder dass die Tabelle nicht angefügt sondern überschrieben wurde.
Zu meiner Schande muss ich gestehen, dass ich auch leider keine Ahnung von VBA Programmierung habe.

Bin jetzt mittlerweile seit Wochen nach auf der Suche nach einer Lösung aber leider finde ich keine.
Ich hoffe Ihr könnt mir helfen und den richtigen Weg weisen.
Vielen Dank im Voraus.

Besten Gruß
Alex

Beaker s.a.

Hallo Alex,
Du brauchst hier vier Tabellen, - Projekte, Aufgaben, AufgabenInProjekten, Phasen

Projekte:
Projekt_ID, PK (Autowert = Long)
ProjektName, Text
...
Aufgaben:
Aufgabe_ID, PK (Autowert = Long)
Aufgabe_Nr, Text
AufgabeBeschreibung, Text
...
Phasen:
Phase_ID, PK (Autowert = Long)
PhaseText, Text
...
AufgabenInProjekten:
AInP_ID, PK (Autowert = Long)
Projekt_IDF, FK (Long)
Aufgabe_IDF, FK (Long)
Phase_IDF, FK (Long)
ZielDatum, Datum
...
Ob das mit den Phasen so stimmt bin ich mir nicht sicher, da muss wahrscheinlich noch dran geschraubt werden.

So wie oben dargestellt würde das Anfügen aller Aufgaben zu einem Projekt etwa so aussehen:
erstelle eine Anfüge-Abfrage "AufgabenZuProjekt" (Objektnamen anpassen)

INSERT INTO AufgabenInProjekten As AP
          AP.Projekt_IDF,
          AP.Aufgabe_IDF,
          AP.Phase_IDF,
          AP.ZielDatum
SELECT
          Forms.frmProjekte.FeldMitProjektID,
          A.Aufgabe_ID,
          1,
          Forms.frmProjekte.FeldMitZieldatum
FROM
          Aufgaben As A


Dein Button bekommt diese Ereignisprozedur
Private Sub DeinButton_Click()
    CurrentDb.Execute "AufgabenZuProjekt", dbFailOnError
End Sub


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AlexC75

Hallo Ekkehard,

erstmal vielen Dank, dass Du Dich so schnell gemeldet hast.
Mit der Tabelle "Phasen" hast Du recht. Daran muss ich später mal arbeiten, sobald ich die Programmierung im wesentlichen verstanden habe.  :-\
Daher habe ich diese Tabelle erstmal außen vor gelassen.

Trotz dessen ist leider ein Fehler aufgetaucht.
Bei Erstellung der Abfrage und Eingabe des SQL Codes kam die Fehlermeldung "Syntaxfehler in INSERT INTO-Anweisung".
Es scheint als ob die Codezeile -> INSERT INTO AufgabenInProjekten As AP diesen Fehler verursacht. "AP" kann anscheinend nicht zugewiesen werden.

Habe darauf die Zielfelder in Klammern geschrieben und entsprechend angepasst.
Code neu:

INSERT INTO AufgabenInProjekten ( Projekt_IDF, Aufgabe_IDF, ZielDatum )
SELECT Forms.frmProjekte.Projekt_ID, A.Aufgabe_ID, Forms.frmProjekte.Zieldatum
FROM Aufgaben AS A;


Allerdings war das auch nicht erfolgreich, da
-> Fehler: "2 Parameter wurden erwartet, aber es wurde zu wenig Parameter übergeben"
Wenn ich das richtig verstehe sind dafür folgende Bezüge verantwortlich:
-> Formulare.frmProjekte.Projekt_ID
-> Formulare.frmProjekte.ZielDatum

Habe die Testdatei mal an die Mail angefügt.

Wäre super wenn Du nochmal helfen könntest.
Schonmal Danke im Voraus.

Gruß
Alex

Lachtaube

Hier sollte die FAQ 6.4 helfen - oder Du lädst die Abfrage als QueryDef-Objekt, weist ihm die Parameter per Code zu und führst dessen Execute-Methode aus.

PS: Absolute Formularparameter werden mit Forms!Formname!Steuerelementname adressiert, wobei dann noch durch das grafische Abfragewerkzeug unnötige []-Paare, die aber nicht weh tun, gesetzt werden, was sich nur verhindern lässt, wenn man den Abfragetext mittels VBA-Code erstellt (macht vermutlich kein Mensch).
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo Alex,
Die Klammerung ist korrekt, - hatte ich unterschlagen.  >:(
Der "fehlende" Parameter ist das Datumsfeld, das muss formatiert
übergeben werden.

.
Format$(Forms.frmProjekte.FeldMitZieldatum, "\#yyyy\-mm\-dd\#")
.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

#5
@Ekkehard,

sorry, aber Du unterbreitest hier Kokolores.
Grüße von der (⌒▽⌒)

Beaker s.a.

@Lachtaube
Sorry, habe ich leider "hingeschlurt".
Ansonsten, interessante Technik Parameter- und Feldnamen zu
"synchronisieren". Kannte ich so noch nicht.
Zitatwenn man den Abfragetext mittels VBA-Code erstellt (macht vermutlich kein Mensch).
Doch ich, - leider immer noch zu häufig.  :(

@Alex
Folge Lachtaubes Beispiel.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

@Ekkehard,

ich meinte den Abfragetext einer gespeicherten Abfrage mittels CreateQueryDef zu erstellen. Denn sonst hat Access gar keine Chance, eigene []-Paare zu setzen :)
Grüße von der (⌒▽⌒)

Beaker s.a.

@Lachtaube
O.K., das mache ich allerdings auch nicht gewohnheitsmässig, und die
[] habe ich noch nie gebraucht.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)