Альтернативы макросам для доступа к объектам данных
Я собираюсь начать реализацию новой версии программы Email-маркетинга для моей компании. Старая версия программы сильно зависела от микросхем и имеет около 2000 строк для подготовки данных для запуска кампании по электронной почте. Но я где- то читал, что макросы - не лучшее решение для выполнения таких тяжелых задач, и лучше их хранить для простых вещей.
Я довольно новичок в QV, и я такой человек, которому нравится учиться на ходу, и я не заканчиваю большой справочник, прежде чем начать проект. Я хорошо разбираюсь в C# и Java, но понял, что скрипты QlikView написаны на VBScript или JScript. У меня нет с ними никакого опыта, но на первый взгляд они не кажутся мне очень сложными.
Мне было интересно, есть ли лучший способ обработки данных в QlikView? Это означает, что я могу использовать другой язык программирования или вы предлагаете мне придерживаться языков сценариев, предоставляемых QV? Потому что одна большая проблема, которую я видел, состоит в том, что по мере увеличения макросов их становится очень сложно отлаживать.
В старой версии нашей программы, разработанной одним из моих коллег, который сейчас покинул компанию, как только произошла ошибка при подготовке данных, все, что мы получили, - это окно макроса без подсказки о том, где произошла ошибка. Поскольку я хотел бы реализовывать этот проект постепенно и понемногу, мне бы хотелось иметь хороший механизм для устранения неполадок, а не использовать сценарий из 2000 строк, чтобы понять, откуда возникла проблема.
Ваши предложения о том, как вывести этот проект на безопасный берег, очень приветствуются. Таким образом, могут помочь любые хорошие плагины или сторонние приложения для мониторинга данных и облегчения моей реализации.
1 ответ
Мы там посторонние. Мы используем OCX и подключаемся к нему в winforms.
Затем у нас есть стандартный код C# со всем отлаживаемым, и он делает всех здесь очень счастливыми после использования бесконечного количества времени отладки JavaScript.
Пользователи используют QV для выбора материала, а затем мы используем выбранное событие в OCX и извлекаем выбранные данные из QV для постобработки и помечаем данные QV динамическим обновлением sql.
Я не обязательно рекомендую этот метод, но он значительно увеличил результаты разработки для нас при использовании QV для обработки данных и последующей обработки выбранных данных.
В следующем проекте мы не собираемся использовать OCX. Но вся логика бизнеса и постобработка находятся в видимом комманде C# dll', к которому мы получаем доступ через макрос vbscript.
РЕДАКТИРОВАТЬ. Подробнее
Это текущая настройка связи с документом через OCX
Изменить выбор
axQlikMainApp.ActiveDocument.Fields("%UnitID").Clear();
var selSuccess = axQlikMainApp.ActiveDocument.Fields(cls.QlikView.QvEvalStr.Fields.UnitId).Select("(%UnitID)");
сбросить объект листа
axQlikMainApp.ActiveDocument.ClearCache();
axQlikMainApp.ActiveDocument.GetSheetObject("Document\\MySheetObjectName").Restore();
получить строку из QV
string res axQlikMainApp.ActiveDocument.Evaluate("=concat(Distinct myField1 &'|' & MyField2,'*')");
и может быть ужасно сложным
string res axQlikMainApp.ActiveDocument.Evaluate( "=MaxString({1 <%UnitID= {" + sUnitIds + @"}>}'<b>' & UnitName & '</b> \r\n bla bla bla:' & UnitNotesPlanning) & " +
"'\n title1: ' & Count({1 <%UnitID= {" + sUnitIds +@"},%ISODate={'" + qlickViewIsoDate + "'},Need = {'Ja'}" + MinusCalc + ">}Distinct %CivicRegNo) & " +
"'\n Title2: ' & Count({1 <%UnitID= {" + sUnitIds + @"},%ISODate={'" + qlickViewIsoDate + "'} " + recallMinusCalc + ">}DISTINCT RevGUID) & " +
"'\n Title3: ' & Count({1 <%UnitID= {" + sUnitIds + @"},%ISODate={'" + qlickViewIsoDate + "'},Need2 = {'Ja'}>}Distinct %CivicRegNo) & '" +
"\n Title4:' & MinString({1 <%UnitID= {" + sUnitIds + @"},FutureBooking = {1}>} Date(BookingStart) & ' Beh: ' & If(IsNull(ResourceDisplayedName),'_',ResourceDisplayedName)) &'" +
"\n Title5:' & MaxString({1 <%UnitID= {" + sUnitIds + @"},FutureBooking = {0}>} Date(BookingStart) & ' Beh: ' & If(IsNull(ResourceDisplayedName),'_',ResourceDisplayedName)) &''" +
" & MaxString({1 <%UnitID= {" + sUnitIds + @"}>}if(UnitGeo_isRelocatedOnSameGeo=1,'\nOBS! Multiple geo addresses. Zoom!',''))" +
""
);