Hallo zusammen,
Nachdem ich länger in Netz betreffend einer Performance Veresserung gesucht habe, bin ich auf folgende Prozedur gestossen.
Diese funktioniert wunderbar auf allen Ufo's & Combos, aber nicht auf dem Pivot Chart, bzw ist der Pivot Chart leer.
Kann mir jemand helfen wie ich die Prozedur ergänzen muss. Vielen dank.
Private Sub Form_Load()
Dim ctl As Control
Me.RecordSource = "T_SalesOrders"
For Each ctl In Me.Controls
Select Case ctl.Properties("ControlType")
Case acComboBox, acListBox
ctl.RowSource = ctl.Tag
Case acSubform
ctl.Form.RecordSource = ctl.Form.Tag
Case Else
'do nothing
End Select
Next ctl
Set ctl = Nothing
End Sub
Hallo,
du könntest dir ja durch das Durchlaufen der Steuerlemente den Wert der Property 'ControlType' für dein PivotChart ausgeben lassen.
Ich kann mir aber vorstellen, dass es entweder ein gebundenes Ojektfeld oder ein ungebundenes Objektfeld sein könnte
Dim ctl As Control
Dim prp As Property
For Each ctl In Form.Controls
For Each prp In ctl.Properties
Debug.Print vbTab & prp.Name & vbTab & prp.Value
If prp.Name = "ControlType" Then Exit For
Next prp
Debug.Print "-----------------"
Next ctl
End Sub
Wenn du diese Schleifenkombi ablaufen lässt bekommst du für jedes Objekt am Formular den ControlTyp angezeigt
so solltest du Name und Value (als Zahlenwerte) auslesen können, sobald die Reihe an dein Chart-Objekt gekommen ist.
Diesen Zahlenwert setzt du dann anstatt der ac... Konstante in deiner Prozedur ein.
HTH
Danke Database fürs Helfen.
Leider bin ich auf VBA nicht sehr fit uns ich bin mir nich ganz sicher wie ich das Durchlaufen von Steuerelemente zu bewerkstelligen habe. Ich habe im Hauptformular "Main" einen Button mit deiner Prozedur eingerichtet, aber es ist nichts passiert.
Ich habe die Prozdur als Modul gespeichert und es so probiert zu starten. Beim "For Each ctl In Form.Controls" bleibt er stehen und sagt "Compile Error" Variable not defined.
Könntest du mit bitte nochmals helfen.
Gruss Cédric
HAllo,
wenn die Controls des Formulares durchlaufen werden sollen, dann muss das so lauten:
For Each ctl In Me.Controls
"betreffend einer Performance Verbesserung"
um welche Art einer "Performance" geht es denn?
Danke für den Hinweis DF6GL, nun kommt die error msg: "Invalid use of ME keyword"
Betreffend Performance: Die DB ist extrem langsam. Um von einem Datensatz auf den den anderen zu wechseln brauchen die DB bis zu 30 Sekunden. Vom Desktop aus funktioniert es einwandfrei, aber vom gemeinsamen Server von wo alle Benutzer zugreifen ist die DB sehr langsam. Habe bereits verschiedene Aenderungen vorgenommen wie Tabellen Properties Subdatasheetname auf NONE gesetzt
oder Autokorrektur entfernt .
Danke und gruss
Cédric
Hallo,
dann steht der Code nicht in einem Formular-Modul...
Ich bezweifle, ob mit dem Bearbeiten von Formular-Controls sich eine Verbesserung der Netzwerk-Geschwindigkeit erziehlen lässt.
Neben den von Dir genannten Punkten findest Du evtl. hier:
http://www.team-moeller.de/?Tipps_und_Tricks:Verbesserung_der_Performance
weitere Tipps
Am Wichtigsten sind:
Aufteilung in FE und BE mit lokal ausgeführtem FE
Sinnvolles Setzen von Indizes in den Tabellen.
Beziehungen nur über numerische Felder (Zahl, long)
UNC-Pfade und kurze Dateinamen verwenden
Untersuchen auf Einfluß eines Antiviren-Programms.
Evtl. Migration auf SQL-Server
Danke für die Hinweise.
Habe nun einen Button im Haupformular mit folgender Prozedur gemacht, aber beim anklicken passiert nichts:
Private Sub Command363_Click()
Dim ctl As Control
Dim prp As Property
For Each ctl In Me.Controls
For Each prp In ctl.Properties
Debug.Print vbTab & prp.Name & vbTab & prp.Value
If prp.Name = "ControlType" Then Exit For
Next prp
Debug.Print "-----------------"
Next ctl
End Sub
Hallo,
was soll passieren?
Der Code "druckt" die Namen und Werte der Properties in das VBA-Direktfenster...
OK sorry, aber wie gesagt: Ist ziemlich Neuland für mich.
Ich mache folgendes: Oeffne ein neues Modul in meiner Datenbank, kopiere den code dort rein und speichere und habe ein neues Modul Names Test :
Option Compare Database
Option Explicit
Sub test()
Dim ctl As Control
Dim prp As Property
For Each ctl In Me.Controls
For Each prp In ctl.Properties
Debug.Print vbTab & prp.Name & vbTab & prp.Value
If prp.Name = "ControlType" Then Exit For
Next prp
Debug.Print "-----------------"
Next ctl
End Sub
Ich plaziere den cursor ganz oben und drücke auf den Pfeil Run Sub/User Form und bekomme die error msg "Invalid use of ME keyword"
Was mache ich falsch ?
Hallo,
bei mir läuft der Code hinter einem Button am aktuellen Formular mit
For Each ctl In Form.Controls
ohne Probleme.
Wenn du deine DB NICHT in Frontend und Backend aufgeteilt hast und mehrere Benutzer GLEICHZEITIG diese Datei übers Netz aufmachen und Daten bearbeiten
wirst du zweifelsohne recht bald mit einer Anfrage nach Datenrettung hier einloggen - so eine Vorgehensweise ist mit ziemlicher Sicherheit eines der Hauptkriterien
warum Access-Datenbanken urplötzlich ihren Dienst verweigern.
Sollte die Aufteilung also bis dato nicht geschehen sein, dann UNBEDINGT SOFORT damit beginnen.
Siehe zu diesem Thema unter Anderem ... http://www.donkarl.com?FAQ1.35 (http://www.donkarl.com?FAQ1.35)
Während ich das schreibe hast du einen neuen Beitrag gesendet....
stelle den Code NICHT in ein Modul sondern wie du bereits hattest ins betreffende Formular ins Klick-Ereignis eines Button!
Du kannst das Formular von einem Modul aus nicht mit 'Me' ansprechen - das bezieht sich immer auf das aktuell geöffnete Formular im Vordergrund.
Setze dann einen Haltepunkt auf die Private Sub DeinButton_Click und zeige das Formular im Formularmodus an.
Anschließend klickst du auf den Button - der VBA-Editor wird angezeigt und du befindest dich am Anfang der Prozedur.
Wenn noch nicht geschehen dann zeige das Direktfenster an - entweder über menü 'Ansicht' im VBA-Editor oder durch drücken von STRG+G
du kannst nun entweder mit F8 schrittweise vorgehen oder mit F5 den Code durchlaufen lassen.
In jedem Fall wirst du im Direktfenster dann eine Ausgabe erhalten die so ähnlich aussehen wird:
EventProcPrefix Bezeichnungsfeld16
Name Bezeichnungsfeld16
ControlType 100
-----------------
EventProcPrefix GA_ID
Name GA_ID
ControlType 109
-----------------
EventProcPrefix GA_ID_Bezeichnungsfeld
Name GA_ID_Bezeichnungsfeld
ControlType 100
-----------------
EventProcPrefix GAVerpackungUF
Name GAVerpackungUF
ControlType 112
-----------------
Dort wo dein Diagramm angesprochen wird - was du ja unschwer an dessen Namen erkennen wirst, liest du den Wert bei 'ControlType' aus und setzt diesen in DEINER Prozedur bei...
Select Case ctl.Properties("ControlType")
Case acComboBox, acListBox
ctl.RowSource = ctl.Tag
Case acSubform
ctl.Form.RecordSource = ctl.Form.Tag
Case WertVonControlType
....
...
Case Else
....
.... ein. Was immer du dann für diesen Control-Typ bestimmen magst folgt dahinter.
HTH
N'abend,
vielleicht hilft Dir http://www.dbwiki.net/wiki/Access_Performance-Tipps
Viel Erfolg und guten Rutsch
Harald
Vielen dank Database für die Geduld und Bahasu für den Hinweis. Ich habe sofort mit der Frontend/Backende aufteilung begonnen.
Unterdessen habe ich es geschaft den ControlType mit der Prozedur herauszufinden:
-----------------
EventProcPrefix ufo_Cap_SO_DIAGRAMM_grouping
Name ufo_Cap_SO_DIAGRAMM_grouping
ControlType 112
-----------------
Und habe den Code wie beschrieben der Prozdur hinzugefügt, aber leider erscheint das Diagramm immer noch nicht.
Private Sub Form_Load()
Dim ctl As Control
Me.RecordSource = "T_SalesOrders"
For Each ctl In Me.Controls
Select Case ctl.Properties("ControlType")
Case acComboBox, acListBox
ctl.RowSource = ctl.Tag
Case acSubform
ctl.Form.RecordSource = ctl.Form.Tag
Case 112
ctl.Form.RecordSource = ctl.Form.Tag
Case Else
'do nothing
End Select
Next ctl
Set ctl = Nothing
End Sub
Habe sehr lange rumprobiert aber es nicht geschafft.
Hallo,
Typischer Copy&Paste Fehler.
Case 112
ctl.RecordSource = ctl.Tag
Nehme jedenfalls an, dass dieses Control (PivotChart) nicht über die Eigenschaft .Form verfügt.
hth
gruss ekkehard
Hi ekkehard - danke für die Hilfe, aber hat leider auch nicht funktioniert. Der Privot Chart bleibt ohne Werte - es ist zum Verzweifeln.
Gemäss http://www.granite.ab.ca/access/performanceforms.htm (http://www.granite.ab.ca/access/performanceforms.htm) gibt es noch eine 2te Variante die Performance to steigern.
Hier ist mir aber der Beschreib der Prozedur aber nicht ganz klar.
Private Sub Form_Load()
Me.RecordSource = "T_SalesOrders" Hier denke ich, kommt meine Tabelle rein
Me.txtSomeField.RowSource = _ ?
"SELECT SomeField " & _ ?
"FROM T_SalesOrders" & _ Hier ebefalls meine Tabelle
"GROUP BY SomeField " & _ ?
"ORDER BY SomeField;" ?
End Sub
Aber beim Rest bin ich mir nicht sicher was ich genau einfügen muss.
Weis jemand wie genau das funktionieren sollte ?
Hallo boehnli,
ZitatMe.RecordSource = "T_SalesOrders" Hier denke ich, kommt meine Tabelle rein
Oder Abfrage, je nachdem wo die Datensätze für das Form herkommen.
Im Prinzip ist das der gleiche Code wie in Deinem OP.
Nur das hier nicht durch alle Controls geschleift wird um den SQL-String aus der Tag-Eigenschaft auszulesen, sondern ein ganz bestimmtes Control (Combo-Box, Listfeld, UFo) angesprochen wird, und der SQL-String direkt zugewiesen wird.
hth
gruss ekkehard
Also die Tabelle für das Hauptformular "Main" nennt sich T_SalesOrders und für das "Subform ufo_TasteConsolidation" = qry_tasteconsolidation. Eines der Felder im Subform nennt sich "PROD_Date". Nun habe die Prozedur beim laden des Haupformulares angepasst, aber es erscheint immer das die error msg "Method or data member not found".
Private Sub Form_Load()
Me.RecordSource = "qry_tasteconsolidation"
Me.PROD_Date.RowSource = _
"SELECT PROD_Date " & _
"FROM qry_tasteconsolidation" & _
"GROUP BY PROD_Date " & _
"ORDER BY PROD_Date ;"
End Sub
Was ist hier falsch ? Im voraus danke für Eure Hilfe.
Hallo boehnli,
ZitatPrivate Sub Form_Load()
Welches Form wird denn hier geladen? Das HFo (Main) oder das UFo?
ZitatSubform ufo_TasteConsolidation
Ist das der Name des Controls oder des Forms darinnen?
Was für ein Controltyp ist PROD_Date?
Du bist ja online, dann beantworte das doch eben. Ich bin auch noch eine Weile hier.
gruss ekkehard
Vielen dank für die Hilfe. Also,
1. Es wird das Hauptformular geladen
2. Nein, weder Name des Forms noch ControlType ist drin.
3. Prod_date hat ControlType 109
Hallo boehnli,
Zitat1. Es wird das Hauptformular geladen
O.K.
Zitat2. Nein, weder Name des Forms noch ControlType ist drin.
Hast Du leider meine Frage nicht verstanden.
Ein UFo besteht aus zwei Elementen; - 1. das UFo-Control und 2. dem eingebetteten Formular (= Herkunftsobjekt des Controls).
Egal, musst Du im Code halt nur den richtigen Namen eintragen.
Zitat3. Prod_date hat ControlType 109
Hm, und was steckt dahinter? Sorry, aber die Werte der ControlType-Konstanten sind mir nicht geläufig.
Private Sub Form_Load()
'RecordSource des HFo
Me.RecordSource = DeineTabelle/AbfrageFuerDasHFo
'RecordSource des UFo
Me!DeinUFoControl.Form.RecordSource=DeineTabelle/AbfrageFuerDasUFo
Me!Dein(e)Kombi/Liste.RowSource = _
DeineTabelle/Abfrage/SQLFuerDiesesControl
End SubDies
"SELECT PROD_Date " & _
"FROM qry_tasteconsolidation" & _
"GROUP BY PROD_Date " & _
"ORDER BY PROD_Date ;"ist ja nur ein Beispiel. Wenn Du keine Gruppierung (GROUP BY) oder Sortierung (ORDER BY) brauchst, gehört das auch nicht da rein.
Was Du da anzeigen willst musst Du ja am besten wissen.
hth
gruss ekkehard