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ů.