severinbuob
Goto Top

Pflichtfelder einer Tabelle via VBA herausfinden

moin zusammen!

In meiner Accessdatenbank, welche ich mit Access XP erstellt habe, möchte ich nun mit VBA eine Funktion erstellen, die mir auf jedem Formular die Pflichtfelder rot hinterlegt. Also müsste die VBA funktion in die Ursprungstabelle zugreiffen und schauen ist dies ein pflichtfeld, wenn ja, rot anfärben wenn nein, nichts machen.

Vielen Dank für deine Unterstützung!

Gruss Severin

Content-ID: 38573

Url: https://administrator.de/contentid/38573

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

SlainteMhath
SlainteMhath 23.08.2006 um 10:27:54 Uhr
Goto Top
sub PflichtfelderSetzen(frm as form)

	Dim idx As Index
	dim tdf As TableDef
	dim fld as field
	
	set tdf=currentdb.TableDefs(frm.RecordSource)
	
	For Each idx In tdf.Indexes
		If idx.Primary Then
			For Each fld In idx.fields
				frm.controls(fld.name).BackColor=vbRed
			next
		end if
	next 
end sub

Zugrunde liegende Annahmen:
- Mit "Pflichtfelder" meinst Du den/die Primärschlüssel der Tabelle
- Das Formular benutzt direkt die Tabelle als Datenquelle und kein Query oder SELECT
- Die Felder im Formular haben die selben Namen wie die Felder in der Tabelle

Aufruf:
Im Load-Event des Formulars:

sub Form_Load
    call PflichtfelderSetzen(me)
end sub

HTH face-smile
severinbuob
severinbuob 23.08.2006 um 11:57:21 Uhr
Goto Top
Danke für deine Hilfe.

Aber zu deinen Annahmen, muss ich leider folgendes korrigieren:

- Mit Pflichtfelder meine ich, Felder, welche angegeben werden müssen (SQL: NOT NULL)
- Zum grössten Teil hole ich mir die Daten über eine Abfrage
- und zum letzten Punkt: wirklich gar keine Felder tragen den selben Namen wie in der Tabelle das heisst die ersten 3 buchstaben sind anders z.B. txtName

Finde es klasse das so schnell eine Antwort kam, war schon fast ein bisschen verdutzt. Grosses Kompliment
SlainteMhath
SlainteMhath 23.08.2006 um 12:38:23 Uhr
Goto Top
Ah, ok... Versuchs mal hiermit (Code aus dem Kopf hingeschrieben - also keine garantie für Syntax/Funktion... aber ich denke Du siehst in welche Richtung das geht)

sub PflichtfelderSetzen(frm as form)
    dim rs as recordset
    dim fld as field
    Dim ctl As Control
    
		set rs=frm.recordset    
 
 		for each fld in rs.fields
        If not fld.AllowZeroLength Then
            For Each ctl In frm.controls
            		if ctl.ControlSource = fld.name then ctl.BackColor=vbRed
            next
        end if
    next 
end sub


Finde es klasse das so schnell eine Antwort
kam, war schon fast ein bisschen verdutzt.
Bin grad ueber einem aehnlichen Problem - deshalb hatt ich das grad so parat

Grosses Kompliment
Danke face-smile
severinbuob
severinbuob 23.08.2006 um 14:07:11 Uhr
Goto Top
Hat hervorragend geklappt, habe allerdings den befehlt ein wenig verändert:
Public Function pflichtfelder(frm As Form)

    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim ctl As Control

        Set rs = frm.Recordset
 
        For Each fld In rs.Fields
            If fld.Required Then
                For Each ctl In frm.Controls
                        If ctl.ControlSource = fld.Name Then ctl.BackColor = vbRed
                Next
            End If
        Next
End Function
Nun habe ich das Problem, wenn ich etwas anderes als ein Textfeld auf meinem Formular habe (button oder label) kommt die Fehlermeldung "Objekt unterstützt diese Eigenschaft oder Methode nicht." Was eigentlich heisst das man die Hintergrundfarbe bei einem Label nicht über ctl.BackColor ändern kann.

Gibt es da Befehle um herauszufinden, ob es sich um ein Textfeld handelt?

Gruss Severin
SlainteMhath
SlainteMhath 23.08.2006 um 14:36:23 Uhr
Goto Top
Freud mich das es klappt.

Du kannst zusätzlich noch die "ControlType" Eigenschaft des Controls abfragen. Wenn ctl.ControlType=109 dann ist es ein Textfeld

Die wichtigsten ControlType's für Formulare sind:
106	CheckBox
109	Textbox	
110	Listbox	
111	ComboBox	
severinbuob
severinbuob 23.08.2006 um 15:39:06 Uhr
Goto Top
So nun bin ich fertig! Habe die Funktion erfolgreich getestet.

Public Function pflichtfelder(frm As Form)

    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim ctl As Control
    Dim ctl_type As Integer

        Set rs = frm.Recordset
 
        For Each fld In rs.Fields
            If fld.Required Then
                For Each ctl In frm.Controls
                        ctl_type = ctl.ControlType
                        If ctl_type = 109 Or ctl_type = 111 Then
                            If ctl.ControlSource = fld.Name Then ctl.BackColor = 14136198
                            ctl.ForeColor = 16777215
                        End If
                Next
            End If
        Next
End Function

Danke nochmals für deine rasche Hilfe!!

Gruss Severin