Neuigkeiten:

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

Mobiles Hauptmenü

Access Performance

Begonnen von boehnli01, Dezember 30, 2011, 21:52:14

⏪ vorheriges - nächstes ⏩

boehnli01

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

database

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

boehnli01

#2
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

DF6GL

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?
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

boehnli01

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

DF6GL

#5
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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

boehnli01

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

DF6GL

Hallo,

was soll passieren?


Der Code "druckt" die Namen und Werte der Properties in das VBA-Direktfenster...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

boehnli01

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 ?

database

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

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

bahasu

N'abend,

vielleicht hilft Dir http://www.dbwiki.net/wiki/Access_Performance-Tipps

Viel Erfolg und guten Rutsch
Harald

Servus

boehnli01

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.

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

boehnli01

Hi ekkehard - danke für die Hilfe, aber hat leider auch nicht funktioniert. Der Privot Chart bleibt ohne Werte - es ist zum Verzweifeln. 

boehnli01

Gemäss 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 ?