检测到文档重新加载已在服务器上发生

时间:2014-01-27 10:59:40

标签: c# ocx qlikview

我有一个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。

3 个答案:

答案 0 :(得分:1)

在加载后重写qvw文件时,文件系统会读取新的修改时间。假设此应用程序的数据部分未从QVW文件中分离出来。可能,您可以通过检查新的时间戳来完成此任务。或者,如果在qvw文档中启用了日志记录,则可以记录读取QlikView生成的文本文件*以完成相同的操作。

*文本文件写入有时会延迟,因此您的文件可能会在日志声明之前刷新一点。

答案 1 :(得分:1)

我们最终使用QV Management API来获取上次任务重新加载时间

从QV下载Qv management api demo

此代码显示如何获取文档上的任务。通过这种方式,您可以在“最后一次文档重新加载任务”完成时获得。

 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