| 
			
			 | 
		#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, печать, печать этикеток | 
| 
	
	 | 
	
		
		
  |