Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: ElkeS am April 30, 2015, 13:10:04

Titel: Formular und globale Variable
Beitrag von: ElkeS am April 30, 2015, 13:10:04
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
Titel: Re: Formular und globale Variable
Beitrag von: DF6GL am April 30, 2015, 13:25:09
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..
Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am April 30, 2015, 13:57:29
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
Titel: Re: Formular und globale Variable
Beitrag von: DF6GL am April 30, 2015, 14:05:16
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?





Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am April 30, 2015, 14:36:40
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
Titel: Re: Formular und globale Variable
Beitrag von: DF6GL am April 30, 2015, 15:01:03
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.

Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am Mai 04, 2015, 07:34:07
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
Titel: Re: Formular und globale Variable
Beitrag von: DF6GL am Mai 04, 2015, 09:01:14
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)
Titel: Re: Formular und globale Variable
Beitrag von: Hondo am Mai 04, 2015, 10:08:24
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
Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am Mai 07, 2015, 12:11:02
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
Titel: Re: Formular und globale Variable
Beitrag von: MaggieMay am Mai 07, 2015, 12:46:25
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?
Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am Mai 07, 2015, 12:56:45
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
Titel: Re: Formular und globale Variable
Beitrag von: DF6GL am Mai 07, 2015, 12:59:41
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

Titel: Re: Formular und globale Variable
Beitrag von: MaggieMay am Mai 07, 2015, 13:18:24
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.
Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am Mai 07, 2015, 15:01:04
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
Titel: Re: Formular und globale Variable
Beitrag von: MaggieMay am Mai 07, 2015, 15:50:42
Wenn du nach der höchsten vergebenen Nummer suchen willst, so brauchst du zwingend auch den Kennbuchstaben mit dem diese "Nummer" beginnt. Wie bzw. womit sonst willst du ein Abfragekriterium erzeugen - was ist daran so schwer zu verstehen?

Und dies hier:
Zitatwenn 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
halte ich für einen Trugschluss. Wer sagt denn, dass ausgerechnet dies die zuletzt vergebene Nummer ist?

Ist diese Samplenummer Teil der Datensätze des Unterformulars? Vielleicht solltest du erstmal über die Inhalte sprechen. Besteht eine einfache 1:n-Beziehung zwischen HF und UF, bspw. so wie bei einer Bestellung und den Bestelldetails (=Positionen)?
Titel: Re: Formular und globale Variable
Beitrag von: ElkeS am Mai 08, 2015, 10:00:22
Hallo,
vielen, vielen Dank - mit der Funktion bekomme ich, was ich will.

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


Ich muss allerdings in meinen Tabellen noch eine Spalte für Datum+Uhrzeit anlegen damit ich auch wirklich den letzten Eintrag bekomme!
Gruß ElkeS
Titel: Re: Formular und globale Variable
Beitrag von: MaggieMay am Mai 08, 2015, 13:25:58
Ja, damit bist du dann tatsächlich unabhängig vom aktuell vergebenen Kennzeichen - es sei denn es könnten auch nachträgliche Erfassungen zum Vorjahr stattfinden.