09.09.2009, 16:00 | #1 |
Сам.AX
|
Печать этикеток из AX 4.0 sp.2
Граждане!
Есть у кого опыт печати этикеток из аксапты. Задача в том, чтобы акапта реагировала на нажатие кнопки сразу на принтер. Пробовал вот так: X++: #WinAPI PrintJobSettings pjs = new PrintJobSettings(); str printerName, printerDriverName, fileParams; int z = 1; while (z <= pjs.getNumberOfPrinters()) { printerName = pjs.getPrinter(z); pjs.deviceName(printerName); printerDriverName = pjs.printerDriverName(); if (printerDriverName == 'Zebra LP2824-Z') { printerDriverName = ''; break; } z++; } if (printerDriverName) { return; } fileParams = "/c print /d:"+printerName+" c:\1.txt"; winapi::shellExecute("cmd",fileParams); на печать не выходит ничего. Грешу на этот фрагмент: X++: fileParams = "/c print /d:"+printerName+" c:\1.txt"; |
|
09.09.2009, 17:13 | #2 |
Участник
|
У нас подобная печать заработала, когда начали использовать
WinAPI::copyFile(fileName, printerPath,false); вместо shellExecute. printerPath - локальный порт, 'LPT1' например, либо сетевое имя принтера этикеток. |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
09.09.2009, 17:15 | #3 |
Участник
|
а ху из print ? и зачем pjs ?
КОнкретно для зебры - мы формируем текстовый файл, а потом X++: err = WinAPI::copyFile(_file,_printer); |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
10.09.2009, 07:39 | #4 |
Сам.AX
|
Цитата:
Вобщем получилось: X++: fileParams = 'C:\\1.txt'; printerName = '\\\\COMP_NAME\\Zebra'; err = WinAPI::copyFile(fileParams,printerName,false); Последний раз редактировалось Alexx7; 10.09.2009 в 08:39. Причина: Другой вариант. |
|
10.09.2009, 08:45 | #5 |
Участник
|
|
|
10.09.2009, 10:43 | #6 |
Сам.AX
|
|
|
10.09.2009, 12:57 | #7 |
Сам.AX
|
Получилось немного в обход. Может что посоветуете по оптимизации:
X++: #WinAPI str fileParams, scriptZebra, printerName, paramStr; int z = 1, posCh = 0, numCh, i; boolean err; container cnt; if (!_printStr) { info('@AKM288'); return; } // Это разложение строчки на поля. while (1 > 0) { numCh = strFind(_printStr, '|', posCh, strlen(_printStr)); cnt += substr(_printStr, posCh + 1, numCh - 1); _printStr = strDel(_printStr,posCh + 1, numCh); if (strlen(_printStr) < 1) { break; } } scriptZebra = '\^\^XA\^\^A@N,0,0,E:Cyri_ub.FNT' +'\^\^FO010,010\^\^A@N,40,35\^\^FD'+conPeek(cnt, 1) +'\^\^FS\^\^FO250,010\^\^A@N,40,35\^\^FD'+conPeek(cnt, 2) +'\^\^FS\^\^FO010,050\^\^A@N,40,35\^\^FD'+conPeek(cnt, 3) +'\^\^FS\^\^FO010,090\^\^A@N,40,35\^\^FD'+conPeek(cnt, 4) +'\^\^fS\^\^FO010,130\^\^A@N,50,40\^\^FD'+conPeek(cnt, 5) +'\^\^FS\^\^FO260,135\^\^A@N,40,35\^\^FD'+conPeek(cnt, 6) +'\^\^FS\^\^FO010,190\^\^A@N,40,35\^\^FD'+conPeek(cnt, 7) +'\^\^FS\^\^PQ1\^\^XZ'; paramStr = scriptZebra+" > c:\\tmp.txt"; WinApi::shellExecute("cmd","/c ECHO "+paramStr); fileParams = 'c:\\tmp.txt'; printerName = '\\\\Comp_name\\Zebra'; err = WinAPI::copyFile(fileParams,printerName,false); if (err) { return; } WinApi::shellExecute("cmd","/c del c:\\tmp.txt"); |
|
10.09.2009, 13:22 | #8 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
10.09.2009, 13:44 | #9 |
Участник
|
X++: Asciiio txtFile; ; txtFile = new Asciiio("LPT" + int2str(_port + 1), "w"); txtFile.write(_text);
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy Последний раз редактировалось ivas; 10.09.2009 в 13:47. |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
10.09.2009, 14:31 | #10 |
Сам.AX
|
|
|
10.09.2009, 14:32 | #11 |
Сам.AX
|
|
|
10.09.2009, 14:40 | #12 |
Сам.AX
|
Цитата:
Вобщем спасибо ivas, что навел на мысль. Вот что получилось: X++: TextIO txtFile; str scriptZebra, printerName, paramStr; int z = 1, posCh = 0, numCh, i; container cnt; // раскладываем строку; while (1 > 0) { numCh = strFind(_printStr, '|', posCh, strlen(_printStr)); cnt += substr(_printStr, posCh + 1, numCh - 1); _printStr = strDel(_printStr,posCh + 1, numCh); if (strlen(_printStr) < 1) { break; } } scriptZebra = '\^\^XA\^\^A@N,0,0,E:Cyri_ub.FNT' +'\^\^FO010,010\^\^A@N,40,35\^\^FD'+conPeek(cnt, 1) +'\^\^FS\^\^FO250,010\^\^A@N,40,35\^\^FD'+conPeek(cnt, 2) +'\^\^FS\^\^FO010,050\^\^A@N,40,35\^\^FD'+conPeek(cnt, 3) +'\^\^FS\^\^FO010,090\^\^A@N,40,35\^\^FD'+conPeek(cnt, 4) +'\^\^fS\^\^FO010,130\^\^A@N,50,40\^\^FD'+conPeek(cnt, 5) +'\^\^FS\^\^FO260,135\^\^A@N,40,35\^\^FD'+conPeek(cnt, 6) +'\^\^FS\^\^FO010,190\^\^A@N,40,35\^\^FD'+conPeek(cnt, 7) +'\^\^FS\^\^PQ1\^\^XZ'; printerName = '\\\\comp_name\\Zebra'; txtFile = new TextIo(printerName, "w", 866); txtFile.write(ansi2ascii(scriptZebra)); Последний раз редактировалось Alexx7; 10.09.2009 в 15:40. Причина: Нашел решение |
|
14.09.2009, 11:49 | #13 |
Сам.AX
|
Кто знает по поводу вот этого:
X++: TextIO txtFile; txtFile = new TextIo(printerName, "w", 866); txtFile.write(ansi2ascii(scriptZebra)); |
|
14.09.2009, 13:47 | #14 |
MCITP
|
Permission-ы надо заassertтить, видимо...
__________________
Zhirenkov Vitaly |
|
14.09.2009, 13:49 | #15 |
Сам.AX
|
|
|
14.09.2009, 13:56 | #16 |
MCITP
|
да, про него родимого...
на сервере без этого работать не будет X++: New FileIOPermission(_fileName, "w").assert(); .......................................... CodeAccessPermission::revertAssert();
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
14.09.2009, 14:01 | #17 |
Сам.AX
|
А как определить откуда вызван мой класс? С серваера или с клиента? т.е. где на данный момент выполняется код?
|
|
14.09.2009, 14:23 | #18 |
MCITP
|
Цитата:
это вам знать не нужно, делайте ассерт всегда, оградите себя от проблем в будущем
__________________
Zhirenkov Vitaly |
|
14.09.2009, 14:30 | #19 |
Сам.AX
|
Цитата:
Несколько вызовов CodeAccessPermission.Assert (S)\Classes\FileIOPermission\assert (S)\Classes\PrintLabel\createPrnString - line 50 (S)\Classes\ProdJournalCheckPostProd\runPrint_RU - line 34 (S)\Classes\JournalCheckPost\run - line 48 (S)\Classes\ProdJournalCheckPostProd\run - line 17 (C)\Classes\ProdJournalCheckPost\main - line 23 (C)\Classes\FormFunctionButtonControl\Clicked (C)\Classes\FormFunctionButtonControl\Clicked - line 6 И это меня очень смущает. вот код: X++: fileIOperm = new FileIOPermission(printerName,"w"); fileIOperm.assert(); txtFile = new TextIo(printerName, "w", 866); txtFile.write(ansi2ascii(scriptZebra)); |
|
14.09.2009, 14:34 | #20 |
MCITP
|
Цитата:
Сообщение от Alexx7
У меня это происходит в цикле. Он теперь начинает говорить
Несколько вызовов CodeAccessPermission.Assert (S)\Classes\FileIOPermission\assert (S)\Classes\PrintLabel\createPrnString - line 50 (S)\Classes\ProdJournalCheckPostProd\runPrint_RU - line 34 (S)\Classes\JournalCheckPost\run - line 48 (S)\Classes\ProdJournalCheckPostProd\run - line 17 (C)\Classes\ProdJournalCheckPost\main - line 23 (C)\Classes\FormFunctionButtonControl\Clicked (C)\Classes\FormFunctionButtonControl\Clicked - line 6 И это меня очень смущает. вот код: X++: fileIOperm = new FileIOPermission(printerName,"w"); fileIOperm.assert(); txtFile = new TextIo(printerName, "w", 866); txtFile.write(ansi2ascii(scriptZebra)); а во-вторных, по мере ненадобности предыдущие "ассерты" надо отменять, я ж писал: X++: CodeAccessPermission::revertAssert(); Значит в начале итерации - assert, в конце - revertAssert...
__________________
Zhirenkov Vitaly |
|
Теги |
winapi, печать, печать этикеток |
|
|