Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

MercatorPenguin en écriture : inventaires

0000002945     -      14/11/2019

MercatorPenguin 2.6 permet la création et la modification d'inventaires. L'accès à un inventaire se fait toujours au départ d'un bundle de type "Liste", via un bouton InventoryEditButton, dont les propriétés suivantes doivent être spécifiées :

  • InventoryId = pieds_d.id_doc ou vide pour un nouvel inventaire
  • InventoryPiece = pieds_d.piece ou 0 pour un nouvel inventaire
  • InventoryType = le type d'inventaire (0 = définitif, 1 = préparation)
<m:InventoryEditButton Text="Modifier" Font="Small" 
InventoryId="@ID_DOC" InventoryPiece="@PIECE" InventoryType="@TYPE" />

Exemple de bundle liste : Inventaires.pngb

Un écran d'inventaire requiert deux paramétrages XAML :

  1. la saisie proprement dite : les informations du pied et de la ligne en cours d'édition
  2. le format de chaque cellule de la ListView affichant les lignes de l'inventaire en cours.

Ce paramétrage est disponible via cet élément de bouton dans les séquences d'inventaires :

Exemple de paramétrage XAML Tab 1

<StackLayout Margin="10, 10, 10, 10">
<m:EditDatePicker Source="date" HorizontalOptions="FillAndExpand" />
<m:EditPicker Source="id_depot" HorizontalOptions="FillAndExpand" />
<m:EditEntry Placeholder="Reference" Source="reference" HorizontalOptions="FillAndExpand" />

<BoxView HorizontalOptions="FillAndExpand" HeightRequest="2" Margin="0,25,0,25" Color="%ThemeColor%"/>

<Grid RowSpacing="10" ColumnSpacing="2">
<Grid.ColumnDefinitions>
        <ColumnDefinition Width="120" />
<ColumnDefinition Width="25" />
<ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>

<m:EditEntry Placeholder="Emplacement" Source="LINE|ID_MPLACE" TargetSigComplWhere="m_id_depot={ID_DEPOT}" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="0" />
<m:EditScanButton TargetSource="LINE|ID_MPLACE" Grid.Column="1" Grid.Row="0" />
<m:TargetSigLabel Origin="LINE|ID_MPLACE" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" Margin="10,0,0,0" Grid.Column="2" Grid.Row="0" />

<m:EditEntry Placeholder="Article" Source="LINE|ID_ART" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="1" />
<m:EditScanButton TargetSource="LINE|ID_ART" Grid.Column="1" Grid.Row="1" />
<m:TargetSigLabel Origin="LINE|ID_ART" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" Margin="10,0,0,0" Grid.Column="2" Grid.Row="1" />

<Label Text="Dispo" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="2" />
<m:EditEntry Source="LINE|DISPO" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="2" />

<Label Text="Q" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="3" />
<m:EditEntry Source="LINE|Q" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="3" />

<Label Text="DPA" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="4" />
<m:EditEntry Source="LINE|DPA" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="4" />

</Grid>

<m:EditAddLineButton Margin="25,25,25,0" HorizontalOptions="FillAndExpand" />

</StackLayout>

Exemple de paramétrage XAML ListViewCell

<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">  
<Label Text="Dispo=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@DISPO:### ##0.00" FontSize="12" Margin="0,0,25,0" />
<Label Text="Q=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@Q:### ##0.00" FontSize="12" Margin="0,0,25,0" HorizontalOptions="FillAndExpand" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="@ID_ART" FontSize="12" Margin="0,0,10,0" />
<Label Text="@DESIGNATIO" FontSize="12" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="Emplacement" FontSize="12" Margin="0,0,10,0" />
<Label Text="@ID_MPLACE" FontSize="12" />
</StackLayout>

Ce code XAML produit ces écrans :

     

 

Principes de paramétrage 

Dans le premier code XAML, il convient d'utiliser des contrôles de type Edit qui permettent la modification des champs du pied (au dessus de la ligne orange) ainsi que de la ligne en cours d'édition (en dessous de la ligne orange). Ces champs de ligne ont une source qui est constituée de LINE| suivi du nom de la colonne dans la table LIGNES_D.

La saisie de l'article en ligne se fait toujours dans un EditEntry, dont la source est LINE|ID_ART. Cette source sera reconnue comme étant une liaison vers le signalétique des articles, ce qui rend possible l'affichage de la désignation dans un TargetSigLabel. (Voir la fonction SQL LIBTARGETSIG_STOCK qui est modifiable).

Le code XAML doit contenir un EditAddLineButton qui permet l'ajout de la ligne en cours dans la liste des lignes déjà encodées.

Dans le second code XAML (LixtViewCell), les variables à afficher doivent être précédées d'un @ et en majuscules. Il est possible de fixer un masque d'affichage sous la forme @COLONNE:masque. Ce masque fonctionne de façon identique à celui de string.Format() du Framework .net.

 

Utilisation

Avant la saisie du premier article, l'utilisateur doit sélectionner la date et le dépôt. Ces contrôles seront désactivés dès l'ajout d'une ligne. Ils sont facultatifs. Si l'EditPicker permettant la saisie du dépôt n'est pas présent, alors l'inventaire sera effectué sur le dépôt par défaut défini au niveau de la séquence. Si l'EditDatePicker associé à la date est absent, alors la date du jour (pour un nouvel inventaire) ou la date de création de l'inventaire sera prise en compte.

Si le dossier contient la gestion des emplacements, l'utilisateur peut saisir l'emplacement. Dans le cas contraire, la première row de la grille peut être retirée et tous les Grid.Row décrémentés de 1. Notez que la valeur de l'emplacement saisi n'est jamais réinitialisé, ce qui permet de saisir une seule fois l'emplacement et d'inventorier ensuite de multiples articles se trouvant dans cet emplacement.

L'utilisateur saisit ensuite un code article. Le cas échéant, MercatorPenguin présente une liste d'articles afin d'en permettre la sélection. Le disponible théorique dans Mercator est capté à cet instant. (Comme dans Mercator, il tient compte de la date de l'inventaire). C'est cette valeur de disponible qui sera corrigée par la saisie d'une quantité dans la zone "Q". Il est aussi possible d'adapter d'autres valeurs, telles que le DPA dans notre exemple.

Enfin, l'utilisateur doit ajouter effectivement la ligne en cours de saisie à la liste du second onglet en utilisant le bouton "Ajouter". Ceci remettra à blanc les données de l'article et le focus dans la zone "Article", afin de permettre la saisie du prochain article.

Les saisies d'article et d'emplacement peuvent être effectuée via l'EditScanButton afin de scanner un code-barres.

Le second onglet permet de visualiser la liste des lignes encodées. Il permet aussi de supprimer une ligne encodée au préalable :

  • sous iOS : en tirant la ligne vers la gauche et en utilisant ensuite le bouton "Supprimer"
  • sous Android : en maintenant appuyé sur la ligne et en utilisant ensuite le bouton "Supprimer"

Il n'est pas possible de remettre en édition une ligne présente dans la liste pour la modifier. Le cas échéant, il convient donc de la supprimer et la recréer.

La finalisation d'un inventaire se fait par ces boutons situés dans le haut de l'écran, qui offrent respectivement ces fonctions :

  • Annuler les modifications en attente et fermer l'écran d'inventaire
  • Enregistrer les modifications en attente et fermer l'écran d'inventaire
  • Enregistrer les modifications en attente et tout en maintenant ouvert l'écran d'inventaire en cours

 

Limitations

Il est nécessaire de bien comprendre que les sauvegardes sont effectuées exclusivement par MercatorPenguinServer et que celui-ci est stateless. Cela veut dire que durant toute la durée de vie de l'inventaire dans MercatorPenguin, cet inventaire n'est pas maintenu ouvert par MercatorPenguinServer. Dès lors, il est possible qu'un autre utilisateur modifie en parallèle cet inventaire. Cette pratique doit être évitée. Lors de l'enregistrement des modifications, les règles suivantes sont d'application :

  • les lignes supprimées dans MercatorPenguin sont supprimées par MercatorPenguinServer si elles existent encore. Aucun message d'erreur n'est produit dans le cas contraire.
  • les lignes ajoutées dans MercatorPenguin sont toujours ajoutées par MercatorPenguinServer

A ce stade du développement, MercatorPenguin ne peut pas inventorier des articles à lot ou à numéro de série.

 

Circulation des données

Lors de l'appel d'un article dans un inventaire de MercatorPenguin, cette requête SQL est exécutée : 

select stock.s_id,stock.s_modele as designatio,stock.s_dpa as dpa,stock.s_pmpa as pmpa,stock.s_prix_rev as prix_rev,dispo.dispo from STOCK ...

Il est possible d'ajouter des colonnes supplémentaires dans la clause select de cette requête via la propriété ReqSql2ExtraColumns de l'EditEntry dont la source est LINE|ID_ART. Par exemple :

ReqSql2ExtraColumns="s_mycol1 as mycol1,s_mycol2 as mycol2"

Ceci permet d'alimenter de façon automatique des éventuels Edit controls dont la source serait LINE|MYCOL1 ou LINE|MYCOL2. In fine, il est ainsi possible d'alimenter de façon automatique les colonnes LIGNES_D.MYCOL1 et LIGNES_D.MYCOL2.

 

Programmation

Les customizers exploitant les événements de l'InventoryEngine sont bien utilisés par MercatorPenguinServer. Il est possible de savoir si l'inventaire est géré par MercatorPenguin en utilisant cette propriété : MercatorUi.Globals.IsMercatorPenguinServer.