<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Efficy Overflow Q&amp;A - Recent questions and answers in Exchange Sync</title>
<link>https://overflow.efficy.io/?qa=qa/developers/services-and-processes/exchange-sync</link>
<description>Powered by Question2Answer</description>
<item>
<title>Answered: 2fa compatibility with exchange sync service</title>
<link>https://overflow.efficy.io/?qa=5467/2fa-compatibility-with-exchange-sync-service&amp;show=5471#a5471</link>
<description>&lt;p&gt;Hi,&lt;br&gt;
If you create an admin user with the impersonate right in Exchange &lt;br&gt;
and configure it in the Efficy service,&lt;br&gt;
You should be able to access them.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://help.efficy.io/edn/admin/scpr_exchangesyncsystemrequirements&quot;&gt;https://help.efficy.io/edn/admin/scpr_exchangesyncsystemrequirements&lt;/a&gt;&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=5467/2fa-compatibility-with-exchange-sync-service&amp;show=5471#a5471</guid>
<pubDate>Tue, 02 Jun 2020 14:34:55 +0000</pubDate>
</item>
<item>
<title>Answered: How can we use Exchange synchro service through a Proxy</title>
<link>https://overflow.efficy.io/?qa=3695/how-can-we-use-exchange-synchro-service-through-a-proxy&amp;show=3701#a3701</link>
<description>&lt;p&gt;Run the Exchange Sync service with a dedicated domain user that has the permissions to contact the office 365 domain (whatever it might be). &lt;/p&gt;

&lt;p&gt;I don't see this as &quot;a work around&quot;, it's just the way it has to be configured. &lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=3695/how-can-we-use-exchange-synchro-service-through-a-proxy&amp;show=3701#a3701</guid>
<pubDate>Thu, 06 Dec 2018 09:50:30 +0000</pubDate>
</item>
<item>
<title>Answered: Classic ExchangeSyncService and SYNCPROFILE table</title>
<link>https://overflow.efficy.io/?qa=3684/classic-exchangesyncservice-and-syncprofile-table&amp;show=3685#a3685</link>
<description>&lt;p&gt;Hi Kristof,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SyncProfile&lt;/code&gt; table is only used for the &lt;code&gt;ExchangeQueueSync&lt;/code&gt;.&lt;br&gt;
The &quot;normal&quot; Exchange (+ google/domino) synchro still use the local service ini file to store the configured profiles.&lt;/p&gt;

&lt;p&gt;Kind regards,&lt;/p&gt;

&lt;p&gt;Alain&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=3684/classic-exchangesyncservice-and-syncprofile-table&amp;show=3685#a3685</guid>
<pubDate>Tue, 27 Nov 2018 11:14:01 +0000</pubDate>
</item>
<item>
<title>Answered: Out of memory DataSynchro Remote after 6000 imports .</title>
<link>https://overflow.efficy.io/?qa=3257/out-of-memory-datasynchro-remote-after-6000-imports&amp;show=3259#a3259</link>
<description>&lt;p&gt;can you shpow us your import script ?&lt;br&gt;
Is every opened context closed like it should ?&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=3257/out-of-memory-datasynchro-remote-after-6000-imports&amp;show=3259#a3259</guid>
<pubDate>Wed, 13 Jun 2018 08:42:07 +0000</pubDate>
</item>
<item>
<title>Problème d'import</title>
<link>https://overflow.efficy.io/?qa=3247/probleme-dimport</link>
<description>&lt;p&gt;Salut,&lt;/p&gt;

&lt;p&gt;J'ai une erreur lors de l'import d'un ficher dans le module remote avec le message suivant:&lt;br&gt;
est-ce que quelqu'un à une petite idée du problème pour m'aider?&lt;br&gt;
Comment puis-je utiliser le &quot;Free pour liberer la memoire&quot; ?Après chaque  6000 imports j'ai le message: &quot;Out of memory&quot; &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://overflow.efficy.com/?qa=blob&amp;amp;qa_blobid=14828831905508094267&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var index = 0;
var transactsTab = [];
function EfficyImportRecord(DataStore) {
    var dateFond = DataStore.AsString('TRANSACTION DATE');
    var fsma = DataStore.AsString('FSMA COMPAGNIE');
    var amount = DataStore.AsString('AMOUNT EUR');
    var IsinTrimed = (DataStore.AsString('CODE ISIN'));
    IsinTrimed = myTrim(IsinTrimed);
    var tranType = getValueFromTableWhereField(&quot;LK_TYPE_TRANS&quot;, &quot;K_TYPE_TRANS&quot;, &quot;F_VALUE&quot;, DataStore.AsString('TRANSACTION TYPE'));
    var param = DataStore.AsString('POLICY NUMBER') + &quot;\n&quot; + fsma + &quot;\n&quot; +tranType+ &quot;\n&quot; + dateFond + &quot;\n&quot; + IsinTrimed;
    var Target = 53; // Tran
    var Target_Contract = 50; //Contract
    var Target_Fond = 52; //Fond
    var k_Contract = query.firstField(&quot;select * from CONTRACTS where reference = :p1&quot;, DataStore.AsString('POLICY NUMBER'), 0);    
    var NbCtra = query.firstField(&quot;select count(*) from contracts where reference = :p1&quot;, DataStore.AsString('POLICY NUMBER') , 0);
    var k_Fond =     query.firstField(&quot;select * from Fonds where F_ISIN_CODE = :p2&quot;, IsinTrimed, 0);
    var PN = DataStore.AsString('POLICY NUMBER');
    index ++;
    Database.log(&quot;Ligne : &quot;+index);
    if(NbCtra &amp;gt; 1)
    {
        Database.log(&quot;plusieurs contrats avec le numero: &quot;+DataStore.AsString('POLICY NUMBER'));
        return;
    }
    var existeItem = 0;
    var existe =  query.firstField(&quot;select count(t.k_transact) from transacts t inner join TRAN_FOND tf on t.k_transact = tf.k_transact inner join fonds f on f.k_fond = tf.k_fond where t.name = :p1 and t.F_FSMA_COMP = :p2 and t.F_LK_TYPE = :p3 and t.F_DATE = CONVERT(datetime2, :p4, 103) and f.F_ISIN_CODE = :p5&quot;, param , 0);
    if(existe &amp;gt; 0)
    {
        Database.log(&quot;Transaction avec POLICY NUMBER: &quot;+ DataStore.AsString('POLICY NUMBER') + &quot; existe déjà =&amp;gt; NOT ADDED! &quot;);
        return;
    }
    //Call méthode add new Transact
    addTransact(k_Contract,k_Fond,Target,Target_Contract,Target_Fond,DataStore);
    for (var i=0;i &amp;lt; transactsTab.length; i++)
    {
        if(transactsTab[i] == PN)
            existeItem ++;
    }
    if(existeItem &amp;gt;0 )
        transactsTab.push(PN);
    else
    {
        transactsTab.push(PN);
        if(tranType != 4)
        {
            try{
                if(existe != 0)
                {
                    var que = &quot;delete transacts where k_transact in (select k_transact from transacts where NAME = :p1) and F_LK_TYPE &amp;lt;&amp;gt; 4 &quot;;
                    query.getDataSet(que,PN);
                    addTransact(k_Contract,k_Fond,Target,Target_Contract,Target_Fond,DataStore);
                }
            }catch (er) {
                Database.log(&quot;Erreur: &quot;+ er.message);
            }
        }
    }
    return true;
}
function addTransact(k_Contract,k_Fond,Target,Target_Contract,Target_Fond,DataStore) {
    var EditHandle = Database.OpenEditContext(Target, 0);
    //check if link existe with contract(If yes than add new Transact)
    Database.log(&quot;k_Contract: &quot;+ k_Contract);
    if( k_Contract != 0 )
    {
        try {
            Database.UpdateFields(EditHandle, 0, 'NAME', DataStore.AsString('POLICY NUMBER'));
            Database.UpdateFields(EditHandle, 0, 'F_AMOUNT', DataStore.AsString('AMOUNT EUR'));
            Database.UpdateFields(EditHandle, 0, 'F_FSMA_COMP', DataStore.AsString('FSMA COMPAGNIE'));
            Database.UpdateFields(EditHandle, 0, 'F_DATE', DataStore.AsString('TRANSACTION DATE'));
            Database.UpdateFields(EditHandle, 0, 'F_LK_TYPE',getValueFromTableWhereField(&quot;LK_TYPE_TRANS&quot;, &quot;K_TYPE_TRANS&quot;, &quot;F_VALUE&quot;, DataStore.AsString('TRANSACTION TYPE')));
            var ctraContext = Database.OpenEditContext(50, k_Contract);
            var invest = Database.ActivateCategory(ctraContext, 'CTRA$INVEST');
            Database.CommitChanges(ctraContext, false);
            Database.CommitChanges(EditHandle, true);
            Database.ExecuteBatch;
            //Database.Free;
            var K_TRANSACT = Database.GetEditKey(EditHandle);
            Database.addLink2(Target,Target_Contract,K_TRANSACT,k_Contract,true);
            Database.log(&quot;Transaction importé avec POLICY NUMBER: &quot;+ DataStore.AsString('POLICY NUMBER') );
        }catch (er) {
            Database.log(&quot;Erreur: &quot;+ er.message);
        }
        finally
        {
            Database.CloseContext(ctraContext);
            Database.CloseContext(EditHandle);
        }
        if(k_Fond != 0 )
            Database.addLink2(Target,Target_Fond,K_TRANSACT,k_Fond,true);
        else
            Database.log(&quot;Fond pas trouvé! Pas de relation avec Table Fond &quot;);
        if(k_Fond != 0 &amp;amp;&amp;amp; k_Contract != 0 )
            Database.addLink2(Target_Fond,Target_Contract,k_Fond,k_Contract,true);
    }
    else
        Database.log(&quot;Contract avec réf: &quot;+DataStore.AsString('POLICY NUMBER')+&quot; pas trouvé! Pas de relation avec table contract &quot;);
}
var query = {
    getDataSet: function (sql, params) {

            var datasetId = Database.ExecuteSQLQuery(sql, params);
            Database.executeBatch;
            var dsResult = Database.CreateDataSet;
            Database.GetObject(datasetId, dsResult);             
            if (dsResult &amp;amp;&amp;amp; !dsResult.isEmpty) dsResult.first;

            return dsResult;

    },
    firstField: function(sql, params, defaultValue) {
        var ds = query.getDataSet(sql, params);
        if (ds &amp;amp;&amp;amp; ds.recordcount &amp;gt; 0) {
            return query.castField(ds, ds.Fields(0));
        }
        return defaultValue;
    },
    castField: function(ds, field) {
        var fieldName = field.fieldName;
        var dataType = parseInt(field.dataType, 10);
        switch (dataType) {
            case 3:
                return ds.fieldByName(fieldName).asInteger; break;
            case 6: case 37: // float
            case 11: // Date
                return ds.fieldByName(fieldName).asFloat; break;
            default:
                return ds.fieldByName(fieldName).asString;
        }
    }
}
// function general to get field from table
function getValueFromTableWhereField(table, kField, field, value) {
    //Database.log(&quot;field + VALUE: &quot;+ field + &quot; =&amp;gt; &quot;+ typeof field +&quot; : &quot; + typeof value) ;
    //var dsId = Database.ExecuteSQLQuery(&quot;SELECT &quot; + kField + &quot; FROM &quot; + table + &quot; WHERE UPPER(&quot; + field + &quot;) = ' UPPER(&quot; + value + &quot;) '&quot;, &quot;&quot;);
    var dsId = Database.ExecuteSQLQuery(&quot;SELECT &quot; + kField + &quot; FROM &quot; + table + &quot; WHERE &quot; + field + &quot; = '&quot; + value + &quot;'&quot;, &quot;&quot;);
    Database.ExecuteBatch;
    var ds = Database.CreateDataSet;
    try {
        Database.GetObject(dsId, ds);
        ds.First;
        return ds.FieldByName(kField).AsString;
    } finally {
        ds.Free;
    }
    return 0;
}
//function to remove white espace for code isin
function myTrim(x) {
    return x.replace(/^\s+|\s+$/gm,'');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Merci d'avance&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=3247/probleme-dimport</guid>
<pubDate>Sat, 09 Jun 2018 13:15:34 +0000</pubDate>
</item>
<item>
<title>Answered: How can we use: CompleteActionSubjectCustom with the MSExchange sync profiles</title>
<link>https://overflow.efficy.io/?qa=1731/completeactionsubjectcustom-with-msexchange-sync-profiles&amp;show=1737#a1737</link>
<description>&lt;p&gt;When the setting is enabled, the Exchange Synchro will take the value from &lt;code&gt;ACTIONS.OUTLOOKSUBJECT (text 255 char)&lt;/code&gt; as content for setting the subject of the corresponding Appo meeting in Outlook. If not enabled (=standard), it will assemble the Outlook subject itself with the appendix of the contacts etc...&lt;/p&gt;

&lt;p&gt;With database workflow, preferably in &lt;code&gt;BeforeCommitActi&lt;/code&gt;, one can initialize this &lt;code&gt;OUTLOOKSUBJECT&lt;/code&gt; value with custom content. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FYI:&lt;/strong&gt; There was the same system for years with the field &lt;code&gt;OUTLOOKMEMO&lt;/code&gt;. &lt;code&gt;OUTLOOKSUBJET&lt;/code&gt; is new in Efficy 10. The custom subject is used at the Belfius project.&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=1731/completeactionsubjectcustom-with-msexchange-sync-profiles&amp;show=1737#a1737</guid>
<pubDate>Mon, 27 Jun 2016 06:38:27 +0000</pubDate>
</item>
<item>
<title>Answered: How to match recurring appointments from Exchange in Efficy?</title>
<link>https://overflow.efficy.io/?qa=1602/how-to-match-recurring-appointments-from-exchange-in-efficy&amp;show=1603#a1603</link>
<description>&lt;p&gt;Efficy stores the globalObjID (some sort of UID) inside &lt;code&gt;SYNCHRO.EXT_2&lt;/code&gt;, together with some additional information. The information is separated with an underscore.&lt;/p&gt;

&lt;p&gt;The oracle query below, maps the ACTIONS table with the SYNCHRO table using this parsed GlobalObjId.&lt;/p&gt;

&lt;p&gt;The query is made for Oracle, it will be structurally identical for MSSQL&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT Count(*)                                     CNT, 
             Min(a.d_begin)                               AS D_BEGIN_MIN, 
             Max(a.d_begin)                               AS D_BEGIN_MAX, 
             Trunc(Max(a.d_begin) - Min(a.d_begin))       AS TIMESPAN_DAYS, 
             a.subject, 
             Substr(s.ext_2, 0, Instr (s.ext_2, '_') - 1) AS encodedGlobalObjID 
FROM   actions a 
             inner join synchro s 
                             ON s.k_application = 25 
                                    AND s.k_table = 32000 
                                    AND s.k_1 = a.k_action 
WHERE  a.planned = '1' 
             AND a.k_recurparent IS NULL 
             AND s.ext_2 IS NOT NULL 
GROUP  BY subject, 
                    Substr(s.ext_2, 0, Instr (s.ext_2, '_') - 1) 
HAVING Substr(s.ext_2, 0, Instr (s.ext_2, '_') - 1) IS NOT NULL 
ORDER  BY cnt DESC; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Explaining the columns of the query&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;CNT&lt;/code&gt;: counts the number of actions from this recurrences, created in Efficy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;D_BEGIN_MIN&lt;/code&gt;: Start date recurrence&lt;/li&gt;
&lt;li&gt;&lt;code&gt;D_BEGIN_MAX&lt;/code&gt;: End date recurrence&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TIMESPAN_DAYS&lt;/code&gt;: Timespan of the recurrence in days&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SUBJECT&lt;/code&gt;: Subject (if we assume the subject hasn't been changed, else leave it out the group)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encodedGlobalObjID&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If required, the globalObjID can be converted in UID with some &lt;a rel=&quot;nofollow&quot; href=&quot;https://msdn.microsoft.com/en-us/library/hh338153%28v=exchg.80%29.aspx?f=255&amp;amp;MSPPError=-2147217396&quot;&gt;manipulations&lt;/a&gt;&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=1602/how-to-match-recurring-appointments-from-exchange-in-efficy&amp;show=1603#a1603</guid>
<pubDate>Thu, 12 May 2016 06:58:05 +0000</pubDate>
</item>
<item>
<title>Answered: What the convert CDO to EWS function in doing exactly?</title>
<link>https://overflow.efficy.io/?qa=1240/what-the-convert-cdo-to-ews-function-in-doing-exactly&amp;show=1241#a1241</link>
<description>&lt;p&gt;R&amp;amp;D Answer:&lt;/p&gt;

&lt;p&gt;&quot;Convert CDO ID to EWS ID” button will do this:&lt;br&gt;
The CDO ID will be converted into an EWS ID and writes it to the synchronization table.&lt;/p&gt;

&lt;p&gt;So it will loop in each mailbox then in each item of the synchro table and will ask to ews to convert old cdo id to new ews id.&lt;/p&gt;

&lt;p&gt;When exchange returned the ews id, we then test if the element can be obtained with it. If yes, the ids are saved in the synchro table with another K_APPLICATION. Old cdo id will remain in the synchro table.&lt;/p&gt;

&lt;p&gt;Since the synchro need to access to the mailbox via ews, it means that info inside acc_accounts need to be filled with ews info instead of cdo info (in “Mail Server” and “Mail Alias”).&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=1240/what-the-convert-cdo-to-ews-function-in-doing-exactly&amp;show=1241#a1241</guid>
<pubDate>Mon, 18 Jan 2016 17:00:32 +0000</pubDate>
</item>
<item>
<title>Answered: Efficy 2014 (6640): Synchro MS Exchange -&gt; Efficy</title>
<link>https://overflow.efficy.io/?qa=1131/efficy-2014-6640-synchro-ms-exchange-efficy&amp;show=1133#a1133</link>
<description>&lt;p&gt;In the Outlook / Exchange calendar, each person has his own calendar with meetings. Each meeting can be moved, deleted or appended with additional information. Each user can decide if he want's to send updates (by e-mail) to others, or can decide to keep them locally.This design requires to have individual records for each calendar.&lt;/p&gt;

&lt;p&gt;Efficy appointments are the opposite, There is only one record with a shared memo and details relations (linked contacts, companies...). This is very useful for a CRM system where you want to see only one record for the same multi-user appointment.&lt;/p&gt;

&lt;p&gt;Conclusion, both designs are technically very different. The Exchange synchronisation respects the source system and creates for each calendar record a destination record in the Efficy database. &lt;/p&gt;

&lt;p&gt;Efficy doens't offer an option to change the sync behavior.&lt;/p&gt;

&lt;p&gt;However, I also believe Efficy could do better. There must be a shared ID between related meetings and if that key would be synced as well to Efficy, at least the individual appointments could be linked together and eventually also shown grouped together in datagrids.&lt;/p&gt;
</description>
<category>Exchange Sync</category>
<guid isPermaLink="true">https://overflow.efficy.io/?qa=1131/efficy-2014-6640-synchro-ms-exchange-efficy&amp;show=1133#a1133</guid>
<pubDate>Thu, 07 Jan 2016 09:46:43 +0000</pubDate>
</item>
</channel>
</rss>