Formularsteuerung

habe folgendes Problem.
Möchte in einem Access-Formular ( Spindverwaltung ), die Spinde
als Schaltfläche darstellen. ( ca. 250 ).
Beim Klick soll nun ein Formular mit dem Datensatz aus der
Tabelle TAB_SPIND geöffnet werden wobei der Schaltflächenname ( 001 -
250 ) die letzten 3 Zeichen der Spind-ID aus der Tabelle sind.

SPIND = Right(ActiveControl.NAME, 3)
SPIND = „’[SPIND_ID] = LMHDEAB-W2-007-1OR-’“ & SPIND
DoCmd.OpenForm „FM_SPIND“, , , „‚SPIND‘“, , acDialog

Das funktioniert für mich als Laien recht gut. Mich stört nur das ich
die Code- Zeile 250 mal wiederholen muß.
Frage kann ich für alle 250 Schaltflächen in einem Formular einen
Code verwenden der mir den ActiveControl.NAME verwendet?

Danke für die Hilfe

Hallo PETE,

erstmal HERZLICH WILLKOMMEN bei wer-weiss-was.

Bitte gebe bei einer Frage immer an, mit welcher Version du gerade arbeitest, da es ggf. gravierende Unterschiede gibt.

Möchte in einem Access-Formular ( Spindverwaltung ), die
Spinde als Schaltfläche darstellen. ( ca. 250 ).

das ist sinnvoll? ich würde ein Kombifeld nehmen.
Das als Suchfeld im Kopf des Hauptformulars mit dem Assistenten platzieren und dann im Hauptformular die dazugehörigen Daten anzeigen lassen. Siehe hier die FAQ:2768 dazu.

für einen Laien, ist der Code doch schon ganz gut. Die Lösung ist eine eigene Prozedur bzw. Funktion, die du immer schreiben kannst, je nach dem was du benötigst.

Z.B.:

Public Function Spind\_AUF(AC\_Name) 
 DoCmd.OpenForm "FM\_SPIND", , , "[SPIND\_ID] = LMHDEAB-W2-007-1OR-" & Right(AC\_NAME, 3), , acDialog
End Function

dann musst du diese Function nur noch beim Klick auf den Button aufrufen :

Spind_auf ActiveControl.NAME

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo Wolfgang

ich hatte es geahnt das es so gehen kann. Genial von dir. Danke.
Du könntest mich zum König der Einäugigen machen wenn du mir
noch ein Tip geben könntest das Programm optisch aufzubessern.
Die Aufgabe:
Ein belegter Spind soll im Formular rot sein.( Jeder Spind ist eine Schaltfläche deren Name die SPIND_ID ist)
Also welcher Schaltflächenname existiert als SPIND_ID in der Tabelle TAB_SPIND und wird dadurch beim öffnen des Formulars rot.
(ACCESS2003)

mfg
pete

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo PETE,

Ein belegter Spind soll im Formular rot sein.( Jeder Spind ist
eine Schaltfläche deren Name die SPIND_ID ist)
Also welcher Schaltflächenname existiert als SPIND_ID in der
Tabelle TAB_SPIND und wird dadurch beim öffnen des Formulars
rot.

nur durch das öffnen des Formulares? oder eigentlich immer?

Eine Taste ist eine Taste und kann man nicht „rot“ machen!
aber man kann die Schrift rot darstellen.

UND man kann der Taste Grafiken zuweisen, z.B. eine für Spind leer und eine für Spind voll.

z.B. bei der Schrift:
me.meinfeld.forecolor= 255 'rot
me.meinfeld.forecolor= 0 'schwarz

Such dir was aus, sagt auch der „Einäugige“ :smile:

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo Wolfgang,

also me.meinfeld.forecolor= 255 'rot
für einen belegten Spind wäre super.
Ich hatte an beim öffnen aktualisieren gedacht.

mfg
pete

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo PETE,

eine Bitte: könntest du bitte das fullquoting lassen (ich weiß was ich geschrieben habe :smile:, oder OBEN antworten, dann muss man nicht immer so viel scrollen. Danke!

Ich hatte an beim öffnen aktualisieren gedacht.

ja möglich, da fehlen aber ein paar Angaben über das Formular:

  • Art
  • Datenquelle
  • Felder der Tabelle etc.

global eigentlich nur eine Schleife:

  • für jedes Control-Objekt in der Formular-Objekt-Liste
  • prüfe in Tabelle (eigene Funktion s.u.)
  • wenn vorhanden, mache Schrift ROT
  • nächstes Objekt

Public Function Prüf_Tabelle(xSuche)
Prüf_Tabelle=IIF(dcount(„ID_Spind“,„Tabellenname“,"[ID_SPIND]=xSuche )>0,true,false)
End Function

Möglich und ggf. schneller wäre auch eine Lösung über ein Recordset mit entsprechender Schleife. Allerdings ist da der Programmieraufwand höher.

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo,

Public Function Prüf_Tabelle(xSuche)
Prüf_Tabelle=IIF(dcount(„ID_Spind“,„Tabellenname“,"[ID_SPIND]=xSuche
)>0,true,false)
End Function

kleiner Code-Korrekturvorschlag:

Public Function Prüf_Tabelle(xSuche as Long) as Boolean
Prüf_Tabelle=Dcount("*",„Tabellenname“,"[ID_SPIND]=" & xSuche )
End Function

Allerdings ist m. E. die Lösung über Schaltflächen ein Irrweg…

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Wolfgang,

ich weiß wo du mit mir hin willst aber es hat bei mir nicht gereicht um weiterzukommen. Sorry.
Formular „FM_PLAN“ hat 250 Befehsschaltflächen Name= „001“ bis „250“
Tabelle „TAB_SPIND“ hat DATENSÄTZE mit SPIND_ID z.B. 001,004,075…
damit sind diese Spinde belegt. und die Schrift soll rot sein.

mfg Pete

Danke auch an Franz , DF6GL

Hallo

Formular „FM_PLAN“ hat 250 Befehsschaltflächen Name= „001“ bis
„250“
Tabelle „TAB_SPIND“ hat DATENSÄTZE mit SPIND_ID z.B.
001,004,075…

bedeutet das, daß der Datentyp von SPIND_ID in der Tabelle TEXT ist?
wenn so, bau das mal um in Datentyp Zahl,Long

Die folgende Ereignisprozedur („Beim Anzeigen“ des Forms) steuert die Schriftfarbe der Schaltflächen. Wie schon gesagt, können Schlatflächen nicht „eingefärbt“ werden.

Sub Form_Current()
Dim i as Long

For i=1 to 250

If Dcount("*",„TAB_SPIND“,„val([ID_SPIND])=“ & i ) > 0
Me(Format(i,„000“)).Forecolor=vbRed
Else
Me(Format(i,„000“)).Forecolor=vbBlack
End If

Next

End Sub

Hallo Pete,

der Franz hat dir ja schon die erste Möglichkeit beschrieben.

Hier nun auch die zweite Möglichkeit, die meiner Meinung nach schneller sein sollte:

Sub Form_Current()
Dim DB,RS

Set DB = CurrentDb
Set RS = db.OpenRecordset(„TAB_SPINT“, dbOpenDynaset)

With RS
.MoveLast
.MoveFirst

While Not .EOF
Me(!SPIND_ID).Forecolor=vbRed
.MoveNext
Wend
.close
End With
End Sub

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo,

wobei dieses noch (geringfügig) schneller ist: :wink:

Sub Form_Current()
Dim DB as Dao.Database , RS as Dao.Recordseet

Set DB = CurrentDb
Set RS = db.OpenRecordset(„TAB_SPINT“, dbOpenSnapShot)

With RS

While Not .EOF
Me(!SPIND_ID).Forecolor=vbRed
.MoveNext
Wend
.close
set RS=Nothing
set DB=Nothing

End With
End Sub

und man sich auch noch die SEEK-Methode zur Performancesteigerung ansehen könnte…

und der obige Code kein Leeren" eines Spints berücksichtigt.

Aber wehe, er bekommt noch einen Spint dazugeschenkt…

Hallo Wolfgang,

Danke. Die Schleife hat super funktioniert.
Dank Deiner Hilfe hat sich mein Code von mehreren hundert Zeilen auf weniger als zwanzig reduziert.

Jetzt werd ich noch ein bischen an der Optik basteln. Und das Programm
zum Einsatz bringen. Möchte gern noch auf einem normalen Drucker ein Etikett drucken. Mein Problem wird sein das bei einem A4 Blatt mit 24 Etiketten nicht immer das erste Etikett sondern auch die 23 anderen Etiketten einzeln angesprochen werden sollten.

Ich könnte mir vorstellen das man z.B. 10 Leersätze und den Datensatz
der gedruckt werden soll zum Drucker schickt wenn man das 11. Etikett
verwenden will. Was sagst Du dazu?

mfg
Peter

Hallo,

ich verstehe die Warnung nicht mit dem geschenkten Spind.
Als Voreinstellung habe ich 250 Datensätze angelegt. Diese entsprechen den 250 Schaltflächen. Wenn ich vier neue bekomme lege ich vier Datensätze an und vier neue Schaltflächen im Formular.

mfg pete

Hallo Peter,

Möchte gern noch auf einem normalen
Drucker ein Etikett drucken. Mein Problem wird sein das bei
einem A4 Blatt mit 24 Etiketten nicht immer das erste Etikett
sondern auch die 23 anderen Etiketten einzeln angesprochen
werden sollten.

Frage: ist der Inhalt der Etiketten gleich, oder unterschiedlich?

Ich könnte mir vorstellen das man z.B. 10 Leersätze und den
Datensatz der gedruckt werden soll zum Drucker schickt wenn man das 11. Etikett verwenden will. Was sagst Du dazu?

ich würde Word nehmen, ein Etikett definieren, als Datenquelle die Access Tabelle/oder Abfrage angeben, fertig.
Im Druckdialog von Word hast du dann alles was du benötigst :smile:

TIPP: ein guter Programmierer programmiert das Rad nicht immer wieder neu. Er hat eine entsprechende Bibliothek aus der er schöpft :smile:
Hier in den FAQ findest du eine Linkliste, die du dir mal anschauen solltest.
Als Wissensbasis solltest du dir die knowhow3 mal näher ansehen:
http://www.freeaccess.de/knowhow.asp

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo,

ich verstehe die Warnung nicht mit dem geschenkten Spind.
Als Voreinstellung habe ich 250 Datensätze angelegt. Diese
entsprechen den 250 Schaltflächen. Wenn ich vier neue bekomme
lege ich vier Datensätze an und vier neue Schaltflächen im
Formular.

naja, klar kannst Du das so machen und Lust hast, jedes Mal die DB zu ändern, statt zu benutzen. :smile:

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo,

dieses Beispiel sollte helfen:

http://www.dbwiki.de/upload/AccSampleEtiketten2000.zip

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!