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 in Abhängigkeit der Eingabe speichern

Begonnen von lada, Mai 31, 2012, 22:20:19

⏪ vorheriges - nächstes ⏩

lada

Guten Tag,

Ich habe folgendes Problem und zwar würde ich gernen einen Datensatz öffters speichern. Der neue Datensatz soll sich nur durch den Primärschlüssel in diesem Fall Angebotsnummer unterscheiden.

Platzanzahl= Anzahl der Datensätze die erzeugt und  über den Button oben in der Mitte gespeichert werden sollen.

(es ist auf Grund von Vorgaben nur so realisierbar.)

Könnte mir jemand bei der Realisierung weiterhelfen ? bin einsteiger in Access und VBA...

[Anhang gelöscht durch Administrator]

Beaker s.a.

#1
Hallo Lada,
Wo kommt denn die Angebotsnummer her?
Ist das ein Autowert?
Im Prinzip geht das mit einer Hilfstabelle und
einer Anfügeabfrage.
Schreib mal, dann sehen wir weiter.
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)

database

Hallo,

im Prinzip ist dein Vorhaben vom verwendeten Datenmodell abhängig.
Wenn ich dein Vorhaben richtig verstanden habe, willst du zu einem 'Angebot' verfügbare oder vergebene Plätze speichern / anzeigen.
Dass du dabei einen Autowert als Angebotsnummer vergibst ist nicht unbedingt der richtige Weg.

Sprechende Nummerierungen sollten durch ERZEUGTE Nummern realisiert werden.

Der Grund dafür ist die Problematik, dass ein einmal erzeugter Autowert nach einer ev. Löschung des Datensatzes nicht mehr auf einfache Weise wiederhergestellt werden kann.

Somit ergibt sich folgende Konstellation (Vermutung, dass es sich um eine Art Mitfahrbörse handelt):

Du erstellst 'Angebote' - diese werden in der Primär- oder Haupttabelle gespeichert.
Um nun diesem Angebot 'Plätze zuzuordnen - hier fehlt dann die Information wer die Fahrgäste sind - wird der Primärschlüssel des erzeugten
Angebots zusammen mit dem Primärschlüssel des Fahrgastes in einer s.g. Zwischentabelle gespeichert.
Die ermittelte Anzahl der Primärschlüssel des Angebots in dieser Zwischentabelle ergibt dann die Anzahl der besetzten Plätze.

ZitatIm Prinzip geht das mit einer Hilfstabelle und einer Anfügeabfrage.
... sehe ich als EINE Möglichkeit, beim Aufbau der Formulare (in Abhängigkeit vom Datenmodell) in Form von HaFo / UFo kann die Anfügeabfrage entfallen.

Aber wie Ekkehard schon geschrieben hat, beschreibe bitte die Situation etwas detaillierter.
Lade ev. dazu eine Kopie deiner DB mit ein paar Spieldaten hier hoch.
DB bitte dann im A2003-Format, repariert/komprimiert und gezippt hochladen.

lada


Die freien Plätze werde im Formular eingegeben. Und an Hand dieser Zahl sollen demensprechend viele Datensäte mit identische Datensätze erzeugt werden. Die Angebotsnummer ist ein Autowert der Automatisch hoch zählt.
Das mit der Mitfahrzentrale ist richtig...
Die Gesuche werden dann mit den Angeboten verknüpft. So kann nur ein Angebot mit einem Gesuch verknüpft werden um aber mehrere Gesuche mit der gleichen Fahrt zu befriedigen zu können werden einfach mehrere Angebote erzeugt. Z.b. ein Anbieter hat 4 Freie Plätze in seinem Auto (d.h. es werden 4 Angebote erzeugt diese können dann mit jeweils einem Gesuch verknüpft werden.)


Leider kann ich die Datenbank nicht als 2003 abspeichern. Wurde mit 2010 erstellt und es kommt zu einer Fehlermeldung, es wurde neuartige Objekte verwendet....


[Anhang gelöscht durch Administrator]

lada

hier ein sceenshot

[Anhang gelöscht durch Administrator]

database

Hallo,

ich habe mir dein Werk mal angesehen und als Vorschlag ein paar Änderungen vorgenommen.
Du hast hier anscheinend eine Musterdatenbank umgebaut.
Habe einige Tabellen hinzugefügt und notwendige Änderungen an den bestehenden Tabellen durchgeführt.
Hierbei ist, wie schon so oft, zu erwähnen, dass keine Sonderzeichen in Spaltenbezeichnungen zu verwenden sind.
Das berechnete Feld habe ich aus der Tabelle 'Fahrerbewertung' entfernt.
Berechnete Werte sollten nicht gespeichert sondern bei Bedarf ermittelt werden.

Weiter habe ich die Hyperlinks entfernt und die Mailadressen somit zu 'normalen' Textfeldern umfunktioniert.
Die Anlagefelder für die Aufnahme von Bildern sollten ebenfalls rausgenommen werden und stattdessen der Pfad zum Bildspeicherort eingetragen werden.
Nicht alle neuen Dinge sind auch gleichsam gute Sachen  ;D
Zu dem habe ich noch einige Umstellungen in den bestehenden Tabellen vorgenommen - z.B. Indizes entfernt welche nicht benötigt werden (Hausnummern)

Zitat... Z.b. ein Anbieter hat 4 Freie Plätze in seinem Auto (d.h. es werden 4 Angebote erzeugt diese können dann mit jeweils einem Gesuch verknüpft werden.) ...
Das passt so nicht ganz, das läuft verkehrt.
Die Tabelle 'GesucheT' habe ich unberücksichtigt gelassen - wenn sie wirklich benötigt wird dann kann sie ja noch eingebunden werden - allerdings nicht nach dem obigen Schema
Meinem Dafürhalten nach würde es genügen Angebote zu erstellen und in einem entsprechenden Formular (UFo) etwaige Mitfahrer bis zur Anzahl der freien Plätze einzutragen.

Tabellenbeziehungen solltest du immer als 1:n Beziehung ausbilden - undefinierte Beziehungen haben in einer relationalen DB nichts zu suchen.

Weiter habe ich die Formulare für die Mitfahrer und die Angebote ein wenig umgestaltet.
Das Formular für die Erstellung eines Angebots kannst du nach dem Muster der beiden anderen Formulare abändern.
Schau dir die Sache im Anhang mal GENAU an - wenn du Fragen dazu hast - keine Scheu, stelle sie - ich oder wir werden versuchen dir die Sache zu erklären oder entsprechende Lösungen anbieten.

Der Vorschlag ist nur als Ansatz einer Lösung angedacht und verpflichtet dich natürlich nicht dazu damit weiter zu arbeiten  ;)

HTH


[Anhang gelöscht durch Administrator]

lada

hallo,

danke! werde an dem Entwurf auf jeden fall weiter basteln. :)
Das Problem ist wenn ein Mitfahrer z.b. einmal nach der Strecke Berlin- Hamburg schucht und einmal nach München-Dortmund wie kann ich das dann mit den Unterformularen regeln? (Bin newie in Access).
Wenn ich das z.b. mit der Gesuchtabelle mache könnte ich einfach für einen Mitfahrer mehrere Gesuche einstellen und diese mit den Angeboten verknüpfen. Dabei taucht dann das Anfangsproblem auf das zur Zeit nur ein Mitfarer pro Fahrt mitgenommen werden kann.

Evtl. kannst du mir das mit dem Ufo nochmal genauer erläutern oder zeigen. Wie das dann zu realisiern wäre wenn ein Mitfarer an mehrern Fahrten teilnehmen kann nicht gleichzeitig  ;) . Das habe ich bei dir nicht ganz verstanden.

Vielen Dank.

database

#7
Hallo,

ich habe dein Beispiel um die angefragete Funktionalität erweitert und den Fehler der durch den Code in einem der Formulare ausgelöst wurde unterdrückt.
Ich habe dabei bewußt ganz einfache Dinge eingebaut um dir die Möglichkeit zu geben
die Änderungen / Erweiterungen leichter nachvollziehen zu können.

Dazu gekommen sind nun 2 Formulare (HaFo und UFo) für die Buchung von Mitfahrern zu bestehenden Angeboten.
Öffne dazu das Formular 'frmFahrten'
Du kannst im Kombi 'Erstellte Angebote' ein Angebot auswählen.
Zu diesem Angebot werden dann Detaildaten angezeigt (Datum, Preis, Zeit, Plätze)
Im UFo werden die gebuchten Mitfahrer angezeigt.
Im Kombi 'Mitfahrer' werden danach mögliche Mitfahrer angeboten.
Wählst du einen Mitfahrer aus und klickst du den Button 'Hinzufügen' (grünes +) dann wird geprüft ob dieser Mitfahrer
bereits eine andere Fahrt an diesem Tag gebucht hat.
Existiert eine Buchung, kann die neue Fahrt nur dann gebucht werden, wenn die neue Abfahrtszeit gleich oder später
als die bereits gebuchte Fahrt stattfindet. Ist dieses der Fall, kann eine neue Buchung stattfinden.
Ich habe dieses so belassen um die Möglichkeit für die Buchung einer Rück- oder Weiterfahrt zu bieten.
Um eine genaue Abgrenzung zu schaffen fehlen jedoch einige Informationen in deinen Tabellen - so z.B. Fahrzeiten zwischen einzelnen Start- und Zielorten
oder geplante Ankunftszeiten etc.
Natürlich kann die Buchung eines Mitfahrers auch wieder rückgängig gemacht werden - klick dazu auf den Lösch-Button (rotes X) nachdem du einen Mitfahrer ausgewählt hast

Bei den Erweiterungen habe ich Abfragen und VBA verwendet um dir unterschiedliche Möglichkeiten zu zeigen.
Die VBA Codes habe ich für dich hoffentlich verständlich kommentiert.
Natürlich können die gezeigten Möglichkeiten weiter optimiert werden, der Code effizienter gestaltet werden,
ich habe jedoch ganz bewußt das Beispiel so gestaltet um dir das Nachvollziehen leichter zu machen.
Zu beachten ist bitte auch, dass in den Codes KEINE wie auch immer gearteten Fehlerbehandlungen implementiert sind.
Auch beim Löschen einer Buchung habe ich keine Sicherheitsabfrage eingebaut - versuch das doch gleich mal selbst einzubauen  ;)

ZitatWenn ich das z.b. mit der Gesuchtabelle mache könnte ich ...
Die Sache mit den 'Gesuchen' wäre eine ganz eigene Funktionalität!
Hierbei KANN es sich darum handeln einem potentiellen Mitfahrer die Möglichkeit einzuräumen,
sich für ein noch nicht bestehendes Angebot 'anzumelden'.
Nach Erstellung eines passenden Angebots KÖNNTE ev. automatisch die Buchung des Gesucherstellers vorgenommen werden.

Bis dahin aber solltest du dich INTENSIV mit den Grundlagen von Datenbanken und Access im Speziellen vertraut machen.
Die Gestaltung solcher Funktionalitäten erfordern wirklich tiefergehende Kenntnisse und sind nicht so mit Fingeschnipps geschaffen.

HTH


[Anhang gelöscht durch Administrator]


database


lada

Versuche eben die Datenbank selbst zu erstellen doch wenn ich das frmFahrten öffne frägt er mich nach Parameterwert von Angebot_F hab dies aber umbenannt in Angot_Nr. Woher stammt diese Abfrage?

Außerdem Aktualisiert er die Felder Fahrpreis usw. nicht... Wie hast du das realisiert?


Sonst bin ich auf einem guten Weg :D

database

Guten Morgen!

Zitat...frägt er mich nach Parameterwert von Angebot_F hab dies aber umbenannt in Angot_Nr.

Nehme an, dass du dir hier die Antwort selbst gegeben hast.  ;)
Das UFo in dem die Mitfahrer angezeigt werden ist über 'Angebot_F' im Unterformular mit 'Angebot_Nr' in der Datenherkunft des HaFO verknüpft.
Die Datenherkunft des HaFO wird durch die Abfrage 'qryAngebote' realisiert.
Das Präfix '_F' wird verwendet um die Primärschlüssel (in deinem Fall '_Nr') zu den Fremdschlüsselfeldern unterschiedlich zu benennen.
Wenn du diese Felder - aus welchen Gründen auch immer - gleich benennen willst musst du die gesamte DB umackern und dieses
bei ALLEN Tabellenfeldern, in allen Abfragen, in der SQL-Datenherkunft von Kombifeldern, in Codes und Steuerelementen manuell nachziehen!

Die Aktualisierung des Fahrpreises ist natürlich davon abhängig, ob ZUVOR alles ohne Fehler abläuft.
Wenn die restlichen ausgegrauten Felder nicht mit Daten befüllt werden wird auch die Fahrpreisberechnung nicht ausgeführt.
Der Gesamtpreis wird in einer VBA-Function berechnet und an die aufrufende Codestelle geliefert.
Die Function befindet sich im VBA Teil des Formulars 'frmFahrten' ...

Private Function Preis() As Double

   'Diese Funktion berechnet den gesamten Fahrpreis
   'der für das aktuelle Angebot eingehoben werden kann.

   Dim MF As Long
   MF = DCount("*", "qryMitfahrer", "Angebot_F=" & Me.cboAngebot)
   Preis = Me.Fahrpreis * MF
   
End Function

An der Berechnung ist auch die Abfrage 'qryMitfahrer' beteiligt, die ebenfalls das Tabellenfeld 'Angebot_F' beinhaltet!

Du siehst - kleine Ursache große Wirkung.  ::)
Nimm die Umbenennung an den Stellen, an denen du sie durchgeführt hast mal wieder zurück - dann sollte es wieder laufen.

HTH

lada

#12
Habs an einer Stelle vergessen ...

,danke

lada

Aber beim Hinzufügen eines Mitfarer kommt die Fehlermeldung -> Fehler beim Kompilieren: Sub oder Function nicht definiert. Aber Private Sub ist vorhanden der Feldname ist richtig cmdPlus_Click() und es gibt ein Sub end
Woran könnte das liegen?
vorhandene Mitfahrer werden angezeigt.

,danke

database

Hallo,

ZitatFehler beim Kompilieren: Sub oder Function nicht definiert
...und wo genau bleibt die Verarbeitung stehen?

Hab' grad probiert, bei mir läft es!

Sieh' auch die folgend Zeilöen in der cmdPlus_Click...


If DCount("Mitfahrer_F", "FahrtT", "Mitfahrer_F=" & Me.cboMitfahrer & " AND Angebot_F=" & Me.cboAngebot) = 0 Then
                'Kann der gewählte Mitfahrer diese Fahrt buchen?
                If WeitereFahrt(Me.Abfahrtszeit, Me.cboMitfahrer, Me.Datum) = True Then
                    'Ist bei diesem Angebot noch ein Platz frei?
                    If DCount("*", "qryMitfahrer", "Angebot_F=" & Me.cboAngebot) < Me.FreiePlaetze Then
                        CurrentDb.Execute "INSERT INTO FahrtT(Angebot_F,Mitfahrer_F) VALUES(" & Me.cboAngebot & "," & Me.cboMitfahrer & ")"


... auch hier kommt Mitfahrer_F vor!