Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

SQL-Prozedur für Anfügung von mehreren Datensätzen möglich ?

Begonnen von ellinho, März 27, 2012, 08:50:13

⏪ vorheriges - nächstes ⏩

ellinho

Hallo zusammen.

Ich stehe vor folgendem Problem. Eine Personalverwaltung beinhaltet eine tbl Mitarbeiter und eine tbl Sollstunden. Über ein Formular Mitarbeiter wird ein neuer Mitarbeiter mitsamt seiner kompletten Stammdaten angelegt. Allerdings nicht seine Sollstunden. Dafür soll noch ein Formular her. Da liegt ja mein Problem. Zusatzinfo : Bisher existiert ebenso ein Formular zum editieren der bereits eingetragenen Sollstunden (diese wurden "händisch" von mir in die Tabelle eingetragen - das soll jedoch kein Dauerzustand bleiben, da ja immer mal wieder neue Mitarbeiter angelegt werden).

Die Tabelle tbl Sollstunden ist wie folgt aufgebaut :

ID,Personalnummer,Wochentag,Sollstunden
000001, 1, 6
000001, 2, 6
000001, 3, 0
000001, 4, 6
000001, 5, 6
000001, 6, 0
000001, 7, 0
(habe die ID-Spalte mal weggelassen - ist ja eh nur ein AUTO-WERT)

Zunächst wollte ich ein Formular erstellen, über das die Sollstunden eingetragen werden, jedoch erfasse ich nach meinem Verständnis immer nur einen Datensatz (= eine Zeile in der Datenblattansicht) und nicht mehrere. Für jeden Mitarbeiter gibt es jedoch 7 Datensätze (7 Wochentage). Nun sollte das über ein Formular aber mit einer Datenerfassung getan sein. Weil ich nicht wusste, ob bzw. wie das mit einem Formular gelöst werden kann, habe ich mir überlegt, mit einem INSERT INTO zu arbeiten. Allerdings müsste dies direkt bei Neuerfassung eines Mitarbeiters passieren (z.B. mit Sollstunden 0 für jeden Wochentag, da der INSERT INTO ja im Hintergrund abläuft), so dass die Einträge danach über das bereits existierende Formular zum Editieren bearbeitbar sind. Ausserdem geht es auch darum, dann die richtige Personalnummer automatisch anzufügen. Beispiel : Wenn ich einen Mitarbeiter erfasse, der die Personalnummer 000009 hat, sollte gleichzeitig der INSERT INTO folgendes an die Tabelle Sollstunden anfügen :
000009, 1, 0
000009, 2, 0
000009, 3, 0
000009, 4, 0
000009, 5, 0
000009, 6, 0
000009, 7, 0

Oder habe ich vielleicht doch die Möglichkeit, die Daten über ein Formular zu erfassen, ohne das einzeln für jeden Wochentag machen zu müssen ?
Ich hoffe, man kann verstehen was ich meine und hoffe weiterhin, dass das Brett vor meinem Kopf nicht allzu groß ist... ;D

Gruß
Karsten

ebs17

Über die Kombination mit einer Zahlentabelle kann man einen Datensatz vervielfältigen:
SELECT Q.Wert, Z.I
FROM
(SELECT '0815' AS Wert) AS Q,
(SELECT I FROM Zahlentabelle
WHERE I Between 1 AND 4) AS Z


Das andere habe ich nicht verstanden.

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard

ellinho

Danke ebs.

Ich habe meine Frage noch mal etwas umgeschrieben. Hoffentlich ist es nun verständlicher !?!?!

Gruß
Karsten

ebs17

Es geht also darum, für einen neuen Mitarbeiter einen kompletten Satz Datensätze für eine Woche anzulegen, wobei für eine Sollstundenzahl 0 vorbelegt ist?

Da bleibt mein Vorschlag praktisch gleich:
Dim sSQL As String
sSQL = "INSERT INTO tblSollstunden (Personalnummer, Wochentag, Sollstunden)" & _
   " SELECT " & Me.txtKundennummer & ", I, 0" & _
   " FROM Zahlentabelle WHERE I Between 1 AND 7"
CurrentDb.Execute sSQL, dbFailOnError
Me.Requery


Die Zahlentabelle enthält einfach ein Feld I (Long, PK) mit den Zahlen von 0 bis z.B. 1000 und ist für viele Fälle wiederverwendbar. Bei der Kundennummer wäre bzgl. SQL-String der Datentyp zu beachten.
Mit freundlichem Glück Auf!

Eberhard

ellinho

Hallo ebs.

Habe mich mal mit Deinem Vorschlag beschäftigt und den SQL-String in das Ereignis der Schaltfläche geschrieben. Irgendwie kommt leider die Fehlermeldung "Objektvariable oder With-Blockvariable nicht festgelegt".

Momentan sieht der Code der Schaltfläche so aus :

DoCmd.RunCommand acCmdSaveRecord
    Dim sSQL As String
    sSQL = "INSERT INTO [dbo].[Sollstunden] (Personalnummer)" & "SELECT" & Me.Personalnummer & ",Wochentag,Sollstd" & "FROM Zahlentabelle WHERE Wochentag BETWEEN 1 AND 7"
    CurrentDb.Execute sSQL, dbFailOnError
    Me.Requery
    Dim Msg As String
    Msg = "Die Änderungen wurden erfolgreich gespeichert !!!"
    MsgBox Msg, vbInformation Or vbOKOnly, "Änderungen erfolgreich !!!"

Was fehlt hier ?

Gruß
Karsten

Josef P.

#5
Hallo!

ZitatWas fehlt hier ?
Der Hinweis, dass du eine ADP-Datei verwendest. ;)
In einer ADP ist CurrentDb nicht verfügbar.
Verwende als Ersatz CurrentProject.Connection und die Insert-Anweisung im T-SQL-Dialekt.

Du könntest auch ganz auf die VBA-Seite verzichten und die Datensätze über einen Trigger auf die Personaltabelle erzeugen.

Ich würde außerdem eine "Sollstunden-Vorlagentabelle" erzeugen, in der die Datensätze so vorkonfiguriert sind, wie sie benötigt werden. (Vielleicht macht es irgendwann einmal Sinn, standardmäßig den Montag mit 8 Stunden und den Samstag mit 4 Stunden zu belegen.)

mfg
Josef

ebs17

Gib Dir den Inhalt von sSQL ins Direktfenster aus und kontrolliere die Anweisung selber auf Fehlendes.

Außerdem:
MsgBox Msg, vbInformation Or vbOKOnly, "Änderungen erfolgreich !!!"
Das "OR" irritiert mich. Außerdem: Woher weißt Du, dass Änderungen erfolgreich waren? Die Abfrage fügt Datensätze an. Ob die in der Tabelle real eingetragen sind ...?

Josef weiß offensichtlich noch ein wenig mehr ...

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard

ellinho

@Josef

Danke für den Tipp mit dem Trigger. Versuche es gerade auf dem Weg.
Allerdings hänge ich noch beim INSERT INTO fest, denn da weiß ich nicht, wie ich das aufbauen soll.
Ich habe den Trigger an die Tabelle Mitarbeiter gehängt (siehe erste Anlage). Ist das richtig so ?
Weiterhin habe ich eine sogenannte Zahlentabelle erstellt (siehe zweite Anlage). Der Trigger soll nun bei jedem neu angelegten Mitarbeiter 7 Datensätze an die Tabelle Sollstunden anhängen :

Personalnummer 123456, Wochentag 1, Sollstd 0
Personalnummer 123456, Wochentag 2, Sollstd 0
usw. bis Wochentag 7

Kann ich beim INSERT INTO mehrere SELECT und FROM-Anweisungen einbauen ?
Wie ist dabei der Aufbau ?

[Anhang gelöscht durch Administrator]

Josef P.

#8
Hallo!

Wenn diese "Zahlentabelle" die Soll-Datensätze darstellt, dann reicht eine Insert-Anweisung mit einem Select aus.

Im Trigger könnte das ungefähr so aussehen (Achtung Luftcode, daher können Fehler enthalten sein!):
Insert into Zieltabelle (PersonalNr, Wochentag, Sollstunden)
Select
   I.PersonalNr,
   S.Wochentag,
   S.Sollstunden
from
  inserted I,
  Solltabelle S


ZitatKann ich beim INSERT INTO mehrere SELECT und FROM-Anweisungen einbauen ?
Du kannst die select-Anweisungen per Union verbinden.
Falls du SQL2008 oder höher verwendest, kannst du auch mehrere Value-Blöcke verwenden.
insert into (a, b, c) values ('Block1', 1, 2), ('Block2', 3, 4)

mfg
Josef

PS: Anworten zu T-SQL-Syntax-Fragen sollten eigentlich auch per Suchmaschine zu finden sein. Ich kann mir zumindest nicht vorstellen, dass nirgends beschrieben ist, wie Insert-Anweisungen in T-SQL aussehen können.

ellinho

Danke Josef für die Ausführungen.
Habe mich für Deinen "Luftcode" entschieden. Dieser funktioniert auch soweit. Allerdings werden momentan zusätzlich zu dem, was richtig angefügt wird, noch NULL-Werte für alle existierenden Personalnummern angefügt. Da suche ich gerade noch nach dem Fehler. Übrigens habe ich im Netz tausend Erklärungen für INSERT-Anweisungen gefunden, allerdings nur die "einfachen" Ausführungen. Insert INTO TABELLE....SELECT ...FROM TABELLE. Meine Geschichte ist ja schon etwas komplizierter aufgebaut.

mfg
Karsten

Josef P.

ZitatAllerdings werden momentan zusätzlich zu dem, was richtig angefügt wird, noch NULL-Werte für alle existierenden Personalnummern angefügt.
Wie sieht dein Trigger aus?
Hast du eventuell statt "inserted" den Tabellennamen der Mitarbeitertabelle verwendet?

mfg
Josef

ellinho

Danke Josef.
Hat sich erledigt. Hatte noch einen "alten", fehlerhaften Trigger zusätzlich drin. Nun läufts prima. Wunderbar.

Gruß
Karsten