Плевать здесь, потому что у меня нет Dynamics и у меня нет настраиваемых компонентов.
Поток данных 1 - Агрегация контрактов
Цель этого потока данных - реплицировать ваши logi c в элегантном запросе, который вы предоставили, и вставьте его в Диспетчер подключений к кешу (см. Примечания для 2008+ в конце)
Источник KingswaySoft Dynamics -> Задача сценария -> Преобразование кеша
Если вы хотите сохранить сортировку, сделайте это перед задачей скрипта. Реализация, которую я возьму с задачей сценария, заключается в том, что она полностью блокирует - то есть все строки должны прибыть, прежде чем она сможет отправить какую-либо. Такие задачи, как Merge Join, блокируются только частично , потому что требование отсортированных данных означает, что если у вас больше нет соответствия для текущего элемента, вы можете отправить его по конвейеру.
Задача сценария будет асинхронным преобразованием . У вас будет два выходных столбца: ваш ключ accountid
и новый производный столбец ari_activecontractitems
. Этот столбец, возможно, должен быть большим - вы будете знать свои данные лучше всего, но если это тип blob в Dynamics (> 4k unicode или> 8k ascii символов), вам нужно будет определить тип данных как DT_TEXT / DT_NTEXT
В качестве входных данных вы выберете accountid и ari_productsummary из вашего источника.
Код должен быть довольно простым. Мы собираемся накапливать входящие данные в словарь.
// member variable
Dictionary<string, List<string>> accumulator;
Метод PreProcess, мы добавим его туда для инициализации нашей переменной
// initialize in PreProcess method
accumulator = new Dictionary<string, List<string>>();
В OnBufferRowSent (имя примерно)
// simulate the inbound queue
// row_id would be something like Rows.row_id
if (!accumulator.ContainsKey(row_id))
{
// Create an empty dictionary for our list
accumulator.Add(row_id, new List<string>());
}
// add it if we don't have it
if (!accumulator[row_id].Contains(invoice))
{
accumulator[row_id].Add(invoice);
}
Как только вы получите сигнал об отсутствии доступных данных, вы начнете буферизовать выходные данные. В автоматически сгенерированном коде будут заполнители для всего этого.
// This is how we shove data out the pipe
foreach(var kvp in accumulator)
{
// approximately thus
OutputBuffer1.AddRow();
OutputBuffer1.row_id = kvp.Key;
OutputBuffer1.ari_productsummary = string.Join("; ", kvp.Value);
}