23.04.2014, 18:02 | #1 |
Участник
|
Добрый день!
Работаю на кастомизированном ядре 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 |
Участник
|
Может, SELECTLATESTVERSION перед каждым запуском отчёта поможет? Перед запуском отчёта запускается функция FindPrinter() в CU1, в которой программа ищет Вашу запись из Т.78 и скорее всего не успевает засечь, что запись в Т.78 между делом уже изменилась.
|
|
23.04.2014, 20:12 | #3 |
Участник
|
Таблица 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 |
Участник
|
Цитата:
Тогда придется выносить выбор принтера на форму а с нее запускать отчет UPD. А вызвать FindPrinter из CU1 в процессе выбора принтера на форме запроса поможет интересно? |
|
24.04.2014, 10:40 | #5 |
Участник
|
Цитата:
Сообщение от IGHG
Если ПЕРЕД запуском отчета тогда караул. Потому что меняется принтер на реквест форме отчета - то есть после того как отчет запустился.
Тогда придется выносить выбор принтера на форму а с нее запускать отчет UPD. А вызвать FindPrinter из CU1 в процессе выбора принтера на форме запроса поможет интересно? И почему караул? Создаёте формочку, в ней производите манипуляцию Т. 78, потом SELECTLATESTVERSION и потом запускаете отчёт. Запускать FindPrinter из CU1 в процессе выбора принтера на реквест форме отчёта вряд ли поможет. |
|
24.04.2014, 11:42 | #6 |
Участник
|
Провел эксперимент с OnInitReport того же отчета. Все управление принтерами похоже идет на его уровне. Задал там явно запись принтера в 78 таблицу и после этого, вне зависимости от последующих модификаций записей в 78 таблице принтер выбирается тот, что указан в OnInitReport. Т.е. 78 таблица похоже только там считывается. Попытка управлять на уровне OnPreReport, который отрабатывает после RequestForm, так же не помогла.
|
|
24.04.2014, 17:05 | #7 |
Участник
|
Сделал выбор принтера через дополнительную форму. Всем спасибо!
|
|