2016-08-01 3 views
0

Я пытаюсь импортировать вложения/аннотации в CRM Dynamics, я делаю это с помощью SDK.Импорт данных привязки Dynamics CRM с использованием SDK

Я не используя импорт импорта мастера.

Я не индивидуально создавая объекты аннотации, вместо этого я использую программно Data Import Feature.

Я в основном использовал образец DataImport из примера кода SDK (SDK \ SampleCode \ CS \ DataManagement \ DataImport).

 Import import = new Import() 
      { 
       ModeCode = new OptionSetValue((int)ImportModeCode.Create), 
       Name = "Data Import" 
      }; 
Guid importId = _serviceProxy.Create(import); 


_serviceProxy.Create(
        new ColumnMapping() 
        { 
         ImportMapId = new EntityReference(ImportMap.EntityLogicalName, importMapId), 
         ProcessCode = new OptionSetValue((int)ColumnMappingProcessCode.Process), 

         SourceEntityName = sourceEntityName, 
         SourceAttributeName = sourceAttributeName, 

         TargetEntityName = targetEntityName, 
         TargetAttributeName = targetAttributeName 

        }); 

Я получаю сообщение об ошибке «Ссылка на приложение не найдена».

documentation говорит, что служба асинхронной службы crm найдет физический файл на диске и загрузит его, мой вопрос: , где служба асинхронного поиска ищет файлы вложений?

Я попытался отобразить поле документа в полный путь к приложению на столе, но это все еще не сработало.

ответ

0

Я нашел решение в obscure blog post, я думаю, что документация является недостоверным или неясным, как все это дело работает, делает имеющие файлы, имеющиеся на диске сервера для асинхронный процесс, нечетный.

Чтобы следовать тому же принципу, все содержимое должно быть отправлено, как и сам файл csv, при привязке к одному и тому же импорту.

Для решения этой проблемы нам необходимо создать индивидуальный специальный Внутренний ImportFile для каждого физического приложения и связать его с импортом, в котором есть данные записи вложений.

Как вы видите ниже, связав вложения ImportFile с помощью ImportId, а затем установив два свойства (ProcessCode и FileTypeCode), все это сработало в конце.

Достаточно сказать, что использование этого метода намного эффективнее и быстрее, чем индивидуально создавая записи аннотаций.

foreach (var line in File.ReadLines(csvFilesPath + "Attachment.csv").Skip(1)) 
      { 
       var fileName = line.Split(',')[0].Replace("\"", null); 
       using (FileStream stream = File.OpenRead(attachmentsPath + fileName)) 
       { 
        byte[] byteData = new byte[stream.Length]; 
        stream.Read(byteData, 0, byteData.Length); 
        stream.Close(); 
        string encodedAttachmentData = System.Convert.ToBase64String(byteData); 

        ImportFile importFileAttachment = new ImportFile() 
        { 
         Content = encodedAttachmentData, 
         Name = fileName, 
         ImportMapId = new EntityReference(ImportMap.EntityLogicalName, importMapId), 
         UseSystemMap = true, 
         ImportId = new EntityReference(Import.EntityLogicalName, importId), 
         ProcessCode = new OptionSetValue((int)ImportFileProcessCode.Internal), 
         FileTypeCode = new OptionSetValue((int)ImportFileFileTypeCode.Attachment), 
         RecordsOwnerId = currentUserRef 
        }; 
        _serviceProxy.Create(importFileAttachment); 
       } 
       idx++; 
      } 
0

Ответ на этот вопрос был предоставлен до внесения изменений в вопрос, разъясняющий использование мастера импорта вместо SDK. Ниже приведен конкретный ответ на использование SDK.


Когда вы подключаете файлы в аннотации (примечание) запись в CRM с помощью SDK, вы используете атрибут (вместе с mimetype) documentbody, но вы должны сначала преобразовать его в base64.

Что-то вроде этого:

var myFile = @"C:\Path\To\My\File.pdf"; 
// Do checks to make sure file exists... 

// Convert to Base64. 
var base64Data = Convert.ToBase64String(System.IO.File.ReadAllBytes(myFile)); 

var newNote = new Entity("annotation"); 

// Set subject, regarding object, etc. 

// Add the data required for a file attachment. 
newNote.Attributes.Add("documentbody", base64Data); 
newNote.Attributes.Add("mimetype", "text/plain"); // This mime type seems to work for all file types. 

orgService.Create(newNote); 
+0

Спасибо, и я сожалею, что не понял, я использую функцию DataImport. Я обновил свой вопрос, чтобы добавить более подробную информацию. – Socardo

+0

После прочтения ваших изменений служба async, скорее всего, будет выглядеть только на самом сервере - она ​​не будет иметь доступ к рабочему столу клиента (предполагая, что это то, что вы имеете в виду, когда говорите «стол»). Я никогда не испортил мастер импорта для импорта вложений - я всегда использовал SDK. –

+0

Мой код запущен на сервере, вложения находятся на сервере, просто не знаю, где служба асинхронного поиска ищет файлы, если она выглядит в первую очередь, документации очень не хватает. – Socardo