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

Uwaga
Omawiana funkcja dodatkowa uruchamia wydruk etykiety zaprojektowanej programem DymoLabelWriter i przekazuje do niej dane
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

Przykład

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.

@PAR ?@Hs200_NQ|Filtr:''@? PAR@

Informację o aktualnym filtrze można odczytać w managerze wydruków
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@

Trzeci zawiera wskazanie na plik ze wzorem etykiety (domyślnie C:\DYMO\Etykieta1.LWL):

@PAR ?@Fs255(File, Open, 'LabelPrinter Labels (*.LWL)|*.LWL|Wszystkie pliki
(*.*)|*.*', *.LWL)|Plik|&Wg wzorca:C:\DYMO\Etykieta1.LWL@? PAR@

A ostatni liczbę etykiet do wydrukowania:

@PAR ?@N4|Ilosc|&Ilość etykiet:1 @? @RL(1) @RH(9999) PAR@

Następnie jest zapytanie odczytujące dane o towarze.

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 ??_NQFiltr

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:

Dim dymoAddIn, dymoLabel
Set dymoAddIn = CreateObject("DYMO.DymoAddIn")
Set dymoLabel = CreateObject("DYMO.DymoLabels")

Następnie otwierany jest plik ze wzorem etykiety do wydrukowania:

dymoAddIn.Open "??_NQPlik "

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:

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").Value

I wreszcie wysłanie wydruku na drukarkę – z ilością przekazaną przez parametr dynamiczny

dymoAddIn.Print ??Ilosc , TRUE

 

Przykład

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:

@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@

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:

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

Wyrażenie ujęte w nawiasy klamrowe zostanie zewaluowane:

{CHOOSE(??TwrCeny=0, 'Twr_TwCNumer', ??TwrCeny )}

Jeśli użytkownik wybrał cenę domyślną (0) wówczas w Join zostanie umieszczony warunek:

... And TwC_TwCNumer=Twr_TwcNumer

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ć:

... And TwC_TwCNumer=2

 

Przykład

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:

@PAR ?@X|WgZasobow|&Ilość wg zasobów:1 @? PAR@

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:

@PAR ?@N4|Ilosc|&Ilość etykiet:1 @? @H({??WgZasobow }) @RL(1) @RH(9999) PAR@

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:

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', '') }

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

{CHOOSE ( ??WgZasobow , '', '='&??Ilosc)}

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.:

TwI_Ilosc=3

Dodano również warunkowe dołączenie do tabeli CDN.TwrIlosci – tylko wówczas, gdy zaznaczono check-boxa Ilość wg zasobów:

{CHOOSE ( ??WgZasobow , 'Join CDN.TwrIlosci On Twr_TwrId
= TwI_TwrId And
TwI_MagId Is Null', '')}

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
o największej dacie)

{CHOOSE ( ??WgZasobow , 'Order By TwI_Data Desc', '') }

Sekcja VB

W sekcji VB zmieniło się jedynie wywołanie funkcji drukującej:

dymoAddIn.Print Recordset.Fields("TwI_Ilosc").Value, TRUE

Ilość jest w tym wypadku przekazywana przez pole odczytane z recordsetu,
a nie przez zmienną dynamiczną.


Lista plików dodatkowych

etykieta1.LWLDefinicja wydruku dla drukarki Dymo LabelWriter 330
etykieta2.LWLDefinicja wydruku dla drukarki Dymo LabelWriter 330
etykietyTwr1.xptFunkcja dodatkowa zawierająca uruchomienie wydruku do przykładu 1
etykietyTwr2.xptFunkcja dodatkowa zawierająca uruchomienie wydruku do przykładu 2
etykietyTwr3.xptFunkcja dodatkowa zawierająca uruchomienie wydruku do przykładu 3

Pliki do pobrania