Navision - советы и секреты

  Все выпуски  

Navision - советы и секреты. Работа с переменными Record + интересная команда BEEP


Добрый день, уважаемые коллеги/подписчики!

 

На повестке сегодняшнего дня - мастер-класс по работе с переменными типа Record. Не все еще знают, какие операции SQL вызываются при работе команд FIND, GET и им подобных :) И особенно - что, в каком объеме и в какие моменты блокируется в таблицах Navision.

 

Подробное изложение этой темы с примерами - в статье "Работа с переменными Record в Microsoft Dynamics NAV" - часть первая.

А также в ту же тему про Navision - часть вторая, но не последняя.

 

Всего частей предполагается быть четырем :)

 

Ну и небольшой экскурс в супер-мощную команду Navision - BEEP. Из рассказов опытного навиженца :)

 

Последние недели я работал над проектом, в котором требовалось использовать команду SendKeys для работы с NAV-клиентом. Во время разработки передо мной встала проблема синхронизации. С одной стороны -  вызовы SendKeys, с другой – поведение непосредственно клиентского приложения. Примерно в таком духе – вы отсылаете NAV’у нажатия клавиш, клиент открывает форму, все это занимает время, а результат – нажатия приняты не тем окном. Я пытался использовать для синхронизации таймер (ожидание, пока окно откроется и т.п.), но это не сработало. Нажатия все равно принимались в очередь событий другого окна.

 

В один прекрасный день, я захотел отследить, в какой момент срабатывает событие и SendKeys добавляются в очередь обработки. Для этого в событие OnTimer была вставлена команда BEEP(440,100). И представьте себе – все нажатия были отработаны в нужном окне! Я выяснил, что когда вы отсылаете некую последовательность клавиш, которая, к примеру, открывает диалог сохранения файла, надо подождать, пока откроется форма диалога, чтобы «записать» имя файла. BEEP помогает сделать это. Т.к. BEEP вызывает какие-то функции в операционной системе, он каким-то образом передает управление ОС. Если соединить эту особенность с событием OnTimer, можно сделать следующее:

  1. Включить таймер (например, на 100 мс);
  1. При первом срабатывании OnTimer,  передайте нужную последовательность клавиш, которая откроет окно;
  2. После того, как передали клавиши, вызовите BEEP;
  1. В следующий вызов OnTimer передайте вторую последовательность клавиш;
  2. Снова вызовите BEEP после того, как передали клавиши;
  1. Повторите шаги для всех окон и клавиш, которые хотите «нажать»;
  2. В последнем вызове OnTime, выключите таймер.

 

Использование BEEP гарантирует, что каждая последовательность нажатий клавиш будет передана в нужное окно, если BEEP вызывается сразу после SendKeys, а NAV свободен для обработки следующей команды. Если вы сделаете это без BEEP, клавиши будут переданы «слишком быстро», и возможно, переданы в ненужное окно.

 

Естественно, вы не хотите каждый раз слышать би-би, поэтому поставьте частоту в 1 Гц (0 Гц не работает, идет просто пропуск вызова команды). Я выяснил, что время выполнения BEEP должно быть больше 10мс, иначе эффекта не будет. Впрочем, как я понимаю, это зависит еще и от самой машины.

 

Зная это, можно вытворять удивительные вещи (например, автоматический контроль версий) :)

 

Вот такие у моего исследования результаты. Не знаю, почему оно так работает, но знайте – ЭТО РАБОТАЕТ (по крайней мере, у меня и моих коллег)

 

Проверено на 4.00 SP2 и 5.0.

 

Развлекайтесь с новым мощным BEEP’ом! 

 

P.S. Требуется авторы, желающие глаголом жечь сердца людей, пишущие с огоньком и интересом к предмету :) Со своей стороны, всемирной славы гарантировать не могу, но упомянуть вас в качестве автора, разместить про вас или вашу компанию любую другую информацию, которую вы посчитаете нужной - велком :)

 

Пишите на mailbox@naviart.ru :)

 

P.P.S. Сайт "Navision - технологии как искусство" поменял дизайн. Пока он утрясается, возможны некоторое сбои в работе. Однако - статей становится больше, качество матерьяла растет, ждем вас!


В избранное