Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Rettungshund am Juni 14, 2011, 12:16:56

Titel: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: Rettungshund am Juni 14, 2011, 12:16:56
Hallo Leute,

ich benötige eure Hilfe! Ich habe im Forum die folgenden zwei Themen nicht gefunden. Vielleicht hab ich auch nicht erkannt, dass ein sehr ähnliches Thema behandelt wurde.

Ich habe die Aufgabe übernommen eine Datenbank zu schreiben, die die Ursachen, umstände und Folgen bestimmter Ereignisse dokumentieren soll.

Für die Eingabe der Benutzer habe ich ein Formular mit mehreren Optionsgruppen entworfen. Sollten die Optionsmöglichkeiten nicht passen (umfassen rund 95% der Möglichkeiten) gibt es als letzten Wert den Begriff "sonstiges". Nun zu meiner ersten Frage:

Ich möchte, wenn der Anwender "sonstiges" gedrückt hat ein Freitextfeld sichtbar machen und den Fokus auf dieses Feld setzen, bei jedem anderen Optionswert soll dieses Feld unsichtbar sein und der Fokus auf das nächste dahinterliegende Feld springen.

Meine zweite Frage lautet:

Wie kann ich, wenn der Benutzer eine bestimmte Zahl in ein Feld eingibt, es erreichen, dass Access schaut, ob diese Zahl in einem der älteren Datensätze vorhanden ist. Wenn die Zahl vorhanden ist, soll das Programm einige Feldinhalte des alten Datensatzes in den aktuellen Datensatz kopieren und den Fokus auf ein anderes Feld des Formulars setzen, als es ohne der Übereinstimmung zu setzen wäre.

Für eure Unterstützung wäre ich euch sehr dankbar

lg
Rettungshund

Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: edgar.basler am Juni 14, 2011, 13:50:46
Beantwortung des ersten Teils der Fragen:

1.) In der Optionsgruppe die Eigenschaft "Beim Klicken" setzen.
2.) Im entsprechenden Code prüfen, ob das richtige "Kästchen" gesetzt wurde. Wenn ja, dann
3.) das Feld sichtbar machen und den Focus setzen.

z.B.:

If me.optin_sonstiges = true then
me.freitextfeld.visible = true
me.freitextfeld.setfocus
end if

4.) Damit dies "rund" läuft, sollte beim Ereignis "Formular anzeigen" das Feld "Sonstiges" auf "true" gerprüft werden, und dem entsprechend das Freitextfeld unsichtbar bzw. sichtbar gemacht werden.

Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: imp666 am Juni 14, 2011, 14:14:11
Mit der Funktion "DLookup" oder "DCount" kannst du abfragen ob ein Wert bereits schonmal existiert.
Ebenfalls mit "DLookup" kannst du Werte aus älteren Datensätzen (wie du es nennst) ermitteln, dann kannst du einfach den Feldwert setzen: me!feld=dlookup(...)

Für genauere Infos müsste man wissen was genau du da machst (Feldnamen,...)
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: Rettungshund1 am Juni 14, 2011, 15:02:19
Hallo Leute,

ich bin ganz weg über die Geschwindigkeit eurer Antworten!!

ad Imp666

Sorry, mit "ältere" Datensätzen waren eigentlich schon vorhandene gemeint - die Formulierung war etwas eigen.
Die Datenbank nimmt unter Anderem personenbezogene Daten auf. Der Einfachkeit halber, da es sehr selten vorkommt, dass die zu protokollierenden Ereignisse mehrfach bei einer Person vorkommen, habe ich die Personendaten nicht in eine eigene Tabelle ausgelagert. Die Person wird durch eine eindeutige Zahl im System registriert. Diese Zahl lautet UB_Zahl in der Tabelle Sturz.
Korrespondierend wird zu dieser UB_Zahl in der Tabelle Sturz der Vorname, der Nachname, das Alter und das Geschlecht erhoben. Diese 4 Felder sollen weiterkopiert werden, sollte die UB_Zahl schon existieren und der Fokus auf das darauffolgende Feld gesetzt werden. Bei Nichtvorhandensein dieser UB_Zahl soll der Fokus auf den Vornamen springen.

Mit bestem Dank

Rettungshund
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: DF6GL am Juni 14, 2011, 15:28:29
Hallo,



"Der Einfachkeit halber" wird Dir schwer zu schaffen machen.


Benutz zwei Tabellen, tblPersonen und tblWerte (was für Werte das auch immer sein sollen) und sogar eine dritte, tblOptionen (anstelle der Optionfeld-Geschichte).


Wenn Du bei der Optionsfeld-Geschichte bleiben willst, dann leg die Optionfelder in eine Optionsgruppe, in der jedes Optionsfeld einen bestimmten Wert (seinen Optionswert) an die Optionsgruppe im Fall seiner Aktivierung gibt, der dann ausgewertet werden kann (ähnlich edgar.basler). Die optionsgruppe ist an ein Tabellefeld gebunden, in dem der ausgewählte Optionwert gespeichert wird.




Sub optGruppe_Afterupdate()

Select Case  me!optGruppe
Case 1

Case 2
'mach was

Case 3
'mach was anderes

Case 4

Case 5
me!freitextfeld.visible = true
me!freitextfeld.setfocus

Case else

End Select

End Sub


Damit das auch beim Anzeigen eines DS funktioniert, kannst du im Form_Current-Ereignis die o. g. Prozedur zusätzlich aufrufen:


Sub Form_Current()
optGruppe_Afterupdate
End Sub
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: imp666 am Juni 14, 2011, 15:38:22
If DCount("UB_Zahl","Sturz","UB_Zahl=" & Me!UB_Zahl_Formulareingabefeld)=1 then
   ' Datensatz existiert
   Me!Vorname=DLookup("Vorname","Sturz","UB-Zahl=" &  Me!UB_Zahl_Formulareingabefeld)
   Me!Nachname=DLookup("Nachname","Sturz","UB-Zahl=" &  Me!UB_Zahl_Formulareingabefeld)
   ' ... (ggf. weitere Felder)
Else
   ' Datensatz existiert noch nicht
   Me!Vorname.SetFocus
End If



...habe mich hoffentlich nicht vertippt, hab es nicht in Access bearbeitet.
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: Rettungshund am Juni 14, 2011, 15:41:33
Hallo DF6GL,

da ist mir ein Fehler passiert - es sind keine Optionsfelder sondern es sind alles Optionsgruppen, insgesamt 6 Optionsgruppen mit der "sonstigen-Option" (variert als Optionswert zwischen 5 und 8), die dann ein Freitextfeld sichtbar machen sollen.

Ich habe mich dazu entschlossen die eventuell doppelten Daten - im Schnitt 5-10 / Jahr bei ca. 450 Datensätzen im Jahr zu aktzeptieren, obwohl dies einer sauberen DB-Lösung widerspricht, aber das Formular soll so einfach und so wenig fehleranfällig wie möglich sein, da es im Bedarfsfall von 200 verschiedenen Personen an rund 30 Terminals benutzt werden soll und die unterschiedlichsten Computerkenntnisse vorliegen.

ad imp666

Sorry, die UB_Zahl ist keine fortlaufende oder sonstige natürliche Zahl, sondern setzt sich aus 5 Ziffern einem Schrägstrich und 2 Jahreszahlziffern zusammen - z.B. 00324/11 oder 56785/11


lg
Rettungshund
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: DF6GL am Juni 14, 2011, 15:47:30
Hallo,

vielleicht besser, weil auch mehr als ein Eintrag pro Person existieren könnte:

If DCount("*","Sturz","UB_Zahl=" & Me!UB_Zahl_Formulareingabefeld) >0  then



    Me!Vorname=DLookup("Vorname","Sturz","UB_Zahl=" &  Me!UB_Zahl_Formulareingabefeld)   
Me!Nachname=DLookup("Nachname","Sturz","UB_Zahl=" &  Me!UB_Zahl_Formulareingabefeld)

wobei hier vorausgesetzt ist, es handelt sich bei "UB_Zahl" um Datentyp Zahl, Long in der Tabelle...
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: imp666 am Juni 14, 2011, 16:02:08
Da es sich um kein Zahlenfeld handelt, müsste es in der jeweiligen Abfrage dann "UB_Zahl='" & Me!... & "'" heissen (also in ' Apostroph gesetzt)

@DF6GL:
Jep, das UB-Zahl war ein Tippfehler.
DCount(...)=1 erachte ich als sinnvoll, denn wenn  es mehrere gibt, dann sollte es ja nicht einfach irgendeinen Datensatz verwenden (und das würde genau bei DCount(...)>0 passieren).
Wenn schon DCount(...)>0, dann zumindest DFirst(...) statt DLookup(...) verwenden, dann ist wenigstens eindeutig welcher Datensatz verwendet wird.
Wenn in DCount als erster Parameter das indizierte Feld steht soll das angeblich besser sein, als "*" (das kann bei bestimmten verknüpften Tabellen zu Performanceeinbußen führen)
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: Rettungshund am Juni 14, 2011, 16:12:40
Hallo,

ich danke euch vorerst sehr herzlich für die sehr schnelle und gründliche Hilfe. Ich werde es nach euren Angeben versuchen und melde das Ergebnis zurück

DANKE

Rettungshund
Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: DF6GL am Juni 14, 2011, 16:16:42
Hallo,

@ imp666 :

1)   Dcount ZÄHLT Datensätze (die dem angegebenen Kriterium entsprechen) und liefert keinen Feldwert.  Wenn =1 benutzt wird, ist die Bedingung nur wahr, wenn es nur und nur einen DS mit der angebeneb Personennummer gibt. Wenn es zwei geben sollte, greift die Bedingung nicht mehr, obwohl sie sollte.

2)  ???     DFirst liefert irgendeinen , muss nicht der "erste" (was sowieso nicht zu bestimmen ist) sein, Datensatz aus der Filtergruppe. Insofern ist diese Aussage nicht haltbar.


3) Wenn "*" im Namen-Argument der Funktion, werden auch die DS mitgezählt bei denen UB_Zahl leer (NULL) ist (d. h. überhaupt ein Datensatz vorhanden ist)

Die Performance ist bei DCount (und im aktuellen Fall) eher ein nebensächlicher Aspekt, wobei es stimmt, dass ein "Count" auf ein Indexfeld natürlich schneller vonstatten geht als auf ein nicht indiziertes Feld.

Titel: Re: Optionsfelder sollen den Formularentwurf beeinflussen
Beitrag von: Rettungshund am Juni 20, 2011, 14:30:38
Hallo Leute,

Ich hab jetzt eure Vorschläge versucht, aber es funktioniert nicht!!!

Hier meine Code-Zeilen:

Private Sub RahmenBewusstsein_Exit(Cancel As Integer)

   
    Select Case Me!RahmenBewusstsein
        Case 1
            Me!RahmenOrientierung.SetFocus
        Case 2
            Me!RahmenOrientierung.SetFocus
        Case 3
            Me!RahmenOrientierung.SetFocus
        Case 4
            Me!RahmenOrientierung.SetFocus
        Case 5
            Me!Bewusstsein_Freitext.Visible = True
            Me.Repaint
            Me!Bewusstsein_Freitext.SetFocus
    End Select
   
End Sub

Ich hab auch versucht die Anweisung wie folgt zu formulieren:


Private Sub RahmenBewusstsein_Exit(Cancel As Integer)

    If Me!RahmenBewusstsein = 5 Then Me!Bewusstsein_Freitext.Visible = True
    Me.Repaint
    Me!Bewusstsein_Freitext.SetFocus
    End If
   
End Sub

Im Formular ist die Sichtbarkeit primär auf Nein gestellt. Leider ändert sich das auch nicht durch die obigen Zeilen. Als zweites Problem tritt jetzt auf, dass eine Änderung der Optionswahl bei Fehleingabe durch den Anwender erst auf ein anderes Element gesprungen werden muss, ehe die Auswahl korregiert werden kann.

Bin mir auch nicht sicher, ob die Wahl "Beim Verlassen" als Auslöser richtig ist.

Vielleicht könnt ihr meinen Fehler finden - hoffentlich

Rettungshund