/// <summary> /// Exports the specified profile. /// </summary> /// <param name="profile">The profile.</param> /// <param name="transportReportFileName">Name of the transport report file.</param> private void Export(NtoNAssociationsTransportProfile profile, string transportReportFileName) { NtoNTransportReport report = null; try { report = new NtoNTransportReport(transportReportFileName); //Get Transport Report if (File.Exists(transportReportFileName)) { report = ReadTransportReport(transportReportFileName); } //Clean Data folder string dataExportFolder = Folder + "\\" + profile.ProfileName + "\\Data"; if (Directory.Exists(dataExportFolder)) { Directory.Delete(dataExportFolder, true); } Directory.CreateDirectory(dataExportFolder); MSCRMConnection connection = profile.getSourceConneciton(); NtoNRelationshipsStructure es = ReadEnvStructure(profile.SourceConnectionName); _serviceProxy = cm.connect(connection); IOrganizationService service = (IOrganizationService)_serviceProxy; List<NtoNTransportReportLine> TransportReport = new List<NtoNTransportReportLine>(); profile.TotalExportedRecords = 0; //Mesure export time DateTime exportStartDT = DateTime.Now; LogManager.WriteLog("Start exporting data from " + connection.ConnectionName); int recordCount = 0; if (es != null) { foreach (SelectedNtoNRelationship ee in profile.SelectedNtoNRelationships) { LogManager.WriteLog("Exporting data for relationship " + ee.RelationshipSchemaName); DateTime entityExportStartDT = DateTime.Now; string fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"; fetchXml += "<entity name='" + ee.IntersectEntityName + "'>"; //Get Entity structure NtoNRelationship strE = new NtoNRelationship(); foreach (NtoNRelationship envE in es.NtoNRelationships) { if (envE.IntersectEntityName == ee.IntersectEntityName) { strE = envE; fetchXml += "<attribute name='" + strE.Entity1IntersectAttribute + "' />"; fetchXml += "<attribute name='" + strE.Entity2IntersectAttribute + "' />"; if (ee.IntersectEntityName == "listmember" || ee.IntersectEntityName == "campaignitem") fetchXml += "<attribute name='entitytype' />"; else if (ee.IntersectEntityName == "campaignactivityitem") fetchXml += "<attribute name='itemobjecttypecode' />"; break; } } //Add Query filter int objectTypeCode = 0; if (ee.Entity2LogicalName == "account") objectTypeCode = 1; else if (ee.Entity2LogicalName == "campaign") objectTypeCode = 4400; else if (ee.Entity2LogicalName == "contact") objectTypeCode = 2; else if (ee.Entity2LogicalName == "lead") objectTypeCode = 4; else if (ee.Entity2LogicalName == "list") objectTypeCode = 4300; else if (ee.Entity2LogicalName == "product") objectTypeCode = 1024; else if (ee.Entity2LogicalName == "salesliterature") objectTypeCode = 1038; if (ee.IntersectEntityName == "campaignitem") fetchXml += "<filter type='and'><condition attribute='entitytype' operator='eq' value='" + objectTypeCode + "' /></filter>"; else if (ee.IntersectEntityName == "campaignactivityitem") fetchXml += "<filter type='and'><condition attribute='itemobjecttypecode' operator='eq' value='" + objectTypeCode + "' /></filter>"; fetchXml += "</entity></fetch>"; int recordCountPerEntity = ExportEntity(profile, fetchXml, ee.RelationshipSchemaName); recordCount += recordCountPerEntity; DateTime entityExportEndDT = DateTime.Now; TimeSpan ts = entityExportEndDT - entityExportStartDT; NtoNTransportReportLine transportReportLine = new NtoNTransportReportLine(); transportReportLine.RelationshipSchemaName = ee.RelationshipSchemaName; transportReportLine.ExportedRecords = recordCountPerEntity; report.TotalExportedRecords += recordCountPerEntity; transportReportLine.ExportedIn = ts.ToString().Substring(0, 10); transportReportLine.ExportStartedAt = entityExportStartDT.ToString(); transportReportLine.ExportFinishedAt = entityExportEndDT.ToString(); report.ReportLines.Add(transportReportLine); WriteTransportReport(report, transportReportFileName); } } TimeSpan exportTimeSpan = DateTime.Now - exportStartDT; LogManager.WriteLog("Export finished for " + profile.SourceConnectionName + ". Exported " + recordCount + " records in " + exportTimeSpan.ToString().Substring(0, 10)); } catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex) { LogManager.WriteLog("Error:" + ex.Detail.Message + "\n" + ex.Detail.TraceText); } catch (Exception ex) { if (ex.InnerException != null) { LogManager.WriteLog("Error:" + ex.Message + "\n" + ex.InnerException.Message); } else { LogManager.WriteLog("Error:" + ex.Message); } } }
/// <summary> /// Downloads the env structure. /// </summary> /// <param name="connectionName">Name of the connection.</param> /// <returns>The N to N Relationships Structure</returns> public NtoNRelationshipsStructure downloadEnvStructure(string connectionName) { try { MSCRMConnection connection = cm.getConnection(connectionName); _serviceProxy = cm.connect(connection); IOrganizationService service = (IOrganizationService)_serviceProxy; NtoNRelationshipsStructure es = new NtoNRelationshipsStructure(); es.NtoNRelationships = new List<NtoNRelationship>(); RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest() { EntityFilters = EntityFilters.Relationships, RetrieveAsIfPublished = true }; // Retrieve the MetaData. RetrieveAllEntitiesResponse AllEntitiesResponse = (RetrieveAllEntitiesResponse)_serviceProxy.Execute(request); List<string> TreatedRelationships = new List<string>(); foreach (EntityMetadata currentEntity in AllEntitiesResponse.EntityMetadata) { List<ManyToManyRelationshipMetadata> ManyToManyRelationships = currentEntity.ManyToManyRelationships.ToList(); foreach (ManyToManyRelationshipMetadata relationship in ManyToManyRelationships) { if (!relationship.IsValidForAdvancedFind.Value) continue; if (relationship.IntersectEntityName == "subscriptionmanuallytrackedobject") continue; if (TreatedRelationships.Find(r => r == relationship.SchemaName) != null) continue; NtoNRelationship ee = new NtoNRelationship(); // Start Entity Node ee.RelationshipSchemaName = relationship.SchemaName; ee.IntersectEntityName = relationship.IntersectEntityName; ee.Entity1LogicalName = relationship.Entity1LogicalName; ee.Entity1IntersectAttribute = relationship.Entity1IntersectAttribute; ee.Entity2LogicalName = relationship.Entity2LogicalName; ee.Entity2IntersectAttribute = relationship.Entity2IntersectAttribute; // End Entity Node TreatedRelationships.Add(relationship.SchemaName); es.NtoNRelationships.Add(ee); } } //Order by SchemaName IOrderedEnumerable<NtoNRelationship> orderedNtoNRelationships = es.NtoNRelationships.OrderBy(se => se.RelationshipSchemaName); es.NtoNRelationships = orderedNtoNRelationships.ToList<NtoNRelationship>(); es.connectionName = connectionName; WriteEnvStructure(es); return es; } catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>) { throw; } catch (Exception) { throw; } }