|
|
#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"; |
|
|
|
|
#2 |
|
Участник
|
У нас подобная печать заработала, когда начали использовать
WinAPI::copyFile(fileName, printerPath,false); вместо shellExecute. printerPath - локальный порт, 'LPT1' например, либо сетевое имя принтера этикеток. |
|
|
|
| За это сообщение автора поблагодарили: Alexx7 (1). | |
|
|
#3 |
|
Участник
|
а ху из print ? и зачем pjs ?
КОнкретно для зебры - мы формируем текстовый файл, а потом X++: err = WinAPI::copyFile(_file,_printer); |
|
|
|
| За это сообщение автора поблагодарили: Alexx7 (1). | |
|
|
#4 |
|
Сам.AX
|
Цитата:
Вобщем получилось: X++: fileParams = 'C:\\1.txt'; printerName = '\\\\COMP_NAME\\Zebra'; err = WinAPI::copyFile(fileParams,printerName,false); Последний раз редактировалось Alexx7; 10.09.2009 в 08:39. Причина: Другой вариант. |
|
|
|
|
#5 |
|
Участник
|
|
|
|
|
|
#6 |
|
Сам.AX
|
|
|
|
|
|
#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");
|
|
|
|
|
#8 |
|
Участник
|
|
|
|
|
| За это сообщение автора поблагодарили: Alexx7 (1). | |
|
|
#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 |
|
Сам.AX
|
|
|
|
|
|
#11 |
|
Сам.AX
|
|
|
|
|
|
#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. Причина: Нашел решение |
|
|
|
|
#13 |
|
Сам.AX
|
Кто знает по поводу вот этого:
X++: TextIO txtFile; txtFile = new TextIo(printerName, "w", 866); txtFile.write(ansi2ascii(scriptZebra)); |
|
|
|
|
#14 |
|
MCITP
|
Цитата:
__________________
Zhirenkov Vitaly |
|
|
|
|
#15 |
|
Сам.AX
|
|
|
|
|
|
#16 |
|
MCITP
|
да, про него родимого...
на сервере без этого работать не будет X++: New FileIOPermission(_fileName, "w").assert(); .......................................... CodeAccessPermission::revertAssert();
__________________
Zhirenkov Vitaly |
|
|
|
| За это сообщение автора поблагодарили: Alexx7 (1). | |
|
|
#17 |
|
Сам.AX
|
А как определить откуда вызван мой класс? С серваера или с клиента? т.е. где на данный момент выполняется код?
|
|
|
|
|
#18 |
|
MCITP
|
Цитата:
это вам знать не нужно, делайте ассерт всегда, оградите себя от проблем в будущем
__________________
Zhirenkov Vitaly |
|
|
|
|
#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)); |
|
|
|
|
#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, печать, печать этикеток |
|
|
|