05.05.2009, 19:50 | #1 |
Участник
|
COM + CRM
Подскажите пожалуйста, как лучше реализовать след. задачу:
Нужно создать com-dll (пишу на c#), с помощью которой я буду создавать сущности в CRM. com будет использоваться другой программой, которая не работает c dotnet. Собственно вопрос как лучше создать новую сущность? Я сделал функцию которая принимает название сущности (например lead) и принимает список параметров "название_поля", "значение". Функция создаёт динамическую сущность (DynamicEntity). Вот только как добавить Properties нужного типа? Есть вариант узнавать через MetadataService тип поля.. но описывать так все варианты полей не хочется.. громоздко получается...Или я вообще не в те дебри залез и всё нужно по другому реализовывать? (в crm я новичок, в принципе как и в com) |
|
06.05.2009, 09:30 | #2 |
Moderator
|
К сожалению, вы на верном пути. MS помешаны на строгой типизации вплоть до апсурда: нужно создавать Property нужного типа, чтобы его потом серелизовать в строку, чтобы потом платформа все равно преобразовывала его в объект. Когда я решал задачу интеграции 2 систем, то использовал следующий подход:
1. Системы обмениваются через шину неким стандартным xml, который содержит тип сообщения, данные о объекте и метаданные... Например: Код: <?xml version="1.0" encoding="utf-8" ?> <Message xmlns="http://tempuri.org/EntitySchema.xsd"> <Entity type="contact"> <Attributes> <Attribute name="crm_id" type="Key"> <Value>{19F7FABE-6530-DD11-9D00-001B7895C8E2}</Value> </Attribute> <Attribute name="altair_id" type="String"> <Value>12345677</Value> </Attribute> </Attributes> </Entity> <Metadata> <Event type="CreateResponse" errorcode="0" errormessage="Карасавчег" /> <Sourcedata source="Altair" user="AtrairUser" /> </Metadata> </Message> 3. Для приведения типов полей используется еще одна XML следующего вида: Код: <?xml version="1.0" encoding="utf-8" ?> <Entitys xmlns="http://tempuri.org/AttributeMap.xsd"> <Entity Name="account" TypeCode="1"> <Attribute internalName="ics_synch" externalName="ics_synch" Type="bool" /> <Attribute internalName="ics_altair" externalName="altair_id" Type="String"/> <Attribute internalName="accountid" externalName="crm_id" Type="Key" /> <Attribute internalName="name" externalName="name" Type="String" /> <Attribute internalName="ics_fullname" externalName="fullname" Type="String" /> <Attribute internalName="telephone1" externalName="telephone" Type="String" /> <Attribute internalName="fax" externalName="fax" Type="String" /> <Attribute internalName="emailaddress1" externalName="email" Type="String" /> <Attribute internalName="statecode" externalName="statecode" Type="State" /> <Attribute internalName="ics_industry" externalName="industry" Type="String" /> <Attribute internalName="ics_governmentid" externalName="governmentid" Type="String" /> <Attribute internalName="sic" externalName="firmid" Type="String" /> <Attribute internalName="ics_fulladdress" externalName="address" Type="String" /> <Attribute internalName="ics_fulladdressfact" externalName="address2" Type="String" /> </Entity> <Entity Name="contact" TypeCode="2"> <Attribute internalName="ics_synch" externalName="ics_synch" Type="bool"/> <Attribute internalName="ics_altair" externalName="altair_id" Type="String"/> <Attribute internalName="contactid" externalName="crm_id" Type="Key"/> <Attribute internalName="firstname" externalName="firstname" Type="String"/> <Attribute internalName="lastname" externalName="lastname" Type="String"/> <Attribute internalName="middlename" externalName="middlename" Type="String"/> <Attribute internalName="jobtitle" externalName="jobtitle" Type="String"/> <Attribute internalName="department" externalName="department" Type="String"/> <Attribute internalName="telephone1" externalName="telephone" Type="String"/> <Attribute internalName="emailaddress1" externalName="email" Type="String"/> <Attribute internalName="fax" externalName="fax" Type="String"/> <Attribute internalName="birthdate" externalName="birthday" Type="DateTime"/> <Attribute internalName="parentcustomerid" externalName="parentcustomerid" Type="GUID"/> <Attribute internalName="ics_documenttype" externalName="documenttype" Type="String"/> <Attribute internalName="ics_documentnumber" externalName="documentnumber" Type="String"/> <Attribute internalName="ics_documentseries" externalName="documentseries" Type="String"/> <Attribute internalName="ics_issuedate" externalName="issuedate" Type="DateTime"/> <Attribute internalName="ics_issueplace" externalName="issueplace" Type="String"/> </Entity> </Entitys> p.p.s.Для преобразования XML возможно использовать XSLT, возможно удатся сократить количество строк кода.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
06.05.2009, 11:45 | #3 |
Участник
|
Спасибо за ответ.
Допустим хочу создать универсальную функцию, которая будет создавать любую сущность. Если одним из параметров является тип поля (в текстовом виде ParamType), то по всей видимости придётся делать switch (ParamType). И в зависимости от значения уже создавать свойство нужного типа? Например: switch (ParamType) { case "string": Prop.Add(CreateStringProperty(Name, Value)); break; case "picklist": PicklistProperty p = new PicklistProperty(); p.Name = FieldName; //FieldName "имя поля" p.Value = new Picklist(); p.Value.Value = FieldValue; //FieldValue "значение поля" Prop.Add(p); break; } Или есть стандартная функция добавление Property, которая примет название типа поля (в формате string) и значение (тоже string) и сама добавит Property нужного типа? |
|
06.05.2009, 15:03 | #4 |
Moderator
|
Совершенно. Кажется в комплекте с SDK есть такой хелпер: SDK\server\helpers\cs\crmhelpers. Была еще мысль в коде прописать строки XML для каждого Property и через String.Format, например, заменять в нужном месте его значение, но было лениво экспериментировать, так что сделал как написал выше.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
Теги |
com connector, интеграция, сущность |
|
|