AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2014, 18:02   #1  
kgenius is offline
kgenius
Участник
 
98 / 10 (1) +
Регистрация: 27.10.2004
Добрый день!
Работаю на кастомизированном ядре 2.6, клиент 2009.
Опишу задачу. Есть функциональность печати ценников из Navision, через report. Ценники имеют разный размер (5x4 и 7x4). Для печати есть ленточный принтер. Необходимо передавать на принтер размер, который требуется напечатать. Какое решение пока рассматривается. Один физический принтер в винде определен, как 2 виртуальных с разными размерами печати (5x4,7x4) по умолчанию. Теперь задача сводится к передачи нужного формата на нужный принтер. Я это сделал через 78 таблицу (Принтер Настройка).
При выборе формата ценника отрабатывает следующий код (на onAfterValidate поля):
[attachment=1384:format.jpg]
CLEAR(ВыбранныйПринтерПуть);
DataMaxПринтерНастройка.RESET;
DataMaxПринтерНастройка.SETRANGE(Магазин,Магазин."Но.");
CASE ФорматЦенника OF
ФорматЦенника::"5x4":
BEGIN
DataMaxПринтерНастройка.SETRANGE(Формат, DataMaxПринтерНастройка.Формат::"5x4");
IF DataMaxПринтерНастройка.FINDFIRST THEN
ВыбранныйПринтерПуть := DataMaxПринтерНастройка.Принтер
ELSE
ERROR('Нет принтера для печати формата 5x4 в таблице 99001656! Обратитесь к администраторам ИС.');
END;
ФорматЦенника::"7x4":
BEGIN
DataMaxПринтерНастройка.SETRANGE(Формат, DataMaxПринтерНастройка.Формат::"7x4");
IF DataMaxПринтерНастройка.FINDFIRST THEN
ВыбранныйПринтерПуть := DataMaxПринтерНастройка.Принтер
ELSE
ERROR('Нет принтера для печати формата 7x4 в таблице 99001656! Обратитесь к администраторам ИС.');
END;
END;
ПринтерНастройка.RESET;
ПринтерНастройка.SETRANGE("Код Пользователя",USERID);
ПринтерНастройка.SETRANGE("Отчет ID", 60252);
IF ПринтерНастройка.FINDSET THEN BEGIN
ПринтерНастройка.VALIDATE("Название Принтера",'');
ПринтерНастройка.MODIFY;
ПринтерНастройка.VALIDATE("Название Принтера", ВыбранныйПринтерПуть);
ПринтерНастройка.MODIFY;
COMMIT;
END ELSE
BEGIN
ПринтерНастройка.INIT;
ПринтерНастройка."Код Пользователя" := USERID;
ПринтерНастройка."Отчет ID" := 60252;
ПринтерНастройка."Название Принтера" := ВыбранныйПринтерПуть;
ПринтерНастройка."Отчет Название" := CurrReport.OBJECTID(TRUE);
ПринтерНастройка.INSERT;
COMMIT;
END;

Суть в том, что записывается значение в Принтер настройка, которое должно далее на системном уровне определять на какой принтер отправлять задание на печать. Работает, но криво. Почему-то срабатывает предыдущий формат, а при повторном запуске он отрабатывает.
Пример:
1) Захожу в сессию Nav, и выбираю формат 5x4. На печать уходит правильный формат.
[attachment=1385:5x4-1.jpg]
2) Перезахожу в отчет и выбираю формат 7x4. На печать идет формат 5x4.
[attachment=1386:7x4-1.jpg]
3) Снова перезахожу и выбираю формат 7x4. Печать идет на правильный формат.
[attachment=1387:7x4-2.jpg]

Всю голову себе уже сломал. Может быть кто-нибудь подскажет вариант решения.
Спасибо.
Изображения
    
Старый 23.04.2014, 19:51   #2  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Может, SELECTLATESTVERSION перед каждым запуском отчёта поможет? Перед запуском отчёта запускается функция FindPrinter() в CU1, в которой программа ищет Вашу запись из Т.78 и скорее всего не успевает засечь, что запись в Т.78 между делом уже изменилась.
Старый 23.04.2014, 20:12   #3  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Таблица 78 взаимодействует с системной таблицей 2000000039 Printer при VALIDATE
Может там что-то пошевелить?

а при выводе на тот же принтер Вы не пользовались CurrReport.PAPERSOURCE?
Есть статья по этому поводу http://www.archerpoint.com/blog/Post...bon-copies-nav

UPD
CurrReport.PAPERSOURCE похоже работает для RTC клиента
Старый 23.04.2014, 20:28   #4  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Цитата:
Сообщение от AlexB Посмотреть сообщение
Может, SELECTLATESTVERSION перед каждым запуском отчёта поможет? Перед запуском отчёта запускается функция FindPrinter() в CU1, в которой программа ищет Вашу запись из Т.78 и скорее всего не успевает засечь, что запись в Т.78 между делом уже изменилась.
Если ПЕРЕД запуском отчета тогда караул. Потому что меняется принтер на реквест форме отчета - то есть после того как отчет запустился.
Тогда придется выносить выбор принтера на форму а с нее запускать отчет

UPD. А вызвать FindPrinter из CU1 в процессе выбора принтера на форме запроса поможет интересно?
Старый 24.04.2014, 10:40   #5  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от IGHG Посмотреть сообщение
Если ПЕРЕД запуском отчета тогда караул. Потому что меняется принтер на реквест форме отчета - то есть после того как отчет запустился.
Тогда придется выносить выбор принтера на форму а с нее запускать отчет

UPD. А вызвать FindPrinter из CU1 в процессе выбора принтера на форме запроса поможет интересно?
Так в том то и дело, если Вы манипулируете записи в Т.78 уже в самом отчёте, то есть отчёт уже запустился, то вы уже опоздали.
И почему караул? Создаёте формочку, в ней производите манипуляцию Т. 78, потом SELECTLATESTVERSION и потом запускаете отчёт.
Запускать FindPrinter из CU1 в процессе выбора принтера на реквест форме отчёта вряд ли поможет.
Старый 24.04.2014, 11:42   #6  
kgenius is offline
kgenius
Участник
 
98 / 10 (1) +
Регистрация: 27.10.2004
Провел эксперимент с OnInitReport того же отчета. Все управление принтерами похоже идет на его уровне. Задал там явно запись принтера в 78 таблицу и после этого, вне зависимости от последующих модификаций записей в 78 таблице принтер выбирается тот, что указан в OnInitReport. Т.е. 78 таблица похоже только там считывается. Попытка управлять на уровне OnPreReport, который отрабатывает после RequestForm, так же не помогла.
Старый 24.04.2014, 17:05   #7  
kgenius is offline
kgenius
Участник
 
98 / 10 (1) +
Регистрация: 27.10.2004
Сделал выбор принтера через дополнительную форму. Всем спасибо!
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:09.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.