Baza wiedzy LINKSPOT › Biuletyny

XL012 – Wydruki tekstowe

Biuletyny · Opublikowano 2020-07-02

Spis treści

Ogólna struktura mechanizmu wydruków tekstowych

Struktura plików XML dla wydruków tekstowych

Przykład definicji wydruku

Wymagania systemowe

Drukowanie tekstowe w usługach terminalowych

Ogólna struktura mechanizmu wydruków tekstowych

Wydruki tekstowe zostały oparte o mechanizm wydruków XML, dlatego na początku w skrócie zostanie nakreślona zasada działania wydruków XML.

Wydruki XML

Definicja wydruku XML zawiera 4 sekcje: [SQL], [XSL], [FILE] i [RUN]

Sekcja SQL

Sekcja ta zawiera zapytanie (lub zapytania SQL), które zostaną zadane do bazy danych. Na podstawie zwróconych recordsetów tworzony jest plik XML o strukturze:

Tagów RECORDSETn jest tyle, ile recordsetów zwracają zapytania z sekcji [SQL] (są one kolejno numerowane).

Tagów RECORD w każdym tagu RECORDSETn jest tyle, ile wierszy zwróciło dane zapytanie.

Każdy tag RECORD posiada tyle atrybutów, ile kolumn zwraca zapytanie. Nazwa danego atrybutu odpowiada nazwie kolumny, a wartość atrybutu – wartości kolumny, np.

Sekcja XSL

Sekcja XSL zawiera schemat, który jest „nakładany” na plik XML wygenerowany zgodnie z opisem w poprzednim punkcie. W wyniku tego „nałożenia” powstaje plik wynikowy.

Sekcja FILE

Sekcja FILE zawiera nazwę pliku, pod jaką zostanie zapisany wynikowy plik XML. Jeżeli sekcja FILE jest pusta, wówczas plik wynikowy zostanie zapisany w katalogu tymczasowym pod nazwą rptNNN.tmp (gdzie NNN jest liczbą szesnastkową)

Sekcja RUN

Sekcja RUN zawiera nazwę programu, do którego zostanie przesłany plik wynikowy. Jeżeli sekcja RUN jest pusta, wówczas plik wynikowy zostanie wysłany do programu domyślnego ze względu na rozszerzenie pliku, np.:

[FILE]

C:\wynik.xml

[RUN]

spowoduje zapisanie pliku wynikowego do pliku C:\wynik.xml i otwarcie go za pomocą przeglądarki internetowej.

Parametry dynamiczne

Cała definicja wydruku XML jest poddawana analizie przez silnik parametrów dynamicznych. Może to być wykorzystywane w dwóch przypadkach:

Aplikacja może przekazać do wydruku listę parametrów dynamicznych, zgodnie z zawartością zakładki Parametry na oknie Konfiguracja wydruków.

Dodatkowo użytkownik może definiować własne parametry dynamiczne, dla których, w chwili wykonywania wydruku, zostanie wyświetlone okno z zapytaniem o wartość parametru.

Opis działania parametrów dynamicznych znajduje się w biuletynie poświęconym modułowi analiz (tworzenie wykresów)

Działanie parametrów dynamicznych zostanie w dalszej części zilustrowane na przykładzie.

Wydruk tekstowy

Do potrzeb wydruków tekstowych przygotowany został program PrintTxt.EXE, który jako parametr wejściowy otrzymuje plik XML o określonej strukturze i w wyniku swego działania przetwarza ten XML na plik tekstowy, który jest kierowany na drukarkę.

Pełny mechanizm generowania wydruku polega na przygotowaniu pliku XML o określonej strukturze, a następnie przetworzenie go przez program PrintTxt.EXE

Struktura plików XML dla wydruków tekstowych

Plik XML, który jest przekazywany do programu PrintTxt.EXE powinien mieć następującą strukturę:

<!– one, req –>

<!– many, req –>

<!– many, opt –>

<!– one, opt –>

<!– many, opt –>

<!– many, opt –>

<!– many, opt –>

<!– one, opt –>

<!– many, opt –>

<!– many, opt –>

<!– many, opt –>

<!– many, req –>

<!– many, req –>

<!– many, opt –>

<!– many, opt –>

<!– one, opt –>

<!– many, opt –>

<!– many, opt –>

<!– many, opt –>

<!– one, opt –>

<!– many, opt –>

<!– many, opt –>

<!– many, opt –>

Uwaga

Oczywiście komentarze nie muszą występować w pliku XML – tutaj zostały dodane, aby oznaczyć czy dany tag ma występować, czy też nie:

many oznacza, że tag może wystąpić wiele razy,

one oznacza, że dany tag (na określonym poziomie) może wystąpić tylko raz,

req oznacza, że dany tag jest wymagany,

opt oznacza, że dany tag jest opcjonalny.

Zawartość tagów

ROOT

Na najwyższym poziomie pliku XML musi wystąpić tylko jeden tag o nazwie ROOT

RAPORT

RAPORT zawiera definicję pojedynczego wydruku. Na ogół ROOT zawierał będzie jeden tag RAPORT, jednakże w przypadku konstruowania wydruków seryjnych możliwe jest umieszczenie wielu tagów RAPORT. Istotne jest to, że dla każdego tagu RAPORT zerowana jest numeracja stron.

RPT_HEADER

Tag ten zawiera definicję wyglądu nagłówka raportu. Nagłówek ten zostanie wydrukowany jeden raz na początku raportu.

PG_HEADER

Tag ten zawiera definicję wyglądu nagłówka strony. Nagłówek ten zostanie wydrukowany na początku każdej strony.

DETAIL

Tag ten zawiera definicję zawartości wierszy raportu.

PG_FOOTER

Tag ten zawiera definicję wyglądu stopki strony. Stopka ta zostanie wydrukowana na końcu każdej strony.

RPT_FOOTER

Tag ten zawiera definicję wyglądu stopki raportu. Stopka ta zostanie wydrukowana jeden raz na końcu raportu.

PARAM | P

Tag ten zawiera definicję parametrów. Parametry są zmiennymi raportu, w których można zapisywać pewne informacje (np. takie, do których się potem wielokrotnie odwołujemy) czy dokonywać pewnych obliczeń (np. sumy). Każdy raport posiada pewną predefiniowaną listę parametrów systemowych (takich jak np. numer strony, numer linii, typ drukarki itp.). Nazwy parametrów systemowych są poprzedzone znakiem @.

Jeżeli odwołujemy się do jakiegoś parametru (np. przy obliczeniach) to jego nazwę poprzedzamy znakiem @, stąd odwołanie do parametrów systemowych poprzedzone jest poprzez @@ (np. @@PAGENO)

Tag PARAM może posiadać następujące atrybuty:

name nazwa parametru
type typ parametru Dopuszczalne wartości to text i number. Domyślnym typem jest text Uwaga: typ parametru jest istotny ze względu na operacje dokonywane na nich. Przykładowo, mając dwa parametry P1 i P2 o wartościach odpowiednio 1 i 2, jeżeli wykonamy na nich operację @P1+@P2, to w przypadku parametrów typu number w wyniku otrzymamy 3, a jeśli co najmniej jeden z nich będzie typu text, to w wyniku otrzymamy 12
value wartość parametru
calc przyjmuje wartości true i false (domyślnie false). Określa, czy wartość parametru jest podana przez wartość (calc=”true”), czy przez wyrażenie (calc=”false”). Przykładowo, jeśli value=”@P1+@P2” calc=”true” to jako wartość parametru zostanie podstawiony wynik wykonania działania na parametrach P1 i P2. Jeżeli natomiast calc=”false”, wówczas jako wartość parametru zostałby podstawiony po prostu tekst @P1+@P2.

Uwaga

wszystkie wyrażenia należy tworzyć zgodnie z syntaktyką języka JScript. Dotyczy to zmiennych PARAM, pól FIELD jak i obliczania wyrażeń typu true/false (np. dla atrybutów hide).

Tagi PARAM mogą być elementami tagu RAPORT (zainicjalizowanie lub jednorazowe ustawienie parametru na początku wydruku). W tym miejscu można ustawiać niektóre parametry systemowe (np. typ drukarki, nazwa urządzenia wyjściowego) oraz zapamiętywać w zmiennych stałe wartości parametrów, które będą później wielokrotnie wykorzystywane w raporcie.

Tagi PARAM mogą być również elementami tagów LINE . wówczas są one przeliczane dla każdej linii.

Dla wydruku definiowane są następujące parametry systemowe

| @PRINTER | nazwa urządzenia wyjściowego (np. LPT1, \KOMPUTER\DRUKARKA, C:\PLIK.TXT – jeżeli chcemy w wydruku zaszyć urządzenie wyjściowe). Możemy również zastosować drukowanie na drukarkę Windows służy do tego parametr dynamiczny ?@Hs100_NQ|Printer:''@?. | | --- | --- | | @VIEWER | nazwa programu służącego do podglądu wydruku, domyślnie jest to „notepad.exe” . | | @CODEPAGE | sposób kodowania polskich znaków na drukarce. Aktualnie dostępne wartości MAZOVIA, LATIN i EMULATOR (oznacza tworzenie polskiej litery poprzez wydrukowanie litery łacińskiej, cofnięcie karetki i wydrukowanie ogonka lub akcentu). Ustawienie tego parametru inicjalizuje wartość parametrów @INPUTCODE i @OUTPUTCODE. Domyślnie wartość pusta, oznaczająca brak przekodowania. Zagadnienie dotyczące przekodowania polskich liter omówione jest szczegółowo dalej. | | @INPUTCODE | tekst wejściowy dla algorytmu przekodowania polskich liter. Inicjalizowany zgodnie z parametrem @CODEPAGE. | | @OUTPUTCODE | tekst wyjściowy dla algorytmu przekodowania polskich liter. Inicjalizowany zgodnie z parametrem @CODEPAGE. | | @PRINTERTYPE | typ drukarki. Aktualnie dostępne wartości to EPSON i PCL. Powodują ustalenie kodów sterujących dla drukarki (w szczególności tryby zagęszczone i pogrubione) | | @FONT_NARROW | kod przełączenia drukarki w tryb czcionki zagęszczonej. Inicjalizowany zgodnie z ustawieniem parametru @PRINTERTYPE | | @FONT_NARROW_ | kod końca tryby czcionki zagęszczonej. Inicjalizowany zgodnie z ustawieniem parametru @PRINTERTYPE | | @FONT_BOLD | kod przełączenia drukarki w tryb czcionki pogrubionej. Inicjalizowany zgodnie z ustawieniem parametru @PRINTERTYPE | | @FONT_BOLD_ | kod końca trybu czcionki pogrubionej. Inicjalizowany zgodnie z ustawieniem parametru @PRINTERTYPE | | @CR | znak cofnięcia karetki do początku strony (domyślnie znak o kodzie 13) | | @LF | znak przejścia do nowej linii (domyślnie znak o kodzie 10) | | @FF | znak końca strony (domyślnie znak o kodzie 12) | | @BS | znak cofnięcia karetki o jeden znak (domyślnie znak o kodzie 8) | | @PAGENO | numer strony | | @PAGETOT | łączna liczba stron wydruku | | @LINENO | numer linii na stronie | | @PAGELENGTH | liczba wierszy na stronie (domyślnie 60) |

LINE | L

Tag ten zawiera definicję wyglądu linii oraz (opcjonalnie) definicje parametrów. Przy przetwarzaniu tagu LINE najpierw obliczane są parametry zdefiniowane dla danej linii, a następnie na podstawie zawartości tagów FIELD tworzony jest .wygląd. linii na wydruku. Po przetworzeniu tagu LINE do pliku wynikowego dodawany jest automatycznie znak nowej linii

FIELD | F

Tag FIELD zawiera definicję pojedynczego pola w drukowanej linii. Tag ten może posiadać następujące atrybuty:

name Jeżeli atrybut nazwa jest ustawiony, to pole jest traktowane tak jak parametr, tzn. wartość aktualnie drukowanego pola jest zapamiętywana jako zmienna
type Typ pola. Dopuszczalne wartości to text i number (domyślnie text). Od ustawienia typu pola zależy jego formatowanie, wyrównywanie itp.
value Wartość pola. Może być podana jako wartość (jeżeli calc=”false”) lub jako wyrażenie (jeżeli calc=”true”)
align Sposób wyrównania pól. Dopuszczalne wartości to left, right i center (domyślnie: brak wyrównania dla tekstu i wyrównanie do prawej dla liczb)
width Szerokość pola.
prec Dla pól typu number oznacza liczbę miejsc po przecinku.
calc Określa, czy value zawiera wartość (calc=”false”) czy wyrażenie (calc=”true”)
fill Znak dopełniający pole do pełnej szerokości podanej w width. Domyślnie spacja.
hide Jeżeli hide=”true” to pole jest ukrywane
hidezero Jeżeli hidezero=”true” to dla pól typu number ukrywane są nieznaczące miejsca po przecinku (w ich miejsce pojawia się spacja)
blankzero Jeżeli blankzero=”true” to pola typu number o wartości 0 są ukrywane.

Uwaga

Wszędzie tam gdzie parametr może przyjmować wartości true lub false możliwe jest również wprowadzanie wyrażeń. Poniższy przykład ilustruje sposób wydrukowania pola tylko na ostatniej stronie:



Parametry systemowe a typ drukarki

W poniższym rozdziale zostaną omówione kwestie ustalania kodów sterujących dla drukarek oraz przekodowania polskich liter.

Ustawienie typu drukarki

Obecnie program drukujący potrafi obsługiwać 2 standardy drukarek: EPSON (drukarki igłowe) oraz PCL (większość drukarek atramentowych i laserowych). Ustalenie typu drukarki jest niezbędne ze względu właściwą obsługę kodów sterujących drukarki, w szczególności przełączania pisma na pogrubione i zawężone.

Jeżeli drukarka wymaga innych kodów sterujących, można to osiągnąć poprzez ustawienie parametrów:

Przykładowo, ustawienie kodów równoważnych dla trybu EPSON można uzyskać poprzez wpisanie:

Natomiast ustawienie kodów równoważnych dla trybu PCL można uzyska poprzez wpisanie:

Ustawienie standardu polskich liter

Obecnie program drukujący potrafi obsługiwać polskie litery w standardach Mazovia i Latin oraz emulować polskie litery poprzez wydruk litery łacińskiej i dodanie do niej akcentu czy ogonka.

Jeżeli drukarka obsługuje polskie litery w jakimś innym standardzie, można uzyskać wydruki poprzez ustalenie wartości parametrów:

Przykładowo, aby uzyskać przekodowanie polskich liter na litery łacińskie (wydruk bez polskich liter) należałoby wpisać:

Przykład definicji wydruku

Zasady budowania definicji wydruku zostaną omówione na przykładzie wydruku Faktury sprzedaży. Przykład ten został wybrany na względu na stosunkowo prostą formę wydruku oraz powszechność w użyciu. Definicja tego wydruku jest w standardowej bazie wydruków programu. W niniejszym biuletynie omówimy tylko ciekawsze fragmenty formatu wydruku.

Projektowanie wydruku

Dla potrzeb sprawnego wykonania wydruku należy wcześniej dokładnie zaplanować jego wygląd. Ze względu na to, że na wydrukach tekstowych wyrównanie kolumn uzyskuje się przez dobór ich szerokości (liczonej w znakach) szczególnie ważne jest zaplanowanie rozkładu poszczególnych pól na wydruku. Do potrzeb wydruku przyjęto, że na stronie mieści się 80 znaków w trybie normalnym oraz 133 znaki w trybie zagęszczonym.

Sekcja SQL

Sekcja SQL zawiera pięć zapytań – tak więc do „pierwotnego” pliku XML zostanie podstawionych pięć recordsetów.

Select Frm_Nazwa1, Frm_Nazwa2, Frm_Nazwa3, Frm_KodP+’ ‘+Frm_Miasto As Frm_Miasto, Frm_Ulica, ‘NIP: ‘+ Frm_NIP As Frm_Nip From CDN.Firma where Frm_GIDNumer=1

Powyższe zapytanie wyciąga dane firmy (pieczątkę firmy) z odpowiedniej tabeli.

exec CDN.wydrTabelkaPlatnosciIVat ??_QFiltr

Powyższe zapytanie wyciąga tabelkę płatności oraz vat dla danego dokumentu. Jak widzimy w sekcji SQL oprócz zapytania SELECT możemy również wywołać procedurę serwerową – klauzula EXEC (EXECUTE).

Uwaga

Aby wydruk z procedurą serwerową wykonał się poprawnie, rola ERPRaport musi mieć prawa wykonywania tej procedury. Dla naszej przykładowej procedury:

CDN.wydrTabelkaPlatnosciIVat

należałoby dodatkowo wykonać poniższe zapytanie:

GRANT EXECUTE ON CDN.wydrTabelkaPlatnosciIVat TO CDNRaport

Zastosowanie w sekcji parametrów procedury wyrażenia ??_QFiltr spowoduje podstawienie w jego miejsce filtru przekazanego z listy (a więc wydruk będzie zawierał dokładnie płatności i tabelę VAT dla wybranego dokumentu). Użycie wywołania wyrażenia ??_QFiltr było możliwe dzięki temu, że we wcześniejszym zapytaniu (w sekcji WHERE klauzuli SQL) użyliśmy deklaracji tego parametru ?@H200_NQ|Filtr:’’@?. Warto zwrócić uwagę, że parametr dynamiczny został wywołany z opcją H, co spowoduje, że użytkownik nie będzie monitowany o podanie jego wartości (parametr zostanie przekazany z aplikacji). Kolejną opcją, na którą warto zwrócić uwagę to opcja NQ w deklaracji parametru i Q (brak N w tej opcji) w wywołaniu tego parametru. Oznacza ona, że przekazany filtr nie będzie otaczany apostrofami (NQ) lub będzie (Q).

Sekcja XSL

Początkowy fragment definicji, tzn.

<xsl:value-of disable-output-escaping=”yes” select=”string(‘<?xml version="1.0"

encoding="windows-1250"?>’)”/>

można w zasadzie uznać za stały. Ustala on sposób przetwarzania „wejściowego” pliku XML oraz ustawia nagłówek pliku wyjściowego. Następnie rozpoczyna się właściwa deklaracja definicji wydruku.

RAPORT

W tagu RAPORT jest ustalonych kilka tagów PARAM (a więc zdefiniowanych kilka zmiennych raportu). Ich znaczenie jest następujące:

Poniższe 3 tagi zawierają ustawienia wartości parametrów systemowych, powodujące ustalenie portu wydruku jako LPT1, typu drukarki jako EPSON i standardu polskich liter na drukarce jako MAZOVIA

Kolejny tag:

powoduje wykonanie template dla recordsetu 1. Są z nim związane następujące dalsze fragmenty w definicji:

Cały ten zabieg powoduje podstawienie wartości pól odczytanych z pierwszego recordsetu do odpowiednich parametrów.

Uwaga

W powyższej definicji xsl:template należy zwrócić uwagę na to, żeby we fragmencie Frm_Nazwa1 to nazwa kolumny z zapytania SQL i jest ona identyczna (ważne duże, małe litery) !

RPT_HEADER

W tagu RPT_HEADER znajduje się pieczątka firmy, dane faktury (numer, data wystawienia, data sprzedaży, numer konta bankowego, dane kontrahentów itp.). Informacje te będą drukowane tylko na pierwszej stronie wydruku.

Zawiera on kilkanaście tagów L [LINE] . tak więc nagłówek raportu będzie liczył tyleż linii.

Omówimy tylko kilka linii na które należy zwrócić uwagę:

W powyższej linii na wydruku będzie wydrukowane

+-Sprzedawca:—————————+ Faktura VAT

Czyli na 42 znakach (width=”42”) zostanie wydrukowany tekst „+-Sprzedawca” (zawartość atrybutu value), 30 znaków minus – (minus bo atrybut fill=”-“, 30 bo 42-12 gdzie 42 to wartość atrybutu width, a 12 to długość stringu w wartości atrybutu value). Jest to pierwsze pole w linii. Drugie pole to + i cztery spacje, następne pole to pogrubiony napis Faktura VAT (dzięki wstawieniu znaków sterujących zapisanych w parametrze @FONT_BOLD). Następne linie będą drukowane fontem normalny, ponieważ został wstawiony znacznik końca fontu pogrubionego (@FONT_BOLD_).

W powyższej linii mamy wstawioną nazwę firmy na długości 40 znaków otoczonej znakami |. Nazwa firmy znajduje się w parametrze @FRM_NAZWA1, którego wartość brana jest z zapytania SQL omawianego w sekcji SQL.

Powyższa linia zawiera drugi człon nazwy kontrahenta głównego (nabywca) oraz docelowego (odbiorca). Warto zwrócić uwagę na atrybut hide, który steruje wyświetlaniem tej linii. Linia ta będzie drukowana wtedy, gdy jedna z wartości @NAB_NAZWA2 lub @ODB_NAZWA2 będzie niepusta, czyli jeżeli na odpowiednich adresach kontrahentów będą wypełnione drugie pola w nazwie kontrahenta. Dzięki temu unikniemy „pustych” linii na wydruku.

PG_HEADER

Kolejnym tagiem jest PG_HEADER. Zawiera on 3 tagi L [LINE], tak więc nagłówek strony będzie liczył 3 linie, które są nagłówkiem tabelki z pozycjami faktury.

DETAIL

Kolejny tag DETAIL zawiera pozycje faktury. Do jego wygenerowania wykorzystany jest template tworzący linię dla każdego wiersza z recordsetu czwartego

i dalej

…..

Każda pozycja na fakturze generuje na wydruku jedną linię. W ramach tej linii obliczane są pewne zmienne oraz drukowane pola.

RPT_FOOTER

RPT_FOOTER zawiera podsumowanie całego wydruku, czyli tabelkę płatności, tabelkę VAT, kwotę dokumentu itp.

PG_FOOTER

PG_FOOTER zawiera dolne obramowanie tabelki pozycji faktury, stronę wydruku oraz informuje o nazwie programu, z którego powstał wydruk.

Proszę zwrócić uwagę, że linia, która jest obramowaniem tabelki pozycji drukowana na ostatniej stronie wygląda inaczej niż linia drukowana na innych stronach (ze względów estetycznych, na ostatniej stronie, linia ta stanowi równocześnie górne obramowanie tabelki z płatności i vat). Zostało to uzyskane przez wykorzystanie atrybutu hide.

Warto zaznaczyć również, że numer strony w stopce strony nie drukowany jest na pierwszej stronie tylko na każdej następnej (warunek @@PAGENO==1). Na pierwszej stronie, drukowany jest w nagłówku raportu RPT_HEADER

Sekcja FILE

Sekcja FILE nie została wypełniona „pomocniczy” plik XML będzie więc zapisywany do katalogu TEMP.

Jeżeli w sekcji file wpiszemy np. C:\FS.XML to zostanie stworzony plik XML wygenerowany poprzez wydruk XML, jest to plik będący bezpośrednio działaniem mechanizmu wydruków XML i jest on poddawany dalszej obróbce przez program PrintTXT.

W ramach testów mechanizmu wydruków można taki plik wygenerować i zobaczyć jego strukturę.

Sekcja RUN

Sekcja RUN zawiera wywołanie programu PrintTXT.EXE, przetwarzającego plik XML na plik tekstowy wysyłany do drukarki.

Wymagania systemowe

Wymagania systemowe dla poprawnego działania systemu ERP XL zostały opisane w dokumencie Wymagania Minimalne Systemu do aktualnej wersji…

Dodatkowo dla poprawnego działania wydruków tekstowych konieczne są komponenty:

Wersje instalacyjne powyższych komponentów oraz więcej informacji na ich temat można znaleźć w lokalizacji:

http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp

Drukowanie tekstowe w usługach terminalowych

Program printtxt.exe który obsługuje drukowanie txt nie pozwala na drukowanie gdy program XL pracuje w usługach terminalowych na drukarki zmapowane w sesji terminalowej. Do obsługi drukowania na drukarkach mapujących się w usługach terminalowych wykorzystano drukowania porze kanału wirtualne. Aby móc drukować wydruki txt w takim środowisku należy:

+ Mam problem z tym tematem Otwórz w portalu bazy wiedzy »