Share via


Δημιουργία μεγάλων και σύνθετων εφαρμογών καμβά

Τα περισσότερα άρθρα σε αυτήν την ενότητα της τεκμηρίωσης καλύπτουν τις επιδόσεις του χρόνου εκτέλεσης των εφαρμογών όπως τις βιώνουν οι τελικοί χρήστες. Αυτό το άρθρο καλύπτει τις επιδόσεις των εφαρμογών που είναι πιο έμπειροι από τα άτομα που τις δημιουργούν.

Καθώς οι εφαρμογές γίνονται μεγάλες και πολύπλοκες, το Power Apps Studio πρέπει να φορτώνει και να διαχειρίζεται μεγάλο αριθμό στοιχείων ελέγχου, τύπων και προελεύσεων δεδομένων, με αλληλεξαρτήσεις που μεγαλώνουν εκθετικά. Ο χρόνος φόρτωσης της εφαρμογής για το Power Apps Studio μπορεί να καθυστερεί και δυνατότητες όπως το IntelliSense και η κωδικοποίηση χρωμάτων μπορεί να είναι αργά. Χρησιμοποιήστε τις συστάσεις σε αυτό το θέμα για καλύτερη εργασία με μεγάλες και σύνθετες εφαρμογές στο Power Apps Studio. Επίσης, μπορούν να σας βοηθήσουν να βελτιώσετε την απόδοση του χρόνου εκτέλεσης των εφαρμογών σας.

Τα παραδείγματα σε αυτό το άρθρο χρησιμοποιούν το δείγμα λύσης επείγουσας απόκρισης νοσοκομείου.

Χρήση του App.Formulas αντί του App.OnStart

Φιλοδώρημα

Μπορείτε να χρησιμοποιήσετε την συνάρτηση With και προσαρμοσμένες ιδιότητες εξόδου στοιχείων καμβά ως εναλλακτική λύση σε τύπους με όνομα.

Ο καλύτερος τρόπος για να μειώσετε τον χρόνο φόρτωσης για το Power Apps Studio και την εφαρμογή τελικού χρήστη σας είναι να αντικαταστήσετε την εκκίνηση μεταβλητής και συλλογής στο App.OnStart με τύπους με όνομα στο App.Formulas.

Δείτε το παρακάτω παράδειγμα που χρησιμοποιεί App.OnStart.

// Get the color of text on a dark background.
Set(varColorOnDark,RGBA(0, 0, 0, 1));

// Get the color of the menu icons.
Set(varColorMenuIcon,"#0070a9");

// Get the styles for a form.
Set(varFormStyle,
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    }
);

ClearCollect(
    FacilitiesList,
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    )
);
If(
    Not IsBlank(Param("FacilityID")),
    Set(ParamFacility,
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name
    );
);

Ως ακολουθία δηλώσεων, η εφαρμογή σας πρέπει να αξιολογήσει αυτές τις κλήσεις Ορισμός και Συλλογή πριν εμφανιστεί η πρώτη οθόνη, γεγονός που καθυστερεί το χρόνο φόρτωσης της εφαρμογής για τον τελικό χρήστη. Αυτός ο τύπος είναι επίσης πολύπλοκος στην ανάλυση από το Power Apps Studio καθώς ολόκληρο το App.OnStart πρέπει να θεωρείται ως σύνολο, η σειρά να διατηρείται, τα σφάλματα να συγκεντρώνονται πριν την επιστροφή του τελικού αποτελέσματος.

Υπάρχει ένας καλύτερος τρόπος. Χρησιμοποιήστε το App.Formulas και ορίστε αυτές τις μεταβλητές και τις συλλογές ως τύπους με όνομα, όπως στο παρακάτω παράδειγμα.

// Get the color of text on a dark background.
varColorOnDark = RGBA(0, 0, 0, 1);

// Get the color of the menu icons.
varColorMenuIcon = "#0070a9";

// Get the styles for a form.
varFormStyle = 
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    };

FacilitiesList =
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    );

ParamFacility = 
    If( Not IsBlank(Param("FacilityID")),
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name,
        Blank()
    );

Αυτή η αλλαγή μπορεί να φαίνεται μικρή, αλλά μπορεί να έχει τεράστιο αντίκτυπο. Επειδή κάθε τύπος με όνομα είναι ανεξάρτητος από τους άλλους, το Power Apps Studio μπορεί να τις αναλύσει ανεξάρτητα, χωρίζοντας αποτελεσματικά ένα μεγάλο App.OnStart σε μικρότερα μέρη. Έχουμε δει τον χρόνο φόρτωσης του Power Apps Studio να μειώνεται κατά 80% και μόνο με αυτήν την αλλαγή.

Επίσης, η εφαρμογή σας φορτώνεται πιο γρήγορα, επειδή δεν χρειάζεται να αξιολογήσει αυτούς τους τύπους μέχρι να χρειαστεί το αποτέλεσμα. Η πρώτη οθόνη της εφαρμογής εμφανίζεται αμέσως.

Οι τύποι με όνομα δεν μπορούν να χρησιμοποιηθούν σε όλες τις περιπτώσεις, επειδή δεν μπορείτε να τους τροποποιήσετε ή να τους χρησιμοποιήσετε με Σύνολο. Ορισμένες περιπτώσεις απαιτούν τη χρήση μιας μεταβλητής κατάστασης που μπορεί να τροποποιηθεί. Το Σύνολο είναι κατάλληλο για αυτές τις περιπτώσεις και θα πρέπει να συνεχίσετε να το χρησιμοποιείτε. Τις περισσότερες φορές, όμως, χρησιμοποιείτε καθολικές μεταβλητές στο OnStart για να ορίσετε στατικές τιμές που δεν αλλάζουν. Σε αυτές τις περιπτώσεις, ο τύπος με όνομα είναι η καλύτερη επιλογή.

Δεδομένου ότι οι φόρμουλες με όνομα είναι μη αμεταβλητές, το πρόθεμα var (συντόμευση για "μεταβλητή") ως σύμβαση ονομασίας δεν είναι πλέον κατάλληλο. Δεν αλλάξαμε τα ονόματα σε αυτό το παράδειγμα, επειδή θα απαιτούνταν αλλαγές στις υπόλοιπες εφαρμογές προκειμένου να συμφωνούν.

Είναι δελεαστικό να τοποθετήσετε ένα τύπο με όνομα στο App.OnStart, αλλά μην το κάνετε. Δεν ανήκουν εκεί. Ως ιδιότητα συμπεριφοράς Ενεργό , το App.OnStart αξιολογεί καθεμία από τις δηλώσεις της με τη σειρά, δημιουργώντας καθολικές μεταβλητές και μιλώντας σε βάσεις δεδομένων μόνο μία φορά, όταν φορτώνεται η εφαρμογή. Οι τύποι με όνομα είναι τύποι που καθορίζουν τον τρόπο υπολογισμού για κάτι, όποτε κι εάν χρειάζεται και είναι πάντα true. Είναι η φύση αυτού του τύπου που τους επιτρέπει να είναι ανεξάρτητοι και επιτρέπει στην εφαρμογή να ολοκληρώσει τη φόρτωση πριν αξιολογηθούν.

Χωρίστε τους μεγάλους τύπους

Το App.OnStart είναι ένας από τους χειρότερους παραβάτες για μεγάλους τύπους και σαφώς εκεί από όπου πρέπει να ξεκινήσετε, αλλά δεν είναι η μοναδική περίπτωση.

Οι μελέτες μας έχουν δείξει ότι σχεδόν όλες οι εφαρμογές με μεγάλο χρόνο φόρτωσης του Power Apps Studio έχουν τουλάχιστον έναν τύπο με περισσότερους από 256.000 χαρακτήρες. Ορισμένες εφαρμογές με τη μεγαλύτερη διάρκεια φόρτωσης έχουν τύπους που έχουν περισσότερους από 1 εκατομμύρια χαρακτήρες. Οι φόρμουλες που εδώ και πολύ καιρό έχουν σημαντικές επιπτώσεις στο Power Apps Studio.

Ακόμα χειρότερα, η αντιγραφή και επικόλληση ενός στοιχείου ελέγχου θα δημιουργήσει διπλότυπους μεγάλους τύπους στις ιδιότητες του στοιχείου ελέγχου χωρίς να πραγματοποιείται. Το Power Apps έχει μοντελοποιηθεί μετά το Excel, όπου πολλά αντίγραφα μιας φόρμουλας είναι κοινά. Ωστόσο, στους τύπους του Excel περιορίζεται σε μία παράσταση και η άμεσή τους περιορίζεται σε 8.000 χαρακτήρες. Οι τύποι του Power Apps μπορούν να αναπτυχθούν για πολύ περισσότερο χρόνο με την εισαγωγή μιας υποχρεωτικής λογικής και του τελεστή σύνδεσης σε αλυσίδα (; ή ;; ανάλογα με τις τοπικές ρυθμίσεις).

Η γενική λύση είναι να διαχωρίσετε τους μεγάλους τύπους σε μικρότερα μέρη και να ξαναχρησιμοποιήσετε αυτά τα μέρη, όπως είχε γίνει με την προηγούμενη ενότητα όταν αλλάξαμε τις δηλώσεις Σύνολο/Συλλογή στο App.OnStart σε τύπους με όνομα στο App.Formulas παραπάνω. Σε άλλες γλώσσες προγραμματισμού, τα επαναχρησιμοποιούμενα αυτά τμήματα συχνά αναφέρονται ως δευτερεύουσες ρουτίνες ή συναρτήσεις που ορίζονται από το χρήστη. Μπορείτε να σκεφθείτε φόρμουλες με όνομα ως μια απλή μορφή συναρτήσεων που ορίζονται από τον χρήστη χωρίς παραμέτρους και χωρίς ανεπιθύμητες ενέργειες.

Χρήση τύπων με όνομα οπουδήποτε

Στο προηγούμενο παράδειγμα, χρησιμοποιήσαμε τύπους με όνομα ως υποκατάστατο του App.OnStart. Ωστόσο, μπορείτε να τα χρησιμοποιήσετε για να αντικαταστήσετε έναν υπολογισμό οπουδήποτε σε μια εφαρμογή.

Για παράδειγμα, μία από τις οθόνες στο δείγμα λύσης απόκρισης έχουν περιλαμβάνεται αυτή η λογική στο Screen.OnIble:

ClearCollect(
    MySplashSelectionsCollection,
    {
        MySystemCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).System.'System Name',
        MyRegionCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).'Region Name',
        MyFacilityCol: ParamFacility,
          MyFacilityColID:  LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Id
    }
); 

Αυτός ο τύπος μπορεί να διαιρεθεί σε ένα σύνολο τύπων με όνομα. Επίσης, κάνει την ανάγνωση του τύπου πιο ευανάγνωστη.

MyRegion = LookUp(
                    Regions,
                    Region = MyParamRegion
           );

MyFacility = LookUp(
                    FacilitiesList,
                    Id = GUID(Param("FacilityID")
            );

MySplashSelectionsCollection = 
    {
        MySystemCol: MyRegion.System.'System Name',
        MyRegionCol: MyRegion.'Region Name',
        MyFacilityCol: ParamFacility,
        MyFacilityColID:  MyFacility.Id
    };

Το ParamFacility είχε εξαχθεί ως τύπος με όνομα νωρίτερα, όταν μετακινήσαμε τις περισσότερες κλήσεις Ορισμός από το App.OnStart σε τύπους με όνομα στο App.Formulas.

Οι τύποι με όνομα αξιολογούνται μόνο όταν οι τιμές τους είναι απαραίτητες. Αν η αρχική πρόθεση της χρήσης του Screen.OnVisible ήταν η αναβολή της εργασίας έως ότου εμφανιστεί η οθόνη, τότε η εργασία θα συνεχίσει να αναβάλλεται ως καθολικοί τύπου με όνομα στο App.Formulas.

Χρήση της συνάρτησης With

Μπορείτε επίσης να χρησιμοποιήσετε τη συνάρτηση Με σε έναν τύπο για να διαχωρίσετε τη λογική. Δημιουργήστε μια καρτέλα στην πρώτη παράμετρο με τις τιμές που θέλετε ως πεδία και, στη συνέχεια, χρησιμοποιήστε αυτά τα πεδία στη δεύτερη παράμετρο για να υπολογίσετε την τιμή επιστροφής από το Με. Για παράδειγμα, το παραπάνω παράδειγμα μπορεί να συνταχθεί ως ένας μόνο τύπος με όνομα:

MySplashSelectionsCollection = 
    With( { MyRegion: LookUp(
                            Regions,
                            Region = MyParamRegion
                      ),
            MyFacility: LookUp(
                            FacilitiesList,
                            Id = GUID(Param("FacilityID")
                      ) 
           },
           {
                MySystemCol: MyRegion.System.'System Name',
                MyRegionCol: MyRegion.'Region Name',
                MyFacilityCol: ParamFacility,
                MyFacilityColID:  MyFacility.Id
           }
    )

Ένα πρόβλημα είναι ότι η χρήση του Με με αυτόν τον τρόπο είναι ότι το MyFacility δεν μπορεί να χρησιμοποιήσει το MyRegion επειδή ορίζονται στην ίδια συνάρτηση Με, ένα πρόβλημα που δεν υπάρχει με τύπους με όνομα. Μια λύση είναι η ένθεση των συναρτήσεων Με και η χρήση της λέξης-κλειδιού Ως για να ονομαστεί η καρτέλα ώστε καθεμία να δίνει εύκολη πρόσβαση σε όλες τις μεταβλητές Με.

Χρησιμοποιήστε στοιχεία καμβά

Τα στοιχεία καμβά χρησιμοποιούνται συχνότερα για τη δημιουργία ενός στοιχείου ελέγχου περιβάλλοντος εργασίας χρήστη που μπορεί να τοποθετηθεί στον καμβά όπως ακριβώς ένα στοιχείο ελέγχου. Μπορούν επίσης να χρησιμοποιηθούν χωρίς περιβάλλον εργασίας χρήστη για την εκτέλεση υπολογισμών, με τις προσαρμοσμένες ιδιότητες εξόδου να είναι εναλλακτική λύση αντί για τύπους με όνομα. Τα στοιχεία καμβά καθίστανται εύκολα κοινόχρηστα με εφαρμογές με βιβλιοθήκες στοιχείων και υποστηρίζονται πλήρως, σε αντίθεση με τους τύπους με όνομα. Ωστόσο, είναι πιο δύσκολο να ρυθμίσετε τις παραμέτρους και να τις χρησιμοποιήσετε σε σχέση με τους τύπους με όνομα.

Για διαίρεση λογικής:

  1. Στο Power Apps Studio, μεταβείτε στην καρτέλα Στοιχεία στην Προβολή δέντρου.
  2. Δημιουργία ενός νέου στοιχείου.
  3. Στο τμήμα παραθύρου Ιδιότητες, ενεργοποιήστε το Πρόσβαση στο πεδίο της εφαρμογής.
  4. Προσθέστε μια προσαρμοσμένη ιδιότητα.
  5. Ορίστε τον Τύπο ιδιότητας σε Έξοδος και τον τύπο δεδομένων, ανάλογα με την περίπτωση.
  6. Επιλέξτε Δημιουργία.
  7. Επιλέξτε τη νέα ιδιότητα δίπλα στον επιλογέα ιδιοτήτων δίπλα στη γραμμή τύπου στο επάνω μέρος της οθόνης.
  8. Συντάξτε τον τύπο για τη λογική που θα διαχωρίσετε και θα χρησιμοποιήσετε ξανά.

Για χρήση της λογικής:

  1. Μεταβείτε στην καρτέλα Οθόνες στην Προβολή δέντρου.
  2. Στο τμήμα παραθύρου Εισαγωγή , αναπτύξτε την επιλογή Προσαρμογή και εισαγάγετε το στοιχείο σας.
  3. Για να υπολογίσετε μια τιμή με την ιδιότητα, χρησιμοποιήστε το ComponentName.PropertyName.

Χρήση της Επιλογής με κρυφό στοιχείο ελέγχου για υποχρεωτική λογική

Η υποχρεωτική λογική χρησιμοποιείται για την τροποποίηση της κατάστασης με το Σύνολο και τη Συλλογή, ειδοποιήστε τον χρήστη με Ειδοποίηση, μεταβείτε σε άλλη οθόνη ή εφαρμογή με Περιήγηση και Εκκίνηση και ξαναγράψτε τιμές σε μια βάση δεδομένων με Ενημέρωση κώδικα, SubmitForm ή RemoveIf.

Οι τύποι με όνομα και οι προσαρμοσμένες ιδιότητες εξόδου στοιχείων καμβά δεν υποστηρίζουν την υποχρεωτική λογική. Ένα σύνηθες πρόβλημα διαίρεσης της υποχρεωτικής λογικής είναι η χρήση της ιδιότητας OnSelect ενός κρυφού στοιχείου ελέγχου.

  1. Προσθέστε ένα στοιχείο ελέγχου Κουμπί σε μια οθόνη.
  2. Ορίστε την ιδιότητα OnSelect στην υποχρεωτική λογική που θέλετε να εκτελέσετε.
  3. Ορίστε την ιδιότητα Ορατό σε false, καθώς δεν χρειάζεται ο χρήστης να βλέπει ή να αλληλεπιδρά με αυτή.
  4. Καλέστε το Select( Button ) όταν θέλετε να εκτελέσετε την υποχρεωτική λογική.

Για παράδειγμα, μία από τις οθόνες του δείγματος έχει την παρακάτω ιδιότητα OnSelect σε ένα στοιχείο ελέγχου Κουμπί. (Αυτό το απλό παράδειγμα είναι μόνο για λόγους επεξήγησης. Κανονικά, χρησιμοποιείτε αυτήν την τεχνική μόνο για μεγαλύτερους τύπους.)

btnAction_17.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in the OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

Για να διαχωρίσουμε αυτήν τη λογική σε μέρη, μπορούμε να βάζουμε τμήματα σε ξεχωριστά στοιχεία ελέγχου Κουμπί και να τα Επιλέγουμε από το αρχικό:

btnTrace.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);

btnSubmit.OnSelect = 
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

btnAction_17.OnSelect = 
    Select( btnTrace );
    Select( btnSubmit );

Αυτή η τεχνική λειτουργεί μόνο στην ίδια οθόνη. Άλλες τεχνικές που είναι ελαφρώς πιο περίπλοκες στις οθόνες, όπως η χρήση του στοιχείου ελέγχου εναλλαγής, η ρύθμιση OnCheck στη λογική που θέλετε να εκτελέσετε και η ρύθμιση Προεπιλογή σε μια καθολική μεταβλητή και, στη συνέχεια, η εναλλαγή της καθολικής μεταβλητής με Set( global, true ); Set( global, false ) στο σημείο που θέλετε να εκτελέσετε τη λογική.

Σε αυτό το παράδειγμα, είχε ήδη γίνει κάποια λογική διαίρεση. Το σχόλιο αναφέρει ότι "Μπορείτε να βρείτε τις επόμενες ενέργειες στο OnSuccess". Αυτό το συμβάν εκτελεί υποχρεωτική λογική μετά την επιτυχημένη υποβολή της καρτέλας, μια λύση ειδικά για τη συνάρτηση SubmitForm .

Διαμερισματοποίηση της εφαρμογής

Ορισμένες εφαρμογές αυξάνονται σε χιλιάδες στοιχεία ελέγχου και εκατοντάδες προελεύσεις δεδομένων, γεγονός που καθυστερεί το Power Apps Studio. Όπως οι μεγάλοι τύποι, οι μεγάλες εφαρμογές μπορούν να χωριστούν σε μικρότερες ενότητες που λειτουργούν μαζί για να δημιουργήσουν μια εμπειρία χρήστη.

Διαχωρίστε εφαρμογές καμβά

Μια προσέγγιση είναι η υλοποίηση ενοτήτων σε ξεχωριστές εφαρμογές καμβά και η χρήση της συνάρτησης Εκκίνησης για την περιήγηση ανάμεσα στις ξεχωριστές εφαρμογές και τη μετάβαση στο απαραίτητο περιβάλλον.

Αυτή η προσέγγιση χρησιμοποιήθηκε στο δείγμα λύσης επείγουσας απόκρισης νοσοκομείου. Ξεχωριστές εφαρμογές διαχειρίζονται κάθε μία από τις κυριότερες περιοχές της συνολικής εφαρμογής. Οι εφαρμογές μοιράζονται ένα κοινό στοιχείο πίνακα επιλογών μέσω μιας βιβλιοθήκης στοιχείων, την οποία εμφανίζει κάθε εφαρμογή στην οθόνη εκκίνησης:

Στιγμιότυπο οθόνης της εφαρμογής καμβά λύσης δείγματος επείγουσας απόκρισης νοσοκομείου που εκτελείται από τηλέφωνο και δείχνει το στοιχείο καμβά πίνακα επιλογών.

Όταν ο χρήστης επιλέγει μια περιοχή, το στοιχείο χρησιμοποιεί μετα-δεδομένα σχετικά με τις διαθέσιμες εφαρμογές και την εφαρμογή που φιλοξενεί το στοιχείο. Αν η οθόνη που θέλετε είναι σε αυτήν την εφαρμογή (ThisItem.Screen δεν είναι κενή), γίνεται μια κλήση Περιήγηση. Αλλά αν η οθόνη που θέλετε είναι σε διαφορετική εφαρμογή (Το ThisItem.PowerAppID δεν είναι κενό), μια συνάρτηση Εκκίνηση χρησιμοποιείται με το αναγνωριστικό εφαρμογής του προορισμού και του περιβάλλοντος FacilityID.

If(
    IsBlank(ThisItem.Screen),
    If(IsBlank(ThisItem.PowerAppID), 
        Launch(ThisItem.URL),           
        Launch("/providers/Microsoft.PowerApps/apps/" & ThisItem.PowerAppID, 
               "FacilityID", Home_Facility_DD.Selected.Id)
    ),
    Navigate(
        ThisItem.Screen,
        Fade
    )
);

Οποιαδήποτε κατάσταση στην αρχική εφαρμογή θα χαθεί όταν γίνει εκκίνηση άλλης εφαρμογής. Φροντίστε να αποθηκεύσετε οποιαδήποτε κατάσταση πριν από την κλήση της συνάρτησης εκκίνησης. Κάντε εγγραφή σε μια βάση δεδομένων, καλέστε το SaveData ή μεταβιβάστε την κατάσταση στην εφαρμογή-στόχο με παραμέτρους που διαβάζονται με τη συνάρτηση Παράμετρος.

Εφαρμογή βάσει μοντέλου με προσαρμοσμένες σελίδες

Οι ενότητες μπορούν επίσης να υλοποιηθούν ως προσαρμοσμένες σελίδες. Κάθε προσαρμοσμένη σελίδα ενεργεί ως μίνι εφαρμογή καμβά, με ένα κοντέινερ εφαρμογής που καθορίζεται από μοντέλο για περιήγηση.

Σημείωση

Μπορείτε να μας πείτε ποια γλώσσα προτιμάτε για την τεκμηρίωση; Πάρτε μέρος σε μια σύντομη έρευνα. (σημειώνεται ότι αυτή η έρευνα είναι στα Αγγλικά)

Η έρευνα θα διαρκέσει περίπου επτά λεπτά. Δεν συλλέγονται προσωπικά δεδομένα (δήλωση προστασίας προσωπικών δεδομένων).