PDA

Vollständige Version anzeigen : SourceObject für UnterformularSteuerElement Wartezeit


stuz1
05.06.2012, 13:44
Hallo zusammen,

ich weise bei Registerkartensteueremelenten die Daten der darin platzierten UnterformularSteuerelemente erst zu wenn der User auch die Karte anzeigt.... mit nachfolgendem Code...

Private Sub regKunden_Change()
Select Case Me.regKunden.Value
Case 0
'nichts weiter
Case 1
If Me.UFrm_KundenMitarbeiter.SourceObject = "UFrm_Dummy" Then
Me.UFrm_KundenMitarbeiter.SourceObject = "UFrm_KundenMitarbeiter"
End If
Case 2
If Me.UFrm_Auftraege.SourceObject = "UFrm_Dummy" Then
Me.UFrm_Auftraege.SourceObject = "UFrm_Auftraege"
End If
Case 3
If Me.UFrm_Belege.SourceObject = "UFrm_Dummy" Then
Me.BezMoment.Visible = True
Me.UFrm_Belege.SourceObject = "UFrm_Belege"
Me.BezMoment.Visible = False
End If
Case 4
MsgBox "Für Register Statistik wurde noch keine Aktion hinterlegt"
Case Else
MsgBox "Für Registerkarte Index: " & Me.regKunden.Value & " wurde noch keine Aktion hinterlegt"
End Select
End Sub


Im Fall CASE 3 versuche ich (da es ein bisschen dauert bis die Daten berechnet sind) das dem User irgendwie klar zu machen.. z.B. durch anzeigen eines Bezeichnungsfeldes....

Zuerst hatte ich es mit Hourglass probiert....

Aber nichts wirkt.... der Rechner ist einfach kurz "gelähmt" bis die Daten da sind.... Also das

Me.BezMoment.Visible = True

kommt erst wenn die Daten bereits geladen sind...

Könnt Ihr mir bitte sagen wie ich diese Wartezeit sauber abfangen kann?

Josef P.
05.06.2012, 13:52
Hallo!

Du könntest mit DoEvents Access die Chance geben, die Anzeigeänderung zu aktualisieren.
If Me.UFrm_Belege.SourceObject = "UFrm_Dummy" Then
Me.BezMoment.Visible = True
DoEvents
Me.UFrm_Belege.SourceObject = "UFrm_Belege"
Me.BezMoment.Visible = False
End If

Noch besser wäre allerdings das Laden so zu beschleunigen, dass die User die Anzeige von "BezMoment" gar nicht sehen. ;)

Versuche vielleicht auch einmal so einen Weg:
1. UFo UFrm_Belege ohne Datenherkunft (bzw. mit Datenherkunft aber 0 Datensätzen) verknüpfen
2. Erst nun die anzuzeigenden Daten laden lassen
=> Wenn das Laden der Daten nicht zu lange benötigt, sehen die Anwender zumindest schon einmal den Formularwechsel. Während sie beschäftigt sind, die Überschriften zu lesen, werden die Daten nachgeladen und angezeigt.

mfg
Josef

stuz1
05.06.2012, 14:05
Hallo Josef,

danke für die schnelle Antwort....

Danke, probiere es nachher mal aus... mit DoEvents bin nur immer etwas skeptisch unterwegs...

Das Problem ist dass wir (momentan noch) bei diesem Kunden die Mengenberechnung der Artikel über eine Eval-Funktion machen... das heißt er kann mathematische Formeln selber in ein Textfeld eingeben und somit direkten Einfluss auf die Mengenberechnung nehmen... der Stammartikel (quasi eine Baugruppe) hat zum Beispiel eigene Dimensionen, z.b. Länge 10m x Breite 10m, jetzt hat dieser Stammartikel z.B. einen Unterartikel... dessen Menge berechnet sich 5 x Länge + 2 x Breite. In einem anderen "Projekt" berechnet sich dieser 3 x Länge, 1 x Breite... usw....

Ziel ist natürlich wenn sich der Stammartikel in der Dimension ändert (z.B. jetzt 10m x 5m) dass sich die Unterartikel alle neu berechnen....

Das funktioniert technisch auch optimal... nur dauert das mit Eval natürlich ein weilchen... vor allem wenn man die Summe über 300 Projekte mit jeweis 30 Stammartikeln und jeweils 20 Unterartikeln bilden möchte...

Im Prinzip sehen die lösungsansätze momentan 2 Richtungen vor die wir gerade mit dem Kunden analysieren:

Entweder wir speichern die Mengen im Artikel mit ab.... Berechnung dann immer nur noch ganz bewusst nach einer Änderung.... Oder wir finden heraus dass es doch nicht ganz so viele Formeln sind wie zunächst vermutet, und geben dem System feste Formeln mit auf den Weg.....

Aber vielleicht hat ja an dieser Stelle auch noch jemand eine ganz andere Idee?

Gruß


Stefan

stuz1
05.06.2012, 14:25
Also, das mit DoEvents hat in diesem Fall Wunder gewirkt... Dankeschön.

Habe dein EDIT gerade erst gelesen....

In diesem Fall brauche ich keine großen Klimmzüge machen da "ich nicht Schuld" bin dass es so lange dauert... er wollte das so flexibel...

aber an anderer Stelle ist das gut, das muss ich mir merken... lange Wartezeiten etwas überspielen.... lächel.... (Eine Anzeige "Bitte warten..." ist nie gut für den Entwickler...)

Grüße nach Österreich

Stefan

Josef P.
05.06.2012, 14:46
Hallo!

Kannst du diese "Eval-Berechnung" eventuell ins Formular verlagern?
... also nicht innerhalb der Abfrage sondern über ein berechnetes Steuerelement.
Dann wird das "im Lauf der Zeit" angezeigt und sollte das Laden der Datensätze aus der Tabelle bzw. Abfrage nicht bremsen.

Entweder wir speichern die Mengen im Artikel mit ab
Was ist für dich ein Artikel?
Ist das der Materialstamm (im Sinne von "Teil" wie ihn die Konstruktuere sehen) oder das an den Kunden ausgelieferte Produkt inkl. Serienkennung o. ä.?

Ein Beispiel (nur skizzenhaft) wie ich so etwas mit frei definiertbaren Artikel-Abmessungen gestaltete:
Artikelgruppe (Beispiel "Blech"): dort werden die unbedingt erforderlichen Abmessungsparameter festgelegt. Blech hat z. B. nur "Dicke".
Zusätzlich wird an dieser Stelle auch die Lagereinheit (z. B. für Belch kg oder m², bei Stangen würde man üblicherweise m verwenden) festgelegt.

Artikelgruppen-Abmessungsparameter (Unterkategorie zu Artikelgruppe / 1:n): Hier werden die je nach Abmessungsart wie "Platte", "Rolle" usw. die Dimensionsparameter definiert. Mit diesen Dimensionsparamtern muss es möglihc sein, den Lagerzugang zu berechnen. Dafür werden die Formeln für Gewicht usw. festgelegt.

Artikel ("Konstruktionsteil" bzw. "Katalogartikel"):
Wird einer Artikelgruppe zugeordnet und enthält die erforderlichen Abmessungsparameter (bei Blech: die Dicke").
Außerdem werden das Material, die anzuwendenden Normen usw. angegeben.

"Lagerware" bzw. "Erzeugnis"
ist definiert durch den Artikel und den beim Wareneingang festgelegten Abmessungsparameter für die jeweilige Artikelgruppe.
Erst hier entsteht ein messbare Größe für die Lagerbewegungen.
Weitere Daten: Seriennummer, Chargennummer usw.

Aus den eingegebenen Parametern wird je nach Formel die Lagermenge (Zu- / Abgang) berechnet.
Ein Datensatz in den Lagerbewegungen besteht somit aus:
- ID der "Lagerware/Erzeugnis"
- Menge (Anzahl)
- Lagerabmessung (z. B. m²)
- Abmessungskennung
- Abmessungen (mehrere Felder passenden zur Abmessungskennung)

Anm.: die Abmessungswerte sind nicht normalisiert sondern aus Performancegründen in Form von Feldern wie Dim1, Dim2 usw. gestaltet.
Ist aber nicht so tragisch, da diese Werte nur zur Protokollführung und zum Gruppieren dienen. Die entscheidende Lagerbewegungsinformation ist in Menge und Lagerabmessung enthalten. (Nur ein Feld für die Lagermenge würde nicht ausreichen, da es bei Stangenmaterial entscheiden ist, ob man 3 x 6m bzw. 6 x 3m lagernd hat. ... aus 6x3m kann man sehr schwer zwei 4m-Stangen herausschneiden. ;))

mfg
Josef

stuz1
05.06.2012, 16:10
Danke für deine Ideen. Ich versuche mal an einem konkreten Beispiel zu erklären was wir da machen:

Verkauft wird 1 Stück Fussboden Breite 10m. x Länge 10m. (=100m.)
(Die Dimensionen stehen in 2 Feldern Dim1 und Dim2)

Den gibt es natürlich nicht als Artikel ab Lager sonder wird besteht aus Einzelteilen.....

Der Kunde erfasst nun folgende Artikel (jeder Einzelartikel hat dabei natürlich seine eigenen Einheiten... z.B. lfm. Leiste oder m² Spanplatte....)



Unterkonstruktion (Holzlatte 40 x 80mm)
Formel: Dim1() x 2 x Dim2() + Dim2() x 2
[Längs alle 500mm eine Latte und dann noch 2 x Quer)

Grundlage (Spanplatte 22mm)
Formel: Dim1() x Dim2()

Decklage: (Laminat Eiche)
Formel: Dim1() x Dim()2

Fussleisten:
Formel: Dim1() + 2 x Dim2()
[Eine Seite keine Leisten]

Abdeckfolie:
Formel: 1
[Einfach 1 komplette Rolle vom Lager mitnehmen]

Warnschilder (Nicht betreten)
Formel: Dim1() x Dim2() / 20
[Alle 20m² ein Warnschild]

Das ganze kann dann natürlich auch noch 3-dimensional sein (z.B. für Korpusse).....

Das Dim1() usw. ruft dann entsprechend Funktionen in einem VBA-Modul auf und holt sich die jeweilige Dimension des Stammartikel.

Wenn der Kunde jetzt merkt dass der Boden doch 20 x 10m ist ändert er das in der Hauptposition und alle abhängigen Belegpositionen sind geändert.

Wenn er dann irgendwann den Beleg für gut empfindet und auf "Produktiv" stellt werden die Kommissionierlisten erstellt, Lagerbestände reserviert, Bestellungen und Preisanfragen an Lieferanten erstellt, Zollpapiere vorbereitet.... naja, das übliche eben...

Das kostet aber unheimlich Performance...... So kann es auf jeden Fall nicht bleiben....