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_1 Gallery wählen → PropertiesItems-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:

    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:

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