我有一个winform / OCX,它使用qlikview文档。我们从QV获得了一个补丁,以便RefreshDocument在QX应用程序中的RefreshDocument中在OCX中工作。但是,当在服务器上重新加载文档时,应用程序会显示一个很好的启用按钮。
有谁知道需要做些什么来检测它。可以是C#还是宏代码或ManagementAPI?
这是ReloadDocument Code。
private void button2_Click(object sender, EventArgs e)
{
var myBloodybookmarkHack = "dynaBookmark" + Guid.NewGuid().ToString().Replace("-","");
axQlikOCX1.ActiveDocument.CreateUserBookmark(myBloodybookmarkHack, true);
//axQlikOCX1.OpenDocument(@"qvp://qvSeverName/path/MyDocument.qvw?bookmark=Server\dynaBookmarkb5aa82ae467540fdb0d18bb499044ed9");
axQlikOCX1.RefreshDocument();
axQlikOCX1.ActiveDocument.RecallUserBookmark(myBloodybookmarkHack);
axQlikOCX1.ActiveDocument.RemoveUserBookmark(myBloodybookmarkHack);
}
通过抑制绘制事件,我得到这个运行非常好。下一个补丁将包括它保留选择(将在11.2 servicerelease 6中修复)。
您需要检测CreateUserBookmark是否成功,如果创建失败,则无法恢复书签。
此代码适用于QV 11.2 serviceRelease 5。
答案 0 :(得分:1)
在加载后重写qvw文件时,文件系统会读取新的修改时间。假设此应用程序的数据部分未从QVW文件中分离出来。可能,您可以通过检查新的时间戳来完成此任务。或者,如果在qvw文档中启用了日志记录,则可以记录读取QlikView生成的文本文件*以完成相同的操作。
*文本文件写入有时会延迟,因此您的文件可能会在日志声明之前刷新一点。
答案 1 :(得分:1)
我们最终使用QV Management API来获取上次任务重新加载时间
此代码显示如何获取文档上的任务。通过这种方式,您可以在“最后一次文档重新加载任务”完成时获得。
private DateTime GetLastDocumentRun(string documentName)
{
string QMS = "http://MyQlikviewserver:4799/QMS/Service";
var client = new QMSClient("BasicHttpBinding_IQMS", QMS);
string key = client.GetTimeLimitedServiceKey();
ServiceKeyClientMessageInspector.ServiceKey = key;
var taskStatusFilter = new TaskStatusFilter();
var clientTaskStatuses = client.GetTaskStatuses(taskStatusFilter, TaskStatusScope.All);
foreach (var taskStatus in clientTaskStatuses)
{
Trace.WriteLine(taskStatus.General.TaskName);
if (taskStatus.General.TaskName.ToLower().Contains(documentName.ToLower()))
{
string fin = taskStatus.Extended.FinishedTime + "";
DateTime finishedTime;
if (DateTime.TryParse(fin, out finishedTime))
return finishedTime;
Logger.ErrMessage("QvManagementApi.GetLastDocumentRun",new Exception("Task finished time did not return a valid datetime value:" + fin));
return DateTime.MinValue;
}
}
return DateTime.MinValue;
}
这很慢,所以你应该在不同的线程上运行。 此操作也不会显示任务是否已成功重新加载。我们还没有修复它,但在taskStatus.Extended你有最后一个日志,如果成功重新加载,你可以解析它以获取。
答案 2 :(得分:0)
如果我理解正确你想知道文件是否已经在QlikView服务器上重新加载了吗?
我是你OCX应用程序有一个持续的连接,你可以评估文件中的ReloadTime()函数,它会告诉你文件最后一次重新加载。如果您在执行此操作时侦听该函数并发出DocumentRefresh,那么一旦新重新加载的文档在服务器上可用,您将获得更改的时间戳。
您发布的代码不会重新加载QlikView文档。至少在QlikView语言中,它只是打开服务器上的文档。
请详细说明我是否误解了你。
关心Torber