Как вставить номер билета (поле поиска) в продукты утверждения цены MS Dynamics CRM (пользовательский объект) с помощью компонента сценария ssis

Мне нужно создать или обновить поле поиска номера билета в продуктах утверждения цен. Этот номер тикета (поле поиска) связан с тикетом (текстовое поле) в другом объекте, который называется Билет подтверждения цен.

Это мой код в компоненте скрипта.

public override void Input0_ProcessInputRow(Input0Buffer Row)
{

    Entity ApprovalProductEnt = new Entity("new_ticketproduct");
    ColumnSet columns = new ColumnSet(true);
    columns = new ColumnSet(new String[] { "new_ticket",
        "new_productgroup",
        "new_producttype",
        "new_productitem" });

    Guid TicketNumberId = new Guid();
    TicketNumberId = getTicketNumber(Row.OppportunityID, ref organizationservice);

    //update
    if (TicketNumberId != Guid.Empty)
    {
        ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId);
    }
    else
    //create
    if (TicketNumberId != Guid.Empty)
    {
        ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId);
    }
}

public Guid getTicketNumber(string ticketnumber, ref IOrganizationService service)
{
    Guid TicketNumberGuid = Guid.Empty;
    QueryExpression TicketNumberQuery = new QueryExpression { EntityName = "new_pricingapprovalticket", ColumnSet = new ColumnSet(true) };
    TicketNumberQuery.Criteria.AddCondition("new_ticketnumber", ConditionOperator.Equal, ticketnumber);
    EntityCollection TicketNumberQueryRetrieve = service.RetrieveMultiple(TicketNumberQuery);

    for (var i = 0; i <TicketNumberQueryRetrieve.Entities.Count; i++)
    {
        TicketNumberGuid = TicketNumberQueryRetrieve.Entities[0].GetAttributeValue<Guid>("new_ticket");
    }

    return TicketNumberGuid;
}

Когда я запускаю пакет служб SSIS, он запускается без ошибок. Но как-то не вставлено никаких данных.

введите описание изображения здесь

У меня нет проблем, чтобы создать нормальное текстовое поле. Но когда дело доходит до области поиска, интернет-решения предлагают использовать EntityReference согласно моему коду, но я понятия не имею, что не так. Так что я немного потерян здесь.

1 ответ

Решение

Lookup - это столбец отношения (внешний ключ) связанной сущности. Вы должны проверить, есть ли основная запись, доступная для сопоставления ключа или создания записи этого типа для сопоставления.

ColumnSet не требуется в первом методе при создании записи объекта. Но вы должны сопоставить столбцы из строк исходного файла / таблицы. ColumnSet полезен, как и во втором методе, при получении набора данных.

Цикл for не нужен во втором методе.

Просто поместите недостающие фрагменты в свой фрагмент, чтобы вы могли понять, что это может быть импровизировано.

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Entity ApprovalProductEnt = new Entity("new_ticketproduct");

    ApprovalProductEnt["new_productgroup"] = Row.ProductGroup;
    ApprovalProductEnt["new_producttype"] = Row.ProductType;
    ApprovalProductEnt["new_productitem"] = Row.ProductItem;

    Guid TicketNumberId = new Guid();
    TicketNumberId = getTicketNumber(Row.OppportunityID, ref organizationservice);

    //update
    if (TicketNumberId != Guid.Empty)
    {
        ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId);
    }
    else
    //create
    {
        Entity TicketEnt = new Entity("new_pricingapprovalticket");
        TicketEnt["new_name"] = Row.OppportunityID;
        TicketNumberId = organizationservice.Create(TicketEnt);

        ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId);
    }

   organizationservice.Create(ApprovalProductEnt);
}


public Guid getTicketNumber(string ticketnumber, ref IOrganizationService service)
{
    Guid TicketNumberGuid = Guid.Empty;
    QueryExpression TicketNumberQuery = new QueryExpression { EntityName = "new_pricingapprovalticket", ColumnSet = new ColumnSet(true) };
    TicketNumberQuery.Criteria.AddCondition("new_ticketnumber", ConditionOperator.Equal, ticketnumber);
    EntityCollection TicketNumberQueryRetrieve = service.RetrieveMultiple(TicketNumberQuery);

if (TicketNumberQueryRetrieve.Entities.Count > 0)
    TicketNumberGuid = TicketNumberQueryRetrieve.Entities[0].GetAttributeValue<Guid>("new_ticket");

return TicketNumberGuid;
}
Другие вопросы по тегам