Neuigkeiten:

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

Mobiles Hauptmenü

Datensatz duplizieren

Begonnen von Tally, April 14, 2014, 13:06:11

⏪ vorheriges - nächstes ⏩

Tally

Hallo zusammen
Ich habe folgendes Problem, wobei ich Eure Hilfe gebrauchen könnte (Basis Access 2007):
In einer Kursverwaltung führe ich 3 Tabellen (Kurs, Adressen, Kursbuchung). Der Steuerschlüssel Adressen ist ein eindeutiger Kundencode, beim Kurs ist es die Kursnummer. Ebenfalls hat es in der Tabelle Kurs ein Feld "Kursdauer". In der Tabelle Kursbuchung sind die Felder Kurs-Nr. Kundencode, Datum und Text vorhanden. Mein Ziel wäre es jetzt, diese Kursbuchung sooft zu duplizieren, wie in der Tabelle Kurs die "Kursdauer" definiert ist, dabei aber pro neuem Datensatz das Feld Datum um 7 zu erhöhen.
Mein Access-Status ist "ambitionierter Amateur", bin für einen stufengerechten Input sehr dankbar.
Gruss René

DF6GL

Hallo,


um "stufengerechten Input" zu tätigen, erst mal die Frage(n):

--Was steht denn im Feld "Kursdauer" drin, d. h. welche Einheit hat dieses Feld?

--Wozu sollen die kopierten Datensätze dienen?

-- Kann ein mehrwöchiger Kurs in einzelnen Wochen gebucht werden?



Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Tally

Im Feld Kursdauer steht eine Zahl 1 - 52, d.h. der Kurs kann ab 1. Kursdatum bis maximal 52 mal besucht werden (Abo-Gültigkeit), kann aber auch nur für 4x, 8x oder 12x gebucht werden. Im Feld "Text" der Tabelle Kursbuchung wird pro Datum dann der jeweilige Status (anwesend, entschuldigt, krank etc.) vermerkt. Dass dabei derjenige, welcher nur 4x bucht, zuviele Buchungseinträge hat, kann ich in Kauf nehmen bzw. die überzähligen dann löschen. Es kann aber auch sein, dass für eine 4malige Teilnahme infolge Feiertagen oder Ferien trotzdem 6 - 7 Daten erforderlich sind. Ich könnte aber auch mit einer Variante leben, dass nach Erfassung der Kursbuchung mit einer Abfrage die gewünschte Dauer einzugeben wäre, womit dann die Duplikation nach dieser Eingabe zu erfolgen hätte. Auch eine Schaltfläche als "Auslöser" der Duplikation wäre für mich kein Problem.
Hoffe mein Vorhaben genauer umrissen zu haben.
Gruss René

database

Hallo,

prinzipiell kann das Vorhaben mit einer FOR NEXT - Schleife, die mit der Auslöser-Schalfläche gestartet wird,
gelöst werden. Die Verarbeitung der Schleife ist gegen mehrmals-auslösen zu sichern.

In der Kundentabelle wird dazu ein Eintrag benötigt, der die Anzahl der gewünschten Buchungen wiedergibt.
Wenn dieser Eintrag für die Anzahl der Schleifenwiederholungen benutz wird, kann es eigentlich nicht vorkommen,
dass für einen Kunden zu viele Einträge in der Buchungstabelle entstehen.

Um dein Tabellenkonstrukt auf einen normalisierten Stand zu bringen benötigst du noch eine Tabelle 'tblStatus'
mit einer Staus_ID und einem StatusText, in der die Stati 'anwesend', 'entschuldigt', 'krank' ... gespeichert sind.
Bei der Eintragung der Anwesenheiten in die Tabelle 'Kursbuchungen' wird dann jeweils der benötigte Status mittels Kombifeld
ausgewählt und die Status_ID in die Tabelle 'Kursbuchung' als Fremdschlüssel eingetragen.

Zur Darstellung des Ganzen wäre ein HaFo/UFo Konstrukt mit einem Endlosformular als UFo denkbar.


Tally

Vielen Dank Peter für die Infos.
Die Status-Tabelle habe ich nicht erwähnt, ist aber selbstverständlich vorhanden. Jetzt kommt aber eben der "nur Amateur", welcher zwar die Absicht Deines ersten Satzes versteht, aber nicht weiss, wie konkret umsetzen:
zum Einen müsste meines Erachtens der Eintrag über die Anzahl der gewünschten Buchungen nicht auf der Kunden- sondern auf der Kurstabelle erfolgen, da ja ein Kunde mehrere Kurse belegen kann. Da aber auch innerhalb eines Kurses verschiedene Teilnahmefristen möglich ist, denke ich braucht es eine Zusatztabelle #Kd-Code, Kurs-Nr., Anzahl Teilnahmen#?
Kannst Du mir den Schleifen-Text für die Auslöser-Schaltfläche grob angeben (damit ich ihn dann mit meinen entsprechenden Feldern füllen kann? (ich begnüge mich bei meinen Prozeduren normalerweise mit Makro-Möglichkeiten :-) )
Vielen Dank für Deine Hilfe; Gruss René

DF6GL

Hallo,

mmhm, die Zusammenhänge hinterblicke ich immer noch nicht genau..

Ich interpretiere:

ein "Kurs" findet permanent das ganze Jahr über statt und hat als eine (Kurs-) Einheit jeweils ein  Woche Dauer.

Ein Abo sagt aus, dass diese Kurseinheiten über eine bestimmte Anzahl besucht werden können  (8xAbo = Teilnahmemöglichkeit in 8 aufeinanderfolgenden (??)  Wochen).

Ist das so richtig?


Ansonsten sähe eine "Schleife" prinzipiell so aus (obwohl sie vermutlich nicht zielführend sein wird):

Sub btnCreateTermine_Click()
Dim i as Long, Anz as Long, datStartdatum, DB as Database

set DB = Currentdb
Anz=8  ' 8-ter Abo  , Zuweisung aus einem Formular-/Tabellenfeld, das den Wert enthält
datStartdatum = #01/01/2014#   ' oder woher auch immer das Startdatum geholt werden kann

For i =1 to Anz
  DB.Execute "Insert into tblKursbuchung (KursNr,Kundencode, Datum) Values (" & Me!KursNr & "," & Me!Kundencode & "," & Format( DateAdd("d",7,datStartdatum), "\#yyyy-mm-dd\#") & ")", dbFailOnError
Next

set DB = Nothing
End Sub



Wenn es aber nur eine "Terminvereinbarung" anhand eines Kalenders ( Kalendertabelle) , in dem alle möglichen angebotenen "Kurswochen" stehen, werden soll, müsste anders an die Sache herangegangen werden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Tally

Hallo Franz
Vielen Dank für die Info, werde Deine Angaben mal durchtesten und mich dann nochmals melden.
Nur zum Verständnis:
Ich biete einen Jahrestanzkurs (Fitness-Dance) an. Dieser Kurs hat eine Kursnummer und findet wöchentlich statt und als Teilnehmer bist Du Jahresmember. Du hast aber auch die Möglichkeit, diesen Kurs mal als "Schnupperkurs" für 4 oder 8 x zu buchen und bezahlst dafür nicht den Memberbeitrag sondern eine Einzelkursgebühr oder Du löst ein 10er Abo, welches ab 1. Kursbesuchstag 10 mal gültig ist. Deshalb ist es für mich interessant, die Buchung entsprechend der Anzahl Teilnahmen zu duplizieren (Standard 52, oder dann mit der Vorgabe der Anzahl Besuche).

database

#7
Hallo,

Zitatder Eintrag über die Anzahl der gewünschten Buchungen nicht auf der Kunden- sondern auf der Kurstabelle erfolgen
Ich bin bei meiner Antwort nicht davon ausgegangen, dass ein Kunde mehrere Kurse im gleichen Zeitraum belegen kann, bzw. ein Kunde mehrere Kurse buchen kann.
Allerdings ergibt sich dann eine m:n Beziehung zwischen Kunden und Kurse die mittels Zwischentabelle aufgelöst werden muss.
Die Anzahl der gewünschten Buchungen ist dann in der Zwischentabelle zu hinterlegen, ebenso das vom Kunden gewünschte Startdatum.
Hilfreich kann in dieser Tabelle jedenfalls auch ein Flag-Feld sein, welches die Werte 0 oder 1 zur Feststellung der Einträge in die Buchungstabelle enthält.
Ja, ich weiß das kann man auch anders feststellen - aber so ist's halt ganz einfach  ::)

In der Buchungstabelle stehen dann nur die jeweiligen Kusdati (Datum, Mensch was für ein Wort!) die festgestellte An-/Abwesenheit und die ID des gebuchten/besuchten Kurses als Fremdschlüssel.



Tally

Hallo und Danke für Eure Mithilfe.
Wenn mehrere mitdenken werden plötzlich andere Sachverhalte sichtbar. Stelle fest, dass ich eigentlich mit unterschiedlichsten Variablen "kämpfe". Habe mir überlegt, dass folgender Lösungsansatz für den Anwender der einfachste wäre:
Kurs wird gebucht: Zähler/Kd.-Code/Kurs-Nr./Beginndatum
Anschliessend mittels Schaltfläche eine Eingabebox aufrufen "wie lange soll der Kurs dauern #Zahl#, mit dieser Zahl den Datensatz duplizieren, wobei pro Duplikation das Beginndatum um 7 erhöht wird. Ist dies machbar, oder muss ich die "Zahl" -wie lange soll der Kurs dauern- in einer Tabelle fix hinterlegen?
Hoffe, dass dies nicht zu unverständlich für Euch Profis rüber kommt und danke für die Unterstützung.
Gruss René

database

Hallo,

Zitatoder muss ich die "Zahl" -wie lange soll der Kurs dauern- in einer Tabelle fix hinterlegen...

Würde ich schon aus Gründen der Nachvollziehbarkeit dringend anraten  ;)
Leg die Anzahl der gewünschten Buchungen in die Zwischentabelle - du kannst diese Zahl ja dennoch über eine Inputbox 'erfragen' oder besser in ein entsprechendes Formularfeld eingeben.

Tally

Hallo Peter
Nachvollziehbarkeit würde bedingen, dass dieser Eintrag fix bleibt. Da aber, wie erwähnt, ein Kunde auch mehrere Kurse mit unterschiedlichen Laufzeiten buchen kann, müsste dann dafür ja eine neue Tabelle Zähler/Kd.-Code/Kurs-Nr./Kursdauer ?? erstellt werden, richtig gedacht? Wenn die Anzahl Kursbuchungen (Anzahl Duplikate) jedoch beim erfassen schon definiert werden, würde mir dies als Nachvollziehbarkeit reichen, ich könnte ja dann mittels Report eine Zusammenfassung aller Buchungen pro Kurs bzw. Kunde ermitteln und die Ursprungszahl wäre für mich somit nicht mehr relevant. Habe ich vielleicht noch nicht explizit erwähnt: Die Buchungstabelle brauche ich als Anwesenheitskontrolle: ich habe also 8 Buchungen, wobei bei 4 der Eintrag "anwesend" steht und bei 4 "unentschuldigt", was mir Grundlagen liefert, wenn der Kunde z.Bsp. reklamiert, dass er nicht den gewünschten Lernerfolg erzielt hat - wie auch, wenn Du die Hälfte unentschuldigt fehlst :-( . Die Variante mit der Eingabebox würde also mein Ziel erreichen, die Frage ist aber nochmals: kann ich mit einer Zahl, die ich in einer Eingabebox eingebe, den aktuellen Datensatz sooft duplizieren und gleichzeitig das Datumsfeld pro Duplikation um 7 erhöhen? Wenn ja wäre ich für einen Prozedurbeschrieb dankbar.
Gruss René

database

Hallo,

Zitat... müsste dann dafür ja eine neue Tabelle Zähler/Kd.-Code/Kurs-Nr./Kursdauer  ...
Richtig, das ist die von mir angesprochene Zwischentabelle als Auflösung der m:n-Bezihung zwischen Kunden und Kursen z.B. tblKundeKurs.
für Kd.-Code und Kurs-Nr sind jedoch die Primärschlüssel - und NUR DIE - der Stammtabellen einzusetzen also die Kunden_ID und die Kurs_ID.

Zitat... Da aber, wie erwähnt, ein Kunde auch mehrere Kurse mit unterschiedlichen Laufzeiten buchen kann ...

Damit hier eine Unterscheidung/Auflistung der Kursbelegungen eines Kunden möglich wird oder ist stehen dann z.B. folgende Daten in der Zwischentabelle

Kunden_ID_F  15  ---  Kurs_ID_F  3  ---  Kursdauer 4 (Wochen) --- Startdatum 01.01.2015
Kunden_ID_F  15  ---  Kurs_ID_F  9  ---  Kursdauer 16 (Wochen)  --- Startdatum 15.01.2015

Somit ist ablesbar, dass Kunde mit der ID 15 zwei Kurse belegt hat 3 und 9 mit unterschiedlichen Starttagen für 4 bzw. 16 Wochen.

Baust du in diese Tabelle noch das erwähnte Flag-Feld ein, z.B. 'buchung' meinetwegen als Ja/Nein - Feld, dann lässt sich auch feststellen ob für den jeweiligen Datensatz bereits die Anwesenheitsliste erstellt wurde oder nicht.


ZitatWenn ja wäre ich für einen Prozedurbeschrieb dankbar

Ist ein wenig schwierig, da ich deine Formularkonstellation nicht kenne.
Wenn ich davon ausgehe, dass du ein Formular hast mit dem du mit einem Kunden einen Kurs vereinbarst und die Kundenauswahl bzw. Kursauswahl jeweils mittels Kombifeld erfolgt, die Anzahl der gebuchten Termine in einem Textfeld steht und das Startdatum des Kurses ebenfalls über ein Textfeld erfaßt wird, könnte in Anlehnung an den Code von Franz das Ganze in Etwa so aussehen:


Sub btnCreateTermine_Click()
Dim i as Long, Anz as Long, datStartdatum, DB as Database

set DB = Currentdb

Anz= Me!txtAnzahl   'Abo  , Zuweisung aus einem Formular-/Tabellenfeld, das den Wert enthält
datStartdatum = Me!txtStartdatum   ' Startdatum aus dem Formularfeld

'Eintrag in die Zwischentabelle

DB.Execute "INSERT INTO tblKundeKurs(Kunden_ID_F,Kurs_ID_F,BAnzahl,Startdatum) VALUES(" & Me!cmbKunde & "," & Me!cmbKurs & "," & Format(Me!txtStartdatum,"\#yyyy-mm-dd\#") & ")", dbFailOnError

'Eintrag in die Buchungstabelle

For i =1 to Anz
  DB.Execute "Insert into tblKursbuchung (Kurs_ID_F,Kunden_ID_F, ADatum) Values (" & Me!cmbKurs & "," & Me!Kunde & "," & Format( DateAdd("d",7,datStartdatum), "\#yyyy-mm-dd\#") & ")", dbFailOnError
Next

'Aktualisieren der Zwischentabelle - die Buchungen wurden in der Anwesenheitsliste eingetragen

DB.Execute "UPDATE tblKundeKurs SET Buchung = -1 WHERE Kunden_ID_F=" & me.cmbKunde & " AND Kurs_ID_F=" & Me!cmbKurs , dbFailOnError


set DB = Nothing
End Sub


HTH

Tally

Danke für die Inputs: werde diese zuerst geistig dann technisch versuchen umzusetzen und mich dann wieder zum Ergebnis melden; kann aber etwas dauern :)
Gruss René

Tally

Hallo
Habe mich wohl etwas überschätzt und bin nicht zum Resultat gelangt. Habe aus all den Vorschlägen folgendes "zusammengebaut", wobei ich nur die aus meiner Sicht relevanten Felder aufführe, Auswahltabellen und weitere Datenfelder, welche nicht für den Prozess relevant sind, lasse ich weg (bin aber noch völlig frei für Anpassungen, da ich z.Z. die Struktur noch anpassen/korrigieren kann):
Tabelle KUNDEN  Kunden_ID (Txt), Kunden_Name (Txt)
Tabelle KURS Kurs_ID (Txt), Kurs_Bezeichnung (Txt)
Tabelle KUNDENKURS Kunden_ID (Txt), Kurs_ID (Txt), Kursanzahl (Zahl), Kursstart (Datum)
Tabelle KURSBUCHUNG Buchungs_ID (Autowert), Kunden_ID (Txt), Kurs_ID (Txt), Kurstag (Datum)
Formular BUCHUNG (Tabellarisch) Buchungs_ID, Kunden_ID, Kurs_ID, Kurstag
Wenn ich Eure Infos richtig verstanden habe, sollte es nun möglich sein, mit obigen Angaben das gesuchte Resultat zu erzielen welches (nochmals kurz zusammengefasst) folgendes wäre:
Ich möchte im Formular BUCHUNG auf dem erfassten Datensatz eine Schaltfläche hinterlegen, welche beim Anklicken den aktuellen Datensatz sooft im Formular (und natürlich auch in der Tabelle BUCHUNG dupliziert, wie die Zahl "Kursanzahl" in der Tabelle KUNDENKURS erfasst ist. Dabei soll das Datumsfeld Kurstag jeweils um 7 Tage erhöht werden. Diese Ereignisprozedur möchte ich bei der Schaltfläche "beim Klicken hinterlegen. Ich gehe davon aus, dass ich die Auswahl für die KURSBUCHUNG aus der Tabelle KUNDENKURS beziehe. Somit müsste dann auch das dort erfasste Datum (Kursstart) automatisch ins Feld Kurstag der Tabelle KURSBUCHUNG kopiert werden.
Ich bitte um Nachsicht, falls ich aus Profisicht mich hier etwas wie der Elefant im Porzellanladen aufführe  :-[ und danke für Eure Unterstützung.
Gruss René

Tally

Hallo
Habe mich wohl etwas überschätzt und bin nicht zum Resultat gelangt. Habe aus all den Vorschlägen folgendes "zusammengebaut", wobei ich nur die aus meiner Sicht relevanten Felder aufführe, Auswahltabellen und weitere Datenfelder, welche nicht für den Prozess relevant sind, lasse ich weg (bin aber noch völlig frei für Anpassungen, da ich z.Z. die Struktur noch anpassen/korrigieren kann):
Tabelle KUNDEN  Kunden_ID  (Txt), Kunden_Name (Txt)
Tabelle KURS Kurs_ID  (Txt), Kurs_Bezeichnung (Txt)
Tabelle KUNDENKURS Kunden_ID  (Txt), Kurs_ID  (Txt), Kursanzahl (Zahl), Kursstart (Datum)
Tabelle KURSBUCHUNG Buchungs_ID  (Autowert), Kunden_ID (Txt), Kurs_ID (Txt), Kurstag (Datum)
Formular BUCHUNG (Tabellarisch) Buchungs_ID, Kunden_ID, Kurs_ID, Kurstag
Wenn ich Eure Infos richtig verstanden habe, sollte es nun möglich sein, mit obigen Angaben das gesuchte Resultat zu erzielen welches (nochmals kurz zusammengefasst) folgendes wäre:
Ich möchte im Formular BUCHUNG auf dem erfassten Datensatz eine Schaltfläche hinterlegen, welche beim Anklicken den aktuellen Datensatz sooft im Formular (und natürlich auch in der Tabelle BUCHUNG dupliziert, wie die Zahl "Kursanzahl" in der Tabelle KUNDENKURS erfasst ist. Dabei soll das Datumsfeld Kurstag jeweils um 7 Tage erhöht werden. Diese Ereignisprozedur möchte ich bei der Schaltfläche "beim Klicken hinterlegen. Ich gehe davon aus, dass ich die Auswahl für die KURSBUCHUNG aus der Tabelle KUNDENKURS beziehe. Somit müsste dann auch das dort erfasste Datum (Kursstart) automatisch ins Feld Kurstag der Tabelle KURSBUCHUNG kopiert werden.
Ich bitte um Nachsicht, falls ich aus Profisicht mich hier etwas wie der Elefant im Porzellanladen aufführe  :-[ und danke für Eure Unterstützung.
Gruss René