2014-01-27 6 views
3

У меня есть winform/OCX, который использует документ qlikview. Мы получили патч от QV, так что RefreshDocument работает в OCX, как RefreshDocument делает в приложении QV. Но приложение показывает хорошую включенную кнопку, когда документ перезагружается на сервере.Обнаружение документа Обновление произошло на сервере

Кто-нибудь знает, что нужно сделать, чтобы обнаружить это. Либо в C#, либо в макрокоде или ManagementAPI?

Это код ReloadDocument.

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

Мы проверили с помощью кодеров QV, что они даже делают этот тип закладок в одном месте.Но теперь есть ошибка в этом вопросе, и, надеюсь, в sr6, запланированном на апрель 2014, следует удалить необходимость взлома закладки. – Archlight

ответ

1

Мы закончили с помощью API QV управления, чтобы получить последнюю задачу время перезарядки

ВЫГРУЖАТЬ Qv management api demo от QV

Этот код показывает, как получить задачи на документе. Благодаря этому вы получаете, когда «последняя задача перезагрузки документа» была завершена.

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 у вас есть последний журнал, который вы можете выполнить синтаксический анализ текста, если он был успешно перезагружен или нет.

+0

Это отлично сработало и получило последнюю неудачную/успешную перезагрузку из продолженного журнала. –

+0

С помощью QMS API, в общем случае существует TaskStatusValue Enum, который вы также можете использовать для просмотра статуса перезагрузки. Поэтому, хотя вы все еще можете прочитать последний журнал и проанализировать, чтобы найти статус, который вам не нужен, просто используйте этот флаг TaskStatusValue. –

0

Если я правильно понимаю, что вы хотите знать, если документ закончит перезагрузки на право сервера QlikView?

У вас приложение OCX имеет постоянное соединение, вы можете оценить функцию ReloadTime() в документе, которая сообщит вам, когда последний раз перезагружался документ. Если вы будете слушать эту функцию и выдавать DocumentRefresh при этом, то вы получите измененную временную метку после того, как вновь перезагруженный документ станет доступен на сервере.

Код вашей публикации, не перезагружает документ QlikView. По крайней мере, не в QlikView lingo, он просто открывает документы на сервере.

Пожалуйста, уточните, если я вас неправильно понял.

С уважением Torber

+0

В примере кода была небольшая ошибка. im, используя myQvOcx.RefreshDocument(); Но я хочу только включить кнопку обновления, если документ на сервере был перезагружен. Кроме того, в настройках документа клиент инициализирует обновление. Я могу обнаружить из ocx, когда документ LAST был обновлен. Но не то, что на сервере есть новая копия, насколько я знаю. Я пытаюсь заставить руководство api работать ... но он действительно работает – Archlight

1

Файловая система считывает новую модифицированную время, когда файл qvw перезаписывается после нагрузки. Предполагая, что часть данных этого приложения не вырвалась из файла QVW. Вероятно, вы могли бы приблизиться к этому, проверив новые отметки времени. В качестве альтернативы, если регистрация в документе qvw включена, вы можете записать текстовый файл *, который генерирует QlikView, чтобы выполнить одно и то же.

* Запись текстовых файлов иногда задерживается, поэтому ваш файл может быть немного обновлен до того, как в журнале будет указано, что это так.

+0

Чтение qv Log - это то, что мы пробовали, и он работает. Но он слишком усложнился слишком быстро, так как пользователи документов не имеют доступа к файловой системе. – Archlight