XL012 – Wydruki tekstowe

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:

<ROOT>

<RECORDSET1>

<RECORD NazwaKolumny1=”wartość kolumny 1” NazwaKolumny2=”wartość kolumny 2” …/>

<RECORD NazwaKolumny1=”wartość kolumny 1” NazwaKolumny2=”wartość kolumny 2” …/>

</RECORDSET1>

<RECORDSET2>

<RECORD NazwaKolumny1=”wartość kolumny 1” NazwaKolumny2=”wartość kolumny 2” …/>

<RECORD NazwaKolumny1=”wartość kolumny 1” NazwaKolumny2=”wartość kolumny 2” …/>

</RECORDSET2>

</ROOT>

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.

<RECORD Knt_GIDNumer=”1” Knt_Kod=”COMARCH” />

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:

  • do przekazywania parametrów dynamicznych wydruku (np. filtr aplikacji, opis wydruku itp.),
  • do wywoływania okienka z parametrami, które do wydruku przekazuje użytkownik.

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

<ROOT> <!– one, req –>

<RAPORT> <!– many, req –>

<PARAM/> <!– many, opt –>

<RPT_HEADER> <!– one, opt –>

<LINE> <!– many, opt –>

<PARAM/> <!– many, opt –>

<FIELD/> <!– many, opt –>

</LINE>

</RPT_HEADER>

<PG_HEADER> <!– one, opt –>

<LINE> <!– many, opt –>

<PARAM/> <!– many, opt –>

<FIELD/> <!– many, opt –>

</LINE>

</PG_HEADER>

<DETAIL> <!– many, req –>

<LINE> <!– many, req –>

<PARAM/> <!– many, opt –>

<FIELD/> <!– many, opt –>

</LINE>

</DETAIL>

<PG_FOOTER> <!– one, opt –>

<LINE> <!– many, opt –>

<PARAM/> <!– many, opt –>

<FIELD/> <!– many, opt –>

</LINE>

</PG_FOOTER>

<RPT_FOOTER> <!– one, opt –>

<LINE> <!– many, opt –>

<PARAM/> <!– many, opt –>

<FIELD/> <!– many, opt –>

</LINE>

</RPT_FOOTER>

</RAPORT>

</ROOT>

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.

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

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:

namenazwa parametru
typetyp 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
valuewartość parametru
calcprzyjmuje 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

@PRINTERnazwa 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:''@?.
@VIEWERnazwa programu służącego do podglądu wydruku, domyślnie jest to „notepad.exe” .
@CODEPAGEsposó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.
@INPUTCODEtekst wejściowy dla algorytmu przekodowania polskich liter. Inicjalizowany zgodnie z parametrem @CODEPAGE.
@OUTPUTCODEtekst wyjściowy dla algorytmu przekodowania polskich liter. Inicjalizowany zgodnie z parametrem @CODEPAGE.
@PRINTERTYPEtyp 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_NARROWkod 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_BOLDkod 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
@CRznak cofnięcia karetki do początku strony (domyślnie znak o kodzie 13)
@LFznak przejścia do nowej linii (domyślnie znak o kodzie 10)
@FFznak końca strony (domyślnie znak o kodzie 12)
@BSznak cofnięcia karetki o jeden znak (domyślnie znak o kodzie 8)
@PAGENOnumer strony
@PAGETOTłączna liczba stron wydruku
@LINENOnumer linii na stronie
@PAGELENGTHliczba 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:

nameJeżeli atrybut nazwa jest ustawiony, to pole jest traktowane tak jak parametr, tzn. wartość aktualnie drukowanego pola jest zapamiętywana jako zmienna
typeTyp pola. Dopuszczalne wartości to text i number (domyślnie text). Od ustawienia typu pola zależy jego formatowanie, wyrównywanie itp.
valueWartość pola. Może być podana jako wartość (jeżeli calc=”false”) lub jako wyrażenie (jeżeli calc=”true”)
alignSposó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)
widthSzerokość pola.
precDla pól typu number oznacza liczbę miejsc po przecinku.
calcOkreśla, czy value zawiera wartość (calc=”false”) czy wyrażenie (calc=”true”)
fillZnak dopełniający pole do pełnej szerokości podanej w width. Domyślnie spacja.
hideJeżeli hide=”true” to pole jest ukrywane
hidezeroJeżeli hidezero=”true” to dla pól typu number ukrywane są nieznaczące miejsca po przecinku (w ich miejsce pojawia się spacja)
blankzeroJeż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:

<LINE>
<FIELD value=”napis na stronie” hide=”@@PAGENO!=@@PAGETOT” />
</LINE>

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:

  • @FONT_NARROW
  • @FONT_NARROW_
  • @FONT_BOLD
  • @FONT_BOLD_ 

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

<PARAM calc=”true” type=”text” name=”@FONT_NARROW” value=”String.fromCharCode(15)”/>

<PARAM calc=”true” type=”text” name=”@FONT_NARROW_” value=”String.fromCharCode(18)”/>

<PARAM calc=”true” type=”text” name=”@FONT_BOLD” value=”String.fromCharCode(14)”/>

<PARAM calc=”true” type=”text” name=”@FONT_BOLD_” value=”String.fromCharCode(20)”/>

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

<PARAM calc=”true” type=”text” name=”@FONT_NARROW” value=”String.fromCharCode(27)+’&k2S'”/>

<PARAM calc=”true” type=”text” name=”@FONT_NARROW_” value=”String.fromCharCode(27)+’&k0S'”/>

<PARAM calc=”true” type=”text” name=”@FONT_BOLD” value=”String.fromCharCode(27)+'(s7B'”/>

<PARAM calc=”true” type=”text” name=”@FONT_BOLD_” value=”String.fromCharCode(27)+'(s0B'”/>

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:

  • @INPUTCODE lista polskich znaków w standardzie Windows, oddzielonych znakami |
  • @OUTPUTCODE lista polskich znaków w standardzie drukarki, oddzielonych znakami |

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

<PARAM type=”text” name=”@INPUTCODE” value=”Ą|ą|Ć|ć|Ę|ę|Ł|ł|Ń|ń|Ó|ó|Ś|ś|Ź|ź|Ż|ż|”/>

<PARAM type=”text” name=”@OUTPUTCODE” value=”A|a|C|c|E|e|L|l|N|n|O|o|S|s|Z|z|Z|z|”/>

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:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” version=”1.0″>

<xsl:output method = “xml” omit-xml-declaration=”yes”/>

<xsl:preserve-space elements=”*”/>

<xsl:template match=”/”>

<xsl:for-each select=”ROOT”>

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

encoding=&quot;windows-1250&quot;?&gt;’)”/>

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

<PARAM type=”text” name=”@PRINTER” value=”LPT1″/>

<PARAM type=”text” name=”@PRINTERTYPE” value=”EPSON”/>

<PARAM type=”text” name=”@CODEPAGE” value=”MAZOVIA”/>

Kolejny tag:

<xsl:apply-templates select=”RECORDSET1″/>

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

<xsl:template match=”RECORD” mode=”r1″>

<P type=”text” name=”FRM_NAZWA1″><xsl:attribute name=”value”><xsl:value-of select=”@Frm_Nazwa1″ /></xsl:attribute></P>

<P type=”text” name=”FRM_NAZWA2″><xsl:attribute name=”value”><xsl:value-of select=”@Frm_Nazwa2″ /></xsl:attribute></P>

<P type=”text” name=”FRM_NAZWA3″><xsl:attribute name=”value”><xsl:value-of select=”@Frm_Nazwa3″ /></xsl:attribute></P>

<P type=”text” name=”FRM_ULICA” ><xsl:attribute name=”value”><xsl:value-of select=”@Frm_Ulica” /></xsl:attribute></P>

<P type=”text” name=”FRM_MIASTO”><xsl:attribute name=”value”><xsl:value-of select=”@Frm_Miasto” /></xsl:attribute></P>

<P type=”text” name=”FRM_NIP” ><xsl:attribute name=”value”><xsl:value-of select=”@Frm_Nip” /></xsl:attribute></P>

</xsl:template>

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 <xsl:value-of select=”@Frm_Nazwa1″ /> 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ę:

<L>

<F value=”+-Sprzedawca:” width=”42″ fill=”-“/>

<F value=”+” width=”5″/>

<F calc=”true” value=”@@FONT_BOLD”/>

<F value=”Faktura VAT”/>

<F calc=”true” value=”@@FONT_BOLD_”/>

</L>

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_).

<L>

<F value=”|” width=”2″/>

<F calc=”true” value=”@FRM_NAZWA1″ width=”40″/>

<F value=”|”/>

</L>

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.

<L hide=”!(@NAB_NAZWA2!=” || @ODB_NAZWA2!=”)”>

<F calc=”true” value=”@NAB_NAZWA2″ width=”60″/>

<F calc=”true” value=”@ODB_NAZWA2″ width=”60″/>

</L>

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

<DETAIL>

<xsl:apply-templates select=”RECORDSET4″/>

</DETAIL>

i dalej

<xsl:template match=”RECORDSET4″>

<xsl:apply-templates select=”RECORD” mode=”r4″/>

</xsl:template>

<xsl:template match=”RECORD” mode=”r4″>

…..

</xsl:template>

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

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

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.

<L><F value=”+—-+————+——————————————–+—————–+————–+—–+————–+————–+” hide=”@@PAGENO==@@PAGETOT”/></L>

<L/>

<L hide=”@@PAGENO==1″>

<F value=”Strona:” width=”10″/>

<F calc=”true” value=”@@PAGENO” width=”3″ type=”number”/>

<F value=”/”/>

<F calc=”true” value=”@@PAGETOT” width=”3″ type=”number”/>

<F value=”CDN XL (C) COMARCH S.A.” align=”right” width=”120″/>

</L>

<L hide=”@@PAGENO!=1″><F value=”ERP XL (C) COMARCH S.A.” align=”right” width=”133″/></L>

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:

  • Microsoft Windows Script
  • Microsoft Windows Script Control

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:

  • W konfiguracji Stanowiska w zakładce Wydruki i wykresy zaznaczyć parametrWydruki tekstowe przez kanał wirtualny
  • Zainstalować na komputerze gdzie podłączone są drukarki i gdzie uruchamia się klienta połączenia terminalowego program: PrintTxtDVC.exe który znajduje się w katalogu XL-a

 

 

Czy ten artykuł był pomocny?