OPT034 – Podłączenie kodów kreskowych drukarki DYMO
Data aktualizacji: 28-11-2018
Przykład – współpraca z drukarką DYMO
W poniższym dokumencie zostanie omówione wykorzystanie funkcji dodatkowych do współpracy z drukarkami etykiet DYMO.
Przykłady opisują kolejne fazy zaawansowania tworzenia funkcji drukującej etykiety dla towaru. Funkcję (pliki xpt) należy dodać do funkcji dodatkowych z poziomu kartoteki towarowej. Drukowanie innego rodzaju wydruków etykiet bazujących na danych z programu można wykonać w podobny sposób.
Sam mechanizm funkcji dodatkowych do programu opisuje artykuł techniczny OPT003-Funkcje dodatkowe
z programu Comarch ERP Optima. Dlatego należy najpierw zainstalować sterowniki drukarki DYMO, skopiować na dysk lokalny do katalogu C:\DYMO przykładowe wzory etykiet (pliki z rozszerzeniem LWL). Wzory etykiet można wgrać do innego katalogu, ale wówczas należałoby podmienić ścieżkę dostępu w definicji funkcji dodatkowej.
Oczywiście w analogiczny sposób można przygotować wydruki etykiet środków trwałych czy dowolnych innych. Konieczne jest do tego przygotowanie odpowiedniego wzoru etykiety programem DymoLabelWriter oraz takie zmodyfikowanie funkcji, aby pobierała dane z innej tabeli (np.CDN.Trwale) oraz podstawiała w skrypcie odpowiednie dane do etykiety.
Wzór etykiety
Wzór etykiety (pliki LWL) przygotowujemy programem DymoLabelWriter. Można zmodyfikować załączony wzorzec lub stworzyć wzór zupełnie od początku.
Przy tworzeniu etykiety, która ma być drukowana z Comarch ERP Optima należy zwrócić uwagę na sposób przekazywania danych z programu do wydruku etykiety. Aby na drukowanej etykiecie można było wydrukować dane np. o towarze pobrane z Comarch ERP Optima, konieczne jest odpowiednie nazwanie obiektów na etykiecie.
Przykładowo, umieszczając pole typu kod kreskowy na etykiecie musimy – oprócz wartości początkowej – określić nazwę tego pola. Robi się to w następujący sposób:
- W menu Edycja zaznaczamy Pokaż narzędzia
- Na wybranym polu klikamy prawym klawiszem myszy
- W otwartym okienku właściwości wpisujemy Nazwę obiektu taką, do jakiej potem odwołamy się w funkcji drukującej
W załączonych przykładowych wzorach etykiet (etykieta1, etykieta2) użyte zostały następujące nazwy pól:
- Barcode – kod kreskowy
- Price – cena
- Desc – opis towaru
- Name – nazwa towaru
Pierwszy przykład ilustruje wydruk zadanej liczby etykiet (podanej przez użytkownika) wg ceny domyślnej towaru. Pełna definicja funkcji znajduje się w pliku etykietyTwr1.xpt. Sekcja SQL Sekcja SQL zawiera definicje parametrów dynamicznych oraz zapytanie do bazy danych: Pierwszy parametr służy do przekazania filtru z aplikacji. Ma atrybut H (hide) co oznacza, że jest niewidoczny dla użytkownika i umożliwia wydrukowanie etykiety towaru którego formularz jest aktualnie otwarty. Informację o aktualnym filtrze można odczytać w managerze wydruków Trzeci zawiera wskazanie na plik ze wzorem etykiety (domyślnie C:\DYMO\Etykieta1.LWL): A ostatni liczbę etykiet do wydrukowania: Następnie jest zapytanie odczytujące dane o towarze. Proszę zwrócić uwagę na wykorzystanie parametru Filtr w klauzuli Where, oraz na sposób odczytupola EAN (Twr_Ean=Substring(Twr_Ean,1,12)). Wynika to stąd, że ostatnia cyfra w polu EAN zawiera cyfrę kontrolną, która jest przez sterownik drukarki DYMO obliczana i dodawana do kodu (dlatego należy ją „obciąć”). Sekcja VB Skrypt jest wykonywany w przypadku, gdy zwrócony recordset nie jest pusty (w celu uniknięcia wydruku pustej etykiety). Kolejno są tworzone obiekty sterowników drukarki: Następnie otwierany jest plik ze wzorem etykiety do wydrukowania: Proszę zwrócić uwagę, że nazwa pliku jest przekazywana przez parametr dynamiczny. W przypadku VBScript możemy to zrobić wprost (a nie poprzez pole w recordsecie jak we wcześniejszych przykładach w JScript), gdyż znak \ jest w VBScript traktowany jak każdy inny. Następnie do pól na etykiecie (zgodnie z nazwami opisanymi we wcześniejszym rozdziale) są podstawiane dane odczytane z recordsetu: I wreszcie wysłanie wydruku na drukarkę – z ilością przekazaną przez parametr dynamiczny@PAR ?@Hs200_NQ|Filtr:''@? PAR@
i funkcji dodatkowych na zakładce Parametry. Drugi parametr zawiera wyłącznie tekst, który pojawi się na okienku parametrów dynamicznych:@PAR ?@ABC('Wydruk etykiet dla towaru')@? PAR@
@PAR ?@Fs255(File, Open, 'LabelPrinter Labels (*.LWL)|*.LWL|Wszystkie pliki
(*.*)|*.*', *.LWL)|Plik|&Wg wzorca:C:\DYMO\Etykieta1.LWL@? PAR@@PAR ?@N4|Ilosc|&Ilość etykiet:1 @? @RL(1) @RH(9999) PAR@
Select Twr_Kod, Twr_Nazwa, Twr_Ean=Substring(Twr_Ean,1,12), Twr_Opis,
TwC_Cena=RTRIM(LTRIM(STR(TwC_Wartosc,15,2) + ' ' + TwC_Waluta))
From CDN.Towary
Join CDN.TwrCeny On Twr_TwrId=TwC_TwrId And TwC_TwCNumer
= Twr_TwCNumer
Where ??_NQFiltrDim dymoAddIn, dymoLabel
Set dymoAddIn = CreateObject("DYMO.DymoAddIn")
Set dymoLabel = CreateObject("DYMO.DymoLabels")dymoAddIn.Open "??_NQPlik "
dymoLabel.SetField "BarCode", Recordset.Fields("Twr_Ean").Value
dymoLabel.SetField "Name", Recordset.Fields("Twr_Nazwa").Value
dymoLabel.SetField "Price", Recordset.Fields("TwC_Cena").Value
dymoLabel.SetField "Desc", Recordset.Fields("Twr_Opis").ValuedymoAddIn.Print ??Ilosc , TRUE
Drugi przykład ilustruje wydruk zadanej liczby etykiet (podanej przez użytkownika) wg ceny wybranej przez użytkownika. Pełna definicja funkcji znajduje się w pliku etykietyTwr2.xpt. Sekcja SQL Zmiana w stosunku do poprzedniego przykładu polega na dodaniu parametru dynamicznego: Parametr ten wyświetla listę zdefiniowanych w konfiguracji cen uzupełnionych o pozycję „domyślne”. Zmienia się również zapytanie SQL w części związanej z dołączaniem tabeli TwrCeny: Wyrażenie ujęte w nawiasy klamrowe zostanie zewaluowane: Jeśli użytkownik wybrał cenę domyślną (0) wówczas w Join zostanie umieszczony warunek: Jeśli użytkownik wybrał cenę inną niż domyślna, wówczas pod parametr ??TwrCeny zostanie podstawiony numer tej ceny (np. 2) i warunek będzie miał postać:@PAR ?@R(SELECT Id = 0, Kod = 'domyślne' UNION SELECT DfC_Lp, DfC_Nazwa From
CDN.DefCeny Order By 1)|TwrCeny|&Ceny:domyślne @? PAR@Select Top 1 Twr_Kod, Twr_Nazwa, Twr_Ean=Substring(Twr_Ean,1,12), Twr_Opis,
TwC_Cena=RTRIM(LTRIM(STR(TwC_Wartosc,15,2) + ' ' + TwC_Waluta))
From CDN.Towary
Join CDN.TwrCeny On Twr_TwrId=TwC_TwrId And
TwC_TwCNumer={CHOOSE(??TwrCeny=0, 'Twr_TwCNumer', ??TwrCeny )}
Where ??_NQFiltr{CHOOSE(??TwrCeny=0, 'Twr_TwCNumer', ??TwrCeny )}
... And TwC_TwCNumer=Twr_TwcNumer
... And TwC_TwCNumer=2
Trzeci przykład został rozbudowany o wydruk zadanej liczby etykiet lub liczby odpowiadającej obecnej ilości towaru na magazynie. Pełna definicja funkcji znajduje się w pliku etykietyTwr3.xpt. Sekcja SQL W sekcji SQL został dodany nowy parametr dynamiczny: Jest to check-box, który wskazuje, czy drukowana ma być ilość etykiet wg obecnego stanu czy wg liczby etykiet podanej przez użytkownika. Dodatkowo został zmodyfikowany parametr Ilosc: Dzięki dodaniu @H({??WgZasobow }) będzie on ukrywany w przypadku, gdy użytkownik zaznaczył check-box Ilość wg zasobów. Największa zmiana dotyczy konstrukcji zapytania SQL: Po pierwsze dodano klauzulę Top 1 – po to, że jeśli odczytujemy liczbę etykiet wg zasobów (czyli wg tabeli CDN.TwrIlosci), żeby ściągnąć tylko jeden rekord. Dodane zostało odczytanie pola TwI_Ilosc – przy czym wyrażenie Powoduje, że jeśli NIE zaznaczono check-boxa Ilość wg zasobów, to pod TwI_Ilosc zostaje podstawiona liczba pobrana z parametru dynamicznego Ilosc, a więc wyrażenie ma postać np.: Dodano również warunkowe dołączenie do tabeli CDN.TwrIlosci – tylko wówczas, gdy zaznaczono check-boxa Ilość wg zasobów: Na końcu dodano warunkowe dodanie klauzuli Order By – jeśli ilość pobieramy z tabeli TwrIlosci, chodzi o to, aby odczytać ostatni zapis (czyli zapis Sekcja VB W sekcji VB zmieniło się jedynie wywołanie funkcji drukującej: Ilość jest w tym wypadku przekazywana przez pole odczytane z recordsetu,@PAR ?@X|WgZasobow|&Ilość wg zasobów:1 @? PAR@
@PAR ?@N4|Ilosc|&Ilość etykiet:1 @? @H({??WgZasobow }) @RL(1) @RH(9999) PAR@
Select Top 1 Twr_Kod, Twr_Nazwa, Twr_Ean=Substring(Twr_Ean,1,12), Twr_Opis,
TwC_Cena=RTRIM(LTRIM(STR(TwC_Wartosc,15,2) + ' ' + TwC_Waluta)),
TwI_Ilosc {CHOOSE ( ??WgZasobow , '', '='&??Ilosc)}
From CDN.Towary
{CHOOSE ( ??WgZasobow , 'Join CDN.TwrIlosci On Twr_TwrId
= TwI_TwrId And
TwI_MagId Is Null', '')}
Join CDN.TwrCeny On Twr_TwrId=TwC_TwrId And TwC_TwCNumer={CHOOSE(??TwrCeny=0,
'Twr_TwCNumer', ??TwrCeny )}
Where ??_NQFiltr
{CHOOSE ( ??WgZasobow , 'Order By TwI_Data Desc', '') }{CHOOSE ( ??WgZasobow , '', '='&??Ilosc)}
TwI_Ilosc=3
{CHOOSE ( ??WgZasobow , 'Join CDN.TwrIlosci On Twr_TwrId
= TwI_TwrId And
TwI_MagId Is Null', '')}
o największej dacie){CHOOSE ( ??WgZasobow , 'Order By TwI_Data Desc', '') }
dymoAddIn.Print Recordset.Fields("TwI_Ilosc").Value, TRUE
a nie przez zmienną dynamiczną.
Lista plików dodatkowych
etykieta1.LWL | Definicja wydruku dla drukarki Dymo LabelWriter 330 |
etykieta2.LWL | Definicja wydruku dla drukarki Dymo LabelWriter 330 |
etykietyTwr1.xpt | Funkcja dodatkowa zawierająca uruchomienie wydruku do przykładu 1 |
etykietyTwr2.xpt | Funkcja dodatkowa zawierająca uruchomienie wydruku do przykładu 2 |
etykietyTwr3.xpt | Funkcja dodatkowa zawierająca uruchomienie wydruku do przykładu 3 |
Pliki do pobrania
- Przykładowy wzór etykiety1
- Przykładowy wzór etykiety2
- Wydruk zadanej liczby etykiet (podanej przez użytkownika) wg ceny domyślnej towaru
- Wydruk zadanej liczby etykiet (podanej przez użytkownika) wg ceny wybranej przez użytkownika
- Wydruk zadanej liczby etykiet lub liczby odpowiadającej obecnej ilości towaru na magazynie