Vbscript 用于访问数据对象的宏的替代方案

Vbscript 用于访问数据对象的宏的替代方案,vbscript,jscript,qlikview,Vbscript,Jscript,Qlikview,我即将开始为我的公司实施新版本的电子邮件营销计划。旧版本的程序严重依赖于微型计算机,大约有2000行代码为即将运行的电子邮件活动准备数据。但我知道宏并不是运行如此繁重任务的最佳解决方案,最好是让它们用于简单的事情 我对QV很陌生,我是那种喜欢边学边做的人,在我开始一个项目之前,我不会完成一本大的参考书。我擅长C#和Java,但我意识到QlikView脚本是VBScript或JScript。我对它们没有任何经验,但乍一看它们并不复杂 我想知道的是,在QlikView中是否有更好的数据处理方法?这意

我即将开始为我的公司实施新版本的电子邮件营销计划。旧版本的程序严重依赖于微型计算机,大约有2000行代码为即将运行的电子邮件活动准备数据。但我知道宏并不是运行如此繁重任务的最佳解决方案,最好是让它们用于简单的事情

我对QV很陌生,我是那种喜欢边学边做的人,在我开始一个项目之前,我不会完成一本大的参考书。我擅长C#和Java,但我意识到QlikView脚本是VBScript或JScript。我对它们没有任何经验,但乍一看它们并不复杂

我想知道的是,在QlikView中是否有更好的数据处理方法?这意味着我可以使用另一种编程语言,还是你建议我坚持使用QV提供的脚本语言?因为我看到的一个大问题是,随着宏变大,调试变得非常困难

在我的一位同事(他现在已经离开了公司)开发的旧版本的程序中,一旦在准备数据时出现错误,我们得到的只是宏窗口,而不知道错误发生在哪里。由于我希望逐步实现这个项目,我希望有一个良好的故障排除机制,而不是通过一个2000行的脚本来理解问题的根源


欢迎您就如何将该项目带到安全地带提出建议。因此,任何好的插件或第三方应用程序来监控数据并促进我的实现都会有所帮助。

我们在这方面是个局外人。我们正在使用OCX并在winforms中连接到它

我们有了标准的c#代码,所有东西都可以调试,在使用了无数时间调试Java脚本之后,这里的每个人都非常高兴

用户使用QV选择内容,然后我们在OCX中使用所选事件,从QV中提取所选数据进行后处理,并使用动态sql更新标记QV数据

我不一定推荐这种方法,但当使用QV进行数据挖掘并处理所选数据时,它大大增加了我们的开发输出

下一个项目我们不打算使用OCX。但是所有的业务逻辑和后处理都在一个com可见的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!',''))" +
""
);
string res axQlikMainApp.ActiveDocument.Evaluate(“=MaxString({1}”&UnitName&'\r\n bla bla bla:'&UnitNotesPlanning)&”+
“'\n title1:'&计数({1}不同的%CivicRegNo)&”+
“'\n标题2:'&计数({1}个不同的RevGUID)&”+
“'\n标题3:'&Count({1}不同的%CivicRegNo)&'”+
“\n标题4:”&MinString({1}日期(BookingStart)和'Beh:'&If(IsNull(ResourceDisplayedName),“,”,ResourceDisplayedName))&”+
\n标题5:'&MaxString({1}日期(BookingStart)和'Beh:'&If(IsNull(resourceddisplayedname),'''u',resourceddisplayedname')&'+
&MaxString({1}if(UnitGeo_isRelocatedOnSameGeo=1,'\nOBS!多个地理地址。Zoom!',''))+
""
);

您能提供更多信息吗?也许您可以将加载分成不同的部分,并在QVD文件之间创建内部文件。@smartmeta例如,我希望将列表框中的当前数据访问到我的程序中,而不是让宏为我执行此操作。我不明白。请添加一些示例数据和加载脚本的一部分,您可以再详细说明一下。这是否意味着您在某个地方有一个dll,可以从中调用QlikView中所需的函数。假设您需要将一个表对象转换为文本,并将该文本文件保存在某个位置。如何告诉QV从DLL文件调用特定函数。如果你能给我看一两张屏幕截图,那就太好了。或者带一个你的函数的小例子。我不希望我的程序依赖VBScript。所以你有这样一个有效的解决方案是很好的。你能再多告诉我一点吗?补充了一些细节。代码是winforms中的c#,ocx名为AxQlikMainApps,因此您拥有的是一个DLL文件,它位于QV文件之外的某个位置,当DV文件上的任何事件触发时,该文件将通知并执行所需的操作?这是我们下一个项目的方式,但我向您展示的示例适用于winforms/ocx