Spis treści
Dodawanie i aktualizacja danych
Czynność po stronie Altum
W bazie Altum istnieje procedura POS.ExportCustomObjects. Należy ją nadpisać, tak by pobierała z bazy dane, które mają trafić do danego POS-a, i zwracała je w formacie XML.
Do procedury są przekazywane parametry pozwalające ograniczyć i dostosować zestaw danych wysyłanych do konkretnego POS-a:
- @rowVersion (bigint) – Wartość pozwalająca przeprowadzać synchronizację różnicową. Jest to wartość znajdująca się w XML wygenerowanym przez tę procedurę podczas ostatniej pomyślnej synchronizacji (w atrybucie RowVersion).
- @companyUnitId (int) – Id centrum, w którym zdefiniowano POS-a (CompanyStructure.CompanyUnits)
- @pointOfSaleId (int) – Id POS-a (Synchronization.PointsOfSales)
- @languageId (int) – Id języka danych (Dictionaries.Languages)
Przy eksporcie danych z kolumn typu bit i datetime należy korzystać z funkcji POS.GetBitString i POS.GetDatetimeString.
Czynność po stronie POS
W bazie POS-a istnieje procedura Synchronization.ImportCustomObjects. Należy ją nadpisać, tak by aktualizowała w bazie POS-a tabele na podstawie otrzymanych od Altum danych w formacie XML – tych wygenerowanych przez procedurę POS.ExportCustomObjects.
Przykład
Przykład pokazuje synchronizację różnicową danych z dwóch tabel – eksport z bazy Altum i import do bazy POS-a:
- SecDictionaries.Dic_PaymentForms -> Configuration.CustomPaymentForms
- dbo.Dic_Country -> Configuration
a) Procedura eksportująca
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 importująca
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
Obsługa słowników uniwersalnych
Aktualizacja procedury eksportującej
W procedurze POS.ExportGenericDirectories, w klauzuli WHERE należy uwzględnić InternalName słownika, który tez ma być synchronizowany.
W procedurze POS.ExportGenericDirectoryValues, w klauzuli WHERE należy uwzględnić InternalName słownika, który też ma być synchronizowany.
Klucze obce do schematu Altum
Dla tabel synchronizowanych
Dostępność obiektów, uprawnienia itp. mogą, na poziomie wiersza w danej tabeli, wpływać na to, które dane są synchronizowane. Przykładem mogą być Kontrahenci, grupy kontrahentów, magazyny, rejestry, formy płatności itd.
Aby uniknąć wielokrotnej ewaluacji, które dane należy synchronizować w tabelach pochodnych (na podstawie FK) należy posiłkować się tabelą POS.SentObjects.
Przykład: Eksport definicji podatków powiązanych z kontrahentem
(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)
wartość typu synchronizowanego obiektu można znaleźć w tabeli POS.SyncTypes.
Dla tabel niesynchronizowanych
Należy samodzielnie zaimplementować proces synchronizacji, tak jakby tabela pochodziła z doróbki.
Usuwanie danych
Czynności po stronie Altum
a) Do tabeli DeletionTypes dodać wpis z Id >= 1000 oraz unikatową nazwą typu usuwanych obiektów.
b) W triggerze AFTER DELETE tabeli, z której usuwanie danych ma być synchronizowane do POS, dodawać do tabeli POS.DeletedObjects wpisy o usuniętych obiektach. Kolumny do wypełnienia:
- DeletionTypeId – identyfikator typu zdefiniowanego w pkcie a)
- Ident – identyfikator usuniętego obiektu. Może to być liczba (int), GUID (uniqueidentifier), nvarchar lub zbiór wartości rozdzielonych znakiem „|”, np. „3428|654”. Patrz też punkt dot. czynności po stronie POS (kolumny IdentColumnName, IdentColumnType).
- POSId – identyfikator POS-a (Synchronization.PointsOfSales) – należy go wypełnić, jeśli obiekt powinien zostać usunięty tylko z konkretnego stanowiska POS, albo pozostawić NULL, jeśli powinien zostać usunięty na wszystkich stanowiskach.
Czynności po stronie POS
Do tabeli Synchronization.DeletionTypes dodać wiersz definiujący sposób obsługi przez mechanizm synchronizacji informacji o usunięciu obiektów przychodzący z ERP-a.
Dostępne są dwa tryby usuwania: automatyczny i niestandardowy.
- W trybie automatycznym mechanizm synchronizacji będzie automatycznie usuwał dane z podanej tabeli, identyfikując wiersze na podstawie podanych nazw kolumn (muszą być uzupełnione wartości w kolumnach TableName, IdentColumnName, IdentColumnType, a także NULL w kolumnie CustomProcName). Stosowany do usuwania na POS-ie niemal wszystkich typów obiektów usuwalnych w ERP-ie (patrz standardowe wpisy w tabeli Synchronization.DeletionTypes).
- Tryb niestandardowy natomiast wymaga podania procedury obsługującej usuwanie obiektów danego typu (musi być wypełniona kolumna CustomProcName). Używany jest, gdy warunek usunięcia jest bardziej skomplikowany i nie da się zastosować mechanizmu automatycznego lub gdy przy usuwaniu należy wykonać dodatkowe operacje.
Tabela Synchronization.DeletionTypes zawiera następujące kolumny:
- DelType – nazwa taka, jak w bazie Altum w tabeli DeletionTypes.
- Order – liczba wyznaczająca kolejność usuwania typów obiektów.
- TableName [tylko tryb automatyczny] – nazwa tabeli, z której obiekty mają być automatycznie usuwane w ramach danego typu DelType.
- IdentColumnName [tylko tryb automatyczny] – nazwy kolumn (rozdzielonych znakiem „|”), wg których ma się odbywać automatyczna identyfikacja usuwanych wierszy, np. „Id”, „GUID”, „PriceTypeId|CustomerGroupId”. Ich liczba i kolejność musi się zgadzać z wartością wpisywaną w bazie Altum do kolumny POS.DeletedObjects.Ident.
- IdentColumnType [tylko tryb automatyczny] – typy kolumn zdefiniowanych jako IdentColumnName, w tej samej liczbie i kolejności, np. „int”, „uniqueidentifier”, „int|int”. W przypadku typu nvarchar(x) wpisujemy „nvarchar”.
- CustomProcName [tylko tryb niestandardowy] – nazwa procedury odpowiadającej za usunięcie obiektów danego typu. Powinna korzystać z danych z tabeli tymczasowej #DeletedObjects. Patrz istniejące procedury Synchronization.DeleteCustomerPriceTypes, Synchronization.DeleteWarehouseDocuments.


