PDA

Vollständige Version anzeigen : Globale Variabeln


MarcH870
28.08.2001, 14:49
Hallo,

ich will mit globalen variabeln arbeiten , wird aber häufig als riskant angegeben,(bücher ect)
mit riskant meine ich , dass eine kombobox sich in ein text feld verwandelt, hab ich noch nicht erlebt und auch heri im forum noch nicht lesen können , dass parameter sich plötlich verändert haben oder text felder in eienm formular verschwinden ,schon
würde also gerne von euch wissen ,wie anfällig sind Globale Variabeln

die sollen nämlich folgendes machen

eine kombobox im HF wird angeklickt und die GlobV setze ich auf TRUE und setze den Focus auf ein Textfeld im UF
bei Focuserhalt des textfeldes werden daten aus eienr Tabelle gefiltert (mit db.openrecordset usw)
dann lasse ich den curser eine zeile weiter gehen im UF
damit jetzt nicht wieder -BeiFocusehalt - ausgelöst wird , muss GlobV auf False stehn

Wiso und warum ich das so machen will ? ich bin ne ganz schlecht tippse ,müsste sehr viel schreiben dazu.
Ich bin mir sicher ,dass das die beste Lösung wäre ,aber mache mir halt sorgen wegen der Verlässligkeit von GV

Baue voll auf eure Hilfe

Gruss marc

Günni
28.08.2001, 18:03
Der Grund warum von globalen Variablen in Standard-Modulen abgeraten wird ist eigentlich nur, dass man von jeder Stelle der Anwendung aus diesen Wert verändern kann und es deshalb schwierig ist - vor allem in größeren Projekten - immer sicher zu sagen, dass der Wert in der Variable auch wirklich der ist, den ich im Moment haben möchte. Wirklich kaputt gehen kann dabei aber nix (außer dass Du Datenschrott produzierst).

Das mal grundsätzlich ... ich muß aber zugeben, dass ich Dein Problem noch nicht so ganz verstanden hab ... wenn es nur um die Kommunikation zwischen einem Unterformular und einem Hauptformular geht, gibt es bedeutend "elegantere" Möglichkeiten als eine globale Variable in einem Standard-Modul (zum Beispiel eine globale Variable im Hauptformular, die dann automatisch zu einer Eigenschaft des Formulares wird und sich von Unterformular aus etwa über die Forms("Hauptformularname").NameDerEigenschaft ansprechen läßt).

<hr>

<font color="#808080" size="2" face="Arial"><strong>Mühldorfer Günter
Computer- und Software-Service
</strong></font>
mg@mgcss.de
<a href="http://www.mgcss.de">www.mgcss.de</a>

MarcH870
29.08.2001, 10:28
Hallo Günter,
danke für die Antwort
stelle jetzt mal die Prozedur rein die für diesen Fall ablaufen soll

-Modul UFORM
Public uformstart as Boolean


-KlickEreigniss Kombobox HF

Private Sub getkey_Click()

uformstart = True
DoCmd.GoToControl "USelectStand"
Forms!Bestellung!USelectStand.Form!Bzeichnung.SetFocus

End sub


-Bei Fokuserhalt für Steuerelm.Bzeichnung im UF

Private Sub Bzeichnung_GotFocus()

Dim db As Database
Dim rs As Recordset

Dim sql As String
Dim arrstand(1 To 30) As String
Dim t As String

Dim i As Integer
Dim a As Integer

Do Until uformstart = False

Set db = CurrentDb()
t = Forms!Bestellung.getkey.Value
sql = "SELECT * FROM tVerbfahrzStan WHERE Refkeyfahrzeug ='" & t & "'"

Set rs = db.OpenRecordset(sql, dbOpenDynaset)
rs.MoveLast
rs.MoveFirst
i = rs.RecordCount
uformstart = False
Loop

a = 1
Do Until a = i

Me.Bzeichnung.Value = rs!Bezeichnung.Value
rs.MoveNext
DoCmd.GoToRecord , , acNewRec
a = a + 1
Loop

End sub


ich will damit das Steuerelement -Bzeichnung- (ungebunden)im UF füllen , da die Werte eventuel gändert werden müssen und es um
Mehrbenutzung geht sehe ich keine andere Möglichkeit
ich habe zunächst angenommen ,es würde ausreichen das UF beim Laden ,nicht duch bindung an eine Abfrage zu füllen ,sondern
durch ein Recordset (also SQL String und dann db.openRecordset(SQL,opendynaset)aber es besteht dann wohl immer noch eine
verbindung zur DatnQ , so dass ,wenn 2 user den selben Wert in der Kombobox auswählen, um damit das UF zu filtern und dann
Daten bearbeiten überschreiben Sie sich gegenseitig

So wie es jetzt geht klappt es schon fast , aber komischerweise erhöht sich die Anzahl vom Steuerelemnt -Bzeichnung- im UF
nicht (steht aber auf Endlos)

Deien Vorschlag habe ich gerede ausprobiert,
.
.
Public test as boolean 'im HF

-dann im UF aufgerufen

Forms("HF"). aber test erschin dann nicht.
bei der Gelegenheit möchte ich noch fragen ,wieso muss der Name in Klammern,mit anführungstr. stehen ,Warum gehts nicht auch
mit -!-
in der OH werden beide Möglichkeiten angegeben

so, das wärs , auch wenns viel ist , hoffe ich ganz stark aufdeine Hilfe Günter

freue mich natürlich auch über jeden anderen Access Profi der sich hier meldet

gruss marc

MarcH870
29.08.2001, 23:27
HELP PLEASE

Hallo Günter ,bitte melden

MarcH870
06.09.2001, 13:09
HELP PLEASE

Sascha Trowitzsch
06.09.2001, 14:26
Wozu brauchst du jetzt noch so dringend HILFEEE?

Wie Gunni sagt, gibt's mit globalen Variablen überhaupt keine Probleme, wenn man den Überblick über deren Namen und Verwendung hat. Wenn du GlobV sowieso nur in dem einen Formular verwenden willst, dann mach das doch!

Ciao, Sascha

MarcH870
07.09.2001, 20:56
Hi sascha,

"Wozu brauchst Du jetzt noch Hilfe"

"So wie es jetzt geht klappt es schon fast , aber komischerweise erhöht sich die Anzahl vom Steuerelemnt -Bzeichnung- im UF
nicht (steht aber auf Endlos)"

erwin
08.09.2001, 09:06
Uiiijehhh Marc.....

wenn ich mir deinen Code so ansehe, dann meine ich, dass du noch einige grundlegende Dinge im Zusammenhang mit Acc.Formularen nicht auf die Reihe gebracht hast.

Das Durchlaufen der Schleife bewirkt nämlich gar nichts, da du ja nie einen neuen DS (ist das UFo überhaupt an eine Tab./Query gebunden ?) anlegst + speicherst. Erst danach würde ein "DoCmd.GoToRecord , , acNewRec" etwas bewirken - ausserdem scheint mit dein 1.Loop-Stmt. dubios.

Endlosforms(Datenblätter) in Acc. stellen immer jene Menge an Zeilen (+ 1 leere wenn INSERTS möglich sind) dar, welche der Anzahl an Datensätzen entsprechen, die in der Tab./Query vorhanden sind, an welche das Formular gebunden ist. Änderungen (sofern prinzipiell möglich) an den dargestellten Daten werden auch direkt in die entspr. Tabellen übernommen.

Insoferne kann man Forms für die Darstellung irgendwelcher "programmdefinierten Werteauflistungen" (Arrays) am einfachsten so verwenden, indem man die Werte in eine (Hilfs-)Tabelle schreibt und diese als Grundlage des Formulars (Datenherkunft) nimmt.

Schau dir einfach mal die Nordwind MDB genauer an - insbesondere wie dort Formulare verwendet werden.

HTH erwin...

MarcH870
08.09.2001, 18:15
Hallo Erwin,

kann sein ,dass mir noch ein paar grundlegende
dinge fehlen , die Anweisung "Docmd.gotorecord,, acNewRecord " habe ich halt bisher immer als Befehl betrachtet ,mit dem man einem Form oder Uform dazu bringen kann -eben eine neue zeile (Datensatz ) aufzumachen , dass man damit einer bestehenden D-Gruppe ,die an dieses Form. gebunden ist ,automatisch einen neuen Datensatz zufügt ist schon klar, aber schliesslich giebt es ja auch :

Dim rs as recordset
.
.
.
rs.Addnew

also habe ich angenommen ,dass "Docmd..." , (da es ja nicht das recorsetobjekt anspricht ) ein Form evnt. auch erweiter ,ohne dass es gebunden ist .

Ich habe sehr viel rumprobiert und es sah immer wieder so aus als wäre ich kurz davor

Bez. erste Schleif: gut, hier fehlt die kurze anweisung ,dass beim öffen des HF die Glob.V. auf true gesetz wird . Dadurch soll verhindert werden dass beim Fokuserhalt des Steuerelemnts (dieses Ereigniss würde ja jedesmal eintreten bei "Docmd...acNewRec") diese Schleife nicht mehr durchlaufen wird .
Und während ich dies schreibe fällt es mir wie schuppen aus den haaren, ohne fokuserhalt natürchlich kein recordset->kein recordcount-> i = 0 und damit letztlich alles fürn ...
scheisse

aber trotzdem danke dass du dich gemeldet hast , bin ich davon erlöst