# 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):** ```text 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:** ```text // 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`: ```text 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):** ```text Filter(Relations, Firma.'Bexio-ID' = galFirms.Selected.'Bexio-ID') ``` **NEU:** ```text Filter(Relations, Firma.'Bexio-ID' = gvSelectedBexioFirmaId) ``` > Falls die Variable noch leer ist (User hat scrBexioKOntakteDetail noch nicht besucht), kannst du einen Fallback hinzufügen: ```text 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:** ```text // 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`: ```text 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: ```text // 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_1` Gallery wählen → *Properties* → *Items*-Eigenschaft - [ ] Formel von `Filter(Relations, Firma.'Bexio-ID' = galFirms.Selected.'Bexio-ID')` auf `Filter(Relations, Firma.'Bexio-ID' = gvSelectedBexioFirmaId)` ändern - [ ] Nach `scrBexioKOntakteDetail` navigieren - [ ] `galFirms` Gallery wählen → *OnSelect*-Event - [ ] Folgende Zeilen hinzufügen: ```text 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:** 1. Öffne Power Apps Monitor 2. Starte die App neu 3. Schaue auf den Trace: - `LoadScreen (Home)` sollte ca. **150-200ms** schneller sein - `InefficientControlReferences` sollte nicht mehr auftauchen - `scrBexioKOntakteDetail` wird 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: ```text 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 - [Power Apps Variables Best Practices](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/working-with-variables) - [Monitor Trace Analysis: app-optimization-bmvcc.md](app-optimization-bmvcc.md) - Trace Raw Data: PowerAppsTraceEvents.json (lokal, nicht Teil dieser Dokumentation)