AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.09.2009, 16:00   #1  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Печать этикеток из 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);
Где "1.txt" - это текстовик с командами принтера.
на печать не выходит ничего.
Грешу на этот фрагмент:
X++:
fileParams = "/c print /d:"+printerName+" c:\1.txt";
Буду рад любому совету. Спасибо.
Старый 09.09.2009, 17:13   #2  
vc is offline
vc
Участник
Самостоятельные клиенты AX
Axapta Retail User
 
89 / 23 (1) +++
Регистрация: 03.06.2005
У нас подобная печать заработала, когда начали использовать
WinAPI::copyFile(fileName, printerPath,false);
вместо shellExecute.
printerPath - локальный порт, 'LPT1' например, либо сетевое имя принтера этикеток.
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 09.09.2009, 17:15   #3  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
а ху из print ? и зачем pjs ?
КОнкретно для зебры - мы формируем текстовый файл, а потом
X++:
err = WinAPI::copyFile(_file,_printer);
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 10.09.2009, 07:39   #4  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от vc Посмотреть сообщение
У нас подобная печать заработала, когда начали использовать
WinAPI::copyFile(fileName, printerPath,false);
вместо shellExecute.
printerPath - локальный порт, 'LPT1' например, либо сетевое имя принтера этикеток.
Я поробовал. Работает на сетевой принтер (обычный лазерный). А вто в зебру не влазит. Зебра установлена как локальный принтер по Standard TCP/IP port. Может в этом причина быть?

Вобщем получилось:
X++:
    fileParams  = 'C:\\1.txt';
    printerName = '\\\\COMP_NAME\\Zebra';
    err = WinAPI::copyFile(fileParams,printerName,false);
Другими словами, если гнать через сеть, тогда будет работать, а если отправлять на локальный порт Standard TCP/IP port, то где то застревает. Хочется понять в чем причина.

Последний раз редактировалось Alexx7; 10.09.2009 в 08:39. Причина: Другой вариант.
Старый 10.09.2009, 08:45   #5  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
а если отправлять на локальный порт Standard TCP/IP port, то где то застревает. Хочется понять в чем причина.
Попробуй не в портписать, а в принтер! Посмотри как он называется в дисп. принтеров - и по этому имени копируй.
Старый 10.09.2009, 10:43   #6  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от egorych Посмотреть сообщение
Попробуй не в портписать, а в принтер! Посмотри как он называется в дисп. принтеров - и по этому имени копируй.
Так тоже пробовал. Нифига не вылазит.
Старый 10.09.2009, 12:57   #7  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Получилось немного в обход. Может что посоветуете по оптимизации:
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  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
Только смущают досовские окна выпрыгивающие и исчезающие. Пользователь испугается... звонить начнет
У ShellExecute есть параметер show, попробуйте дать туда SW_HIDE
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 10.09.2009, 13:44   #9  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
X++:
Asciiio txtFile;
;
txtFile = new Asciiio("LPT" + int2str(_port + 1), "w");
txtFile.write(_text);
на LPT порт можно повесить сетевой принтер через коменду net use.
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy

Последний раз редактировалось ivas; 10.09.2009 в 13:47.
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 10.09.2009, 14:31   #10  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от ivas Посмотреть сообщение
X++:
Asciiio txtFile;
;
txtFile = new Asciiio("LPT" + int2str(_port + 1), "w");
txtFile.write(_text);
на LPT порт можно повесить сетевой принтер через коменду net use.
Пожалуй стоит попробовать.
Старый 10.09.2009, 14:32   #11  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
У ShellExecute есть параметер show, попробуйте дать туда SW_HIDE
X++:
WinApi::shellExecute("cmd","/c ECHO "+paramStr,'','',0);
Вот так ↑ заработало. Вобще никаких "левых" окон.
Старый 10.09.2009, 14:40   #12  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от ivas Посмотреть сообщение
Asciiio txtFile;
;
txtFile = new Asciiio("LPT" + int2str(_port + 1), "w");
txtFile.write(_text);
Работает, только почемуто кодировка неподходит, нужно DOS (ASCII).

Вобщем спасибо 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  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Кто знает по поводу вот этого:
X++:
TextIO                              txtFile;

txtFile = new TextIo(printerName, "w", 866);
txtFile.write(ansi2ascii(scriptZebra));
Не хочет работать на сервере. Говорит, что объект не инициализарован. Как быть?
Старый 14.09.2009, 13:47   #14  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
Кто знает по поводу вот этого:
X++:
TextIO                              txtFile;

txtFile = new TextIo(printerName, "w", 866);
txtFile.write(ansi2ascii(scriptZebra));
Не хочет работать на сервере. Говорит, что объект не инициализарован. Как быть?
Permission-ы надо заassertтить, видимо...
__________________
Zhirenkov Vitaly
Старый 14.09.2009, 13:49   #15  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от ZVV Посмотреть сообщение
Permission-ы надо заassertтить, видимо...
Можете немного подробнее. Вы про класс FileIOPermission?
Старый 14.09.2009, 13:56   #16  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
Можете немного подробнее. Вы про класс FileIOPermission?
да, про него родимого...
на сервере без этого работать не будет

X++:
        New FileIOPermission(_fileName, "w").assert();
        ..........................................
        CodeAccessPermission::revertAssert();
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 14.09.2009, 14:01   #17  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от ZVV Посмотреть сообщение
да, про него родимого...
на сервере без этого работать не будет

X++:
        New FileIOPermission(_fileName, "w").assert();
        ..........................................
        CodeAccessPermission::revertAssert();
А как определить откуда вызван мой класс? С серваера или с клиента? т.е. где на данный момент выполняется код?
Старый 14.09.2009, 14:23   #18  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
А как определить откуда вызван мой класс? С серваера или с клиента? т.е. где на данный момент выполняется код?
а зачем вам это нужно знать?
это вам знать не нужно, делайте ассерт всегда, оградите себя от проблем в будущем
__________________
Zhirenkov Vitaly
Старый 14.09.2009, 14:30   #19  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от ZVV Посмотреть сообщение
а зачем вам это нужно знать?
это вам знать не нужно, делайте ассерт всегда, оградите себя от проблем в будущем
У меня это происходит в цикле. Он теперь начинает говорить
Несколько вызовов 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  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от 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, печать, печать этикеток

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
gatesasbait: Dynamics AX 2009 SSRS and SSAS Integration Tips Blog bot DAX Blogs 3 09.07.2009 13:07
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Arijit Basu: AX 2009 - Quick Overview Blog bot DAX Blogs 4 19.05.2008 14:47
AX UK: Demand Planner on the AX 4 SP 1 VPC Blog bot DAX Blogs 0 10.08.2007 23:40
AX UK: Microsoft Dynamics AX 4.0 SP 1 available for download Blog bot DAX Blogs 3 07.12.2006 17:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:03.