Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: boehnli01 am Dezember 30, 2011, 21:52:14

Titel: Access Performance
Beitrag von: boehnli01 am Dezember 30, 2011, 21:52:14
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
Titel: Re: Access Performance
Beitrag von: database am Dezember 30, 2011, 23:21:55
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
Titel: Re: Access Performance
Beitrag von: boehnli01 am Dezember 31, 2011, 12:53:18
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
Titel: Re: Access Performance
Beitrag von: DF6GL am Dezember 31, 2011, 13:19:32
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?
Titel: Re: Access Performance
Beitrag von: boehnli01 am Dezember 31, 2011, 13:37:01
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
Titel: Re: Access Performance
Beitrag von: DF6GL am Dezember 31, 2011, 13:56:15
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
Titel: Re: Access Performance
Beitrag von: boehnli01 am Dezember 31, 2011, 14:29:14
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
Titel: Re: Access Performance
Beitrag von: DF6GL am Dezember 31, 2011, 14:32:15
Hallo,

was soll passieren?


Der Code "druckt" die Namen und Werte der Properties in das VBA-Direktfenster...
Titel: Re: Access Performance
Beitrag von: boehnli01 am Dezember 31, 2011, 14:58:25
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 ?
Titel: Re: Access Performance
Beitrag von: database am Dezember 31, 2011, 15:19:48
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
Titel: Re: Access Performance
Beitrag von: bahasu am Dezember 31, 2011, 21:42:57
N'abend,

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

Viel Erfolg und guten Rutsch
Harald

Titel: Re: Access Performance
Beitrag von: boehnli01 am Januar 01, 2012, 21:35:53
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.
Titel: Re: Access Performance
Beitrag von: Beaker s.a. am Januar 01, 2012, 22:09:21
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
Titel: Re: Access Performance
Beitrag von: boehnli01 am Januar 01, 2012, 22:19:41
Hi ekkehard - danke für die Hilfe, aber hat leider auch nicht funktioniert. Der Privot Chart bleibt ohne Werte - es ist zum Verzweifeln. 
Titel: Re: Access Performance
Beitrag von: boehnli01 am Januar 02, 2012, 16:11:00
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 ?
Titel: Re: Access Performance
Beitrag von: Beaker s.a. am Januar 02, 2012, 16:45:19
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
Titel: Re: Access Performance
Beitrag von: boehnli01 am Januar 02, 2012, 21:04:54
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.
Titel: Re: Access Performance
Beitrag von: Beaker s.a. am Januar 02, 2012, 21:39:30
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
Titel: Re: Access Performance
Beitrag von: boehnli01 am Januar 02, 2012, 21:57:51
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
Titel: Re: Access Performance
Beitrag von: Beaker s.a. am Januar 02, 2012, 23:55:25
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 Sub


Dies
"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