Обсуждение:Автоматическая печать документов в БОУРМ
0 (0)
Обсуждение:Автоматическая печать документов в БОУРМ ( Обсуждение примера 25.07.2002 21:36 )
0(0)Макросы действия после приема, реализующие автоматическую печать платежных документов (aftrcv.mac) и писем (aftrcLet.mac)
Посмотреть пример
>> ОтветитьАвтоматическая печать документов в БОУРМ ( Aeast 02.03.2004 11:32 )
0(0)Я попробовал ввести отрывок из примера
filename = cbPrintMsg(CurrentRecord,3);
run (GetEnv("COMSPEC"),"/c copy "+filename+" LPT1");
return true;
У меня есть переназначение Novell на LPT1 сетевого принтера
ошибки при обработке документа БОУРМ не выдает но и ничего не печатает. Как решить вопрос , чтобы печать проходила?
Алексей
aost@mak.orl.ru
>> ОтветитьАвтоматическая печать документов в БОУРМ (+) ( Дмитрий В 03.03.2004 09:03 )
0(0)Посмотрите в RSCB.INI следующий параметр:
; Признак запрета формирования файлов результата выполнения макросов (0/1)
; DisableMacroOutput=1 - файл результата не формируется (обработка сообщений
; в этом режиме будет выполняться быстрее)
; DisableMacroOutput=0 - файл результата формируется
>> ОтветитьА если так попробовать? ( Terapevt 04.03.2004 08:31 )
0(0)run(GetEnv("Comspec"), "/c nprint " + FileName + " /S=NWсервер /Q=очередь /NB /NFF /C=1 /NNOTIFY > nul");
>> ОтветитьАвтоматическая печать документов в БОУРМ ( Aeast 09.03.2004 10:36 )
0(0)Пробовал не работает
У меня стоит Novell 5.0
У принтера есть общий доступ
Находится он в другом контексте чем ПК с которого я хотел бы печатать из DOS строки или DOS приложения
Пробовал такую строку -- не работает!!!
f:\public\nprint c:\22.txt /Q=.Q4VAL.buch.mak-bank_orel /NB /NFF /C=1 /NNOTIFY
Пробовал с командой COPY --- такая же история
Подскажите что еще посмотреть... Я пробовал на этой машине просто из
FAR отправить напечать не работает...
Может кто еще подскажет варианты ....?
Алексей!
aost@mak.orl.ru
>> ОтветитьRe: Автоматическая печать документов в БОУРМ (+) ( Terapevt 10.03.2004 08:04 )
0(0)
> Я пробовал на этой машине просто из
> FAR отправить на печать не работает...
Ну, раз из командной строки ничего не печатает, то чего же Вы хотите от БОУРМ?
Настраивайте печать, доступы, права и прочую сетевую лабудень.
>> Ответить
Хочу заметить, что печатать из макроса действия после приема - не самое лучшее решение (+) ( <B>Alex</B> 12.03.2004 16:07 )
0(0)Это плохо, потому, что в этом случае печать запускается внутри транзакции, соответственно, если с печатью возникают какие-либо проблемы, скажем, вылазит виндовый MessageBox и ждет от юзера нажатия на OK, то этого самого юзера ждет уже не только процедура печати, но и все параллельно запущенные копии БОУРМ, т.к. их транзакции ждут завершения той первой транзакции, а она ждет завершения печати, а печать ждет юзера... Все усугубляется, если БОУРМ 5.2 запущен как сервис ОС без возможности взаимодействия с десктопом (а это практически всегда так), в этом случае MessageBox не видно на экране, а физического юзера вообще нет, соответственно печать висит на всегда.
В БОУРМ начиная с 5.20.012.1 предусмотрен штатный механизм автоматической печати, он запускается из process.mac после выполнения шага действия после приема и после транзакции. Это не предотвращает зависаний одного из процессов сервиса из-за виндовых MessageBox'ов внешних систем, но по крайней мере предотвращает ступор всех параллельных процессов.
Реально все реализовано в макросах, поэтому все то же самое можно сделать в любой более ранней версии БОУРМ. Для этого надо в process.mac и processm.mac вставить строки:
в начало:
... import "autoprnt"; ...
в macro mainPostProcess:
... el*/if(processId == clbcipridDo) cbMakeAndSendReceipt(CurrentRecord,CurrentRecord.state,"",resultDesc); autoPrintMsg(CurrentRecord,resultCode,resultDesc); end; ...
И создать макрофайл autoPrnt.mac, примерно следующего сожержания:
import constant; macro autoPrintMsg(rec,resultCode:integer,resultDesc:string) /* Пример для автоматической печати после загрузки в банк */ /* var StructName=strlwr(FileName(rec)); if(NOT ( /* печатаем только нужные нам формы */ ((StructName == strlwr(clbcStructNamePaymentDoc)) /*AND ((rec.form == 1) OR (rec.form == 2) OR (rec.form == 1001) OR (rec.form == 1002) )*/ /* для платежных печатаем все формы */ ) OR ((StructName == strlwr(clbcStructNameInfoMessage)) AND ((rec.form == 3) OR /* ВОбя4 - Поручение на обязательную продажу валюты */ (rec.form == 4) OR /* зВал4 - Запрос на покупку продажу валюты */ (rec.form == 1002) OR /* зВып - Запрос на получение выписки */ (rec.form == 1003) OR /* ВОбяз - Поручение на обязательную продажу валюты */ (rec.form == 1004) OR /* зВал - Запрос на конвертацию */ (rec.form == 1005) OR /* зВыпИ - Запрос на получение инкрементальной выписки */ (rec.form == 1006) OR /* зРепл - Запрос на обновление справочников */ (rec.form == 1007) OR /* Письм - Письмо */ (rec.form == 1008) OR /* Отзыв - Отзыв документа/сообщения */ (rec.form == 1009) OR /* ВПокп - Поручение на покупку валюты */ (rec.form == 1010) /* ВПрод - Поручение на продажу валюты */ ) ))) return; end; var filename=cbPrintMsg(rec,1); /* /* Можно печатать так: */ var printerName=" prn"; run(GetEnv("COMSPEC"),"/c copy " + filename + printerName);*/ /* а можно печатать этак: */ cbPrintFile(filename); /* Печатаем на принтер, заданный в настройках "Параметры станции" */ */ end;
Саму реализацию посылки на печать надо править уже в autoPrnt.mac.
>> ОтветитьА если печать идет через PlatVis.mac? ( Bratsk 15.03.2004 12:08 )
0(0)и именно в нем вся реализация посылки на печать, то как здесь быть?
Если не затруднит - опишите подробнее.
>> ОтветитьВ этом случае все то же самое, только после cbPrintMsg(rec,1) уже больше делать ничего не надо (+) ( <B>Alex</B> 15.03.2004 14:06 )
0(0)На принтер все послано уже platvis'ом. Кстати для печати через VRSL все вышеописанное крайне актуально, т.к. он любит в диалог с юзером вступать в самые неподходящие моменты.
>> Ответить
Автоматическая печать документов в БОУРМ ( Aeast 17.03.2004 09:14 )
0(0)Cпасибо за очень важное замечание насчет не печати из avtrcv.mac
Все понятно непонятно как работать должна функция(макрос) cbprintfile()
Я почему спрашиваю.... У меня принтер NDPS Novell и просто командой copy или print печать не проходит, может в настройках очереди что не так..
Может есть пример такой функции..
С уважением Алексей
Орел
aost@mak.orl.ru
>> ОтветитьcbPrintFile - это внутренняя ф-ция БОУРМ 5.20.013 и выше (+) ( <B>Alex</B> 17.03.2004 13:55 )
0(0)version 5.20.013, 13.10.2003 ... - В макросы проэкспортирована ф-ция cbPrintFile: cbPrintFile(fileName:string[, AltPrint:bool]) Ф-ция печатает файл fileName используя стандартный механизм печати, с учетом настроек принтеров, ESC последовательностей, баннеров и т.д. Необязательный параметр AltPrint позволяет использовать альтернативную процедуру печати (AltPrint = true), по умолчанию используется стандартная процедура. Ф-ция не возвращает никакого значения. Переключать настройки печати можно стандартными RSL процедурами GetPRNInfo/SetPRNInfo (см. документацию по RSL). ...
В 5.1 ее соответственно нет, так что там печатать придется старыми способами :( А насчет печати на новеловый принтер - скорее всего действительно что то в нетвари не настроено. Если уж фар/copy не печатает, то и никто не сможет. К сожалению в настройке нетвари ничем помочь не могу, тут я не спец.
>> ОтветитьПроблема Автоматической печати остается!!! ( Aeast 17.03.2004 15:25 )
0(0)Я вставил все что необходимо в макросы process.mac; processm.mac
Привожу результат
== process.mac ==========================================
import cbmFormFields,"constant", "autoprnt" ;/*,"debug","utils"*/
macro mainPreProcess(processId:integer):bool
/*
Макрос предобработки возвращает признак можно ли в настоящее время
выполнять заданный шаг (processId) или нет.
Если макрос вернул true - шаг будет выполнен,
иначе его выполнение будет отложено до следующего цикла обработки.
*/
/* if(processId == 0)
return cbSetReturnDesc("Проба отказа приема"); end;*/
/* RECORD CurrentRecord(clbpdoc);
println("mainPreProcess(",processId,")");
dbgPrintRec(CurrentRecord);*/
return true;
end;
macro mainPostProcess(processId:integer,resultCode:integer,resultDesc:string):bool
/*
Макрос постобработки возвращает признак можно ли выполнять следующий шаг
обработки сообщения прямо сейчас или нет. Иначе говоря, нужно ли
выполнять все шаги за один проход или за несколько циклов
автоматической обработки.
Если макрос вернул true - все шаги выполняются за один проход,
иначе в одном проходе выполняется только один шаг и после его
выполнения производится переход к обработке следующего сообщения.
*/
RECORD CurrentRecord(clbpdoc);
/* println("mainPostProcess(",processId,",",resultCode,",",resultDesc,")");
dbgPrintRec(CurrentRecord);*/
/* if(resultCode != clbclrcOk)
NetSend("",string("pdoc id=",CurrentRecord.id,", resultCode=",resultCode,", resultDesc=",resultDesc)); end;*/
/* Заполняем дату, время получения сообщения в банке: */
if((CurrentRecord.primary == clbcMsgPrimary) AND (processId == clbcipridStorage))
cbSetFieldByName(CurrentRecord,"payerBankDeliveryDate",date());
cbSetFieldByName(CurrentRecord,"payerBankDeliveryTime",cbTimeEx());
end;
if((resultCode == 84) AND (CurrentRecord.lastProcessTryCount < 5))
CurrentRecord.mode=clbcMsgModeAuto;
return false;
end;
if(CurrentRecord.primary != clbcMsgPrimary)
return true; end; /* для отправляемых подтверждения не надо слать :-) */
if(resultCode != clbclrcOk)
/* if(processId != clbcipridDo) /* раньше на макро действия после приема отказы не слались */*/
cbMakeAndSendReceipt(CurrentRecord,clbcRcpTypeRejected,"",resultDesc); /*end;*/ */ */ */
else
/* if(processId == clbcipridInsertion)
cbMakeAndSendReceipt(CurrentRecord,clbcRcpTypeReceived,"",resultDesc);
elif(processId == clbcipridStorage)
cbMakeAndSendReceipt(CurrentRecord,clbcRcpTypeAccepted,"",resultDesc);
elif(processId == clbcipridMacroCheck)
cbMakeAndSendReceipt(CurrentRecord,clbcRcpTypeChecked,"",resultDesc);
el*/
if(processId == clbcipridDo)
cbMakeAndSendReceipt(CurrentRecord,CurrentRecord.state,"",resultDesc);
autoPrintMsg(CurrentRecord,resultCode,resultDesc);
end;
end;
return true;
end;
== process.mac ==========================================
== Autoprnt.mac ==========================================
import constant;
macro autoPrintMsg(rec,resultCode:integer,resultDesc:string)
/* Пример для автоматической печати после загрузки в банк */
var StructName=strlwr(FileName(rec));
if(NOT ( /* печатаем только нужные нам формы */
((StructName == strlwr(clbcStructNamePaymentDoc)) /*AND
((rec.form == 1) OR
(rec.form == 2) OR
(rec.form == 1001) OR
(rec.form == 1002)
)*/ /* для платежных печатаем все формы */
) OR
((StructName == strlwr(clbcStructNameInfoMessage)) AND
((rec.form == 3) OR /* ВОбя4 - Поручение на обязательную продажу валюты */
(rec.form == 4) OR /* зВал4 - Запрос на покупку продажу валюты */
(rec.form == 1002) OR /* зВып - Запрос на получение выписки */
(rec.form == 1003) OR /* ВОбяз - Поручение на обязательную продажу валюты */
(rec.form == 1004) OR /* зВал - Запрос на конвертацию */
(rec.form == 1005) OR /* зВыпИ - Запрос на получение инкрементальной выписки */
(rec.form == 1006) OR /* зРепл - Запрос на обновление справочников */
(rec.form == 1007) OR /* Письм - Письмо */
(rec.form == 1008) OR /* Отзыв - Отзыв документа/сообщения */
(rec.form == 1009) OR /* ВПокп - Поручение на покупку валюты */
(rec.form == 1010) /* ВПрод - Поручение на продажу валюты */
)
)))
return; end;
var filename=cbPrintMsg(rec,1);
/* /* Можно печатать так: */
var printerName=" prn";
run(GetEnv("COMSPEC"),"/c copy " + filename + printerName);*/
/* а можно печатать этак: ВОТ ТАК и ХОТЕЛОСЬ БЫ!!! */
cbPrintFile(filename); /* Печатаем на принтер, заданный в настройках "Параметры станции" */
end;
== Autoprnt.mac ==========================================
После приема тестаового документа в БОУРМ тишина на принтере и нет сообщений об ошибках. Документ загружен и все..
Еще хотел уточнить а что это за параметр в файле \OBJ\rscb.ini
; Признак запрета формирования файлов результата выполнения макросов (0/1)
; DisableMacroOutput=1 - файл результата не формируется (обработка сообщений
; в этом режиме будет выполняться быстрее)
; DisableMacroOutput=0 - файл результата формируется
Это для лога "0" ставится или для самой печати...???
Алексей,
Орел,
aost@mak.orl.ru
>> ОтветитьСудя по логам, что Вы присылали в поддержку (+) ( <B>Alex</B> 17.03.2004 22:36 )
0(0)Вы оставили незакомментаренной ф-цию cbPrintFile - эта ф-ция есть только в версии 5.2 (см. выше), в 5.1 ее нет вообще. Поэтому и возникают ошибки компиляции. Удалите строки с cbPrintFile и у Вас все должно заработать. Отправляйте на принтер другими способами, не cbPrintFile!!!
>> Ответить