Neuigkeiten:

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

Mobiles Hauptmenü

Variablen verlieren wert

Begonnen von elvodia, Dezember 27, 2011, 11:07:38

⏪ vorheriges - nächstes ⏩

daolix

#15
Wenn du nicht alle Variable deklarieren willst dann lösche die Zeile Option Explicit. Ist aber nicht zu empfehlen.

und ohne das ich wirklich verstehe was du vorhast mußt du deine Sub Form_Load ändern:


Private Sub Form_Load()
   VAR_patient_alt = Me.tf_patient
   VAR_behandlungsart_alt = Me.tf_behandlungsart
   VAR_RZ_ID_alt = Me.tf_RZ_ID
   MsgBox VAR_patient_alt & ", " & VAR_behandlungsart_alt & ", " & VAR_RZ_ID_alt
End Sub


damit die FormularFunktions(sub)-übergreifende Variablen benutzt werden.


DF6GL

Hallo,


ich habe Option Explicit aus Kopf geschmissen. nun kann ich docmd.requery wieder benutzen wie ich mag und er meckert nicht mehr wegen Variablen wenn ich da ein Form name eintrage.


da kann ich auch nur sagen:  das ist nicht nur KEINE Lösung, das ist überhaupt keine Lösung    :'( :o

Durch das Abwürgen der Hilfestellung des VBA-Editors wird der Code ja nicht besser und wird trotzdem NICHT funktionieren.





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

Stapi

Hallo Franz, hallo daolix

@elvodia versucht über ein "klick Ereignis" zu prüfen, ob an ihren Datensatz in Bezug auf die drei Felder ein Wert oder Inhalt geändert worden ist, um ihn dann im Abschluß nochmals zu speichern.
Ich kann aus ihren Code nicht erkennen was geschieht wenn dieser besagte "Save Button " nicht betätigt worden ist, kann der Anwender dann zum nächsten Datensatz springen ohne Prüfung? Somit wäre die Änderung auch ohne Prüfung übernommen.

Hier ist aus meiner Sicht der Ansatz Fragwürdig, wenn eine Prüfung stattfinden soll dann in den Formular Feldern mit einer [Ereignisprozedur] z.b  "nach Änderung" ober "bei Änderung"

Eine Grundregel die du @Df6GL ( Franz ) angesprochen hast, immer im Klassenmodul "Option Explicit" zu verwenden, sollte mann schon beachten, alleine schon im an betracht der selbst Kontrolle eine Variabel nicht deklariert zu haben, von den Problemen die im Nachgang kommen könnten bei nicht beachtung gar nicht zu reden.

Gruß Stefan
Grüße aus dem schönen NRW
Stefan

database

#18
Hallo,

Zitatich habe Option Explicit aus Kopf geschmissen. nun kann ich docmd.requery wieder benutzen wie ich mag ....
Bitte nicht böse sein aber - hast du schon mal nach dem Begriff 'Humbug' gegoogelt?

DoCmd.Requery (NamedesSteuerelments)

DoCmd.Requery "NameDesFormulars"

Du mußt halt das Requery-Kommando richtig einsetzen dann klappts auch mit 'Option Explicit'

Hat aber Franz bereits in #13 GENAU SO dargestellt!

Bei deiner Syntax passiert nämlich gar nix - ausser dass DEIN Fehler - weil keine Variablendeklaration mehr verlangt wird - nicht mehr gemeldet wird!

@daolix
ZitatWenn du nicht alle Variable deklarieren willst dann lösche die Zeile Option Explicit. Ist aber nicht zu empfehlen
...ist nicht nur nicht zu empfehlen sondern m.E. grob fahrlässig!

elvodia

Mein Problem ist einfach das wenn ich "Option Explicit" im Head habe, er Meldungen Bringt die ich nicht verstehe.

Kein Option Explicit im Head

DoCmd.Requery FM_behandlungen

Aktualisiert mir das Form Welches sich in FM_INDEX(Hauptform).UF1(Unterform) befindet

Option Explicit im Head

DoCmd.Requery FM_behandlungen ---> Variable nicht definiert

DoCmd.Requery "FM_behandlungen" ---> Laufzeitfehler '2109' Der aktuelle Datensatz enthält kein feld mit dem Namen 'FM_behandlung'

DoCmd.Requery 'FM_behandlungen' --> Aktualisierung Funktioniert jedoch wird mir 'FM_Behandlungen' in grün angezeigt was für mich auf ein Kommentar deutet.

Wie ist es denn nun richtig?



database

#20
Hallo,

die erste Variante ist schlicht und ergreifend falsch, ebenso die Zweite und bei der Vierten ist - wie du richtig bemerkt hast - der Objektname auskommentiert.

Variante 3 ist Syntaktisch richtig.

Befindest du dich beim Ausführen des Requery-Befehls im Formular FM_behandlungen ?
Wenn ja dann lies doch noch einmal Antwort #13 von DF6GL ...

Zitatwenn dieser Code in diesem Formular abläuft, wäre besser:
Me.Requery

Befindest du dich im FM_behandlungen dann lautet der Befehl   Me.Requery  
Befindest du dich in einem Hauptformular und möchtst ein Unterformular aktualisieren:
Me!Unterformularname.Requery
Unterformularname ist der Name des Unterformularobjekts im Hauptformular und nicht der tatsächliche Name des Unterformulars selbst!

Befindest du dich in einem fremden Formular und möchtest das Unterformular eines anderen geöffneten Hauptformulars aktualisieren

Forms!Hauptformularname!Unterformularname.Form.Requery
bzw.
Forms!Hauptformularname!Unterformularname.Requery

Zum RICHTIGEN Einsetzen der Formularbezüge siehe folgenden Link aus der http://www.donkarl.com?FAQ4.2

http://access.mvps.org/access/forms/frm0031.htm

Und BITTE lass das 'Option Explicit' im Modulkopf stehen - egal welche dubiosen Ratschläge du dem entgegen erhältst!
Gehe noch weiter und stelle im VBA-Editor unter 'Extras' ... 'Optionen' ein, dass die Variablendeklaration ERFORDERLICH ist.
Das Verwenden von Variablen OHNE DIESE VORHER ZU DEKLARIEREN ist und bleibt grober Unfug - du handelst dir dadurch in weiterer Folge nur Probleme ein!

daolix


Zitat von: database@daolix
ZitatWenn du nicht alle Variable deklarieren willst dann lösche die Zeile Option Explicit. Ist aber nicht zu empfehlen
...ist nicht nur nicht zu empfehlen sondern m.E. grob fahrlässig!
Na na na, jetzt wollen wir aber nicht übertreiben nichwa. Das Problem ist doch das MS diese halt per Default nicht einstellt, und elvodia schon Code geschrieben hatte der ohne diese Option lief und erst im Rahmen dieses Threads in dem Code wohl mit aufgenommen wurde.

Zitat von: databaseUnd BITTE lass das 'Option Explicit' im Modulkopf stehen - egal welche dubiosen Ratschläge du dem entgegen erhältst!
Ehlich lies dir den Thread noch mal durch und denke nach bevor du hier etwas als dubios bezeichnest.

database


Zitatund denke nach bevor du hier etwas als dubios bezeichnest
besten Dank für den hervorragenden Ratschlag - worüber ich nachdenke brauchst du nicht in dein Sorgenregister aufnehmen  ;)

...dann hast du ja verstanden was ich mit dubios meine!




elvodia

Keine Streitereien pls.


Ich befinde mich in Folgendem Pfad.

FM_start

Dort gibt es ein Navigationselement UF1

Dort wird das Formular "FM_verwaltung_behandlungen" hineingeladen über

Me!UF1.SourceObject = "FM_verwaltung_behandlungen"

Und dien Inhalt dieses FM_verwaltung_behandlungen möchte ich aktualisieren. Solange es über

DoCmd.Requery geht bin ich zu frieden.

Es sei den mit erklärt jemand wie man das schreibt. Ich bin gerne für richtige Programmierung jedoch das einen langen Pfad zu schreiben nur wegen der Genauigkeit Wenns der kleine befehl auch macht.

daolix

besten Dank für den hervorragenden Ratschlag - worüber ich nachdenke brauchst du nicht in dein Sorgenregister aufnehmen  Zwinkernd

...dann hast du ja verstanden was ich mit dubios meine!


Nein. erklärs mal.

Beaker s.a.

Hallo,

@elvodia
ZitatDazu gibt es ein Form was wenn es geöffnet wird einen bestimmten Datensatz auswählt.

Davon ist in dem Code aber nichts zu sehen.

Deine Prüfroutine verlagere mal nach Form_BeforeUpdate. Da brauchst Du auch Deine ganzen Variablen nicht, da Du da mit .OldValue vergleichen kannst. Der Button löst dann nur noch das Speichern den DS aus, wodurch das o.a. Ereignis gefeuert wird.

@daolix
OHNE Option Explicit geht GAR NICHT !!

@database
ZitatGehe noch weiter und stelle im VBA-Editor unter 'Extras' ... 'Optionen' ein, dass die Variablendeklaration ERFORDERLICH ist.

Hierzu vielleicht noch die Ergänzung, dass, wenn das eingestellt ist, die Zeile automatisch in jedes neue Modul (auch Forms/Reports) eingetragen wird.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Beaker s.a.

Hallo daolix,

Zitat
Nein. erklärs mal.

Mit nicht deklarierten Variablen kann Dir alles passieren, schlimmstenfalls speicherst Du falsche Daten.
Ein kleiner Tippfehler reicht da schon, um Deine Programmlogik völlig durcheinander zu bringen, weil Du EBEN KEINE Fehlermeldung erhältst.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

daolix

Hallo ekkehard

der Vorschlag meinerseits ( den ich aber nicht empfahl ) fußte auf einen anderen kontext
elvodia hat ein Form in diesen hat er Code und mit diesem hatte er probleme, aber es gab keine FM's bezüglich nicht deklarierte Variablen.
darauf hin schrieb ich hier hier und hier
Nun tauchten aber das Problem mit besagter Option auf, die elvodia jetzt wohl mit in den Code einbaute, welche ich aber nur mit angab damit elvodia einen Position hat wo er die Variablen deklarieren soll, weil ich davon ausging das diese option soundso bei ihm aktiviert ist. Und da sein vorhergehender Code aber ohne diese Option erstellt wurde sollte er diese Zeile halt wieder rausnehmen.

Mein "Nein. erklärs mal." war schon explizit an database gerichtet, denn deine Erklärung ist schon richtig, aber glaube mir der meint was anderes.





elvodia

#28
Me!xAnzahl = Nz(list_patienten_alle.ListCount, 0)

Er sagt list_patienten_alle was ein listenfeld ist sei nicht als Variable definiert. Habs mit hochkomma und  Gänse versucht immr fehler.

Das schöne ist das ich den Selben Code in einem Anderen Form stehen habe und er da nicht meckert. Habe nun in jedem Form

Option Compare Database
Option Explicit


drin

EDIT: Problem gefunden das listenfeld hatte einen anderen namen.

elvodia

Zitat von: Beaker s.a. am Dezember 27, 2011, 22:50:20

Deine Prüfroutine verlagere mal nach Form_BeforeUpdate. Da brauchst Du auch Deine ganzen Variablen nicht, da Du da mit .OldValue vergleichen kannst. Der Button löst dann nur noch das Speichern den DS aus, wodurch das o.a. Ereignis gefeuert wird.


Wie mache ich denn so ein Vergleich mit OldValue. Habe in der Access Hilfe nix gefunden und Goole half mir auch nicht weiter.

Ich habe ein Form wo ich Behandlungen eingeben kann. Dort muss ich die Patienten ID und die Behandlungs ID eingeben. Die Rezept ID wird automatisch eingetragen durch Auswahl der Behandlung, was ich so verknüpft habe(Bzw. dahinten ist eine SQL Insert Anweisung). Wenn dieses Rezept nun ein Hausbesuchs Rezept ist wird zusätzlich eine Hausbesuchsbehandlung mit eingetragen als extra Datensatz. Das heist wenn ich eine Beahndlung eintrage und es ist ein Hausbesuchsrezept trägt er automatisch 2 Datensätze ein. Wenn man nun den Patienten bzw. die Behandlung ändert auf ein nicht Hausbesuchsrezept muss ich diesen eintrag ja wieder löschen damit die Bilanz nachher stimmt. Die Sql bekomme ich bestimmt irgendwie hin. Für mich ist wichtig wie man das schreibt:


If (NewValue von textfeld) = (OldValue von Textfeld) Then
    tue nix
else
    sql ausführung
end if