Extensions de la synchronisation des données avec DataService

Ajouter et actualiser les données

Action du côte de Comarch ERP Standard

La base de Comarch ERP Standard contient la procédure POS.ExportCustomObjects. Cette fonction doit être remplacée de façon à ce qu’elle récupère les données qui doivent être envoyées à un point de vente particulier depuis la base de données et les renvoie au format XML.

Les paramètres ci-dessous sont passés à la procédure pour limiter et personnaliser l’ensemble des données envoyées à un point de vente POS particulier :

  • @rowVersion (bigint) – valeur permettant d’effectuer une synchronisation différentielle. C’est la valeur qui se trouve dans XML généré par cette procédure lors de la dernière synchronisation réussie (dans l’attribut RowVersion).
  • @companyUnitId (int) – Id de centre où un point de vente POS a été défini (CompanyStructure.CompanyUnits)
  • @pointOfSaleId (int) – Id de point de vente POS (Synchronization.PointsOfSales)
  • @languageId (int) – Id de langage de données (Dictionaries.Languages)

Lors de l’exportation des données des colonnes du type bit et datetime, il faut utiliser les fonctions POS.GetBitString et POS.GetDatetimeString.

Action du côté de POS

Dans la base POS existe la procédure Synchronization.ImportCustomObjects. Elle doit être remplacée de façon à ce qu’elle mette à jour les tableaux dans la base de données POS sur la base des données XML reçues de Comarch ERP Standard – celles générées par la procédure  POS.ExportCustomObjects.

Exemple

L’exemple présente la synchronisation différentielle des données de deux tableaux – l’exportation de la base Comarch ERP Standard et l’importation dans la base POS :

  • Dic_PaymentForms -> Configuration.CustomPaymentForms
  • Dic_Country -> Configuration.CustomCountries
a)     Procédure d’exportation
ALTER PROCEDURE [POS].[ExportCustomObjects]
    @rowVersion bigint,
    @companyUnitId int,
    @pointOfSaleId int,
    @languageId int
AS
BEGIN
                                    SET NOCOUNT ON;
    declare @dbts bigint = cast(@@DBTS as bigint)
        
    select
            @dbts as [@RowVersion],

        (select
            pf.Id			as [@Id],
            pf.Name		as [@Name],
            pf.CategoryId		as [@Type],
            POS.GetBitString(pf.Active)
                        as [@IsActive]
        from SecDictionaries.Dic_PaymentForms pf
        where pf.Timestamp > @rowVersion		
        for xml path('PaymentForm'), type),
        (select
                        c.Id		as [@Id],
            c.Code		as [@Code],
            c.Name		as [@Name],
            POS.GetBitString(c.Active)
                    as [@IsActive]
        from dbo.Dic_Country c
        where c.Timestamp > @rowVersion
        
        for xml path('Country'), type)
    for xml path('CustomObjects')
END

b) Procédure d’importation

ALTER PROCEDURE [Synchronization].[ImportCustomObjects]
    @XML xml
AS
BEGIN
    SET NOCOUNT ON;
    
    -- Countries --
    select
        doc.col.value('@Id', 'int') Id,
        doc.col.value('@Code', 'nvarchar(50)') Code,
        doc.col.value('@Name', 'nvarchar(100)') Name,
        doc.col.value('@IsActive', 'bit') IsActive
    into #Countries
    from @XML.nodes('/DataFromERP/CustomObjects/Country') doc(col)

update pos
    set
        Code = erp.Code,
        Name = erp.Name,
        IsActive = erp.IsActive
    from Configuration.CustomCountries pos
        join #Countries erp on erp.Id = pos.Id

    insert into Configuration.CustomCountries
    (
        Id,
        Code,
        Name,
        IsActive
    )
    select
        Id,
        Code,
        Name,
        IsActive
    from #Countries erp
    where not exists (select 1 from Configuration.CustomCountries where Id = erp.Id)

    -- Payment forms --
    select
        doc.col.value('@Id', 'int') Id,
        doc.col.value('@Name', 'nvarchar(50)') Name,
        doc.col.value('@Type', 'tinyint') [Type],
        doc.col.value('@IsActive', 'bit') IsActive
    into #PaymentForms
    from @XML.nodes('/DataFromERP/CustomObjects/PaymentForm')  doc(col)

    update pos
    set
        Name = erp.Name,
        Type = erp.Type,
        IsActive = erp.IsActive
    from Configuration.CustomPaymentForms pos
        join #PaymentForms erp on erp.Id = pos.Id

    insert into Configuration.CustomPaymentForms
    (
        Id,
        Name,
        Type,
        IsActive
    )
    select
        Id,
        Name,
        Type,
        IsActive
    from #PaymentForms erp
    where not exists (select 1 from Configuration.CustomPaymentForms where Id = erp.Id)
    
END

Gestion des répertoires universels

Mise à jour de la procédure d’exportation

Dans la clause WHERE de la procédure POS.ExportGenericDirectories il faut inclure InternalName de répertoire qui doit être également synchronisé.

Dans la clause WHERE de la procédure POS.ExportGenericDirectoryValues il faut inclure InternalName de répertoire qui doit être également synchronisé.

Clés étrangères pour le schéma Standard

Pour les tableaux synchronisés

La disponibilité des objets, les autorisations etc. peuvent, au niveau de la ligne d’un tableau donné, affecter les données qui seront synchronisées. Un exemple serait les Clients, groupes clients, entrepôts, registres, modes de paiement etc.

Afin d’éviter une évaluation multiple, il faut utiliser le tableau POS.SentObjects pour savoir quelles données doivent être synchronisées dans les tableaux dérivées (sur la base de FC).

Exemple : Exportation des définitions d’impôts associés à un client

(select
        ven.Id as [@Id],
        ven.ActivityId as [@ActivityId],
        ven.VendorId as [@VendorId]
        from Implementations.VendorActivityConnectionsEcoTax ven
        inner join Implementations.ActivityEcoTax ac on ven.ActivityId = ac.Id
        inner join Implementations.SettingsEcoTax sett on ac.Id = sett.CompanyActivityId and sett.CompanyId = @companyUnitId 
        inner join POS.SentObjects so on so.ObjectId = ven.VendorId and so.SyncTypeId = 14 and so.POSId = @pointOfSaleId
        where ven.Timestamp > @rowVersion 
                        for xml path('VendorActivityConnectionsEcoTax'), type)

La valeur du type d’objet synchronisé peut être consultée dans le tableau POS.SyncTypes.

Pour les tableaux non-synchronisés

L’utilisateur doit lui-même implémenter le processus de synchronisation, comme si le tableau provenait d’une extension.

Suppression des données

Actions du côté de Comarch ERP Standard

  1. Il faut ajouter dans le tableau DeletionTypes l’entrée avec « Id >= 1000 » et le nom unique du type des objets supprimés.
  2. Dans le déclencheur AFTER DELETE du tableau à partir duquel la suppression des données doit être synchronisée avec POS, ajoutez des entrées concernant les objets supprimés à la table POS.DeletedObjects. Colonnes à compléter :
    • DeletionTypeId – identifiant du type défini dans le point a)
    • Ident – identifiant d’objet supprimé. Un identifiant peut être un nombre (int), un GUID (uniqueidentifier), nvarchar ou un ensemble de valeurs séparées par le caractère « | », par exemple : „3428|654”. Voir aussi le point concernant les actions du côté de POS (colonnes IdentColumnName, IdentColumnType).
    • POSId – identifiant POS (Synchronization.PointsOfSales) – il faut le compléter, si l’objet doit être supprimé d’un point de vente POS particulier ou laisser NULL s’il doit être supprimé de tous les points de vente.

Actions du côte de POS

Ajoutez au tableau Synchronization.DeletionTypes une ligne définissant le moyen de gestion par le mécanisme de synchronisation d’information sur la suppression d’objets provenant d’ERP.

Il existe deux modes de suppression : automatique et personnalisé.

  • En mode automatique, le mécanisme de synchronisation supprimera automatiquement les données du tableau indiqué en identifiant les lignes à partir des noms des colonnes (les valeurs doivent être complétées dans les colonnes TableName, IdentColumnName, IdentColumnType, ainsi que la valeur NULL dans la colonne CustomProcName). Ce mode est utilisé pour supprimer dans POS presque tous les types d’objets supprimables dans l’ERP (voir les entrées standards dans le tableau Synchronization.DeletionTypes).
  • Le mode personnalisé exige que la procédure prenant en charge la suppression des objets du type donné (la colonne CustomProcName doit être complétée) soit indiquée. Ce mode est utilisé lorsque la condition de suppression est plus complèxe et il n’est pas possible d’appliquer le mécanisme automatiue ou lorsqu’il faut effectuer des opérations supplémentaires lors de la suppression.

Le tableau Synchronization.DeletionTypes contient les colonnes suivantes :

  • DelType – nom comme dans la base Standard dans le tableau DeletionTypes.
  • Order – nombre définissant l’ordre de suppression des types d’objets.
  • TableName [uniquement en mode automatique] – nom du tableau dont les objets doivent être automatiquement supprimés dans le cadre du type donné DelType.
  • IdentColumnName [uniquement en mode automatique] – noms des colonnes (séparés par le caractère « | ») selon lesquels se fait l’identification automatique des lignes supprimées, par exemple : „Id”, „GUID”, „PriceTypeId|CustomerGroupId”. Leur quantité et ordre doivent correspondre à la valeur saisie dans la base Standard dans la colonne POS.DeletedObjects.Ident.
  • IdentColumnType [uniquement en mode automatique] – types des colonnes définis comme IdentColumnName dans la même quantité et ordre, par exemple „int”, „uniqueidentifier”, „int|int”. Dans le cas de nvarchar(x), il faut saisir « nvarchar ».
  • CustomProcName [uniquement en mode personnalisé] – nom de procédure responsable pour la suppression des objets d’un type donné. Cette colonne doit utiliser les données du tableau temporaire #DeletedObjects. Voir les procédures existantes Synchronization.DeleteCustomerPriceTypes, Synchronization.DeleteWarehouseDocuments.

Czy ten artykuł był pomocny?