Office: (Office 2010) Sub-Prozedur in der Schleife

Helfe beim Thema Sub-Prozedur in der Schleife in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Liebe Access-Profis, wieder mal weiß ich nicht weiter: Ich habe ein Formular, indem ich 41 Bezeichnungsfelder ('Bez0 – Bez40') und ebenso viele... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von gromax, 30. Mai 2020.

  1. Sub-Prozedur in der Schleife


    Liebe Access-Profis,
    wieder mal weiß ich nicht weiter:
    Ich habe ein Formular, indem ich 41 Bezeichnungsfelder ('Bez0 – Bez40') und ebenso viele Textfelder ('txtRedSch0 – txtRedSch40') untergebracht habe; die Caption der Bezeichnungsfelder werden gleichsam mit der Schleife 'For i = 0 To 40' befüllt und die angeordneten Textfelder nehmen die entsprechenden Werte auf. Das funktioniert soweit prima!
    Jetzt möchte ich mit einem VBA-Code die Werte in den Textfeldern ändern bzw. neu anlegen; dazu habe ich das Ereignis 'AfterUpdate' im entsprechenden Textfeld gewählt.
    Die Sub-Prozedur tituliert dann wie folgt:
    Code:
    Muss ich denn für jedes Textfeld ('txtRedSch0 – txtRedSch40') eine solche Prozedur schreiben oder gibt es eine Technik, mit der ich ähnlich wie bei der Schleife 'For i = 0 To 40' mit einer Zähl-Variablen arbeiten kann?
    Wie so häufig: Vorab vielen Dank für jedwede Hilfestellung!

    Viele Grüße
    gromax

    :)
     
    gromax, 30. Mai 2020
    #1
  2. Du kannst dir eine Klasse bauen, die du auf die Steuerelemente anwendest.
    D.h. die Prozedur wird nur 1x in der Klasse definiert und im Aufruf des Formulars (Beim Laden) über eine Schleife auf die Steuerelemente angewendet.
    Der code im Load des Formulars sähe dann so aus:
    Code:
    Der Code der Klasse dann so (im Moment ist im AfterUpdate Ereignis unsinnig definiert, dass nach dem Aktualisieren die Hintergrundfarbe wechselt zwischen grün und rot).

    Code:
    In der Klasse kannst du natürlich für alle verfügbaren Ereignisse Prozeduren schreiben, oder eigene.
    Natürlich auch beliebig andere Steuerelemente verfügbar machen (z.b. Label)

    Man könnte jetzt fast ketzerisch fragen, wieso es 40 Textboxen gibt, die alle das gleiche AfterUpdate-Ereignis brauchen, und würde wahrscheinlich in den Dauerbrenner Datemodell münden,..
     
    fredfred, 31. Mai 2020
    #2
  3. Hallo Fredfred,

    vielen Dank für die große Mühe, die Du angewendet hast; ich habe auch versucht, diese Klasse einzurichten, aber ich habe dieses nicht hinbekommen.

    In meiner Unwissenheit habe ich Dir die DB als Fragment angehängt; es geht dabei um die Verwaltung von Reduktion im Schulbetrieb. Hier erhält eine Schule für bestimmte Tätigkeiten und Umstände Anrechnungen (= Reduktionen). Diese Reduktionen sind an den verschiedenen Schulen ganz unterschiedlich ausgestaltet.
    Im UF sfm_SchuleReduktionen werden diese Reduktionen aufgeführt und ggf. geändert. Für die ersten beiden Schulen habe ich nun Beispiele aufgeführt und eben für das erste Textfeld txtRedSch0 (entspricht der "A" Altersermäßigung) einen VBA-Code hinterlegt. Dieser scheint zu funktionieren, eben nur für dieses Feld. Ich kann diesen Code natürlich in Fleißarbeit für alle anderen Textfelder kopieren.

    Deine Idee mit den Klassen ist wohl sicherlich der richtige Weg, aber ich kann ihn nicht umsetzen; kannst Du mir nochmals den Weg weisen?

    Sorry und vielen Dank vorab.

    Viele Grüße
    gromax
     
    gromax, 1. Juni 2020
    #3
  4. Sub-Prozedur in der Schleife

    Du musst doch lediglich die Codes in die DB integrieren (unverändert).

    Lediglich in der Klasse im AfterUpdate musst du deinen individuellen Code unterbringen.
     
    fredfred, 1. Juni 2020
    #4
  5. Hallo Fredfred,

    sorry, dass ich nachfrage.
    In meinem Code greife ich bei dem veränderten Textfeld auf das darüberliegende Bezeichnungsfeld bzw. auf dessen Caption zu. Mit dieser dort ausgebrachten Kurzschreibweise (z.B. "A" für Altersreduktion) suche ich den passenden Fremdschlüssel zur weiteren Verarbeitung und lege diesen in der Variablen 'intRedArt' ab.
    Code:
    Könntest Du nochmals drüberschauen?!

    Danke vorab.

    Viele Grüße
    gromax
     
    gromax, 1. Juni 2020
    #5
  6. Wenn du die Bezeichnungsfelder an die Textfelder binden würdest, könntest du die Bezeichnungsfelder direkt über die Textfelder ansprechen.
    objClsText.controls(0).name
    Das erspart diese Schleife mit "Bez" & i

    Du könntest auch den Schlüssel der Kurzbezeichnung in einer Variablen der Klasse mitabspeichern und hättest so die ID direkt für den SQL-String.


    Ehrlich gesagt, habe ich mir deine DB nicht groß angeschaut, was du da eigentlich tust, bzw. warum du es tust. NOrmalerweise schaue ich mir als erstes an, ob das Modell zum Vorhaben passt, und wenn nicht ob es Alternativen gibt.


    Wozu den Formularbezug, du hast doch das Steuerelement direkt abgreifbar in der Klasse. Das ist fast so als wenn du im Restaurant am Tisch schon vor deinem Schnitzel sitzt, du aber nochmal aus dem Restaurant rausgehst, nochmal durch die Tür gehst und deinen Tisch mit dem Schnitzel suchst. (lol.. blöder Vergleich )


    Code:
    Der ganze Code scheint mir arg umständlich zu sein.
    Zuwas das Array ?
    Zuwas die 2 Recordsets beim Befüllen bzw. AfterUpdate, wenn die Schule gewechselt wird ?
    Das wäre doch ein Recordset mit den Bezeichnungen und den Feldern der Werte der Textboxen, oder nicht ?
    Das Hauptformular könntest du dir auch sparen, da doch sowieso ungebundene Felder füllst.
    Muss ich nochmal schauen nachher. Keine Zeit gerade.
     
    fredfred, 1. Juni 2020
    #6
  7. Wenn man die Hauptfunktionalität nimmt kürzt sich der Code auf die paar Zeilen nach Auswahl einer Schule im Kombi:
    Code:
    Der Vollständigkeit: der String der Abfrage qry_MinSchule

    Code:
     
    fredfred, 1. Juni 2020
    #7
  8. Sub-Prozedur in der Schleife

    Hier mal deine DB
    Was ich gemacht habe:

    - aus deinem alten Formular die Steuerlemente in eine Tabelle (tblSteuerelemente) ausgelesen (Höhe, Position usw.), um damit ein neues Formular mit assoziierten Labels per VBA zu bauen. Mir ist es nicht gelungen per VBA die Labels nachträglich im alten Formular zu assoziieren. Deshalb neues Formular, Steuerelemnt Textboxen per copy and past (ging schneller als Code für das "Createn" zu bauen) , danach anhand der ausgelesenen Werte, die Elemente korrekt anordnen über VBA.
    - Entsorgung des HF's Schule -> nicht notwendig
    - Beim AfterUpdate des Schul-Kombis werden die Daten per Recordset ausgelesen (qry_Minderungen, bzw. qry_MinderungenAlle (damit ich alle Arten im RS zur Verfügung habe, durch das WHERE der vorgeschaltenen qry_Minderungen stehen die dort nicht zur Verfügung). Dem TextSteuerelement wird in der Eigenschaft "Marke" (TAG), die ID der Art des Labels zugewiesen. Im AfterUpdate der Klasse kann man dann leicht die Marke des Steuerlements auslesen und so per Aktionsabfrage (Insert oder UPDATE) in den SQL String einbauen.
    - ach ja, was mich immer nervt, sind die 0 Standardwerte, die Access bei Zahlenfelder setzt. Die habe ich über ein kleines Script eleminiert. Genauso gibt es noch diverse Codes, die ich verwendet habe um dein altes Formular über die ausgelesenen Werte automatisch neu zu schreiben.
    Kann man dann alles entsorgen.
    In der Klasse habe ich dir das AfterUpdate überarbeitet.
    FrmNeu ist meine Version deines HF-UFO Konstrukt
    Wie du siehst, fallen die ganzen Codes kürzer aus.
    Die Schul_ID habe ich in einer public Variablen zwischengespeichert, da gibt es wohl intelligentere Lösungen, aber auf die Schnelle mal so. Die braucht man für die SQL-Strings im AFterUpdate der Klasse.
    Für problematisch halte ich, dass keine Historie in deinen Daten entsteht, sondern du die Werte überschreibst bei vorhandenem Datensatz. Das solltest du anders lösen

    Was fehlt: das Löschen des Datensatzes wenn der Wert gelöscht wird. Da entsteht augenblicklich noch ein Fehler. DAs kannst du nacharbeiten und prüfen ob das Feld einen Wert hat und dann darauf mit einer DELETE-Abfrage reagieren.

    Edit: ich habs dir doch noch eingebaut
     
    fredfred, 2. Juni 2020
    #8
  9. Hier mal deine DB
    Was ich gemacht habe:

    - aus deinem alten Formular die Steuerlemente in eine Tabelle (tblSteuerelemente) ausgelesen (Höhe, Position usw.), um damit ein neues Formular mit assoziierten Labels per VBA zu bauen. Mir ist es nicht gelungen per VBA die Labels nachträglich im alten Formular zu assoziieren. Deshalb neues Formular, Steuerelemnt Textboxen per copy and past (ging schneller als Code für das "Createn" zu bauen) , danach anhand der ausgelesenen Werte, die Elemente korrekt anordnen über VBA.
    - Entsorgung des HF's Schule -> nicht notwendig
    - Beim AfterUpdate des Schul-Kombis werden die Daten per Recordset ausgelesen (qry_Minderungen, bzw. qry_MinderungenAlle (damit ich alle Arten im RS zur Verfügung habe, durch das WHERE der vorgeschaltenen qry_Minderungen stehen die dort nicht zur Verfügung). Dem TextSteuerelement wird in der Eigenschaft "Marke" (TAG), die ID der Art des Labels zugewiesen. Im AfterUpdate der Klasse kann man dann leicht die Marke des Steuerlements auslesen und so per Aktionsabfrage (Insert oder UPDATE) in den SQL String einbauen.
    - ach ja, was mich immer nervt, sind die 0 Standardwerte, die Access bei Zahlenfelder setzt. Die habe ich über ein kleines Script eleminiert. Genauso gibt es noch diverse Codes, die ich verwendet habe um dein altes Formular über die ausgelesenen Werte automatisch neu zu schreiben.
    Kann man dann alles entsorgen.
    In der Klasse habe ich dir das AfterUpdate überarbeitet.
    FrmNeu ist meine Version deines HF-UFO Konstrukt
    Wie du siehst, fallen die ganzen Codes kürzer aus.
    Die Schul_ID habe ich in einer public Variablen zwischengespeichert, da gibt es wohl intelligentere Lösungen, aber auf die Schnelle mal so. Die braucht man für die SQL-Strings im AFterUpdate der Klasse.
    Für problematisch halte ich, dass keine Historie in deinen Daten entsteht, sondern du die Werte überschreibst bei vorhandenem Datensatz. Das solltest du anders lösen

    Was fehlt: das Löschen des Datensatzes wenn der Wert gelöscht wird. Da entsteht augenblicklich noch ein Fehler. DAs kannst du nacharbeiten und prüfen ob das Feld einen Wert hat und dann darauf mit einer DELETE-Abfrage reagieren.

    Edit: ich habs dir doch noch eingebaut
     
    fredfred, 2. Juni 2020
    #9
  10. Hallo Fredfred,

    Du hast Dich ja mächtig ins Zeug gelegt; sorry, dass ich mich nicht gemeldet habe, aber ich bin im Moment im Stress - ich kann mich erst wieder am WE wieder melden.

    Vielen Dank schon vorab - das nötigt mir schon Respekt ab - klasse!!

    Viele Grüße
    gromax
     
    gromax, 4. Juni 2020
    #10
  11. Hallo Fredfred,

    zuerst habe ich es noch selber probiert, habe Deinem Impuls entsprechend die Bezeichnungsfelder mit den Textfeldern verbunden und dann meine unzähligen Versuche mit objClsText.controls(0).name unternommen, aber ehrlich: Das hat alles nicht geklappt. Die Programmierung mit Klassen ist noch ein ganz dunkles Feld?!
    Der Übertrag Deiner tollen Unterstützung hat dann aber prima funktioniert, im Abkupfern liegen meine Qualitäten. Von Deiner Lösung und Deinem Einsatz bin ich ganz toll beeindruckt - vielen, vielen Dank! Das hätte ich nie hinbekommen!!

    Nochmals meinen aufrichtigen Respekt
    und bleib gesund!
    gromax
     
    gromax, 8. Juni 2020
    #11
  12. du kannst nur mit objClsText.column(0) arbeiten, wenn die Textbox ein Label zugeordnet hat.
    Deshalb der neue Entwurf des Formulars.
    Ich habe noch etwas rumgespielt.
    Im Feld txtRed1 - txtRedX sind nur noch Zahleneingaben möglich. Buchstaben werden mit Error quittiert und nicht geschrieben und rot unterlegt Die 0 wird als Wert im Feld ignoriert (nicht zulässig). (Spielerei).
    Bei Auswahl der Schulen erscheinen die vergebenen Minderungen zuerst und dann die noch nicht vergebenen Arten (kann man wieder ändern, indem man die Sortierung in der Abfrage minAlle rausnimmt).
    Die Labels der nicht benötigten Textboxen werden über .column(0) auf not visible geschaltet (und nicht generell alle Labels wie im alten Code, wenn eine Textbox gefunden wird). Dadurch bleibt das Label des Kombi-Feldes visible.

    Im Modul2 gibt es einen Code FormularSchreiben, der erstellt das Formular komplett neu mit allen controls. Nur die AfterUpdate/Load VBA-Codes müssten ergänzt werden -> Spielerei ..
     
    fredfred, 8. Juni 2020
    #12
  13. Sub-Prozedur in der Schleife

    Hallo Fredfred,

    nochmals "danke" für Deine Nacharbeit; genial!

    Jetzt habe ich mit der Lösung ein wenig "gespielt" und siehe da, wenn ich bei einer Reduktion eine Dezimalzahl, im Beispiel '3,5' - es gibt halbe und ganze Werte - dann bricht die Aktualisierung ab und moniert mit Gelb-Markierung die Zeile Code:
    in der AfterUpdate-Prozedur des Klassenmoduls.
    In der Tabelle 'tbl_Minderungen' habe ich dann den Datentyp für das Feld 'MIND_Lwh' auf single ungestellt. Trotzdem nimmt das Formular den Wert nicht an.
    Kann denn an einer anderen Stelle der Datentyp auf 'Integer' gestellt sein?

    Wenn Du mir nochmals helfen könntest?

    Vielen Dank vorab!

    Alles Gute
    gromax
     
    gromax, 9. Juni 2020
    #13
  14. Verwende Double und kein Single. Ein Dezimalwert muss im String über die Str() Funktion geparst werden.
    Solltest du die Einschränkung auf Zahlen verwenden, musst du den "," erlauben.
    keycode = 188
     
    fredfred, 9. Juni 2020
    #14
  15. Hallo Fredfred,

    jetzt geht gar nichts mehr.

    Den Datentyp habe ich in der Tabelle tbl_MINDERUNGEN auf Double umgestellt und im Klassenmodul den Eintrag '.OnKeyDown = conEreignis' in der init-Prozedur eingetragen.
    Der Code Code:
    in der Prozedur des Klassenmoduls springt selbst beim Drücken der Taste '4' an?
    Auch verhält sich der Code unterschiedlich, wenn ich die Ziffern auf dem Tastenblock oder dieselbe innerhalb der oberen Reihe auf der Tastatur tippe!

    Wenn ich die Ganzzahl '5' in eine andere Ganzzahl ändere, erscheint "Error" im betreffenden Formularfeld?

    Wo liegt denn jetzt der Fehler?

    Sorry für die Dauerhafitigkeit meiner Anfrage!

    Viele Grüße
    gromax
     
    gromax, 11. Juni 2020
    #15
Thema:

Sub-Prozedur in der Schleife

Die Seite wird geladen...
  1. Sub-Prozedur in der Schleife - Similar Threads - Sub Prozedur Schleife

  2. "Eigene"excel-Funktion innerhalb einer Sub verwenden

    in Microsoft Excel Hilfe
    "Eigene"excel-Funktion innerhalb einer Sub verwenden: Hallo, ich möchte innerhalb einer Sub eine Berechnung mittels einer selbst erstellten Funktion durchführen. Wie kann ich die Funktion aufrufen? Grüße Reinhard Beispiel zum Verständnis Function...
  3. Problem mit Private Sub Worksheet_Change

    in Microsoft Excel Hilfe
    Problem mit Private Sub Worksheet_Change: Hallo, ich komme nicht weiter mit meiner Worksheet_Change. Ich muss sagen, ich bin kein VB Profi - eher Laie mit Grundverständnis in Coding. Was möchte ich (Erwartung): 1. Wenn eine gewisse Zelle...
  4. Listenfeld in Word 2016

    in Microsoft FrontPage Hilfe
    Listenfeld in Word 2016: Hallo, leider konnte ich keinen Eintrag zu meinem Problem finden: Wegen der größeren Länge von Texten kann ich nicht nur einfach eine listbox verwenden. Die listbox zur Auswahl der Alternativen...
  5. Function Sub und Makro

    in Microsoft Excel Hilfe
    Function Sub und Makro: Hallo zusammen. Ja, auch ich verzweifle gerade. Ich habe folgendes Problem: Da ich quasi ein Makro innerhalb einer Wenn-Dann-Bedingung starten möchte, muss ich den VBA Code in einer Function...
  6. VBA Spalten aus- und einblenden trotz Blattschutz

    in Microsoft Excel Hilfe
    VBA Spalten aus- und einblenden trotz Blattschutz: Guten Tag Ich habe eine Übersicht, in dem die Urlaubszeiträume meiner Kollegen eingetragen werden sollen. Neben Namen, Vornamen und Zeitraum sollen noch weitere spezifische Daten eingetragen...
  7. Aufruf private sub prozedur

    in Microsoft Excel Hilfe
    Aufruf private sub prozedur: hallo, wie kann ich aus einer private sub prozedur eine andere private sub prozedur aufrufen? 156458
  8. Aufruf von Sub im Modul funktioniert nicht

    in Microsoft Access Hilfe
    Aufruf von Sub im Modul funktioniert nicht: Hallo Forum, freut mich hier zu sein und ich hab' gleich mal eine Frage:. Ich möchte eine Datenbank aufsetzen, in die in regelmäßigen Abständen Daten aus Excel Listen eingelesen werden. Ich habe...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden