Implementierungsleitfaden: Screen-Referenzen Beheben¶
Ziel: Entfernen der screenübergreifenden Control-Referenz zwischen Home und scrBexioKOntakteDetail, um ~668ms Laden-Zeit zu sparen.
Problem Zusammenfassung¶
Trace-Warnung:
InefficientControlReferences (Home->scrBexioKOntakteDetail)
Reason: galbexiokontakte_1.Items referenziert galFirms.Selected auf scrBexioKOntakteDetail
Aktuelle Formel (Home Screen, galbexiokontakte_1 Gallery):
Items: =Filter(Relations, Firma.'Bexio-ID' = galFirms.Selected.'Bexio-ID')
Problem: galFirms ist ein Control auf scrBexioKOntakteDetail. PowerApps muss deshalb scrBexioKOntakteDetail laden, bevor Home vollständig dargestellt wird.
Lösung: 3-Schritt-Prozess¶
Schritt 1: Variable auf App-Level Erstellen¶
Wo: App-Settings oder ggf. im App.OnStart()
Code:
// Global variable to store selected Kontakt/Firma from Bexio screen
// Initialize on app startup
Set(gvSelectedBexioFirmaDatum, {});
// Whenever needed, store the selected Firma data
Set(gvSelectedBexioFirmaDatum, {
BexioId: ...,
Name: ...,
// All fields you need from galFirms.Selected
});
Alternative (Empfohlen): In scrBexioKOntakteDetail OnSelect von galFirms:
Finde auf scrBexioKOntakteDetail den Screen und wechsle zu den Properties. Im Event OnSelect von galFirms:
Set(gvSelectedBexioFirmaId, Self.Selected.'Bexio-ID');
Set(gvSelectedBexioFirma, Self.Selected);
Schritt 2: Bestehende Formel auf Home Ersetzen¶
Screen: Home
Control: galbexiokontakte_1
Property: Items
ALT (Aktuell):
Filter(Relations, Firma.'Bexio-ID' = galFirms.Selected.'Bexio-ID')
NEU:
Filter(Relations, Firma.'Bexio-ID' = gvSelectedBexioFirmaId)
Falls die Variable noch leer ist (User hat scrBexioKOntakteDetail noch nicht besucht), kannst du einen Fallback hinzufügen:
Filter(Relations, Firma.'Bexio-ID' = (gvSelectedBexioFirmaId ?? ""))
Schritt 3: Synchronisierung sicherstellen¶
Falls Home und scrBexioKOntakteDetail zeitgleich aktiv sein sollen (z.B. in Tabs), müssen Sie ein Update-Pattern etablieren:
Option A: Mit Button / Event auf scrBexioKOntakteDetail:
// Button "Apply Selection" - OnSelect:
Set(gvSelectedBexioFirmaId, galFirms.Selected.'Bexio-ID');
Set(gvSelectedBexioFirma, galFirms.Selected);
Navigate(Home); // oder Tab wechseln
Option B: Automatisch on galFirms Selection Change (Live-Sync):
In der Property OnSelect von galFirms auf scrBexioKOntakteDetail:
Set(gvSelectedBexioFirmaId, Self.Selected.'Bexio-ID');
// galbexiokontakte_1 auf Home wird sofort aktualisiert
Option C: Mit Dataverse View Parameter (Advanced):
Falls Sie ein komplexeres Sync-Szenario haben, können Sie auch Context-Variablen beim Navigation übergeben:
// Bei Navigation zu scrBexioKOntakteDetail mit select:
Navigate(
scrBexioKOntakteDetail,
ScreenTransition.Fade,
{
firmaidFromHome: gvSelectedBexioFirmaId
}
);
// In scrBexioKOntakteDetail.OnVisible:
If(
IsBlank(firmaidFromHome),
Set(gvSelectedBexioFirmaId, ""),
Set(gvSelectedBexioFirmaId, firmaidFromHome)
);
Implementierungs-Checkliste¶
[ ] App öffnen in Power Apps Studio
[ ] Nach
Home-Screen navigieren[ ]
galbexiokontakte_1Gallery wählen → Properties → Items-Eigenschaft[ ] Formel von
Filter(Relations, Firma.'Bexio-ID' = galFirms.Selected.'Bexio-ID')aufFilter(Relations, Firma.'Bexio-ID' = gvSelectedBexioFirmaId)ändern[ ] Nach
scrBexioKOntakteDetailnavigieren[ ]
galFirmsGallery wählen → OnSelect-Event[ ] Folgende Zeilen hinzufügen:
Set(gvSelectedBexioFirmaId, Self.Selected.'Bexio-ID'); Set(gvSelectedBexioFirma, Self.Selected);
[ ] App speichern & publishen
[ ] Power Apps Monitor öffnen und auf neue Trace Events prüfen
[ ] Verifiziere, dass
InefficientControlReferences-Warnung weg ist
Ergebnis Validation¶
Nach der Änderung:
Öffne Power Apps Monitor
Starte die App neu
Schaue auf den Trace:
LoadScreen (Home)sollte ca. 150-200ms schneller seinInefficientControlReferencessollte nicht mehr auftauchenscrBexioKOntakteDetailwird erst geladen, wenn Sie dahin navigieren
Erwartet Load-Zeit-Verbesserung: ~600-700ms (wenn Home-Screen vorher ~1.150ms brauchte, nun ~500ms)
Häufige Fragen¶
Q1: Was passiert, wenn gvSelectedBexioFirmaId leer ist?¶
A: Die Gallery zeigt keine Zeilen. Nutze einen Fallback oder einen “Kein Datensatz”-Zustand:
Items: =If(
IsBlank(gvSelectedBexioFirmaId),
Table(), // Leere Tabelle
Filter(Relations, Firma.'Bexio-ID' = gvSelectedBexioFirmaId)
)
Q2: Muss ich das auch auf anderen Screens machen?¶
A: Nur wenn es andere ähnliche screenübergreifende Referenzen gibt. Der Monitor zeigt 2 Warnungen, aber beide auf die gleiche Stelle hin. Falls es andere gibt, wird ein neuer Monitor-Run das zeigen.
Q3: Kann ich die Variable noch woanders nutzen?¶
A: Ja! Alle anderen Screens und Controls können jetzt auch gvSelectedBexioFirmaId direktzugreifen, ohne dass dieser Screen geladen werden muss.
Q4: Was ist der Unterschied zwischen Optionen A, B und C?¶
A:
A (Button): Nutzer muss Änderungen bestätigen. Gut für kritische Aenderungen.
B (Live-Sync): Aenderung sofort sichtbar. Gut für schnelle Navigationserlebnisse.
C (Context): Weitergabe von Kontext zwischen Screens. Gut für Workflows mit mehreren Schritten.
Weitere Referenzen¶
Trace Raw Data: PowerAppsTraceEvents.json (lokal, nicht Teil dieser Dokumentation)