Access-o-Mania

Access-Forum => Access Programmierung => Thema gestartet von: zorlayan am Juni 15, 2022, 18:06:01

Titel: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 15, 2022, 18:06:01
Hallo zusammen,

im Hauptformular (Rechnung) habe ich einen Kombinationsfeld (KundenID)
Wenn eine Kunde nicht in der Liste vorhanden ist dann verwende ich folgendes Code:

'Wenn die Kunde nicht im Kombinationsfeld vorhanden ist
Private Sub KundenID_NotInList(NewData As String, Response As Integer)

   Dim intAnswer As Integer

On Error GoTo ErrorHandler
'NewData ist was eingegeben war
   intAnswer = MsgBox("Hizufügen " & NewData & " Kunden?", _
      vbQuestion + vbYesNo)

   If intAnswer = vbYes Then
   
   Response = acDataErrContinue
   'Form Kunden wird geöffnet
   DoCmd.OpenForm "Kunden", , , , acFormAdd
   'Neuer Name in den Feld eingefügt
   Forms!Kunden!KName = NewData
   Else
   Response = acDataErrContinue
   Me!KundenID.Undo
   End If

   Exit Sub

ErrorHandler:
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
End Sub

Benötigte Daten pflege ich ein und drücke ich Button (Speichern):
Private Sub Speichern_Click()
    Me.Dirty = False
'speichert explizit
    DoCmd.Close acForm, "Kunden"
', acSaveYes - kannst du vergessen, macht nur Sinn wenn das Form zur
                     'Laufzeit im Entwurfsmodus geöffnet wird
Call RequeryKunden

    End Sub

Daten werden ohne Probleme in die Tabelle gespeichert, Formular für die Kunden wird geschlossen anschließend soll der Kombifeld im Hauptformular aktualisiert werden mit dem folgenden Code:

Public Sub RequeryKunden()
    Dim Kombo As Control
    Set Kombo = Forms!Rechnung!KundenID
    Kombo.Requery

End Sub

Problem: Laufzeitfehler '2118':
Sie müssen das aktuelle Feld speichern, bevor Sie die aktualisierten Daten-Aktion ausführen können.

Wenn ich Debuggen klicke dann wird die Zeile

    Kombo.Requery

angezeigt.

Leider habe nicht zum laufen gebracht.
Unterstützung wäre wünschenswert.

Vielen Dank

PS: Bei Bedarf kann ich kompletten DB zur Verfügung stellen.


Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: MzKlMu am Juni 15, 2022, 19:25:58
Hallo,
die Sub für Requery dürfte überflüssig sein.
Das sollte eigentlich reichen.
Private Sub Speichern_Click()
'speichert explizit
    Me.Dirty = False
    Me.KundenID.Requery
    DoCmd.Close acForm, "Kunden"
End Sub
acSaveYes ist ohnehin überflüssig.
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 15, 2022, 20:57:43
Zitat von: MzKlMu am Juni 15, 2022, 19:25:58Hallo,
die Sub für Requery dürfte überflüssig sein.
Das sollte eigentlich reichen.
Private Sub Speichern_Click()
'speichert explizit
    Me.Dirty = False
    Me.KundenID.Requery
    DoCmd.Close acForm, "Kunden"
End Sub
acSaveYes ist ohnehin überflüssig.

Danke für die schnelle Hilfe aber so funktioniert nicht, weil Speichern-Button im "Kunden" Form ist und der Kombifeld ist im Form "Rechnung".
Also wenn ich die neuen Datensatz im Form durch klicken auf "Sperichern" Button speichere soll der Kombi im "Rechnung" Form aktualisiert sein.

Habe folgende Variante auch versucht aber weiterhin kein Erfolg:

    Forms!Rechnung!KundenID.Requery 'Anstelle Me.KundenID.Requery


Der gleiche Fehler. :(
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 15, 2022, 21:01:42
Die Beziehungen sind wie im Bild. (Hoffentlich alles korrekt)  :D
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: Beaker s.a. am Juni 16, 2022, 14:27:20
Hallo,
Forms!Rechnung!KundenID.Requery Würde schon funktionieren. Das Problem wird sein, dass das Kombi
an die KundenID gebunden ist. Dadurch ist das Formular "Dirty",
was zu der besagten Fehlermeldung führt.
Entferne die Bindung, dann klappt es auch mit dem ".Requery". Die
KundenID übergibst einem, an dieses gebundenen Textfeld.

gruss Ekkehard

P.S.: Ans Datenmodell sollte man auch nochmal dran.

P.S.S.: OT
Ich finde ja diesen Weg des Workflows immer wieder befremdlich, -
eine Rechnung erstellen zu wollen, wenn ich noch gar keinen Kunden
habe. Einer Rechnung geht doch normalerweise ein(e) Auftrag/Bestellung
und die Lieferung bzw. DL voraus. Wenn ich den Kunden dann immer noch
nicht kenne, würde ich mir Gedanken machen.
Für mich ist im Vertrieb der Kunde die zentrale Entität. Das entsprechende
Form war dann nach dem Login auch das Startform. Da gab es einen Button,
der das Belege-Formular mit Übergabe der KundenID öffnete. Dort ein Kombi
für die Belegart und eins für evtl. offene Aufträge des Kunden, - das ID-Feld
ist gesperrt.
Da entfällt auch das Gefrickel mit "NotInList".
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 17, 2022, 00:30:28
Hallo,

leider habe ich zum Laufen immer noch nicht bringen können :(

Diese DB sollte zur Erstellung einer Rechnung bei einem kleinen KFZ-Händler dienen.
Bei dem Geschäftsnodell kannst im Voraus nicht wissen wer deine Kunde ist deswegen die Kunden oder Fahrzeuge können erst bei der Rehnungserstellung neu hinzugefügt oder ausgewählt werden falls schon mal in der Liste waren.

Hier lasse ich eine Kopie der DB, live kann man besser überprüfen und die Störung aufheben.

VG
Zorlayan

Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: DF6GL am Juni 17, 2022, 13:30:54
Hallo,


ZitatBei dem Geschäftsnodell kannst im Voraus nicht wissen wer deine Kunde ist deswegen die Kunden oder Fahrzeuge können erst bei der Rehnungserstellung neu hinzugefügt oder ausgewählt werden falls schon mal in der Liste waren.


Trotzdem kannst Du für diesen Fall einen Pseudo-Kunden anlegen, der dann bei Kenntnis des realen Kunden durch diesen ersetzt wird.

Des Weiteren solltest Du am Tabellenmodell Verbesserungen vornehmen:


Beziehung:

Land:Kunden  entfällt
Marken:Azos entfällt  (und die dazugehörenden FKs)

MwSt  entfällt. Der MwStSatz kann gleich in "tblLand" eingetragen werden.



Was bedeuten die Felder Erkl1 - Erkl5 ?

Gibt es keine Detaildatensätze für eine Rechnung (tblRechnungspositionen) ?


Was wird mit Tabelle "Historie" (---> besser "tblAutoHistorie") abgebildet?

Benamsung:

"Autos"  besser "tblFahrzeuge"
"Rechnungen" besser "tblKundenRechnungen"
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: Beaker s.a. am Juni 17, 2022, 15:47:38
Hallo Zoryalan,
Wie vermutet liegt das Problem zunächst mal an der Bindung, -
Auswirkung wie beschrieben.
Auch wenn sich das einfach zu beheben liesse, hast du das gleiche
Problem bei den Autos.
Das ganze Formular ist wegen der DS-Herkunft unbrauchbar. U.U. ist
die noch nicht mal aktualisierbar, habe ich nicht getestet ohne
Beispieldaten.
Das geht auch nicht alles auf einem Formular.

Merke: ein Formular - eine Tabelle (es gibt Ausnahmen)

Das/die? Autos gehören in ein UFo, das sind dann so zu sagen die
Rechnungspositionen. Z.Zt. ist da ja nur eine möglich.

Die Kundendaten (die reinen Adressdaten, Anrede bis Land würden m.E.
reichen) würde ich in ungebundene Felder mit DLookup aus einer Abfrage
holen. Da könnte man diese Daten auch in einem Feld so zusammenstellen
wie man sie für den Rechnungskopf braucht, - alles zusammen in einem
etwas grösseren Textfeld auf dem Form(kopf).
Die Auswahl erfolgt weiterhin mit einem Kombi, wie gehabt, inkl. Bindung
an die "KundenID". Nur die DS-Herkunft solltest du einschränken, - du
brauchst ja nur die KID (der FK) und den/die Namen zum Auswählen
SELECT KID, Nachname, KName FROM KundenAlso 3 Spalten im Kombi, die erste ist die gebundene und ist 0cm breit.
Spalte 2 + 3 kannst du so breit machen wie du willst.
Die Hinweise (Erkl1-5) gehören auch in eine eigene Tabelle und auch als
UFo ins HFo.

Zum "Geschäftsmodell", - sehr befremdlich eine DL zu erbringen ohne zu
wissen, von wem ich dann meine Kohle bekomme. Aber wenn das bei euch so
funzt, ist es ja gut.

gruss ekkehard

edit: Auf Klaus' Hinweise zum Datenmodell gehe ich nicht weiter ein, da gibt
es wohl nichts hinzuzufügen.
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: MzKlMu am Juni 17, 2022, 15:56:13
Hallo Ekkehard,
Zitat von: undefinedAuf Klaus' Hinweise zum Datenmodell
Das war ich diesmal nicht.  ;D
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: Beaker s.a. am Juni 17, 2022, 16:48:25
Au ja, war Franz, sorry.
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 17, 2022, 16:55:06
Zitat von: DF6GL am Juni 17, 2022, 13:30:54Was bedeuten die Felder Erkl1 - Erkl5 ?

Gibt es keine Detaildatensätze für eine Rechnung (tblRechnungspositionen) ?


Was wird mit Tabelle "Historie" (---> besser "tblAutoHistorie") abgebildet?
Hallo Franz,

vielen Dank für die Untersuchung und Verbesserungsvorschläge. :)

Erkl1-5 -> sind die Hinweise zum verkauften Auto in der Rechnung, z.B. 8-Fach bereift, neu TÜV usw.

-> Rechnungspositionen sind entweder "Gültig" oder "Storniert" sind in der Tabelle "Status" an Rechnung gebunden, sodass jede Rechnung ein Position hat.
Manchmal kommen die Verkaufte Autos in einer Woche zurück deswegen die Rechnung auch im System storniert werden.

Historie-> ist für die Autos, z.B. Austauschmotor, Defekt-Repariert, CD-Player erneuert. usw. zum ermitteln der Arbeit bis zum Verkauf.

ja, bei der Benamung kann ich noch kreativer werden :)
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 17, 2022, 17:03:27
Zitat von: Beaker s.a. am Juni 17, 2022, 15:47:38Zum "Geschäftsmodell", - sehr befremdlich eine DL zu erbringen ohne zu
wissen, von wem ich dann meine Kohle bekomme. Aber wenn das bei euch so
funzt, ist es ja gut.
Hallo Ekkehard,

auch vielen Dank für Überprüfung und Vorschläge, werde bemühen etwas kompaktes rauszubringen.

Leider beim KFZ-Händler bis zum Verkauf weißt man nicht an wem man das Fahrzeug verkauft. :)

Mal sehen ob es mit meinen "New Bee" Kenntnissen klappen wird.

VG
Zorlayan
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: DF6GL am Juni 17, 2022, 17:12:13
Hallo,


da kommt (auch) mir Einiges merkwürdig vor..

Zitat von: undefinedRechnungspositionen sind entweder "Gültig" oder "Storniert" sind in der Tabelle "Status" an Rechnung gebunden, sodass jede Rechnung ein Position hat.

Ein Status ist doch keine Rechnungsposition, sondern eben "nur" ein Status....

Sinnvoller für die Rechnungsposition(en) sind die Daten in Erkl1-5.  Insofern sollten diese Felder in eine (weitere) n-Tabelle "tblRechnungPositionen" ausgelagert werden. Wenn solche "Position" als Gesamtheit vorgegeben sind, sollten diese in eine Nachschlage-Tabelle "tblPosBezeichnungen" erfasst werden und über (Formular-)Kombifeld in tblRechnungPositionen  auswählbar sein.

Das führt dazu, dass es pro Rechnung beliebig viele Positionen geben, nicht nur max. 5 und ein Preis pro Position definiert werden kann.


PS: 

ZitatLeider beim KFZ-Händler bis zum Verkauf weißt man nicht an wem man das Fahrzeug verkauft.

Dann nutze meinen Vorschlag   und erstelle die Rechnung zunächst für einen "PseudoKunden". Das kann ja euere  Werkstatt selber sein.  Wenn das Fz dann verkauft wird, wird der reale Kunde anstelle der Werkstatt eingesetzt.
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: zorlayan am Juni 17, 2022, 21:01:11
Zitat von: DF6GL am Juni 17, 2022, 17:12:13Sinnvoller für die Rechnungsposition(en) sind die Daten in Erkl1-5.  Insofern sollten diese Felder in eine (weitere) n-Tabelle "tblRechnungPositionen" ausgelagert werden. Wenn solche "Position" als Gesamtheit vorgegeben sind, sollten diese in eine Nachschlage-Tabelle "tblPosBezeichnungen" erfasst werden und über (Formular-)Kombifeld in tblRechnungPositionen  auswählbar sein.
Hallo,

wo er Recht hat, hat er Recht!
Danke für den Vorschlag.

ich habe die Aktualisierung der Kombifelder im Hauptformular immer noch nicht hinbekommen auch selbst die Beziehungen jetzt entfernt sind.
Kannst du bitte bei der Gelegenheit eine ähnliche Bespieldatei erstellen und zur Verfügung stellen?
Seit einer Woche kriege ich ihn nicht hin und es macht mich verrückt!

VG
Zorlayan
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: Beaker s.a. am Juni 18, 2022, 12:38:45
Hallo Zoryalan,
ZitatLeider beim KFZ-Händler bis zum Verkauf weißt man nicht an wem man das Fahrzeug verkauft.
O.K., daran hatte ich nicht gedacht  >:( . Das ist dann eine so genannte
Sofortrechnung, und es macht Sinn den Kunden erst beim Verkauf zu erfassen.
Das geht aber, wie geschrieben, nicht mit deinem Formular. Ausser du legst
es als ungebundenes Form an und kümmerst dich um die Speicherung selber.
Franz' Vorschlag mit dem Dummy-Kunden halte ich nicht für sinnvoll.
Das die Erkl in eine eigene Tabelle gehören, hatte ich schon geschrieben,
aber dass man die als Rechnungspos. anlegen soll kann ich nicht nachvollziehen,-
die werden ja nicht verkauft. Die Rech.-Pos. ist/sind das/die Auto(s).
Wenn ich's recht verstanden habe sind die Erkl. ja nur spezielle Hinweise, die
den Autos zugeordnet sind. Daraus ergibt sich eine n:m-Beziehung zwischen Erkl.
und Autos.
Das Rechnungs-Form würde ich so gestalten:
DS-Herkunft eine Abfrage mit Rechnungen und Kunden (Ausnahme!, s.#7)
Im Kopf die Rech.-Daten (Nr., Datum usw.) und ein Kombi mit den Kunden, wie
beschrieben.
Im Detailbereich ein UFo für das/die Auto(s), und darin ein UUFo mit den Erkl.
Habe jetzt keine Zeit dafür ein Beispiel zu basteln, da ich mich erstmal in die
andere Geschichte hier mit den Betriebsanweisungen verbissen habe.

gruss ekkehard
Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: DF6GL am Juni 18, 2022, 15:37:24
HAllo,

@Ekkehard:

ZitatFranz' Vorschlag mit dem Dummy-Kunden halte ich nicht für sinnvoll.

Warum?


Zitatdass man die als Rechnungspos. anlegen soll kann ich nicht nachvollziehen,-


Dann muss die Tabelle  tblFzAusstattung heißen und der Preis weggelassen werden... Zugegebenermaßen hängt die Tabelle dann am "Auto" und nicht an der Rechnung.


Insgesamt sollte dann die Bedeutung von "Auto"  und von "Rechnung" neu definiert und die Tabellenkonstruktion angepasst werden.   

Ein "Auto" wäre dann ein verkaufsfähiger "Artikel" in der Firma. Dieser Artikel wird mit allen seinen Erweiterungen (Erklxxx) "hergestellt" und auf "Lager" gelegt.  Wird er verkauft, wird eine Rechnung an den realen Kunden erstellt, die trotz allem auch Positionen erhalten sollte (muss). Es kann ja sein, dass man zusätzlich zum Auto noch weitere Teile oder Dienstleitungen (,die auch "Artikel" wären,) verkaufen will\muss.




Titel: Re: Kombinationsfelder Aktualisieren
Beitrag von: Beaker s.a. am Juni 19, 2022, 11:50:27
Hallo Franz,
Weil sich das Problem aus dem OP nur aus einem falschen Formular-
aufbau ergeben hat.

Beim Rest deiner Ausführungen bin ich ganz bei dir.

gruss ekkehard