Erweiterung der Datensynchronisierung mit DataService

Daten hinzufügen und aktualisieren

In Comarch ERP Standard

In der Comarch ERP Standard-Datenbank gibt es eine POS.ExportCustomObjects-Prozedur. Sie muss so überschrieben werden, damit sie Daten für die betreffende POS-Stelle aus der Datenbank übernimmt und im XML-Format zurückgibt.

Der Prozedur werden Parameter übergeben, um die an eine bestimmte Kasse gesendeten Daten einzuschränken und anzupassen:

  • @rowVersion (bigint) – mit dem Wert kann die differenzierte Synchronisation durchgeführt werden. Dies ist ein Wert, der in der von dieser Prozedur bei der letzten erfolgreichen Synchronisierung erzeugten XML-Datei (im Attribut RowVersion) zu finden ist.
  • @companyUnitId (int) – Id des Zentrum, in dem POS definiert wurde (CompanyStructure.CompanyUnits)
  • @pointOfSaleId (int) – POS-Id (Synchronization.PointsOfSales)
  • @languageId (int) – Id der Datensprache (Dictionaries.Languages)

Bei dem Datenexport aus den Spalten vom typ bit und datetime sollen Sie die POS.GetBitString und POS.GetDatetimeString-Funktionen verwenden.

In Comarch POS

In der POS-Datenbank gibt es eine Synchronization.ImportCustomObjects-Prozedur. Sie sollte überschrieben werden, damit sie die Tabellen in der POS-Datenbank auf der Grundlage der von ERP Standard empfangenen XML-Daten aktualisiert, die durch das Verfahren in Kapitel 1 erzeugt wurden.

Beispiel

Das Beispiel zeigt die differenzierte Synchronisation von zwei Tabellen – Export aus der ERP Standard-Datenbank und Import in die POS-Datenbank:

  • Dic_PaymentForms -> Configuration.CustomPaymentForms
  • Dic_Country -> Configuration.CustomCountries
a)     Exportprozedur
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)    Importprozedur
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

Umgang mit universellen Dictionaries

Exportprozedur aktualisieren

In der Prozedur POS.ExportGenericDirectories, in der Klausel WHERE ist InternalName von Dictionary, welcher auch synchronisiert werden soll, zu berücksichtigen.

In der Prozedur POS.ExportGenericDirectoriesValues, in der Klausel WHERE ist InternalName von Dictionary, welcher auch synchronisiert werden soll, zu berücksichtigen.

Fremdschlüssel für Comarch ERP Standard

Für synchronisierte Tabellen

Die Verfügbarkeit der Objekten, Berechtigungen usw. in einer Zeile der Tabelle können darauf auswirken, welche Daten synchronisiert werden. Beispielsweise können dies Kunden, Kundengruppen, Lager, Register, Zahlungsformen usw. sein.

Um die Mehrfachauswertung zu vermeiden, welche Daten in den abgeleiteten Tabellen (auf Basis von FK) synchronisiert werden sollen, sollte die Tabelle POS.SentObjects verwendet werden.

Beispiel: Export von kundenbezogenen Steuerdefinitionen

(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)

Der Wert des Typs des synchronisierten Objekts ist in der Tabelle POS.SyncTypes zu finden.

Für nicht synchronisierte Tabellen

Der Synchronisierungsprozess muss selbst implementiert werden, damit die Tabelle aus der Erweiterung kommt.

Daten löschen

In Comarch ERP Standard

  1. Fügen Sie der Tabelle DeletionTypes einen Eintrag mit Id >= 1000 und einem eindeutigen Namen für den Typ der Objekte, die gelöscht werden sollen, hinzu.
  2. Fügen Sie im AFTER DELETE-Trigger der Tabelle, aus der die Löschung von Daten in POS synchronisiert werden soll, die Einträge DeletedObjects mit gelöschten Objekten ein. Spalten, die gefüllt werden sollen:
    • DeletionTypeId – ID des im Punkt a) definierten Typs
    • Ident – ID des gelöschten Objekts Dies kann eine Zahl (int), eine GUID (uniqueidentifier), nvarchar oder ein Wertsatz, der mit ‘|’ getrennt ist, z. B. „3428|654”. Siehe auch der folgende Punkt „In Comarch POS“ (Spalten IdentColumnName, IdentColumnType).
    • POSId – POS-ID (Synchronization.PointsOfSales) – sollte ausgefüllt werden, wenn das Objekt nur an einer bestimmten Stelle gelöscht werden soll, oder als NULL gelassen werden, wenn es an allen Stellen gelöscht werden soll.

In Comarch POS

Fügen Sie der Tabelle Synchronization.DeletionTypes eine Zeile hinzu, die definiert, wie die Informationen über das Löschen von Objekten, die aus dem ERP-System gesendet werden, durch den Synchronisierungsmechanismus verarbeitet werden sollen.

Das Löschen von Daten kann auf zwei Arten erfolgen: automatisch und benutzerdefiniert.

  • Automatisch: der Synchronisierungsmechanismus löscht die Daten aus der angegeben Tabelle automatisch, wobei die Zeilen anhand der angegebenen Spaltennamen identifiziert werden (die Werte in den Spalten TableName, IdentColumnName, IdentColumnType und NULL in Spalte CustomProcName sollen ausgefüllt werden). Es wird verwendet, um fast alle Arten von löschbaren Objekten in ERP an einer POS-Stelle zu löschen (siehe Standardeinträge in der Tabelle Synchronization.DeletionTypes).
  • Benutzerdefiniert: es muss eine Prozedur angegeben werden, mit der Daten von einem bestimmten Typ gelöscht werden (die Spalte CustomProcName muss ausgefüllt werden). Es wird verwendet, wenn die Löschbedingung etwa komplizierter ist und der automatische Mechanismus nicht verwendet werden kann bzw. wenn beim Löschen zusätzliche Vorgänge durchgeführt werden müssen.

Die Tabelle Synchronization.DeletionTypes enthält folgende Spalten:

  • DelType – Name, wie in der ERP-Standard-Datenbank in der DeletionTypes-Tabelle.
  • Order – Zahl, die die Reihenfolge bestimmt, in der die Objekttypen gelöscht werden sollen.
  • TableName [nur im automatischen Modus] – Name der Tabelle, aus der Objekte innerhalb des ausgewählten DelTyp automatisch gelöscht werden sollen.
  • IdentColumnName [nur im automatischen Modus] – Namen der Spalten (mit dem Symbol „|” getrennt), nach denen die automatische Identifizierung der Zeilen, die gelöscht werden sollen, erfolgt, z. B. „Id”, „GUID”, „PriceTypeId|CustomerGroupId”. Die Zahl und die Reihenfolge muss mit dem Wert in der ERP-Standard-Datenbank in der Spalte POS.DeletedObjects.Ident übereinstimmen.
  • IdentColumnType [nur im automatischen Modus] – Typen von Spalten, die als IdentColumnName definiert wurden, in der gleichen Menge und Reihenfolge, z. B. „int”, „uniqueidentifier”, „int|int”. Im Falle von nvarchar(x) geben Sie „nvarchar” ein.
  • CustomProcName [nur im benutzerdefinierten Modus] – Name der Prozedur, mit der die Objekte des ausgewählten Typs gelöscht werden sollen. Sie soll Daten aus der temporären Tabelle #DeletedObjects verwenden. Siehe bestehende Prozeduren Synchronization.DeleteCustomerPriceTypes, Synchronization.DeleteWarehouseDocuments.

Czy ten artykuł był pomocny?