Neuigkeiten:

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

Mobiles Hauptmenü

Begrenzte Werte in Kombifeld anzeigen und nächste freie Nummer vergeben

Begonnen von Rainer 1984, Mai 29, 2011, 03:08:28

⏪ vorheriges - nächstes ⏩

Rainer 1984

Hallo Accessianer,

ich habe ein Problem, dass mir schwer lösbar erscheint. Ob das so funktioniert, wie ich mir das vorstelle, weiß ich nicht. Ich habe mal eine vereinfachte Datei angefertigt und unten beigefügt, die wie folgt aussieht:

Ich möchte in folgende Formulare Datensätze eingeben:
- Artikelstamm
- Kundenstamm
- Lieferantenstamm

Jeder der Datensätze soll eine entsprechende Nummer erhalten. Diese setzt sich aus einer Kombination aus Buchstaben (1-stellig)und Nummern (4-stellig), getrennt durch einen Bindestrich, zusammen. Diese Kombinationen sind in der Nachschlagetabelle ,,Alphanumerikkreise" definiert.
Dabei gibt es in jedem der o.g. Stämme verschiedene Alphanumerikkreise:
- Artikelstamm = 4 Stück: A-1000, A-2000, A-3000, A-4000 (diverse Artikelgruppen)
- Kundenstamm = 2 Stück: K-0000, K-1000 (unregistrierte und registrierte Kunden)
- Lieferantenstamm = 2 Stück: L-0000, L-1000 (unregistrierte und registrierte Lieferanten)

In der Nachschlagetabelle ,,Alphanumerikkreise" sind zusätzlich noch folgende Felder vorhanden:
- Präfix: Die in diesem Feld eingegebenen Daten sind quasi die ,,Anführungszeichen", die im Dropdownmenü der o.g. Stämme auswählbar sind.
- Anwendung in: Hier ist eingetragen, für welchen der 3 Stämme der Alphanumerikkreis auswählbar sein soll.

Und so soll es funktionieren, als Beispiel möchte ich den Kundenstamm nehmen:
1. Ich möchte einen neuen Kunden anlegen, dazu öffne ich das Formular ,,Kundenstamm", ein neuer, leerer Datensatz erscheint. Ich klicke zuerst auf das Dropdownmenü ,,Kundennummer". Jetzt sollen mir NUR die für den Kundenstamm relevanten Präfixe der Alphanumerikkreise angezeigt werden, also nur  K-0 und K-1. Momentan werden ALLE Präfixe (also für den Artikelstamm und Lieferantenstamm) angezeigt.
2. Wähle ich eins der beiden Präfixe aus, soll die nächste freie Nummer vergeben und automatisch vervollständigt werden. 

Beispiel:
- Letzter unregistrierte Kunde war K-0815.
Wenn ich einen weiteren unregistrierten Kunden anlegen möchte, wähle ich K-0 aus und die Nummer K-0816 soll automatisch vergeben werden.
- Letzter registrierte Kunde war K-1386.
Wenn ich einen weiteren registrierten Kunden anlegen möchte, wähle ich K-1 aus und die Nummer K-1387 soll automatisch vergeben werden.

Dies sind meine Probleme:
- Ich kriege es nicht hin, dass mir in den entsprechenden Dropdownmenüs der Stämme nur die relevanten Präfixe zur Auswahl angezeigt werden. Dazu habe ich z.B. im Abfragegenerator des Formulars ,,Kundenstamm" unter ,,Kriterien" der 2. Spalte (AlphNumKr_Anw) das Wort ,,Kundenstamm" (in Anführungszeichen) eingegeben, jedoch ohne Erfolg. Es kommt beim Anklicken des Dropdownmenüs die Fehlermeldung ,,Datentypenkonflikt in Kriterienausdruck".
- Wie kann ich die jeweils 1. Nummer manuell eingeben, also z.B. K-1000? Die soll ja als Basis für alle weiteren, automatisch angelegten Nummern dienen.

Für eine Hilfe wäre ich wirklich sehr dankbar.

Viele Grüße

Rainer


[Anhang gelöscht durch Administrator]

DF6GL

Hallo,




In den "Stamm"-Tabellen muss zunächst je ein weiteres Feld ("LfdNr", Long) eingebaut werden, das die  laufende Nummer eines jeden Datensatzes (Kunde, Lieferant, Artikel) beinhaltet und die dadurch erst überhaupt berechenbar wird.

Die Felder KDSt_KDNR  LiefSt_LiefNr, ArtSt_ArtNr sollten in "....ANKID" umbenannt werden.


so soll es funktionieren:

1) eine Abfrage (SQL) für die Datensatzherkunft des Kombis ("KdSt_ANKID") erstellen, das nur die Prefixe des jeweiligen "Stammes" auflistet:

Select AlphnumKr_ID, AlphnumKr_AlphnumKr from Alphanumerikkreise inner Join Anwendungen
on Anwendungen.Anwend_id = Alphanumerikkreise.AlphnumKr_Anw
where Anwend_Anwend ="Kundenstamm"

2) etwa mit diesem Code:

Sub KdSt_ANKID_Afterupdate()
Me!KdSt_LfDnr.Defaultvalue = nz(Dmax("KdSt_Lfdnr","Kundenstamm"),-1) +1  'Erste Nummer beginnt bei leerer Tabelle bei 0
End Sub


Probleme:
1) Nicht Abfragegenerator für das Formular,  eher für das Kombi  (siehe SQl oben)
2) Es wird nichts manuell eingegeben, die Lfdnr wird berechnet. Wenn die Tabelle leer ist, wird für die  Lfdnr 0 erzeugt. Über den Standardwert im Formular wird die jeweils berechnete LfdNr beim Anlegen eines neuen Ds vorgeschlagen. Es ist sinnvoll, dieses Feld gegen manuelle Eingabe zu sperren.



Rainer 1984

Hallo Franz,

zuerst vielen Dank!!!
Habe den "Kundenstamm" komplett nach Deinem Rat aufgebaut, die anderen Stämme sind noch nicht ganz fertig, werde ich noch anpassen.
Die aktualisierte Datei ist unten beigefügt.

Was ich jetzt schon festgestellt habe:
Punkt 1 funktioniert auf den ersten Blick einwandfrei.
Bei Punkt 2 treten folgende Probleme auf:
- Beim 1. Datensatz wird gar keine Nummer vergeben, erst beim 2. Datensatz wird eine "0" vergeben.
- Die Nummern sind immer in 2 Datensätzen identisch.
- Außerdem nummeriert er fortlaufend, ohne Rücksicht, ob ich vorher "K-1000" oder "K-0000" auswähle.

Kann ich irgendwie im ersten Datensatz die Nummer manuell eintragen, da nicht alle Datensatz-Serien aus "gewachsenen" Gründen bei "0" anfangen?

Übrigens: Was bedeutet das Kürzel ANKID?

Schönen Wochenanfang wünscht

Rainer

[Anhang gelöscht durch Administrator]

DF6GL

Hallo,

naja, damit der ganze Ablauf korrekt vonstatten geht, braucht es noch ein bisschen mehr an programmatischen Aufwand...


Anbei ein Beispiel für den Kundenstamm.

Probleme 1 & 2:

Der Code sollte ja nur das Prinzip zeigen, wie man so etwas realisieren könnte (Defaultwert-Eigenschaft auf berechneten Wert setzen)

Problem 3:
Ja, das war so vorgesehen, die "KdSt_Lfdnr" ist eine "laufende Nummer". ;-)    Im meinem Beispiel hab ich das aber angepaßt.



"Was bedeutet das Kürzel ANKID?"

-->  AnwendungsNummernKreis-ID   

(Ich bin zu faul zum Schreiben ;-)  . Deine Benamsungen sind eher "unhandlich"  )




[Anhang gelöscht durch Administrator]

Rainer 1984

Hallo Franz,

ich kann Deine Datei leider nicht öffnen - es kommt die Meldung:
"Der Extrahierungsvorgang kann nicht fertig gestellt werden. Die Zieldatei konnte nicht erstellt werden."

Viele Grüße

Rainer

Rainer 1984

Hallo Franz,

habe es mehrmals versucht - jedoch kann ich immer noch nicht Deine Datei aus Deinem Beitrag vom 30.05.2011 öffnen.
Bei anderen Dateien im Forum klappt es problemlos.

Schönen Feiertag wünscht

Rainer

DF6GL

Hallo,

anbei ZIP-Archiv mit geringerer Kompression. Vielleicht geht das ja.

[Anhang gelöscht durch Administrator]

Rainer 1984

Hallo Franz,

super - hat geklappt, die Datei konnte ich öffnen!

Funktioniert jetzt, wie ich es mir vorgestellt habe - vielen Dank.
Bezüglich Deiner Änderung im Kundenstamm: Kommt man eigentlich irgendwie ohne die "doppelte" Kombifeld-Ausführung des Präfixes (Präfix im Detailbereich und Nummernkreis im Formularkopf) und vor allem der Befehlsschaltfläche "Datensatz hinzufügen" im Formularkopf aus?

Ich werde mal am kommenden Wochenende versuchen, das zu vereinfachen.
Werde mich wieder melden.

Viele Grüße

Rainer

DF6GL

Hallo,

das gibt Probleme,  weil bei nur einem gebundenen Kombi die Nummer jedesmal bei Neuauswahl verändert werden würde, auch bei schon generierten Nummern.   Was stört Dich denn an dem zweiten (gebundenen) Kombi?  blende es halt aus, wenn Du es nicht brauchst...

Rainer 1984

Hallo Franz,

habe das 2. gebundene Kombi ausgeblendet.

Gibt es eigentlich irgendwie die Möglichkeit, die Befehlsschaltfläche btnNeu zu umgehen?
Dieser soll ja, soweit ich das verstanden habe, das ungebundene Kombifeld txtANKID bei einem neuen Datensatz leer anzeigen, damit manuell eine Auswahl getroffen werden kann. Aber warum steht da, wenn man auf konventionelle Art einen neuen Datensatz öffnet (also durch TAB- bzw. ENTER-Taste nach Eingabe der letzten Eingabe, also des Kundennamens), überhaupt schon ein Wert drin (hier K-1)?

Wenn ich in irgendeiner Datei irgendein Formular öffne, sind doch bei einem neuen Datensatz die Kombifelder von vornherein leer.

Viele Grüße

Rainer

DF6GL

Hallo,

es ist so gewollt (von mir durch den Code ), dass das Feld geleert wird. Wenn der Eintrag von vorher bleiben soll, dann kommentier den Code aus, der das Feld leer setzt.


Mein Code insgesamt ist ja nur ein Vorschlag, wie man an die Nummer lt. Vorgabe kommen könnte(!) und wie man überhaupt das Form bedient.



Es ist halt an Dir, einen genauen(!) und gangbaren Formularbedienaublauf zu definieren...


Die Schaltfläche umgehen (d. h. gar nicht  benutzen/haben zu wollen) ist schon möglich, es ist lediglich ein auslösendes Ereignis zu bestimmen.

Rainer 1984

Hallo Franz,

okay - werde versuchen, es entsprechend umzubauen.
Werde mich danach wieder melden.

Schönen Sonntagabend

Rainer

Rainer 1984

Hallo Franz,

habe eine Lösung ohne Schaltfläche gefunden, die scheint zu funktionieren.
Hier der umgestellte Code vom Kundenstamm:Private Sub Form_Load()
    DoCmd.GoToRecord , , acNewRec   'Neuer Datensatz
End Sub

Private Sub Form_Current()
    Me!KdSt_ANKID.DefaultValue = ""
    Me!KdSt_LfdNr.DefaultValue = ""
    Me!txtANKID = Null
    Me!txtANKID.Visible = Me.NewRecord
End Sub

Private Sub txtANKID_AfterUpdate()
    Me!KdSt_LfdNr.DefaultValue = Nz(DMax("KdSt_Lfdnr", "Kundenstamm", "kdst_Ankid=" & Me!txtANKID), -1) + 1 'Erste Nummer beginnt bei leerer Tabelle bei 0
    Me!KdSt_ANKID.DefaultValue = Me!txtANKID
    Me.KdSt_LfdNr.Locked = Not Me!KdSt_LfdNr.DefaultValue = 0
End Sub


Viele Grüße

Rainer

Rainer 1984

Hallo Franz,

mir ist noch ein Problem eingefallen - bin leider erst jetzt draufgestoßen.  :-[

Auch akquirierte Kunden werden in den Kundenstamm aufgenommen, bei denen jedoch noch nicht feststeht, welchem Alphanumerikkreis sie mal angehören werden. Deshalb erhalten diese noch gar keine Kundennummer.

Möchte ich zu einem späteren Zeitpunkt nachträglich eine Nummer generieren, geht das nicht.
Habe versucht, den Code entsprechend umzubauen, bisher ohne Erfolg.  ???

Ist sowas überhaupt möglich? Dafür müssten nicht nur all die vor dem betroffenen Datensatz (also dem ohne Kundennummer) liegenden Datensätze berücksichtigt werden, sondern alle darauf folgenden auch, um die nächste freie Kundennummer zu generieren.

Einen schönen Pfingstmontagnachmittag wünshct

Rainer

DF6GL

Hallo Rainer,


diese ganze Vorgehensweise ist Quatsch, sorry..., soll heißen: db-technischer Unsinn.


Ein Kunde ist ein Kunde, ob nun "akquiriert" oder nicht.  Sobald ein Kunde erfasst wird, erhält er eine Kundennummer, die NICHT SPRECHEND sein darf (dringend "sollte") .  Der "Zustand"  (Status, Kategorie) eines Kunden ist ein Attribut des Kunden und keine Definition (Kennung), insofern ist es sinnvoll, im Datensatz ein Feld mitzuführen, das eben den (akt.) Status des Kunden aufnimmt ("neu", "akquiriert", "archiviert", "gelöscht", "gestorben",  etc), wobei diese Kategorien gemäß den Normalisierungsregeln in einer extra Tabelle geführt werden.


Ist sowas überhaupt möglich?
möglich ist es, genau so, wie aus einem Auto einen Hubschrauber zu bauen...  ;) ;D