Accueil Blog (en) Configuration du Hub de périphérique

Configuration du Hub de périphérique

Fernando Amadoz | Le 25 mars 2022

Il s’avère que le cliché « plus on est joyeux » n’est pas toujours le cas – ni approprié d’ailleurs. Par exemple, en ce qui concerne le trafic, les hypothèques, les « influenceurs » IG et... le nombre de clics de souris nécessaires pour terminer une activité dans un système logiciel - plus n’est certainement pas mieux.

Lorsque les systèmes sont déployés dans de grands entrepôts occupés, la préférence pour les utilisateurs va souvent directement de l’écran Acumatica à l’imprimante en un seul clic. Dans Acumatica, par défaut, ce processus nécessite au moins quelques clics supplémentaires et quelques secondes de temps d’attente pendant que la fenêtre d’aperçu est chargée avant que le document ne soit réellement imprimé.

Configuration du Hub de périphérique

À partir de la version 2018 R1, Acumatica a inclus la fonctionnalité Device Hub qui est un processus en cours d’exécution en permanence dans l’interrogation en arrière-plan pour les nouveaux documents à imprimer, afin qu’ils puissent passer d’Acumatica à la file d’attente de l’imprimante en un seul clic.

Dans cet article de blog, nous passerons en revue le processus nécessaire pour y parvenir en examinant l’installation, la configuration et quelques bons exemples de code ancien.

Installation du concentrateur de périphérique d’imprimante

Lorsque l’assistant de configuration ERP d’Acumatica est exécuté pendant le processus d’installation, l’une des fonctionnalités de configuration disponibles est l’installation de DeviceHub. Assurez-vous que cette case à cocher est cochée, puis continuez avec le reste de l’installation comme il serait normalement fait.

Installer DeviceHub

Configuration de l’imprimante sur le serveur

Étant donné que toute cette configuration est effectuée dans un nouveau serveur, nous devons nous assurer qu’au moins une imprimante est correctement configurée et opérationnelle. Dans ce cas, nous utiliserons l’imprimante Microsoft vers PDF (redirigé 2) imprimante

Configuration de l’imprimante sur le serveur

Nous vérifions qu’un document de test est correctement ajouté à la file d’attente de l’imprimante :

Vérifiez qu’un document de test est correctement ajouté à la file d’attente de l’imprimante

Configuration de l’environnement

Dans la page Activer/Désactiver les fonctionnalités (CS100000), assurez-vous que l’option DeviceHub est sélectionnée :

Configuration de l’environnement

L’application DeviceHub elle-même a 2 onglets à configurer: le site et les imprimantes.

Configuration de DeviceHub
Configuration de DeviceHub

Veuillez noter qu’étant donné que DeviceHub est un processus qui est exécuté en continu en arrière-plan pour demander au système s’il y a de nouvelles informations à ajouter à la file d’attente de l’imprimante, il est pratique d’avoir un utilisateur spécifique créé à cet effet.

Après avoir appuyé sur OK, le DeviceHub commencera à s’exécuter et à interroger pour que de nouveaux documents soient imprimés.

DeviceHub est en cours d’exécution et d’interrogation pour de nouveaux documents à imprimer

Notez également que si la fenêtre DeviceHub est fermée, le processus continuera à s’exécuter en arrière-plan. Pour l’arrêter, le gestionnaire de tâches doit être utilisé.

Statut de DeviceHub

Configuration d’Acumatica

La première chose à faire est de rendre l’imprimante disponible dans Acumatica. Ceci est accompli à partir de la page Imprimantes (SM206510).

Dans cette page, le bouton Mettre à jour la liste des imprimantes est utilisé pour remplir la grille avec les imprimantes précédemment définies dans le DeviceHub.

Configuration d’Acumatica

Encore une fois, notez que si aucun résultat n’est visible dans la grille après avoir appuyé sur le bouton Mettre à jour la liste des imprimantes , le bouton Annuler doit être utilisé pour actualiser la grille.

Cela permettra de mettre à jour la liste des imprimantes disponibles dans le DeviceHub.

Liste des imprimantes disponibles dans le DeviceHub

Ayant les imprimantes déjà disponibles dans Acumatica, l’étape suivante consiste à mapper les différents utilisateurs à différentes imprimantes. Par exemple, cela permettra à l’équipe administrative d’utiliser une imprimante et à l’équipe de sélecteur de l’entrepôt d’utiliser une autre imprimante distincte dans un emplacement différent. Cela se fait dans la page Accès à l’imprimante (SM106000).

Cette page est composée de deux onglets : les utilisateurs et les imprimantes associées.

Les utilisateurs et les imprimantes associées

Notez que les utilisateurs sélectionnés dans le groupe ne nécessitent pas l’inclusion de l’utilisateur DeviceHub précédemment créé car ils servent à des fins différentes: les premiers sont utilisés pour identifier l’imprimante à utiliser et le second est utilisé pour l’interrogation pour les travaux dans la file d’attente.

Notez également que les imprimantes et les utilisateurs peuvent appartenir à plusieurs groupes. L’effet de cette configuration est visible dans le champ GroupMask de la table RelationGroup où une combinaison de valeurs binaires permet au système d’identifier correctement l’imprimante à utiliser.

Une fois tous les paramètres et configurations terminés, nous allons ensuite étendre la page Inventaire et un nouveau bouton pour imprimer un rapport sera ajouté :

Étape 1 – Un graphique est créé pour gérer la logique d’impression:


using System;
using System.Collections.Generic;
using PX.SM;
using PX.Data;
using PX.Objects.CS;
using PX.Objects.IN;
using PX.Objects.CR;
using PX.Objects.AR;

namespace AcumaticaDeviceHub
{
    public class PEPrintSLMaint : PXGraph<PEPrintSLMaint>
    {
        #region DAC PrintParameters
        [System.SerializableAttribute]
        public partial class PrintParameters : IBqlTable, PX.SM.IPrintable
        {
            #region PrintWithDeviceHub
            public abstract class printWithDeviceHub : IBqlField
            {
            }
            [PXDBBool]
            [PXDefault(typeof(FeatureInstalled<FeaturesSet.deviceHub>))]
            [PXUIField(DisplayName = "Print with DeviceHub")]
            public virtual bool? PrintWithDeviceHub { get; set; }
            #endregion
            #region DefinePrinterManually
            public abstract class definePrinterManually : IBqlField
            {
            }
            [PXDBBool]
            [PXDefault(true)]
            [PXUIField(DisplayName = "Define Printer Manually")]
            public virtual bool? DefinePrinterManually { get; set; }
            #endregion
            #region Printer
            public abstract class printerName : PX.Data.IBqlField { }
            [PX.SM.PXPrinterSelector]
            public virtual string PrinterName { get; set; }
            #endregion
        }
        #endregion

        public static class Parameters
        {
            public const string Inventory_ID = "Inventory_ID";
        }

        public static class Fields
        {
            public static readonly string Inventory_ID = string.Format("{0}.{1}", nameof(InventoryItem), nameof(Parameters.Inventory_ID));
        }

        #region Methods
        public void PrintReportInDeviceHub(string reportID, string actualReportID, List<string> nameGroupsList, Dictionary<string, string> parametersDictionary, string printerName, int numberPrint)
        {
            Guid loggedUser = this.Accessinfo.UserID;

            Users usersRow = PXSelect<Users,
                                    Where<Users.pKID, Equal<Required<Users.pKID>>>>
                                    .Select(this, loggedUser);
            string BinaryGroupMask = Convert.ToString(usersRow.GroupMask[0], 2);

            List<string> ListGroupsUser = new List<string>();
            for (int i = 0; i < BinaryGroupMask.Length; i++)
            {
                if (BinaryGroupMask.Substring(i, 1) != "0")
                {
                    String BinaryGroup = (BinaryGroupMask.Substring(i, 1).PadLeft(i + 1, '0')).PadRight(BinaryGroupMask.Length, '0');
                    ListGroupsUser.Add(Convert.ToString(Convert.ToDecimal(Convert.ToByte(BinaryGroup, 2))));
                }

            }

            Dictionary<string, string> groupsUserDictionary = new Dictionary<string, string>();
            foreach (String GroupUser in ListGroupsUser)
            {
                foreach (RelationGroup relationGroupRow in PXSelect<RelationGroup, Where<RelationGroup.active, Equal<Required<RelationGroup.active>>>>.Select(this, 1))
                {
                    if (Convert.ToString(relationGroupRow.GroupMask[0]) == GroupUser)
                    {
                        groupsUserDictionary[relationGroupRow.GroupName] = Convert.ToString(relationGroupRow.GroupMask[0]);
                        break;
                    }
                }
            }

            foreach (SMPrinter printersRow in PXSelect<SMPrinter, Where<SMPrinter.isActive, Equal<Required<SMPrinter.isActive>>>>.Select(this, 1))
            {
                foreach (string nameGroup in nameGroupsList)
                {
                    if (groupsUserDictionary.ContainsKey(nameGroup))
                    {
                        if (groupsUserDictionary[nameGroup] == Convert.ToString(printersRow.GroupMask[0]))
                        {
                            printerName = printersRow.PrinterName;
                            break;
                        }
                    }
                }
            }

            if (String.IsNullOrEmpty(printerName))
            {
                throw new PXException(Convert.ToString("The user is not active in an impression group"));
            }

            Dictionary<string, PXReportRequiredException> reportsToPrint = new Dictionary<string, PXReportRequiredException>();
            PrintParameters filter = new PrintParameters();
            filter.PrintWithDeviceHub = true;
            filter.DefinePrinterManually = true;
            filter.PrinterName = printerName;

            for (int i = 0; i < numberPrint; i++)
            {
                reportsToPrint = PX.SM.SMPrintJobMaint.AssignPrintJobToPrinter(reportsToPrint, parametersDictionary, filter,
                new NotificationUtility(this).SearchPrinter, ARNotificationSource.Customer, reportID, actualReportID, 16);
            }

            if (reportsToPrint != null)
            {
                PX.SM.SMPrintJobMaint.CreatePrintJobGroups(reportsToPrint);
            }
        }
        #endregion
    }
}

Étape 2 - Logique étendue pour ajouter le bouton d’impression


using System.Collections;
using System.Collections.Generic;
using PX.Data;
using PX.Objects.IN;

namespace AcumaticaDeviceHub
{
    public class InventoryItemMaintSKExt : PXGraphExtension<InventoryItemMaint>
    {
        public PXAction<InventoryItem> printLabel;
        [PXUIField(DisplayName = "Print Item Balance", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
        [PXButton(CommitChanges = true)]
        public virtual IEnumerable PrintLabel(PXAdapter adapter)
        {
            PEPrintSLMaint tGPrintGraph = PXGraph.CreateInstance<PEPrintSLMaint>();

            Dictionary<string, string> parametersDictionary = new Dictionary<string, string>();
            parametersDictionary[PEPrintSLMaint.Fields.Inventory_ID] = this.Base.Item.Current.InventoryCD.Trim();
            List<string> ListGroupsFilter = new List<string> { "Group1", "Group2", "Group3" };
            tGPrintGraph.PrintReportInDeviceHub("IN615000", "IN615000", ListGroupsFilter, parametersDictionary, null, 1);

            return adapter.Get();
        }
    }
}

Exemple de résultat

Solde de l’article d’impression

Lorsque l’utilisateur appuie sur le nouveau bouton d’équilibrage de l’élément d’impression , le rapport est ajouté directement dans la file d’attente de l’imprimante :

File d’attente de l’imprimante

Et le DeviceHub indique le travail en cours d’impression:

DeviceHub indique la tâche en cours d’impression

La liste des demandes d’impression en attente et traitées se trouve dans la page Travaux d’impression :

Page Imprimer les travaux

Conclusion

Profitez de la fonctionnalité Device Hub dans Acumatica R1 et les versions ultérieures. L’impression de quelques documents par jour avec cette fonctionnalité n’a pas d’effet significatif dans de nombreux cas. Cependant, pour les entrepôts animés où de nouvelles palettes, boîtes et emballages sont continuellement assemblés, quelques secondes économisées, par demande d’impression, s’additionnent à la fin de la journée.  Cela se traduit directement par une efficacité et une performance accrues.  Parce que vous savez ce qu’ils disent, « le temps, c’est de l’argent ».


*Cliquez sur le lien pour télécharger l’exemple de code C # dans l’article.

 

 

Auteur du blog

Fondateur et PDG de SkyKnack, un fournisseur de solutions ERP qui aide les partenaires d’Acumatica à développer des personnalisations, des intégrations et de nouveaux produits, ainsi que des services de mise en œuvre et de formation.

Recevez des mises à jour de blog dans votre boîte de réception.