Daten in POS exportieren
Es ist möglich, nicht zusammenhängende Daten mit Objekten zu synchronisieren, die in POS erstellt und mit dem ERP-System synchronisiert wurden. Dazu muss die Prozedur Synchronization.ExportCustoms ausgeführt werden. Es ist zu beachten, dass die Struktur in <Customs><Custom> beizubehalten ist, während die Struktur unter dem Knoten <Customs> frei gestaltet werden kann.
Es ist gut, wenn die Struktur der Tabellen, aus denen die Daten ausgewählt werden, die hochzuladen sind, über die Baumstruktur verfügen und die Haupttabelle über folgende Spalten verfügt:
- GUID – sorgt für Identifikation des Objekts zwischen POS und ERP
- Id – in Bezug auf die Struktur
- Type – wenn Sie Daten in DS unterscheiden wollen, vor allem wenn ggf. separate Erweiterungen vorhanden sind
- WasSentToERP – filtriert Daten, die schon versandt wurden
Gesendete Daten kennzeichnen
Es ist möglich, die Standardmethode zur Kennzeichnung gesendeter Objekte für die Markierung benutzerdefinierter Objekte zu verwenden.
Überladen Sie an dieser Stelle die Service-Methode ISynchronizationRepository (dieser Bereich verfügt über keine Erweiterungspunkte)
public class SynchronizationRepositoryExt : SynchronizationRepository
{
public override void MarkIfWasSentToERP(string xml)
{
base.MarkIfWasSentToERP(xml);
using (var context = new POSDBContext())
{
context.ExecuteProcedure("Synchronization.MarkSentCustomData", xml);
}
}
}
Sie können auch beispielsweise eine Prozedur intern aufrufen, die die gesendeten Objekte markieren wird.
CREATE PROCEDURE [Synchronization].[MarkSentCustomData]
@p0 xml
AS
BEGIN
UPDATE CustomSchema.CustomRootTable
SET WasSentToERP = 1
Where GUID in (SELECT xmlData.Col.value('@GUID','varchar(max)') FROM @p0.nodes('/Customs/Custom') xmlData(Col))
END
GO
Beispiel für Export
CREATE PROCEDURE [Synchronization].[ExportCustoms]
AS
BEGIN
SET NOCOUNT ON;
select
pad.GUID as [@GUID],
pad.Type as [@Type],
pad.Data1 as [@Data1],
Synchronization.GetDatetimeString(pad.ChangeDate) as [@ChangeDate],
(
select
td.Number as [@NumberString],
td.Status as [@Status],
td.Value as [@Value]
from CustomSchema.Table1 td where pad.Id = td.RootId
for xml path('Table1'), root('Tables1'), type
),
(
select
ti.ToPayNet as [@ToPayNet],
ti.Points as [@Points],
ti.ToPay as [@ToPay]
from CustomSchema.Table2 ti where pad.Id = ti.RootId
for xml path('Table2'), root('Tables2'), type
)
from CustomSchema.RootData pad
where pad.WasSentToERP = 0
for xml path('Custom'), root('Customs')
END
GO
Import in DataService
Der Datenimport erfolgt über den IDataCustomService und die Überladung der Methode SaveCustom. Die Methode erhält jede Custom-Zeile als Argument in Form eines XElement-Objekts.
Um mehrere Erweiterungen zu verarbeiten, müssen Pin-Points für den DataService verwendet werden.
Snippet für den Import
[DataServiceBusinessModule]
public static class Module
{
[MethodInitializer]
public static void Initialize()
{
var dataCustomService = IoC.Container.Resolve<IDataCustomExtensionPointService>();
dataCustomService.OnSaveCustomEvent += DataCustomService_OnSaveCustomEvent;
}
private static void DataCustomService_OnSaveCustomEvent (object sender, XEEventArgs e)
{
//deserialisieren + Daten speichern
}
}