Estensibilità della sincronizzazione dei dati con DataService

Aggiunta e aggiornamento dei dati

Attività in ERP Standard

Nel database del sistema ERP Standard esiste la procedura POS.ExportCustomObjects. Bisogna sovrascriverla perché essa scarichi dal database i dati che devono trovarsi in un dato POS e perché li restituisca nel formato XML.

Alla procedura vengono trasferiti i parametri che consentono di limitare e adattare i set di dati inviati a un POS specifico:

  • @rowVersion (bigint): valore che consente di eseguire la sincronizzazione differenziale. Questo è un valore che si trova in XML generato da questa procedura durante l’ultima sincronizzazione riuscita (nell’attributo RowVersion).
  • @companyUnitId (int): ID del centro in cui è definito POS (CompanyStructure.CompanyUnits)
  • @pointOfSaleId (int): ID di POS (Synchronization.PointsOfSales)
  • @languageId (int): ID della lingua dei dati (Dictionaries.Languages)

Durante l’esportazione dei dati dalle colonne del tipo bit e datetime bisogna utilizzare la funzione GetBitStringPOS.GetDatetimeString.

Attività in POS

Nel database POS esiste la procedura Synchronization.ImportCustomObjects. Bisogna sovrascriverla perché questa aggiorni nel database POS le tabelle in base ai dati ricevuti da ERP Standard in formato XML, cioè i dati generati dalla procedura POS.ExportCustomObjects.

Esempio

L’esempio dimostra la sincronizzazione differenziale dei dati da due tabelle: esportazione dal database ERP Standard e importazione verso il database POS:

  • Dic_PaymentForms → Configuration.CustomPaymentForms
  • Dic_Country → Configuration

a)  Procedura di esportazione

ALTER PROCEDURE [POS].[ExportCustomObjects]
@rowVersion bigint,
@companyUnitId int,
@pointOfSaleId int,
@languageId int
AS
BEG+IN
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) Procedura di importazione

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

 

Gestione dei dizionari generali

Aggiornamento della procedura di esportazione

Nella procedura POS.ExportGenericDirectories, nella clausola WHERE bisogna includere InternalName del dizionario che anche va sincronizzato.

Nella procedura POS.ExportGenericDirectoryValues, nella clausola WHERE bisogna includere InternalName del dizionario che anche va sincronizzato.

Chiavi esterne per lo schema Standard

Per le tabelle sincronizzate

La disponibilità degli oggetti, sincronizzazioni ecc. possono, al livello della riga in una data tabella, influire i dati che saranno sincronizzato. L’esempio costituiscono i clienti, i gruppi di clienti, i magazzini, i registri, le modalità di pagamento ecc.

Per evitare la valutazione multipla riguardante i dati da sincronizzare nelle tabelle derivanti, bisogna ricorrere alla tabella POS.SentObjects.

Esempio: Esportazione della definizione delle tasse associate a un cliente

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

il valore del tipo dell’oggetto sincronizzato può essere trovato nella tabella POS.SyncTypes.

Per le tabelle non sincronizzate

Bisogna implementare da soli il processo di sincronizzazione, come se la tabella provenisse da una parte aggiunta del sistema aggiunta.

Eliminazione dei dati

Attività in ERP Standard

a) Alla tabella DeletionTypes bisogna aggiungere l’inserzione con Id >= 1000 e il nome unico del tipo degli oggetti eliminati.
b) Nel trigger AFTER DELETE della tabella dalla quale i dati eliminati vanno sincronizzati verso POS bisogna aggiungere alla tabella POS.DeletedObjects le inserzioni riguardanti gli oggetti eliminati. Colonne da completare:

  • DeletionTypeId: identificatore del tipo definito nel punto a)
  • Ident: identificatore dell’oggetto eliminato. Questo può essere un numero (int), GUID (uniqueidentifier), nvarchar o l’insieme di valori separati dal simbolo “|”, per es. „3428|654”. Vedi anche i punti riguardanti le attività in POS (colonne IdentColumnName, IdentColumnType).
  • POSId: identificatore di POS (Synchronization.PointsOfSales): bisogna completarlo se l’oggetto va eliminato soltanto da una postazione POS specifica o lasciare NULL se dovrebbe essere eliminato da tutte le postazioni.

Attività in POS

Ala tabella Synchronization.DeletionTypes bisogna aggiungere la riga che definisce il metodo di gestione dal meccanismo di sincronizzazione dell’informazione riguardante l’eliminazione degli oggetti provenienti dal sistema ERP.

Sono disponibili due modi di eliminazione: automatico e personalizzato.

  • Nella modalità automatica il meccanismo di sincronizzazione eliminerà automaticamente i dati da una tabella specifica, identificando le righe in base ai nomi delle colonne inseriti (i valori nelle colonne TableName, IdentColumnName, IdentColumnType devono essere completate e anche NULL nella colonna CustomProcName). Utilizzato per l’eliminazione in POS di quasi tutti i tipi di oggetti possibil da eliminare in ERP (vedi: inserzioni standard nella tabella Synchronization.DeletionTypes).
  • Invece la modalità personalizzata richiede la specificazione della procedura che gestirà l’eliminazione degli oggetti di un dato tipo (la colonna CustomProcName deve essere completata). La modalità viene utilizzata quando la condizione di eliminazione è più complicata e non è possibile utilizzare il meccanismo automatico o quando durante l’eliminazione bisogna eseguire operazioni aggiuntive.

La tabella Synchronization.DeletionTypes contiene le seguenti colonne:

  • DelType: lo stesso nome che nel database ERP Standard, nella tabella DeletionTypes.
  • Order: numero che indica l’ordine di eliminazione dei tipi di oggetti.
  • TableName [soltanto la modalità automatica]: nome della tabella da cui gli oggetti vanno eliminati automaticamente nell’ambito di un dato tipo DelType.
  • IdentColumnName [soltanto la modalità automatica]: nomi delle colonne (separate dal simbolo “|”) secondo cui va eseguita l’identificazione automatica delle righe eliminate. „Id”, „GUID”, „PriceTypeId|CustomerGroupId”. Il loro numero e l’ordine deve essere conforme al valore inserito nel database ERP Standard, nella colonna POS.DeletedObjects.Ident.
  • IdentColumnType [soltanto la modalità automatica]: tipi di colonne definite come IdentColumnName, nella stessa quantità e nello stesso ordine, per es. „int”, „uniqueidentifier”, „int|int”. Nel caso del tipo nvarchar(x) bisogna inserire “nvarchar”.
  • CustomProcName [soltanto la modalità personalizzata]: nome della procedure responsabile per l’eliminazione degli oggetti di un dato tipo. Dovrebbe utilizzare i dati provenienti dalla tabella temporanea #DeletedObjects. Vedi: procedure esistenti Synchronization.DeleteCustomerPriceTypes, Synchronization.DeleteWarehouseDocuments.

 

Czy ten artykuł był pomocny?