Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Viele Case-Unterscheidungen eleganter lösen

Begonnen von gats1966, November 27, 2010, 17:40:28

⏪ vorheriges - nächstes ⏩

gats1966

Hallo,
in einem Formular soll bei Klicken in  das Artikelfeld, der Schrank, in dme sich der Artikel befindet in ort angezeigt werden. Habe dazu folgenden Code (da ich aber 15 Schränke habe - die Feldnamen sind jeweils txt_schrank1 bis txt_schrank15) frage ich mich, ob ich das nicht mit einer Variable lösen könnte, statt mit 15 Case Zeilen.

Private Sub txt_Bezeichnung_Click()
'Schrank in rot anzeigen
Select Case txt_Schrank

    Case "Schrank1"
        Me.txtSchrank1.BackColor = 255           
    Case "Schrank2"
        Me.txtSchrank2.BackColor = 255
End Select

End Sub

bahasu

#1
N'abend

ist die Nomenklatur immer "txt_Schrankxx" {xx: einstellige bis zweistellige Zahl}?

Dann ist folgendes denkbar:
Beim Feld "Artikelfeld" das Ereignis "Nach Aktualisierung" ergänzen um:

Me("txt_" & Me!Artikelfeld).backcolor=255

Ist ungetestet. Fehlt auch noch eine Fehlerbehandlung (z.B. im Kombifeld wird ein Inhalt eingetragen, den es nicht als Feld gibt. Oder wird das via Auswahlliste abgefangen?)

Mir ist allerdings nicht klar, ob Du nun einen Unterstrich verwendest (siehe Prosatext) oder nicht (siehe case-Anweisung).

Harald
Servus

gats1966

Vielen Dank, funktioniert zwar wunderbar, nur bleiben  diejenigen rot , die man vorher gesucht hat(wenn man weiter sucht)
Ja, sorry, ich hatte keine Unterstriche.
Ja, das Ganze geht über ein Kombifeld

DF6GL

Hallo,

es müssen halt vorher alle Textfelder wieder auf die Ursprungs-Hintergrundfarbe zurückgesetzt werden:


Dim i as Long
For i= 1 to 15
Me("txtSchrank" & i).Backcolor =vbWhite
Next

bahasu

#4
Die Lösung von Franz funktioniert besser nach meinen Tests. Habe deshalb den bislang hier stehenden Vorschlag gelöscht.

Harald
Servus

database

Hallo,

...und das Codefragment von DF6GL baust du hier ein:


Private Sub txt_Bezeichnung_Click()
'Felder entfärben
    Dim i as Long
    For i= 1 to 15
        Me("txtSchrank" & i).Backcolor =vbWhite
    Next
'Schrank in rot anzeigen
Select Case txt_Schrank

    Case "Schrank1"
        Me.txtSchrank1.BackColor = 255           
    Case "Schrank2"
        Me.txtSchrank2.BackColor = 255
End Select

End Sub




Solte laufen

Grüße
Peter

Maxel

Hallo Peter,

ist Dein Case-Code nicht ein Rückschritt gegenüber der Lösung von bahasu?

Me("txt_" & Me!Artikelfeld).backcolor=255
Viele Grüße
Maxel

database

#7
@Maxel

Nein...  ;)

wobei das nicht 'mein' Case-Code ist ...  8)

ob's nun mit bahasu's oder seiner eigenen Methode realisiert wird ändert nichts an der Stelle, an der die Felder zu entfärben sind.

Maxel

#8
OK,

ich hatte den Threadstarter so verstanden, dass er das Case-Konstrukt elegant ersetzen möchte und Franz' Beitrag nur eine Ergänzung zur Entfärbung war.
Viele Grüße
Maxel

DF6GL

#9
Hallo,

lol, so ein pile-up hier  (würde ich als OM sagen)  ...    ;D :D


als Komplettlösung (ohne Errorhandler, der nötig ist, wenn es da  evtl. falsche/fehlende Schranknamen geben sollte):

Private Sub txt_Bezeichnung_Click()
   Dim i as Long

'Felder entfärben
   For i= 1 to 15
       Me("txtSchrank" & i).Backcolor =vbWhite
   Next

' akt. Schrank in rot anzeigen
Me("txt" & Me!txtSchrank).Backcolor=255

End Sub



Möglich/besser wäre auch das Form_Current-Ereignis, dann spart man sich die Klickerei..

Wenn im gebundenen Textfeld "txtSchrank" der Name des  Schrankes, in dem sich der akt. angezeigte Artikel befindet, steht ("Schrank1", "Schrank2",etc) und die ungebundenen Textfelder "txtSchrank1", "txtSchrank2" , etc.   heißen..

oma

Hallo,

ist vielleicht auch besser, generell den Tip-Vorschlagenden die Sache  erklären/verbessern/ändern zu lassen, als das von anderen zusätzliche oder lediglich erläuternde Beiträge erstellt werden.

Gruß Oma
nichts ist fertig!

bahasu

#11
N'abend

Nachdem mein Lieblings Krimi im Fernsehen beendet ist, noch eine Variante als Zweizeiler (allerdings auf zwei Ereignisse aufgeteilt).

Das folgende gilt für die Ereignisse des Kombifeldes:
1. Beim Ereignis "Bei Änderung" eintragen {dient zum Löschen einer roten Farbe}:
     If Nz(Me!DeinKombifeld) > "" Then Me("txt" & Me!DeinKombifeld).BackColor = vbWhite    ' oder Deine gewünschte Farbe

2. Beim Ereignis "Nach Aktualisierung" eintragen {dient zum Rotfärben}:
   If Nz(Me!DeinKombifeld) > "" Then Me("txt" & Me!DeinKombifeld).BackColor = 255

Es führen viele Wege nach Rom.

Harald
Servus