V. Développement▲
V-A. Quelques règles▲
Règles
- Sauvegardez souvent.
- Faites une copie localement de votre projet à chaque point de synchro.
- Donnez des noms à vos contrôles.
- La zone de codage est vite confuse si votre code est important. N'hésitez pas à écrire celui-ci dans le bloc-note, puis copiez-le dans powerapps. Corrigez les anomalies.
- La syntaxe est de type Excel, c'est-à-dire : le If THEN ELSE se traduit par If (condition;alors;sinon). Quand n instructions se suivent, séparez-les par ;;
V-B. Propriétés, contrôles et fonctions utilisés▲
Les propriétés ci-dessous sont celles que nous utiliserons.
Niveau |
Quoi |
Utilisation |
---|---|---|
Application |
OnStart |
Préprocess comme l'initialisation de variables globales, la navigation vers le 1er écran de l'appli |
Écran |
OnVisible |
Préprocess comme l'initialisation de variables temporaires. Focus sur un contrôle particulier |
Saisie Utilisateur |
OnChange |
Déclenché APRÈS la saisie, à la perte du focus |
Bouton |
OnSelect |
Déclenché au clic (et non au select) |
Les contrôles ci-dessous sont ceux que nous utiliserons.
Fonction |
Documentation |
Utilisation |
Propriété importante |
---|---|---|---|
Bouton |
Déclencher une action |
OnSelect |
|
Étiquette |
Affichage d'un texte non modifiable |
Text |
|
Galerie verticale |
Affichage d'une collection suivant un gabarit prédéfini |
Items |
|
Icône |
Déclencher une action |
OnSelect |
|
Saisie utilisateur |
Saisie |
OnChange |
|
Liste déroulante |
Choix unique |
OnChange |
|
Table de données |
Liste des éléments d'une collection |
Items |
Les fonctions ci-dessous sont celles que nous utiliserons.
Documentation |
Utilisation |
---|---|
Ajouter une colonne à une collection |
|
Donner un alias à une table |
|
Revenir en arrière dans la navigation |
|
Insérer des lignes (Collect), vider une collection (Clear), Vider la collection avant d'insérez les nouvelles lignes (ClearCollect) |
|
Compter le nombre de lignes d'une table |
|
Différence entre deux dates |
|
Rendre toutes les lignes (max 500) répondant aux conditions |
|
Obtenir la 1re ligne (First), la ligne N (FirstN ou LastN), la dernière ligne (Last) d'une collection |
|
Boucler sur toutes les lignes d'une collection |
|
Tester si la donnée est à blanc ou null |
|
Tester si un champ est numérique |
|
Vérifier si une date/time est dans la date du jour |
|
Longueur d'un texte, nombre de lignes d'un tableau |
|
Rendre la 1re ligne répondant aux conditions |
|
Naviguer vers |
|
Afficher un message |
|
Mettre à jour des lignes |
|
Réinitialiser un contrôle |
|
Supprimer des lignes |
|
Simuler un clic sur un contrôle |
|
Donner le focus |
|
Trier (Sort), Trier en utilisant le nom de la colonne (SortByColumns) |
|
Tests multiples |
|
Transformer numérique ou date vers texte |
|
Initialiser des variables temporaires |
|
Mettre un texte en majuscules |
|
Transformer texte vers numérique |
Lors de la création des écrans, j'indiquerai les contrôles et fonctions utilisés. Référez-vous à ces tableaux pour la documentation.
Le plus simple est d'ouvrir, dans un deuxième onglet, cette partie et la conserver
V-C. La création des écrans▲
Renommez screen1 en ETest (cet écran servira au débogage).
Créer huit écrans vierges (Nouvel Écran puis vierge) et renommez-les (les … en face du nom de l'écran) comme ceci :
- ELogin
- EMenu
- EUsers
- ELog
- EStock
- EInOutInv
- EIOIMaj
- EVisu
Il faut dire à l'application quel est l'écran qui sera appelé initialement. Ceci est fait par la propriété OnStart de l'application.
Navigate
(
EMenu)
V-D. Le login - Autoriser l'accès à l'application▲
V-D-1. Écran de login▲
V-D-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Étiquette |
Affichage LOGIN |
Text |
LOGIN |
|
Input-Text |
Saisie du matricule |
MaxLength |
8 |
(1) |
Bouton |
Validation |
Text |
VALIDEZ |
|
Étiquette |
Affichage texte durant l'accès en base |
Text |
Patientez |
(2) |
- Renommez ce contrôle en Matricule et effacez le texte par défaut.
- Donnez une taille importante à ce contrôle et passez la police à 30.
On affiche ce texte AVANT la recherche et on le rend invisible APRÈS. Il faut donc modifier la propriété Visible Dynamiquement.
Il est impossible de modifier dynamiquement une propriété fixée. Ainsi l'instruction Etiquette.visible=true sur un contrôle Etiquette dont la propriété visible est fixée à false ne fonctionnera pas. Ce comportement implique que toute propriété qui doit être dynamiquement modifiée ne peut être fixée, mais doit être liée à une variable ou au résultat d'une instruction.
V-D-3. Règles de gestion▲
Règle |
Message |
---|---|
Matricule obligatoire |
Matricule obligatoire |
Matricule doit exister en table P8_Login |
Matricule n'existe pas |
Ces règles s’appliquent lorsque l’utilisateur appuie sur le bouton VALIDEZ. C’est alors la propriété OnSelect de celui-ci qui est déclenchée. Le code doit donc se trouver sur cette propriété.
Comme expliqué précédemment, l'initialisation des variables et le focus initial se font dans la propriété OnVisible l'écran.
V-D-4. Code▲
V-D-4-a. En clair▲
Initialiser vVisible
Mettre le focus sur le matricule
SI (MATRICULE = Space)
ALORS Afficher("Matricule Obligatoire")
SINON
Rechercher flag admin dans P8_Login avec Login=Matricule
SI absent ALORS
Afficher ("Matricule n'existe pas")
SINON
Aller vers EMenu(admin)
FSI
FSI
V-D-4-b. PowerApps▲
UpdateContext
(
{vVisible:Blank
(
)});;SetFocus
(
MATRICULE)
If
(
IsBlank
(
Matricule.Text
);Notify
(
"Matricule obligatoire"
;Error
);;SetFocus
(
MATRICULE);
UpdateContext
(
{vVisible: true
});;
UpdateContext
(
{vAdmin: LookUp
(
'[schema].[P8_login]';Upper(Login) = Upper(Matricule.Text);admin)});;
UpdateContext
(
{vVisible: false
});;
If
(
IsBlank
(
vAdmin);Notify
(
"Matricule inconnu"
;Error
);;SetFocus
(
MATRICULE);Navigate
(
EMenu;Fade;{rAdmin:vAdmin})))
V-D-4-c. Nota Bene▲
Notify affiche des messages (en haut de l'écran) en y ajoutant une petite icône en fonction du type de message (Warning, Error…). Il y a un cast implicite vers du texte si l'un des composants du message est un texte. Ainsi Notify(100) provoquera une erreur alors que Notify(100 & " ") fonctionnera. Autre particularité, Notfiy("A");;Notify("B") n'affichera que Notify("B")
LookUp recherche, dans une collection, le 1er élément correspondant au test et renvoie la colonne demandée (3e argument) ou la ligne complète si cet argument est absent. Ici c'est le flag admin qui est renvoyé (n'oubliez pas de modifier le nom du schéma ou de l'enlever suivant que vous êtes en SQL ou en Excel).
UpdateContext permet d'initialiser une variable TEMPORAIRE, variable qui n'est visible que de l'écran à l'inverse de la variable GLOBALE qui est initialisée par l'instruction Set et est visible de toute l'application. Les deux étant persistantes, une bonne méthode consiste à initialiser les globales dans la propriété OnStart de l'application et les privées dans la propriété OnVisible de l'écran.
Navigate permet d'aller vers l'écran cité dans le navigate en lui passant, si nécessaire, des paramètres (ce qui est le cas ici). Les paramètres doivent être déclarés dans la fonction Navigate et sont de type temporaire. Ils ne sont utilisables que dans l'écran appelé.[Ici, on déclare un paramètre rAdmin initialisé avec la valeur vAdmin et qui ne pourra être utilisé que dans Emenu.]
V-D-4-d. Test▲
Test |
Résultat |
---|---|
Valider sans saisie |
Matricule obligatoire |
Saisir XXX et valider |
Matricule inconnu |
Saisir un logon correct et valider |
EMenu |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
V-E. Le menu - Portail de l'application▲
V-E-1. Écran de menu▲
Comme on peut le voir, il y a deux menus possibles en fonction du profil. Si c'est un profil ADMIN, alors c'est le 1er menu qui sera affiché, sinon ce sera le second.
Le flag admin a été récupéré lors du login et passé en paramètre à cet écran sous le nom de rAdmin.
V-E-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Bouton |
Menu EUsers |
Text |
Administrateur |
Renommer en BUsers |
Bouton |
Menu ELog |
Text |
Visualisation des Logs |
Renommer en BLog |
Bouton |
Menu EStock |
Text |
Interrogation Stock |
Renommer en BStock |
Bouton |
Menu EInOutInv |
Text |
Entrée Stock |
Renommer en BEntree |
Bouton |
Menu EInOutInv |
Text |
Sortie Stock |
Renommer en BSortie |
Bouton |
Menu EInOutInv |
Text |
Inventaire |
Renommer en BInventaire |
Bouton |
Menu EVisu |
Text |
Visu tables (Test) |
Renommer en BVisu |
Étiquette |
Affichage Menu Administrateur |
Text |
Menu Administrateur |
(1) |
Étiquette |
Affichage Menu |
Text |
Menu |
Même position que le bouton « Visualisation des logs » |
- La propriété visible est dépendante de la valeur de rAdmin. Si celle-ci vaut true, le bouton sera visible, sinon ce ne sera pas le cas.
- C'est le même écran qui sera appelé par Entrée, Sortie ou Inventaire, car c'est le même dessin et quasiment les mêmes règles de gestion.
- Cette fonction ne sert qu'au développeur pour lui permettre de visualiser les tables (P8_…) et la collection Errors.
- Cet élément ne sera visible que si rAdmin est à false. D'autre part, sa position sera la même que celle du bouton « Visualisation de Logs ». Ceci n'a pas d'importance, le recouvrement n'ayant aucune incidence sur le comportement du contrôle.
Lorsque vous allez inscrire rAdmin dans la propriété visible, le contrôle pourrait disparaitre. Ceci est dû au fait que, n'étant pas passé par le login, rAdmin est à false.
Si c'est votre cas, exécutez le login et donnez un login administrateur. Votre menu reviendra.
V-E-3. Règles de gestion▲
Règle |
Message |
---|---|
Afficher Menu 1 ou 2 en fonction du profil |
|
Aller à la fonction choisie |
La 1re règle va s'appliquer automatiquement, car la propriété visible des deux étiquettes et des deux boutons concernés est dépendante de ce flag.
La 2e règle s'applique lors du clic sur le bouton, c'est donc la propriété OnSelect qui est concernée.
V-E-4. Code▲
V-E-4-a. En clair▲
Aller vers Exxxx()
V-E-4-b. PowerApps▲
Navigate
(
Exxxxx)
V-E-4-c. Nota Bene▲
Nous ne précisons pas Fade dans le Navigate, car c'est le défaut.
V-E-4-d. Test▲
Test |
Résultat |
---|---|
Se connecter avec un profil administrateur (Login ADMIN) |
Le menu 1 doit apparaître |
Se connecter avec un profil non administrateur (Login AGENT) |
Le menu 2 doit apparaître |
Cliquer sur le bouton |
Navigation vers le bon écran |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
V-F. La gestion des utilisateurs▲
V-F-1. Écran▲
V-F-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Icône Flèche gauche |
Retour vers Menu |
(1) |
||
Étiquette |
Affichage Titre |
Text |
Gestion des utilisateurs |
|
Text-input |
Saisie matricule |
Text d'information |
Matricule |
Renommer en ILoginAgent |
Text-Input |
Saisie nom |
Text d'information |
Nom |
Renommer en INomAgent |
Liste déroulante |
Choix Admin ou pas |
Par défaut |
NO |
Renommer en IAdmin |
Bouton |
Ajouter |
Text |
Ajouter |
|
Étiquette |
Afficher texte Login |
Text |
Login |
|
Étiquette |
Afficher texte Nom |
Text |
Nom |
|
Étiquette |
Afficher texte Admin |
Text |
Admin |
|
Galerie Verticale |
Affichage de la table P8_Login |
Items |
P8_Login |
(3) |
Colonne Admin (Ne pas ajouter, mais sélectionner) |
Affichage flag admin |
Text |
Instruction |
(5) |
Étiquette |
Affichage Patientez |
Text |
Patientez.. Maj en cours |
(6) |
Comme vu précédemment, on doit forcer le focus sur le 1er contrôle de saisie (ici IloginAgent). C'est la propriété OnVisible de l'écran qui sera chargée de le faire.
Ajoutez, donc, à cette propriété, le code SetFocus(IloginAgent).
- Utilisez le menu Insérer , sous-menu Icône du bandeau et non le menu Formes du volet gauche.
- Une liste déroulante attend une collection. Celle-ci peut être une table, mais aussi un tableau. Dans ce cas la syntaxe est [el1;el2;…;eln]. C’est le cas ici où la collection est un tableau de deux postes [“YES”;”NO”].
- Une galerie affiche une collection selon une disposition définie par le modèle choisi ou par l'utilisateur. Cette disposition est valable pour toutes les lignes et toute modification de celle-ci se répercute sur l’ensemble de la collection. Il en est de même pour les propriétés. Ainsi, le remplacement de l’icône > par l’icône poubelle doit se faire uniquement sur la 1re ligne, la modification étant répercutée sur l’ensemble du composant.
- Les colonnes retenues de la table P8_Login sont Login (Titre), Nom (Sous-Titre) et Admin (Corps).
Renommez les colonnes , dans le contrôle Galerie par Login, Nom et Admin
Remplacez l’icône > par l’icône poubelle. - Voir règles de gestion concernant ce contrôle quant aux instructions.
- Faire la même chose que lors de la recherche du Login.
V-F-3. Règles de gestion▲
Règle |
Message |
---|---|
Icône fait revenir au menu |
|
Ajout Utilisateur |
Début |
Login obligatoire |
Le login est obligatoire |
Nom obligatoire |
Le nom est obligatoire |
Existence utilisateur |
L'utilisateur existe déjà |
Ajout Utilisateur |
Fin |
Flag Admin |
Début |
Admin : Rouge; Non Admin : Vert |
|
Cliquer sur le flag fait changer la valeur en son contraire |
|
Flag Admin |
Fin |
Suppression |
Début |
Clic sur l'icône poubelle |
|
Doit rester un agent |
Il doit rester un utilisateur au moins |
Suppression |
Fin |
Ces règles vont s'appliquer sur la propriété OnSelect des contrôles activables (Icône, Bouton Ajouter, Flag Admin, icône poubelle).
V-F-4. Code▲
V-F-4-a. En clair▲
Reset des contrôles et Retour arrière d'un écran
SI (ILoginAgent = Blanc ALORS Afficher("Le Login est obligatoire")
SINON
SI (INomAgent = Blanc ALORS Afficher("Le nom est obligatoire"")
SINON
Rechercher dans P8_Login ILoginAgent
SI existe ALORS Afficher("Cet utilisateur existe déjà")
SINON créer Utilisateur)))
SI (item.admin = TRUE ALORS YES SINON NO)
SI (item.admin = TRUE ALORS Vert SINON Rouge)
SI (item.admin = TRUE ALORS Modifier Table P8 (admin=false) ET Afficher NO ROUGE
SINON Modifier Table P8 (admin=true) ET Afficher YES VERT)
Compter le nombre lignes P8_Login
SI (compte=1 ALORS Afficher("Il doit rester un utilisateur au moins"")
SINON Supprimer la ligne de P8_Login)
V-F-4-b. PowerApps▲
Reset
(
IloginAgent);;Reset
(
INomAgent);;Reset
(
IAdmin);;Back
(
)
If
(
IsBlank
(
ILoginAgent.Text
);Notify
(
"Le Login est obligatoire"
;Error
);;SetFocus
(
IloginAgent);
If
(
IsBlank
(
INomAgent.Text
);Notify
(
"Le nom est obligatoire"
;Error
);;SetFocus
(
INomAgent);
If
(
IsBlank
(
LookUp
(
'[schema].[P8_Login]';Upper(Login)=Upper(ILoginAgent.Text);Login));UpdateContext({vVisible:true});;Collect('[schema].[P8_Login]';{Login:Upper(ILoginAgent.Text);nom:INomAgent.Text;admin:If(IAdmin.SelectedText.Value="YES";true;false)});;UpdateContext({vVisible:false});
Notify
(
"Cet utilisateur existe déjà"
);SetFocus
(
IloginAgent))))
If (ThisItem.admin;"YES";"NO")
If (ThisItem.admin;Green;Red)
UpdateContext({vVisible:true});;Patch('[schema].[P8_login]';ThisItem;{admin:If (ThisItem.admin;false;true)});;UpdateContext({vVisible:false})
If (CountRows('[schema].[P8_login]') < 2;Notify("Il doit rester un utilisateur au moins";Error);;SetFocus(IloginAgent);
UpdateContext({vVisible:true});;Remove('[schema].[P8_login]';ThisItem);;UpdateContext({vVisible:false}))
V-F-4-c. Nota Bene▲
Remarquez l'utilisation de tests directement dans les fonctions. Cette façon de faire, si elle est maîtrisée, permet de rendre le code moins verbeux.
Remarquez aussi que l'on n'écrit pas, par exemple, If (ThisItem.admin;ThisItem.admin=false;ThisItem.admin=true). Cette syntaxe est incorrecte, car nous sommes déjà dans la partie valeur du couple nom:valeur.
Remarquez l'utilisation de ThisItem. Cette syntaxe correspond à Collection.SelectedItem. En effet, l'appui sur l'une des colonnes (icône) d'une ligne sélectionne celle-ci automatiquement.
V-F-4-d. Test▲
Test |
Résultat |
---|---|
Ajouter un utilisateur sans rien renseigner |
Message Login Obligatoire |
Renseigner le login, pas le nom puis ajouter |
Message Nom Obligatoire |
Renseigner login et nom avec un login existant |
Message Utilisateur existe déjà |
Renseigner login et nom avec un login non existant |
Celui-ci apparaît dans la liste |
Cliquer sur le flag admin |
Changement de texte et de couleur (YES ver NO et inv., Vert vers Rouge et inv.) |
Cliquer sur l'icône poubelle |
Si plus d'un agent, suppression de celui-ci sinon Message Il doit rester un utilisateur au moins |
Cliquer sur l'icône flèche |
Retour au menu |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
Si vous ne voyez pas votre ajout, vérifiez que celui-ci n'est pas sous la fenêtre de la galerie.
Lorsque vous reviendrez au menu, vous constaterez que le menu est conservé alors que l'on ne relit pas le flag admin. Ceci démontre la persistance des données dans les écrans, persistance qu'il faudra gérer si besoin.
V-G. Visu des tables▲
V-G-1. Écran▲
Cet écran ne sert que lors des tests pour vérifier les mises à jour des tables P8_Equipement, P8_Mouvement et P8_Stock. On y ajoute aussi la collection ERRORS que l'on fait pointer sur P8_Stock.
V-G-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Icône Flèche gauche |
Retour vers Menu |
|||
DataTable |
Liste P8_Mouvement |
Items |
P8_mouvement |
(1) |
DataTable |
Liste P8_Stock |
Items |
P8_stock |
(1) |
DataTable |
Liste P8_Equipement |
Items |
P8_equipement |
(1) |
Errors |
Erreurs éventuelles |
(1)(2) |
- Suivant votre version de PowerApps, le contrôle à insérer peut être nommé « Table de données »
Dans le 1er volet, cliquez sur modifier champs puis, dans la popup qui apparaît sur ajouter champs et ajouter l'ensemble des champs de la table. (L'ordre dans lequel vous sélectionnez les champs donne l'ordre d'affichage.) - Errors est une collection prédéfinie qui contient les erreurs éventuelles liées aux ordres SQL comme Patch,Update,Collect… Il y a une collection par table.
V-G-3. Règles de gestion▲
Règle |
Message |
---|---|
Icône fait revenir au menu |
Ces règles vont s'appliquer sur la propriété OnSelect de l'Icône.
V-G-4. Code▲
V-G-4-a. En clair▲
Naviguer vers le menu
V-G-4-b. PowerApps▲
Navigate
(
EMenu)
V-G-4-c. Test▲
Test |
Résultat |
---|---|
Cliquer sur l'icône flèche |
Retour au menu |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
Si vous ne voyez pas vos données, vérifiez que celles-ci ne sont pas cachées (Slider).
V-H. Entrée, Sortie et Inventaire▲
V-H-1. Écran▲
Cet écran ne possède qu'une seule zone Input alors que nous allons avoir à saisir Casier, Équipement et Quantité. Ce choix est lié au fait que l'agent peut commencer indifféremment par le casier ou l'équipement.
V-H-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Icône Flèche gauche |
Retour vers Menu |
(1) |
||
Text-Input |
Interdiction de maj |
Text |
vEIOI |
(2) |
Étiquette |
Affichage de l'étape |
Text |
vLabel |
(3) |
Text-Input |
Saisie agent |
|||
Étiquette |
Affichage Casier |
Text |
Casier : vCasier |
(4) |
Étiquette |
Affichage Équipement |
Text |
Équipement : vDes |
(4) |
Étiquette |
Affichage Quantité |
Text |
Quantité : vQte |
(4) |
DataTable |
Liste P8_Mouvement |
Items |
P8_mouvement |
(4) |
- On choisit Navigate plutôt que Back, car la mise à jour se fera dans EIOIMaj. Back ferait alors revenir à l'écran EIOIMaj et non au menu.
- Cet Input-text va servir de flag pour la maj dans l’écran EOIMaj. (Voir Ecran EIOIMaj.)
- vLabel vaudra « Équipement ou Rangement » ou « Quantité » suivant l'étape.
- Comme nous n'avons qu'une seule zone d'input, celle-ci ne peut conserver les données entrées. Cette fonction est dévolue à ces Étiquettes.
- Liste des mouvements saisis dans la journée et triés par date de maj Décroissante.
On ne peut ici se contenter de donner juste la table. Il faut aussi que la liste réponde aux critères souhaités. Pour obtenir la liste des mouvements du jour, on utilisera Filter qui renvoie un ensemble de lignes et Sort pour trier celui-ci.
V-H-3. Règles de gestion▲
Règle |
Message |
---|---|
Si appelé par menu, l'ensemble des zones doit être initialisé. |
|
Icône fait revenir au menu |
|
Si saisie 5 caractères non numériques => Casier |
|
Si saisie numérique et équipement ou casier non encore saisi => Équipement |
Équipement n'existe pas |
Si saisie numérique et équipement et casier saisis => Quantité |
Quantité non numérique |
La 1re règle est appliquée AVANT l'affichage de l'écran, donc avec l'évènement OnVisible. Pour éviter que le casier soit écrasé d'où que l'on vienne, celui-ci sera initialisé au retour vers le menu.
La règle liée à l'élément cliquable (la flèche gauche) est supportée, comme déjà vu, par OnSelect.
Les règles qui régissent les contrôles doivent être exécutées lorsque la saisie est terminée.
C'est l'évènement OnChange qui est concerné. Celui-ci est déclenché à la perte du focus, c'est-à-dire quand la saisie est terminée.
V-H-4. Code▲
V-H-4-a. En clair▲
Rechercher la liste de P8_Mouvements tels que la date de maj soit dans la date du jour.
Trier celle-ci par date décroissante
Reset des variables (hors casier) et du IScan
Afficher "Equipement ou Rangement"
Donner le focus à IScan
Reset du casier
Naviguer vers le menu
SI (casier=blanc ou équipement=blanc ALORS
SI (IScan n'est pas numérique ALORS
SI (Longueur de IScan = 5 ALORS
casier = IScan
SINON
Afficher ("Scan invalide (Casier ?)"
FSI
SINON
Recherche équipement dans P8_Equipement avec P8.equipement = ISCAN
SI (Non trouvé ALORS
Afficher ("Scan invalide (Equipement ?)")
SINON
équipement = IScan
FSI
FSI
SI (casier <> blanc ET équipement <> blanc ALORS Label = "Quantité" FSI
SINON
SI (IScan = "0" ALORS
Equipement = blanc
Label = "Equipement ou Rangement"
SINON
SI (IScan non numérique ALORS
Afficher("Quantité non numérique")
SINON
Aller vers EIOIMaj (casier,équipement,quantité,type traitement)
FSI
FSI
FSI
V-H-4-b. PowerApps▲
Sort
(
Filter
(
'[schema].[P8_mouvement]';IsToday(DateMaj));DateMaj;SortOrder.Descending)
UpdateContext
(
{vLabel:"Equipement ou Rangement"
});;
UpdateContext
(
{vEqpt:Blank
(
)});;
UpdateContext
(
{vQte:Blank
(
)});;
UpdateContext
(
{vDes:Blank
(
)});;
UpdateContext
(
{vEIOI:Blank
(
)});;
Reset
(
IScan);;
SetFocus
(
IScan)
UpdateContext
(
{vCasier:Blank
(
)});;
Navigate
(
EMenu)
If
(
IsBlank
(
vCasier) Or
IsBlank
(
vEqpt);
If
(Not
IsNumeric
(
IScan.Text
);
If
(
Len
(
IScan.Text
) =
5
;UpdateContext
(
{vCasier:IScan.Text
});Notify
(
"Scan invalide (Casier ?)"
;Error
));
UpdateContext
(
{vDes:LookUp
(
'[schema].[P8_equipement]';Equipement=Value(IScan.Text);Designation)});;
If
(
IsBlank
(
vDes);Notify
(
"Scan invalide (Equipement ?)"
;Error
);
UpdateContext
(
{vEqpt:IScan.Text
})));;
If
(Not
IsBlank
(
vEqpt) And
Not
IsBlank
(
vCasier);UpdateContext
(
{vLabel:"Quantité"
}));
If
(
IScan.Text
=
"0"
;UpdateContext
(
{vEqpt:Blank
(
)});;UpdateContext
(
{vDes:Blank
(
)});;UpdateContext
(
{vLabel:"Equipement ou Rangement"
});
If
(Not
IsNumeric
(
IScan.Text
);Notify
(
"Quantité non numérique"
;Error
);
UpdateContext
(
{vEIOI:"X"
});;
Navigate
(
EIOIMaj;Fade;{rCasier:vCasier;rEqpt:vEqpt;rQte:IScan.Text
;rType:typeTrt}))));;Reset
(
IScan);;SetFocus
(
IScan)
V-H-4-c. Nota Bene▲
Noter la valeur de vEIOI qui est blanc au départ et devient X juste avant le Navigate. C'est ce flag qui autorisera ou non la maj et règle ainsi le déclenchement intempestif du OnVisible de l'écran de EIOIMaj
Avant de tester cet écran , il faut d'abord modifier le menu afin de lui passer le type (Entrée, Sortie ou Inventaire). Le code est Navigate(EInOutInv;Fade;{typeTrt:« E »}) pour l'entrée, O pour la sortie et I pour l'inventaire.
V-H-4-d. Test▲
Test |
Résultat |
---|---|
Initialisation |
Toutes les variables sont à blanc |
Cliquer sur l'icône flèche |
Retour au menu |
Entrer 3 car non numériques |
Scan invalide (Casier ?) |
Entrer 5 car non numériques |
Texte Casier : valeur casier |
Entrer 8 car numériques ne correspondant pas à un équipement |
Scan invalide (Équipement ?) |
Entrer 8 car numériques correspondant à un équipement |
Texte Équipement : désignation équipement |
Entrer n car non numériques |
Quantité non numérique |
Entrer 0 |
Seul le casier doit rester présent |
Revenir à la quantité et entrer n car numériques |
Appel de EIOIMaj |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
V-I. La mise à jour▲
V-I-1. Écran▲
Nous sommes ici dans le cas d'une fonction déportée, c'est-à-dire d'une fonction qui aurait dû être placée ailleurs (ici dans le onChange du contrôle IScan de l'écran EInOutInv). Il peut y avoir de bonnes raisons à faire ceci (lisibilité, complexité, réutilisation…), mais en général, on préférera les Flow qui se comportent comme des macros plutôt que d'utiliser un écran. (Dans ce tuto, la raison est de montrer l'utilisation d'un écran comme une fonction déportée, cet écran n'existant pas dans l'appli originelle.)
V-I-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Étiquette |
Affichage de l'étape |
Text |
vLabel |
(1) |
Bouton |
Retour vers EInOutInv |
Visible |
false |
(2) |
- Affichera le texte Patientez et l'étape de mise à jour. Celle-ci devra être importante, taille police 30.
- Renommez-le en BRetour. Ce bouton servira à faire le retour à EinOutInv lorsqu'il sera sollicité par l'instruction Select. Un écran ne peut pas faire un Back dans OnVisible. Ceci provoque une erreur de syntaxe. On peut contourner cette limitation grâce à un contrôle que l'on déclenche à distance par l'instruction Select(nom du contrôle).
V-I-3. Règles de gestion▲
Règle |
Message |
---|---|
Ne s'exécuter que si le contrôle EIOI vaut X |
|
Créer un mouvement |
|
Si type=E alors stock = stock + Qte, Equipement = Equipement + Qte |
La 1re règle est impérative compte tenu du fonctionnement de l'éditeur.
Comme dit au début de ce tuto, OnVisible (resp OnHidden) est exécuté LORSQU'ON ENTRE (resp. SORT), que ce soit par l'application (Navigate, Back) ou par sélection de l'écran dans l'éditeur. Si, associé à cet évènement, on y a codé une mise à jour de base, par exemple, celle-ci SERA EXÉCUTÉE même si l'intention première était de modifier l'écran.
Faites ce test : Créez deux écrans, l'un que vous nommerez E1 et l'autre E2. Dans E1, ajoutez un bouton qui aura comme code Navigate(E2) puis sélectionnez E2. Ajoutez-y un bouton que vous renommerez B1, dans lequel, vous coderez, à son évènement OnSelect Navigate(E1), puis dans l'évènement OnVisible de l'écran E2, codez Select(B1).
Sauvez le tout, puis retournez sur E1 et cliquez sur le bouton. Vous allez voir E2 apparaître brièvement puis vous reviendrez sur E1, ce comportement est normal.
Maintenant, toujours dans l'éditeur, sélectionnez E2. Vous revenez à E1 et E2 n'est plus accessible.
Ce test démontre que l’évènement OnVisible a été déclenché. Il est donc souhaitable de ne pas coder de procédures critiques comme des mises à jour de base ici (la seule option qu'il vous reste est de renommer E1 afin de provoquer une erreur dans E2).
V-I-4. Code▲
V-I-4-a. En clair▲
SI (EIOI = "X" ALORS
vLabel = "Maj Mouvement"
Créer un enregistrement dans P8_mouvement
vLabel = "Maj Stock"
Rechercher Stock avec Equipement et Casier
SI (stock n'existe pas ALORS
Créer Stock
oldStock = rQte
SINON
oldStock = stock.stock
Mettre à jour stock.stock
FSI
vLabel = "Maj Equipement"
Rechercher Equipement
Mettre à jour equipement.qteStock
Reset EIOI
Déclencher BRetour
Retourner à EInOutInv
V-I-4-b. PowerApps▲
UpdateContext
(
{vLabel:""
});;
If
(
EIOI.Text
=
"X"
;UpdateContext
(
{vLabel:"Maj Mouvement"
});;
Collect
(
'[schema].[P8_mouvement]';{Equipement:Value(rEqpt);Designation:LookUp('[schema].[P8_equipement]';Equipement= Value(rEqpt);Designation);Qte:Value(rQte);Casier:rCasier;Type:rType;Agent:Matricule.Text;DateMaj:Now()});;
UpdateContext
(
{vLabel:"Maj Stock"
});;
UpdateContext
(
{stock:LookUp
(
'[schema].[P8_stock]';Equipement=Value(rEqpt) And Casier=rCasier)});;
If
(
IsBlank
(
stock);Collect
(
'[schema].[P8_stock]';{Equipement:Value(rEqpt);Casier:rCasier;Stock:Switch(rType;"E";Value(rQte);"S";Value(rQte)*-1;"I";Value(rQte))});; UpdateContext({oldQte:Value(rQte)});
UpdateContext
(
{oldQte:stock.Stock
});;
Patch
(
'[schema].[P8_stock]';stock;{Stock:Switch(rType;"E";stock.Stock+Value(rQte);"S";stock.Stock-Value(rQte);"I";Value(rQte))}));;
UpdateContext
(
{vLabel:"Maj Equipement"
});;
UpdateContext
(
{tabEqpt:LookUp
(
'[schema].[P8_equipement]';Equipement=Value(rEqpt))});;
Patch
(
'[schema].[P8_equipement]';tabEqpt; {QteStock:Switch(rType;"E";tabEqpt.QteStock+Value(rQte);"S";tabEqpt.QteStock-Value(rQte);"I";tabEqpt.QteStock-oldQte + Value(rQte));QteRecue:If(rType="E";tabEqpt.QteRecue+Value(rQte);tabEqpt.QteRecue)});;
Reset
(
EIOI);;
Select
(
BRetour))
Back
(
)
V-I-4-c. Test▲
Test |
Résultat |
---|---|
Sélectionner EMenu puis revenir dans cet écran |
Constater qu'aucune mise à jour n'est faite |
Retour à Elogin puis dérouler l'application et faire quelques entrées |
Vérifier que vous avez bien tous vos mouvements dans EInOutInv et vérifier, dans EVisu que les tables Stock et Equipement sont à jour |
Retour à EMenu puis dérouler l'application et faire quelques sorties |
Vérifier que vous avez bien tous vos mouvements dans EInOutInv et vérifier, dans EVisu que les tables Stock et Equipement sont à jour |
Retour à EMenu puis dérouler l'application et faire quelques inventaires |
Vérifier que vous avez bien tous vos mouvements dans EInOutInv et vérifier, dans EVisu que les tables Stock et Equipement sont à jour |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
V-J. La recherche dans le stock▲
V-J-1. Écran – Estock▲
V-J-2. Contrôles à insérer (Icône + sur le côté gauche)▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Icone Left Arrow |
Return EMenu |
|||
Étiquette |
Recherche dans le stock |
Text |
Recherche dans le stock |
|
Input-Text |
Saisie de l'équipement |
(1) |
||
Galerie verticale |
Affichage des stocks répondant au critère |
Items |
liste |
(2) |
Étiquette |
Affichage texte durant l'accès en base |
Text |
Patientez…Recherche en stock |
(4) |
Étiquette |
Affichage popup Équipement |
Text |
(5) |
(6) |
Icône X |
Fermeture popup |
Fill |
AntiqueWhite |
- Renommez ce contrôle en IStock et effacez le texte par défaut.
- Renommez ce contrôle en Gliste.
- Le Texte du titre doit comporter, non pas le N° d'équipement, mais la désignation. On obtient celle-ci par un LookUp sur l'équipement.
La propriété sera donc "Désignation : " + LookUp('[schema].[P8_equipement]';Equipement=ThisItem.Equipement;Designation)
Il est de très loin préférable d'utiliser une vue dans ce cas. En effet, le LookUp est effectué sur chaque ligne, ce qui pourrait potentiellement donner des temps de réponse exécrables. - Donnez une taille importante à ce contrôle et passez la police à trente Gras.
- Text : "Équipement " + vEqpt.Equipement + Char(13) + "Total : " + vEqpt.QteStock
- Renommez ce contrôle en popEqpt.
La popup est une fenêtre apparaissant au milieu de l'écran. Ce ne peut être un écran comme on en a généré jusqu'ici, car le Navigate écrase l'écran original.
On utilise ici une astuce qui se base sur deux contrôles. Un Text qui affichera les données et une icône X pour fermer notre popup. L’astuce réside en des positions contiguës, une couleur de fond identique et une variable de visibilité identique (ainsi les deux sont visibles ou invisibles en même temps).
Il existe d'autres façons de faire bien sûr, mais je trouve celle-ci simple et déclinable à l'infini.
V-J-3. Règles de gestion▲
Règle |
Message |
---|---|
Rechercher les stocks de l'équipement demandé |
|
Trier par Équipement Casier |
|
L'appui sur la flèche droite affiche le n° d'équipement et le stock total dans une popup |
La recherche sera lancée à la fin de la saisie , donc, quand l'évènement OnChange sera déclenché.
La règle portant sur les données supplémentaires sera déclenchée au OnSelect de l’icône activée.
V-J-4. Code▲
V-J-4-a. En clair▲
vVisible=false
vPlus=false
Donner le focus à IStock
Effacer IStock
Effacer la liste
Retourner à menu
vVisible = true ' Rend visible la fenêtre "patientez..."
liste = Rechercher les stocks dont l'équipement correspond au N° d'équipement demandé et trier celle-ci par équipement, casier
vVisible = false ' Rend invisible la fenêtre "Patientez...."
vEqpt = Rechercher l'équipement correspondant au N° de l'équipement de la ligne de Gliste sélectionnée
vPlus= true ' Rend visible la popup
vPlus = false ' Rend invisible la popup
SetFocus(IStock)
V-J-4-b. Powerapps▲
UpdateContext
(
{vVisible:false
});;
UpdateContext
(
{vPlus:false
});;
SetFocus
(
IStock)
Reset
(
IStock);;
Clear
(
liste);;
Navigate
(
EMenu)
UpdateContext
(
{vVisible:true
});;
ClearCollect
(
liste;SortByColumns
(
Filter
(
'[Power].[P8_stock]';Equipement=Value(IStock.Text));"Equipement";Ascending;"Casier";Ascending));;UpdateContext({vVisible:false})
UpdateContext
(
{vEqpt:LookUp
(
'[Power].[P8_equipement]';Equipement=ThisItem.Equipement)});;
UpdateContext
(
{vPlus:true
})
UpdateContext
(
{vPlus:false
});;
SetFocus
(
IStock)
V-J-4-c. Nota Bene▲
Clear vide une collection de tous ses objets. À ne pas confondre avec Remove ou RemoveIf qui supprime des lignes d'une table.
ClearCollect vide une collection (Clear) avant de la recharger (Collect). Si on n'efface pas une collection, la nouvelle liste est ajoutée à la collection existante (Merge).
SortByColumns trie les lignes d’une collection. Il se diffère de Sort par la possibilité de faire du multicritère et par l’utilisation, pour définir un critère, du nom de la colonne.
V-J-4-d. Test▲
Test |
Résultat |
---|---|
Entrez un équipement existant |
Liste des casiers dans Gliste |
Sélectionner la flèche droite |
La popup apparaît |
Fermer la popup |
Celle-ci disparait et le focus est rendu au text-input |
Retour à EMenu |
Affichage EMenu |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.
V-K. Visualisation des logs▲
V-K-1. Écran ELog▲
Cet écran ne correspond pas à ce qui a été réellement développé, mais va nous permettre d'aborder les jointures et la problématique des icônes dans les DataTables.
V-K-2. Contrôles à insérer▲
Contrôle |
Utilisation ici |
Propriété |
Valeur |
Remarques |
---|---|---|---|---|
Icône Left Arrow |
Return EMenu |
|||
Input-Text |
Interdiction de maj et de recherche |
visible |
false |
(1); |
Étiquette |
Libellé |
Text |
Visualisation des Mouvements |
|
Étiquette |
Libellé |
Text |
Date début (Gras) |
|
Étiquette |
Libellé |
Text |
Date fin (Gras) |
|
Étiquette |
Libellé |
Text |
Stock Négatif (Gras) |
|
Input-Text |
Saisie de l'équipement |
DisplayMode |
vDisabled |
(2); |
Input-Text |
Saisie du casier |
DisplayMode |
vDisabled |
(3) |
Sélecteur de date |
Saisie date début |
Default Date |
(4) |
(4) |
Sélecteur de date |
Saisie date fin |
Default Date |
(5) |
(5) |
Liste déroulante |
Choix stock négatif |
items |
[« Oui »;« Non »] |
(6) |
Étiquette |
Libellé |
Text |
Trié par (Gras) |
|
ComboBox |
Choix des critères |
Items |
[« Équipement »;« Casier »;« Date de Mouvement »] |
(7) |
Button |
Exécution |
(8) |
||
DataTable |
Liste des mouvements |
Items |
(9) |
(9) |
Étiquette |
Détail équipement |
Text |
(10) |
|
Icône X |
Fermeture popup |
Fill |
AntiqueWhite |
(11) |
Rectangle |
Modification Stock |
Fill |
AntiqueWhite |
(12) |
Étiquette |
Correction du Stock |
visible |
vEdit |
(13) |
Input-Text |
Saisie Modification Stock |
Hint text |
Nouveau stock |
(13) |
Button |
Confirmation stock |
visible |
vEdit |
(13) |
Icône X |
Fermeture popup |
Visible |
vEdit |
(13) |
Étiquette |
Libellé |
Text |
Patientez…Recherche en cours |
- Renommez ce contrôle en ILog et effacez le texte par défaut.
- Renommez ce contrôle en ILogEqpt et effacez le texte par défaut.
- Renommez ce contrôle en ILogCasier et effacez le texte par défaut.
- Renommez ce contrôle en ILogDebut,
DefaultDate = ToDay()-30,
InputTextPlaceHolder = If(IsBlank(Self.SelectedDate); Text(Today() - 30; Self.Format; Self.Language))
Self veut dire que l'action est sur le contrôle lui-même. C'est l'équivalent de this en Java, par exemple.
Le cast en texte de ToDay.. est nécessaire, car seul le texte est accepté. - Renommez ce contrôle en ILogFin,
DefaultDate = ToDay(),
InputTextPlaceHolder = If(IsBlank(Self.SelectedDate); Text(Today()); Self.Format; Self.Language)) - Renommez ce contrôle en IlogStock.
- Renommez ce contrôle en ILogTri.
PowerApps ne fait pas de distinction entre Value et Texte comme le fait la tag option en html.
Ce qui est affiché est renvoyé au programme. Ce comportement est gênant quand on désire afficher un texte à l'utilisateur et recevoir une autre valeur (ce qui est le cas ici avec la date de mouvement). - Renommez ce contrôle en Bliste.
- Renommez ce contrôle en DListe
Les champs à insérer sont : DateMaj, Type, Equipement, Casier, Qte, MvtStock, MvtEqpt, Détail, Correction. Les quatre derniers champs ont été ajoutés par l'instruction AddColumns (voir le code correspondant). - Renommez ce contrôle en LDetail.
Text : "Equipement " + vEquipement.Equipement + Char(13) + "Designation " + vEquipement.Designation + Char(13) "Stock : " + vEquipement.QteStock.
Avec le contrôle ICloseDet, nous reprenons le principe de la popup vu dans l'écran précédent. - Renommez ce contrôle en IcloseDet.
- Ce contrôle sert à donner un fond à la popup de correction.
- Tous ces éléments appartiennent à la même popup. Ils ont donc la même visibilité.
V-K-3. Règles de gestion▲
Règle |
Message |
---|---|
Si stock négatif, l'équipement et le casier ne doivent pas être renseignés |
Interdit avec Stock négatif |
Récupérer la liste des mouvements triée suivant les critères choisis. |
|
L'appui sur la loupe affichera le détail de l'équipement |
|
L'appui sur le crayon affichera la popup permettant la correction du stock |
|
Popup de correction : la quantité doit être numérique |
Quantité non numérique |
Comme d'habitude, ces règles s'appliquent au OnSelect pour les boutons, items pour les liste et OnVisible pour l'écran.
Nous avons vu et revu ces principes, aussi je ne m'étendrai pas plus avant. Passons au code.
V-K-4. Code▲
V-K-4-a. En clair▲
' Initialisations diverses
vDisabled = DisplayMode.Edit; ' Enable tous les contrôles concernés
vEdit = false; ' Rend invisible la popup de correction
vDetail = false; ' Idem pour le détail
Donner le focus à ILogEqpt
Ttexte = "Patientez ... La recherche est en cours"
vVisible = false ' Rendre invisible la fenêtre d'attente
SI ILog=X ALORS
vLog=Blanc; ' Interdit la maj
Clic sur BListe ' Relance une recherche pour prendre en compte les modifications
FSI
Effacer ILogTri, ILogFin, ILogDebut, ILogCasier, ILogEqpt
vLog = Blanc
Vider mvtListe et mvtLste
Retourner au menu
LogTri = Pour tous les critères sélectionnés : Si critère = "Date de Mouvement" ALORS LogTri = LogTri + "DateMaj" SINON LogTri = LogTri + critère FSI FPOUR ' On remplace Date de Mouvement par DateMaj, car c'est le nom de la colonne qui est attendu pour le tri
SI ((ILogEqpt <> Blanc OU ILogCasier <> Blanc) ET Stock Négatif
ALORS
Afficher ("Équipement ou Casier interdit avec Stock négatif")
Focus sur IlogEqpt
SINON
vVisible = true ' Affiche Patientez...
mvtListe = Sélection des lignes P8_Mouvement telle que :
(ILogEqpt = Blanc OU ILogEqpt = P8_Mouvement.Equipement) ET
(ILogCasier = Blanc OU ILogCasier = P8_Mouvement.Casier) ET
(DateMaj - ILogDebut) >= 0 ET
(ILogFin - DateMaj) >= 0 ET
SI (Stock Négatif ALORS P8_Stock.Stock < 0 OU P8_Equipement.QteStock < 0) FSI
Ajouter Colonne MvtStock (Stock Casier)
Ajouter Colonne MvtEqpt (Stock Équipement)
Ajouter Colonne Détail avec Emoij Loupe
Ajoute Colonne Correction avec Emoij Crayon
vVisible = false ' faire disparaitre fenêtre patientez
Remarquez les colonnes MvtStock et MvtEqpt ainsi que le test du stock négatif. Pour le réaliser, nous aurons besoin de deux jointures, une vers P8_Stock et l'autre vers P8_Equipement.
SUIVANT Nombre de critères
SI 1 ALORS Trier sur le 1er critère,Descending FSI
SI 2 ALORS Trier sur 1er critère,Descending et sur le 2e critère,Descending FSI
DEFAUT Trier sur le 1er critère,Descending, sur le 2e critère,Descending et sur le 3e critère,Descending FDEFAUT
FSUIVANT
VEquipement = Trouver P8_equipement quand Equipement=Équipement sélectionné de DListe
vDetail = true ' On affiche la popup détail
vDisabled = Disabled ' On rend indisponibles tous les contrôles permettant une saisie
vEdit=true ' On rend visible la popup de correction
vDisabled = Disabled ' On rend indisponibles tous les contrôles permettant une saisie
Effacer INStock
Focus à INStock
vDetail = false ' Rend invisible la popup
vDisabled = Edit ' Rend disponibles les contrôles de saisie
SI (INStock est numérique) ALORS
Activer l'icône ICloseCor
vLog = "X" ' Autorise la mise à jour
Aller vers EIOIMaj (Casier sélectionné de DListe,Équipement de P8_Equipement,Quantité renseignée,"I") ' Va vers l'écran de Mise à jour avec le type I(nventaire)
SINON
Afficher ("La quantité doit être numérique")
FSI
vEdit = false ' Fermer la popup de correction
vDisabled = Edit ' Rend disponible les contrôles de saisie
V-K-4-b. Powerapps▲
UpdateContext
(
{vDisabled:DisplayMode.Edit
});;
UpdateContext
(
{vEdit:false
});;
UpdateContext
(
{vDetail:false
});;
SetFocus
(
ILogEqpt);;
UpdateContext
(
{vVisible:false
});;
If
(
ILog.Text
=
"X"
;UpdateContext
(
{vLog:Blank
(
)});;
Select
(
BListe))
Reset
(
ILogTri);;
Reset
(
ILogFin);;
Reset
(
ILogDebut);;
Reset
(
ILogCasier);;
Reset
(
ILogEqpt);;
UpdateContext
(
{vLog:Blank
(
)});;
Clear
(
mvtLste);;
Clear
(
mvtListe);;
Navigate
(
EMenu)
ClearCollect
(
LogTri;
ForAll
(
ILogTri.SelectedItems
;
If
(
Value=
"Date de Mouvement"
;{triValue:"DateMaj"
};{triValue:Value})));;
If
((Not
IsBlank
(
ILogEqpt.Text
) || Not
IsBlank
(
ILogCasier.Text
)) &&
ILogStock.SelectedText.Value
=
"Oui"
;Notify
(
"Equipement ou Casier interdit avec Stock négatif"
;Error
);SetFocus
(
ILogEqpt);
UpdateContext
(
{vVisible:true
});;
ClearCollect
(
mvtListe;
AddColumns
(
ClearCollect
(
mvtLste;
Filter
(
AddColumns
(
'[Power].[P8_mouvement]' As Mvt;"MvtStock";LookUp('[Power].[P8_stock]' As Stock;Mvt.Equipement=Stock.Equipement And Mvt.Casier=Stock.Casier;Stock.Stock);"MvtEqpt";LookUp('[Power].[P8_equipement]' As Eqpt;Mvt.Equipement=Eqpt.Equipement;Eqpt.QteStock));
(
IsBlank
(
ILogEqpt.Text
) || Equipement=
Value
(
ILogEqpt.Text
)) &&
(
IsBlank
(
ILogCasier.Text
) || Upper
(
Casier) =
Upper
(
ILogCasier.Text
)) &&
DateDiff
(
ILogDebut.SelectedDate
;DateMaj) >=
0
&&
DateDiff
(
DateMaj;ILogFin.SelectedDate
) >=
0
&&
If
(
ILogStock.SelectedText.Value
=
"Oui"
;MvtStock <=
0
|| MvtEqpt <=
0
;1
=
1
)));
"Détail"
;"????"
; "Correction"
;"??"
));; UpdateContext
(
{vVisible:false
}))
MvtStock est obtenu grâce à la jointure entre P8_Mouvement et P8_Stock.
MvtEqpt est obtenu grâce à la jointure entre P8_Mouvement et P8_Equipement.
Remarquez l'utilisation de As qui lève l’ambiguïté entre le casier de P8_Mouvement et celui de P8_Stock par exemple.
Pensez à toujours utiliser As et un alias quand vous êtes dans une situation ambiguë comme ici.
Switch (
CountRows
(
LogTri);
1
;SortByColumns
(
mvtListe;First
(
LogTri).triValue
;Descending);
2
;SortByColumns
(
mvtListe;First
(
LogTri).triValue
;Descending;Last
(
LogTri).triValue
;Descending);
SortByColumns
(
mvtListe;First
(
LogTri).triValue
;Descending;Last
(
FirstN
(
LogTri;2
)).triValue
;Descending;Last
(
LogTri).triValue
;Descending))
Pour atteindre le 1er élément d'une collection, c'est l'instruction First.
Le dernier, c'est Last, mais comment atteindre un élément intermédiaire ?
Un solution consiste à créer une collection dont le dernier élément est celui recherché grâce à FirstN. Il suffit ensuite d'utiliser Last.
Ici nous cherchons le deuxième critère de tri quand il y en a trois. On utilise donc Last(FisrtN(liste critères,2))
UpdateContext
(
{VEquipement:LookUp
(
'[Power].[P8_equipement]';Equipement=DListe.Selected.Equipement)});;
UpdateContext
(
{vDetail:true
});;
UpdateContext
(
{vDisabled:DisplayMode.Disabled
})
Cliquer sur une ligne, dans une DataTable la sélectionne et donne accès à toutes les colonnes concernées
UpdateContext
(
{vEdit:true
});;
UpdateContext
(
{vDisabled:DisplayMode.Disabled
});;
Reset
(
INStock);;
SetFocus
(
INStock)
UpdateContext
(
{vDetail:false
});;
UpdateContext
(
{vDisabled:DisplayMode.Edit
})
If
(
IsNumeric
(
INStock.Text
);
Select
(
ICloseCor);;
UpdateContext
(
{vLog:"X"
});;
Navigate
(
EIOIMaj;Fade;{rCasier:DListe.Selected.Casier
;rEqpt:Text
(
DListe.Selected.Equipement
);rQte:INStock.Text
;rType:"I"
});
Notify
(
"La quantité doit être numérique"
;Error
))
Remarquez que rendre invisible un contrôle n'interdit pas à celui-ci de continuer son exécution
UpdateContext
(
{vEdit:false
});;
UpdateContext
(
{vDisabled:DisplayMode.Edit
})
V-K-4-c. Nota Bene▲
Résumons les instructions notables : ForAll qui permet de boucler sur l'ensemble d'une collection.
First, FirstN, Last, LastN qui permettent d'obtenir, dans une collection, une ligne précise. La combinaison de ces instructions est l'équivalent de l'indice dans un tableau. Associé à une table SQL, c'est l'équivalent de TOP N.
Comme montré ci-dessus, le système est assez souple pour « créer » la liste voulue en combinant Collect,Filter,AddColumns,LookUp.
V-K-4-d. Test▲
Test |
Résultat |
---|---|
Entrez un équipement et sélectionnez Stock Négatif |
Message « Équipement ou Casier interdit avec Stock négatif » |
Entrez un équipement non existant et sélectionnez Non Stock Négatif |
Liste vide |
Entrez un équipement existant et sélectionnez Non Stock Négatif |
Liste des mouvements |
Sélectionnez une icône loupe |
La popup détail apparaît, fermez celle-ci |
Sélectionnez une icône crayon |
La popup correction apparaît |
Entrez une quantité non numérique et confirmez |
Message « La quantité doit être numérique » |
Entrez une quantité numérique et confirmez |
Mise à jour du stock, fermeture popup et rafraîchissement de la liste |
Retour à EMenu |
Affichage EMenu |
Pour lancer le test, mettez-vous sur App puis PF5 ou utilisez l'icône :> en haut à droite de l'écran.
En appuyant sur ALT, vous basculez en mode Test, ce qui permet de tester les contrôles un à un.