Synchronizace není schopna přejít přes konkrétní modul (duplicitní relace v databázi)

Popis

Synchronizace eWay-CRM Mobile® se zastavuje na tom samém modulu a opakuje se.

V logu na eWay-CRM® Mobile pro iPhone je:

[WARN] [BACK] [2018-03-28 12:57:32] Exception caught while loading all items into module 11.
[WARN] [BACK] [2018-03-28 12:57:32] Exception caught while loading all items into module 11.
[WARN] [BACK] [2018-03-28 12:57:33] Exception caught while loading all items into module 11.
[ERROR] [BACK] [2018-03-28 12:57:33] Sync error: The loader has loaded more items than the wanted list size. Check for duplicit relations.

Číslo 11 označuje modul, v tomto případě se jedná o Příležitosti. eWay-CRM® Mobile má pro jednotlivé moduly své vlastní číslování.

 V logu pro telefony se systémem Android je dokonce uvedeno, na jaké položce je duplicita:

2018-03-29 16:18:17 com.eway_crm.mobile.androidapp.sync.exceptions.SynchronizationException: The item 3FA25D51-EBA7-11E5-A70D-549F350D3CCE is here twice.
    at com.eway_crm.mobile.androidapp.sync.SynchronizationThread$BlockLoader.loadAndSave(SynchronizationThread.java:1129)
    at com.eway_crm.mobile.androidapp.sync.SynchronizationThread.syncItems(SynchronizationThread.java:867)
    at com.eway_crm.mobile.androidapp.sync.SynchronizationThread.syncAllModuleItems(SynchronizationThread.java:732)
    at com.eway_crm.mobile.androidapp.sync.SynchronizationThread.runFullSync(SynchronizationThread.java:565)
    at com.eway_crm.mobile.androidapp.sync.SynchronizationThread.run(SynchronizationThread.java:229)
    at com.eway_crm.mobile.androidapp.sync.WcfSyncAdapter.onPerformSync(WcfSyncAdapter.java:180)
    at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)

Verze

Všechny verze eWay-CRM®

Obtížnost řešení

Střední

Postup řešení

Příčinou je duplicitní 1:N relace, která zdvojuje záznam položky v seznamu pro synchronizaci. Druhým důvodem může být zdvojená vazba mezi Flows a Actions.

Varianta 1: Automatické odmazání všech zdvojených relací

Dostupnost: Procedura je dostupná od verze eWay-CRM® 5.2.2.

Důležité: Před využitím následujícího postupu je třeba provést zálohu databáze!

Pro smazání všech chybných zdvojených relací je možné použít proceduru eWaySP_DeleteDuplicatedRelations, která se spustí nad serverovou databází. Lze spustit jako:

EXEC [dbo].[eWaySP_DeleteDuplicatedRelations]

Varianta 2: Manuální odmazání jednotlivých chybných relací

Důležité: Před spuštěním procedury je třeba provést zálohu databáze!

Všechny položky, které mají problematické relace je možno zjistit dotazem:

SELECT ItemGUID1, ObjectTypeID2, RelationType, COUNT(*)
FROM EWR_ObjectRelations WHERE RelationType NOT IN ('GENERAL', 'GROUP') AND Direction = 1
GROUP BY ItemGUID1, ObjectTypeID2, RelationType HAVING COUNT(*) > 1

Přes vrácený ItemGUID1 dohledáme všechny duplicitní relace pro jednu konkrétní položku. Vždy musíme rozhodnout, kterou z relací tam necháme a které odmažeme (pomůže datum vytvoření nebo vlastník relace). Ty, které nechceme smažeme. Mělo by se jednat o staré vazby, protože duplicitu vazeb kontroluje databázový trigger. Smazání provedeme nejjednodušeji voláním:

EXEC eWaySP_DeleteRelations '8E131BDF-B376-11E3-9426-0010188DFF72'


kde jediný parametr je RelationDataGUID nechtěné relace.

Postup opakujeme, dokud dotaz výše vrací nějaké výsledky. Konzistentní stav databáze je pouze tehdy, pokud nevrací nic. Poté synchronizace eWay-CRM® Mobile začne fungovat.

Varianta 3. Duplicitní akce workflow přechodu

Duplicita může být také v záznamech tabulky EWD_Actions. Každý záznam z tabulky EWF_Flows smí být použit v EWD_Actions.FlowGUID maximálně jedenkrát. Spuste tento příkaz pro vyhledání vícenásobně použitých Flows:

 SELECT FlowGUID FROM EWD_Actions GROUP BY FlowGUID HAVING count(*) > 1

Na eWay-CRM 5.2.0 a starší sloupec FlowGUID neexistuje. Pro hledání duplicit použijeme příkaz:

SELECT f.ItemGUID FROM EWF_Flows f INNER JOIN EWR_ObjectRelations r ON f.ItemGUID = r.ItemGUID1  AND r.ObjectTypeID2 = dbo.GetObjectTypeID('Actions') GROUP BY f.ItemGUID HAVING count(*) > 1

Každý identifikátor  FlowGUID vypsaný příkazem výše musí být vyřešen. Je potřeba si vylistovat jeho akce a vybrat jedinou, která bude ponechána. Ostatní je potřeba smazat. Tento postup opakujeme pro všechny výstupy příkazu výše, dokud nevrací 0 řádků.