Neuigkeiten:

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

Mobiles Hauptmenü

Formular und globale Variable

Begonnen von ElkeS, April 30, 2015, 13:10:04

⏪ vorheriges - nächstes ⏩

ElkeS

Liebe Nutzergemeinde,

ich bin hier im Forum ein "Newbie" und auch bei der DB-Arbeit unter Access 2010.
Meine spezielle Frage bezieht sich nun auf die Wertübergabe aus einem Unterformular an eine globale Variable.
Ist: Ein Hauptformular mit 3 Unterformularen (Grundlage sind 4 Tabellen)
Formularstart: Letzter Datensatz wird angezeigt im Hauptformular und in den Unterformularen.
Soll: In einem Unterformular wird eine "Nummer" angezeigt (zusammengesetzt aus Buchstaben und Zahlen), diese Nummer soll gespeichert werden in globaler Variable. Beim Anlegen eines neuen Datensatzes soll diese Nummer um Eins erhöht werden und im betreffenden Feld (UFO) angezeigt werden. Eine manuelle Eingabe soll so verhindert werden.
Brauche ich überhaupt eine globale Variable oder kann ich dieses Problem auch anders lösen?
Gruß ElkeS

DF6GL

Hallo,


aus was genau besteht diese (Text-)Nummer  (Beispiel!)?

Gibt es weitere Vorgaben für die  Erzeugung  dieser Nummer?
Wie und wo kommt diese Nummer in den Tabellen vor Tabellen- und Feldname)?

Wenn der numerische Teil der Nummer bei jedem neuen DS (gibt es einen Primärschlüssel und wie heißt das Feld?) um 1 erhöht werden soll, wäre es empfehlenswert, die Nummer in 2 Tabellenfelder aufzuteilen, ein Feld (Datentyp Text) für den Text-Teil, ein zweites für den numerischen Teil (Datentyp Zahl, Long). Dann könnte diese numerische Zahl z. B. in der Eigenschaft "Standardwert" des Formular-Textfeldes, das diese Zahl anzeigt, in etwa so berechnet werden:

=nz(Dmax("FeldDesNumTeils";"tblTabelle1") +1);1)

Globale Variablen sind nicht nötig..
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

ElkeS

Hallo,
Danke für die schnelle Reaktion!
1.   (Text-)Nummer  (Beispiel!) z.B.  A1, A2, A3.....A999999
2.   Tabelle: tblSample
3.   Feldname: txtSamplenum
4.   Primärschlüssel: bytMasterID
Die Berechnung ist so nicht mein Problem! Auch das Separieren der String und der numerischen Komponente aus dem Gesamtstring (A1) ist nicht das Problem!
Das Auseinandernehmen der beiden Teile (also String und Num – 2 Felder) wäre eine Möglichkeit.
Ich hatte mir es aber so gedacht: Beim Öffnen des Formulars wird ja der letzte Datensatz angezeigt. Auch in dem UFo mit der [txtSamplenum] (also z.B. A156) – Zugriff beim OpenForm-Ereignis auf das UFo und abspeichern der letzten [txtSamplenum]. Beim NewRecord-Ereignis und Hingehen zum UFo
hochzählen der [txtSamplenum] und Anzeige derselben.
Ist das zu umständlich gedacht oder geht das gar nicht?
Gruß ElkeS

DF6GL

Hallo,

ZitatIst das zu umständlich gedacht oder geht das gar nicht?

Mehr als umständlich.....

Gibt es weitere Vorgaben für die  Erzeugung  dieser Nummer?
hast Du nicht beantwortet...

Steht grundsätzlich "A" vor der Zahl? Und von was hängt dieser Vorspann ab?





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

ElkeS

Hallo,
Sorry!
Der Vorsatz wird sich von Jahr zu Jahr ändern! Also dieses Jahr ,,A" und ,,AA" und nächstes Jahr ,,B" und ,,BB" usw. (liegt nicht bei mir – ist eine Vorgabe!!!) und wenn das ausgeschöpft ist....
Das soll nur nicht manuell eingegeben werden wegen Fehler und Schnelligkeit!
Wenn Du sagst - zu umständlich - dann muss ich wohl doch in der Tabelle ändern! Aber interessieren würde mich der Zugriff auf den letzten Wert doch!
Gruß ElkeS

DF6GL

Hallo,





sorry, aber ich kapiere den Algorithmus zur Berechnung einer neuen "Nummer" immer noch nicht...

ZitatAlso dieses Jahr ,,A" und ,,AA" und nächstes Jahr ,,B" und ,,BB" usw.

Was heißt das?  Gibt es jetzt unterschiedliche Prefixe ("A","B","C", etc.)  und sollen die dann nächstes Jahr "AA","BB","CC" respektive heißen?  (Heißen die Prefixe wirklich so oder sind das nur Beispiele?  Woher kommen die Prefixe als solche überhaupt?)

Hat jeder Prefix seinen eigenen laufenden Nummerblock? D. H. es gibt z. B.  "A5", "B5","C5"?

Soll die laufende Nummer beim Jahreswechsel ("A"--> "AA")  jeweils wieder bei 1 beginnen?




ZitatAber interessieren würde mich der Zugriff auf den letzten Wert doch!

Es gibt keinen "letzten" Wert, lediglich einen "höchsten" Wert, und der kann bei numerischen Werten mit der Dmax() bestimmt 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

ElkeS

Hallo Frank,
vielen Dank für Deine schnellen Antworten!
Also einen Algorithmus zur Samplenummerberechnung – Fehlanzeige – es gibt keinen! Es wird festgelegt mit jedem neuen Jahr! – in diesem Jahr ,,A" und ,,AA" und im nächsten ev. ,,B" und ,,BB". Die Zahlen fangen mit dem Jahr bei Eins wieder an!
Darauf habe ich keinen Einfluss.
Nun nochmal zu meinem eigentlichen Problem!  Ich glaube ich habe mich da verrannt! Mir wird scheinbar nur das Schreiben einer Funktion helfen, mit der ich den letzten bzw. höchsten Wert aus meiner Sampletabelle abrufe, meinem Eingabeformular zur Verfügung stelle und damit eine neue Samplenummer – Erhöhung des numerischen Teils um Eins – bereitstelle.
Wo und wie schreibe ich nun diese Funktion – kommt sie genau wie eine globale Variable in ein eigenes Modul? Oder kann ich das auch als Routine im Open-Formular Ereignis ablaufen lassen?
Wie bekommt mein UFo dann die entsprechende Information?
mfG ElkeS

DF6GL

#7
Hallo,

die Lösung habe ich anfangs schon präsentiert...

Wobei immer noch nicht klar ist was

Zitatin diesem Jahr ,,A" und ,,AA" und im nächsten ev. ,,B" und ,,BB".
bedeuten soll.

Wird "A" und "AA" (das sind zwei Prefixe!) in diesem Jahr gemischt verwendet, oder wie? Soll das evtl. die Kennung für ein bestimmtes Jahr sein?


Wenn es keine solche Bedeutung  hat, wie soll dann die Vorgabe: "Soll bei jedem neuem Prefix und pro Jahr wieder bei 1 beginnen" (automatisch) realisiert werden?

Es könnte dann so gelöst werden, dass unabhängig vom Prefix, der manuell eingegeben wird, das Feld mit der laufenden Nr. bei Beginn eines neuen Jahres um 1 erhöht wird.


Ich schlage vor:

baue drei Tabellenfelder für den Prefix ("sample_prx", die laufende Nr ("sample_lfdnr")und für das Erfassdatum ("sample_edat",  Standardwert: =Datum() ) ein.

In der Eigenschaft Standardwert für das Formular-Textfeld, das die lfdnr anzeigt kommt:

=wenn (Jahr(Dmax("sample_edat";"tblSamples")) = Jahr(Datum()) ;  nz(Dmax("sample_lfdnr";"tblSamples") +1 ; 1)  ;  1)
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

Hondo

Hallo,
falls du aus irgendwelchen Gründen bei dieser Benummerung bleibst/bleiben musst, erstell doch eine kleine Funktion in einem Modul welche einfach die Zeichen von anfang an entfernt die nicht numerisch sind. Ich hab das mal für dich getan:

Public Function fetchNumber(ByVal cNumber As String) As String
    Do While Not IsNumeric(Mid(cNumber, 1, 1))
        cNumber = Mid(cNumber, 2)
    Loop
    If IsNumeric(cNumber) Then fetchNumber = cNumber
End Function


Gruß Andreas

ElkeS

Hallo,
vielen Dank für Eure Bemühungen aber das hilft mir alles nicht so richtig weiter, denn das Hochzählen der Nummer ist nicht das Problem. Ich versuche es nochmal zu erklären:
Beim Öffnen meines Hauptformulars wird der letzte Datensatz mit einer ID angezeigt falls es zu dieser ID in den Unterformularen eine Eintragung gibt wird sie auch angezeigt, falls nicht bleibt das Unterformular leer, d.h. mein Steuerelement mit der Samplenummer bleibt leer.
Jetzt will ich einen neuen Datensatz eingeben und dazu gehört auch eine Samplenummer, dann brauche ich die letzte vergebene Nummer (egal zu welcher ID sie gehört) um sie dann um Eins zu erhöhen. Nun meine Frage wie und wo komme ich an diese letzte Nummer?
Gruß ElkeS

MaggieMay

Hi Elke,

wenn du das nicht jedes Jahr neu programmieren willst, musst du den aktuell verwendeten Präfix irgendwo abspeichern.
Zitatin diesem Jahr ,,A" und ,,AA"
Wie willst du entscheiden, welcher zu verwenden ist?
Freundliche Grüße
MaggieMay

ElkeS

Hi Maggie,
eine Abfrage, welcher Buchstabe aktuell sein soll (müsste per Hand eingegeben werden), zum Jahresanfang sollte dazu reichen, dass wie schon gesagt sind aber eigentlich nur Randprobleme! Ich weiß nur nicht an welcher Stelle ich die letzte vergebene Nummer abfragen kann damit ich sie dann im Formular für die neue Dateneingabe zur Verfügung habe.
Grüße ElkeS

DF6GL

Hallo,

sorry, ich verstehe immer weniger, was Sache ist...


Zeig mal einen Screenshot des Beziehungsfensters... oder besser noch, lade die Db hier mal hoch (repariert/komprimiert, evtl. datenreduziert und gezippt) .


ZitatBeim Öffnen meines Hauptformulars wird der letzte Datensatz mit einer ID angezeigt

heißt das, der DS mit dem höchsten ID-Wert (aus der Tabelle, auf der das Hauptform basiert) wird angezeigt? 

Zitatfalls es zu dieser ID in den Unterformularen eine Eintragung gibt wird sie auch angezeigt, falls nicht bleibt das Unterformular leer, d.h. mein Steuerelement mit der Samplenummer bleibt leer.

WELCHE ID wird angezeigt? Die aus dem Hauptform oder die aus der Tabelle, auf der das Unterform basiert?

ZitatJetzt will ich einen neuen Datensatz eingeben

WO soll ein neuer DS angegeben werden? Im Unterformular (vermutlich)?

Zitatbrauche ich die letzte vergebene (Sample-)Nummer (egal zu welcher ID sie gehört)


Diese "letzte vergebene Nummer" hat aber keinerlei Bezug zu irgendwelchen anderen Daten... Woher soll man die dann nehmen?  Allenfalls könnte die Sampletabelle nach einem Datumsfeld "Erfassungsdatum" (das bei der Neuanlage eines DS auf das aktuelle Datum mit Uhrzeit gesetzt wird) absteigend sortiert und davon der erste Wert genommen werden.


Public Function LastSampleNr()
LastSampleNr=Currentdb.Openrecordset("Select top1 samplenr from tblSamples order by Erfassungsdatum desc",dbOpenSnapShot)(0)
End Function

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

MaggieMay

Zitateine Abfrage, welcher Buchstabe aktuell sein soll (müsste per Hand eingegeben werden), zum Jahresanfang sollte dazu reichen
Wenn du die Jahreskennung nicht speicherst, wirst du immer wieder danach gefragt werden müssen. Und wenn sie nicht eindeutig ist, nützt dir das auch nichts.
Eine Antwort auf die Frage, wie du entscheiden willst ob nach "A" oder "AA" gesucht werden soll, hast du auch nicht gegeben.

Zitatdass wie schon gesagt sind aber eigentlich nur Randprobleme!
Ohne Klärung dieser "Randprobleme" gibt es keinen Lösungsansatz.

Auf die DMax-Funktion wurdest du bereits hingewiesen, wenn dir das nicht weiterhilft, musst du die Zusammenhänge einfach nochmal genauer beschreiben.
Freundliche Grüße
MaggieMay

ElkeS

Hallo,

Zitat:
heißt das, der DS mit dem höchsten ID-Wert (aus der Tabelle, auf der das Hauptform basiert) wird angezeigt?

 
...genau

Zitat:
WELCHE ID wird angezeigt? Die aus dem Hauptform oder die aus der Tabelle, auf der das Unterform basiert?


...z.B.: ID=2436 Hautformular zeigt die Werte zur ID
Unterformulare zeigen auch die Werte zur ID=2436 an (falls es welche gibt, falls nicht ist das Unterformular leer)

Zitat:
WO soll ein neuer DS angegeben werden? Im Unterformular (vermutlich)?


Ein neuer Datensatz wird sowohl im Hauptformular und wenn Werte für die Unterformulare vorhanden sind, werden sie auch in die entsprechenden Unterformulare eingetragen. Falls es keine Werte für ein Unterformular gibt z.B. für das Sampleformular dann wird dort auch kein neuer Datensatz für die ID angelegt.

Zitat:
Diese "letzte vergebene Nummer" hat aber keinerlei Bezug zu irgendwelchen anderen Daten... Woher soll man die dann nehmen?  Allenfalls könnte die Sampletabelle nach einem Datumsfeld "Erfassungsdatum" (das bei der Neuanlage eines DS auf das aktuelle Datum mit Uhrzeit gesetzt wird) absteigend sortiert und davon der erste Wert genommen werden.


...nur teilweise richtig, es gibt keinen Bezug zur aktuellen ID wenn es zu dieser ID im Unterformular keinen Eintrag gibt, wenn doch dann ist es der letzte Eintrag und der ist dann auch im Unterformular zu lesen und dann habe ich auch einen Wert zur Berechnung der Samplenummer aber wenn nicht dann...
Es geht nur Datum + Uhrzeit, denn pro Datum kann es mehrere Einträge geben aber mit der Uhrzeit wäre es eindeutig. Die Funktion könnte die Lösung sein aber wo schreibe ich sie hin und wann und wie rufe ich sie auf?

Zitat:
Wenn du die Jahreskennung nicht speicherst, wirst du immer wieder danach gefragt werden müssen. Und wenn sie nicht eindeutig ist, nützt dir das auch nichts.
Eine Antwort auf die Frage, wie du entscheiden willst ob nach "A" oder "AA" gesucht werden soll, hast du auch nicht gegeben.


...ich brauche doch nur auf den Beginn eines neuen Jahres (Date()) zu testen und falls dann wird eine neue Buchstabenkennung eingegeben.  Falls ,,B" dann wird auch ,,BB" zugelassen, es gibt sicher einen Befehl zum Replizieren.

Sorry aber ich stelle mich bestimmt zu blöd an!
Danke für die Geduld und viele Grüße ElkeS