票據(jù)打印方法和系統(tǒng)的制作方法
【專(zhuān)利摘要】本發(fā)明涉及一種票據(jù)打印方法和系統(tǒng)。根據(jù)該方法:獲得一可擴(kuò)展標(biāo)記語(yǔ)言格式的打印模板,該打印模板包括唯一的根元素和可由該根元素引用的多個(gè)子元素,該多個(gè)子元素包括文本子元素和數(shù)據(jù)項(xiàng)子元素;該根元素包含第一屬性,用于描述該票據(jù)的匯總信息應(yīng)當(dāng)關(guān)聯(lián)的一匯總表,該文本子元素為票據(jù)上呈現(xiàn)的固定格式信息,該數(shù)據(jù)項(xiàng)子元素用于從該數(shù)據(jù)表索引數(shù)據(jù);其中該數(shù)據(jù)表與該打印模板是分離的。解析該根元素和各個(gè)子元素,并根據(jù)元素的屬性從匯總表和明細(xì)數(shù)據(jù)表中查詢(xún)數(shù)據(jù),構(gòu)造輸出至打印緩沖區(qū)的打印信息。在遍歷完所有子元素后,將該打印緩沖區(qū)中的打印信息流發(fā)往打印機(jī)。
【專(zhuān)利說(shuō)明】票據(jù)打印方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及打印設(shè)備,尤其是涉及一種票據(jù)打印系統(tǒng)及其方法。
【背景技術(shù)】
[0002]服務(wù)性機(jī)構(gòu)在交易過(guò)程中,通常會(huì)向客戶(hù)提供各種式樣的票據(jù),作為交易的憑證等。不同服務(wù)性行業(yè)或者不同的市場(chǎng)主體,針對(duì)自身需求以及不同的交易數(shù)據(jù)信息,向外提供的票據(jù)格式不同。由于目前的打印系統(tǒng)不能適用于各類(lèi)場(chǎng)景,針對(duì)不同場(chǎng)景或者更改打印機(jī)型號(hào)的時(shí)候,需要定制軟件,這將導(dǎo)致軟件維護(hù)成本大大增加、提高軟件管理復(fù)雜度。
[0003]本發(fā)明旨在統(tǒng)一打印軟件,降低軟件開(kāi)發(fā)維護(hù)成本,有效解決各類(lèi)應(yīng)用系統(tǒng)打印票據(jù)格式多變的難題。
【發(fā)明內(nèi)容】
[0004]本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種票據(jù)打印方法和系統(tǒng)。
[0005]本發(fā)明為解決上述技術(shù)問(wèn)題而采用的技術(shù)方案是本發(fā)明提出一種票據(jù)打印方法,包括以下步驟:
[0006]獲得一可擴(kuò)展標(biāo)記語(yǔ)言格式的打印模板,該打印模板包括唯一的根元素和可由該根元素引用的多個(gè)子元素,該多個(gè)子元素包括文本子元素和數(shù)據(jù)項(xiàng)子元素;該根元素包含第一屬性,用于描述該票據(jù)的匯總信息應(yīng)當(dāng)關(guān)聯(lián)的一匯總表,該文本子元素為票據(jù)上呈現(xiàn)的固定格式信息,該數(shù)據(jù)項(xiàng)子元素用于從該數(shù)據(jù)表索引數(shù)據(jù);其中該數(shù)據(jù)表與該打印模板是分離的;
[0007]初始化打印緩沖區(qū),解析該打印文檔的根元素,獲得該根元素的該第一屬性以根據(jù)該第一屬性查詢(xún)?cè)搮R總表;
[0008]解析該打印模板的各個(gè)子元素,包括:
[0009]當(dāng)該子元素是文本子元素時(shí),將該文本子元素直接保存至打印緩沖區(qū);以及
[0010]當(dāng)該子元素是數(shù)據(jù)項(xiàng)子元素時(shí),查詢(xún)?cè)搮R總表以獲得數(shù)據(jù),并據(jù)此構(gòu)造用于輸出至該打印緩沖區(qū)的打印信息;
[0011]如果該根元素的所有子元素已經(jīng)遍歷完,將該打印緩沖區(qū)中的打印信息流發(fā)往打印機(jī)。
[0012]在本發(fā)明的一實(shí)施例中,該匯總表是保存于一數(shù)據(jù)庫(kù),且根據(jù)該第一屬性查詢(xún)?cè)搮R總表的步驟包括,根據(jù)該第一屬性構(gòu)造一數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,以查詢(xún)?cè)摂?shù)據(jù)庫(kù)中的匯總表。
[0013]在本發(fā)明的一實(shí)施例中,該多個(gè)子元素還包括循環(huán)子元素,該循環(huán)子元素引用一個(gè)或多個(gè)需要循環(huán)處理的子元素,所述一個(gè)或多個(gè)需要循環(huán)處理的子元素至少包括數(shù)據(jù)項(xiàng)子元素,且該循環(huán)子元素包含第二屬性,用于描述該票據(jù)的明細(xì)信息應(yīng)當(dāng)關(guān)聯(lián)的一明細(xì)表。
[0014]在本發(fā)明的一實(shí)施例中,上述一個(gè)或多個(gè)需要循環(huán)處理的子元素還包括文本子元素。
[0015]在本發(fā)明的一實(shí)施例中,在解析該打印模板的多個(gè)子元素時(shí),當(dāng)該子元素是循環(huán)子元素時(shí),獲取該循環(huán)子元素的該第二屬性以根據(jù)該第二屬性查詢(xún)?cè)撁骷?xì)表,并將該循環(huán)子元素作為根節(jié)點(diǎn)依次遍歷其下所有子節(jié)點(diǎn)以組織用于輸出至該打印緩沖區(qū)的打印信息。
[0016]在本發(fā)明的一實(shí)施例中,該明細(xì)表與該打印模板是分離的。
[0017]在本發(fā)明的一實(shí)施例中,該明細(xì)表是保存于一數(shù)據(jù)庫(kù),且根據(jù)該第二屬性查詢(xún)?cè)撁骷?xì)表的步驟包括,根據(jù)該第二屬性構(gòu)造一數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,以查詢(xún)?cè)摂?shù)據(jù)庫(kù)中的明細(xì)表。
[0018]在本發(fā)明的一實(shí)施例中,上述的子元素還包括打印控制子元素,該打印控制子元素包含用于實(shí)施以下操作的打印命令:更改打印字體大小、行列間距、控制換行走紙。
[0019]在本發(fā)明的一實(shí)施例中,在解析該打印模板的各個(gè)子元素時(shí),當(dāng)該子元素是打印控制子元素時(shí),獲取該打印控制子元素的屬性,并輸出至該打印緩沖區(qū)。
[0020]在本發(fā)明的一實(shí)施例中,該打印控制子元素標(biāo)記該打印命令為16進(jìn)制數(shù)值。
[0021]在本發(fā)明的一實(shí)施例中,該數(shù)據(jù)項(xiàng)子元素包含用于索引該匯總表或該明細(xì)表中對(duì)應(yīng)數(shù)據(jù)的字段名。
[0022]在本發(fā)明的一實(shí)施例中,該數(shù)據(jù)項(xiàng)子元素包含格式屬性和/或?qū)R屬性。
[0023]在本發(fā)明的一實(shí)施例中,上述方法還包括預(yù)存該打印模板于一打印系統(tǒng)中。
[0024]在本發(fā)明的一實(shí)施例中,上述方法還包括接收對(duì)該打印模板的編輯。
[0025]本發(fā)明還提出一種票據(jù)打印系統(tǒng),包括:
[0026]用于獲得一可擴(kuò)展標(biāo)記語(yǔ)言格式的打印模板的裝置,該打印模板包括唯一的根元素和可由該根元素引用的多個(gè)子元素,該多個(gè)子元素包括文本子元素和數(shù)據(jù)項(xiàng)子元素;該根元素包含第一屬性,用于描述該票據(jù)的匯總信息應(yīng)當(dāng)關(guān)聯(lián)的一匯總表,該文本子元素為在票據(jù)上呈現(xiàn)的固定格式信息,該數(shù)據(jù)項(xiàng)子元素用于從該匯總表索引數(shù)據(jù);其中該匯總表與該打印模板是分離的;
[0027]用于初始化打印緩沖區(qū),解析該打印模板的根元素,獲得該根元素的該第一屬性以根據(jù)該第一屬性查詢(xún)?cè)搮R總表的裝置;
[0028]用于解析該打印模板的各個(gè)子元素的裝置,其中:當(dāng)該子元素是文本子元素時(shí),將該文本子元素直接保存至該打印緩沖區(qū);以及當(dāng)該子元素是數(shù)據(jù)項(xiàng)子元素時(shí),查詢(xún)?cè)搮R總表以獲得數(shù)據(jù),并據(jù)此構(gòu)造用于輸出至該打印緩沖區(qū)的打印信息。
[0029]本發(fā)明由于采用以上技術(shù)方案,使之與現(xiàn)有技術(shù)相比,具有如下顯著優(yōu)點(diǎn):單一的XML模板文件,既標(biāo)識(shí)了打印格式,又包含了交易數(shù)據(jù)項(xiàng),使用非常方便,程序處理高效。由于模板直觀,所見(jiàn)即所得,因此本發(fā)明把定制復(fù)雜打印格式的過(guò)程,簡(jiǎn)化成了文本文件的編輯。其次,本發(fā)明標(biāo)準(zhǔn)化了打印軟件,可適用于各類(lèi)文本信息的打印,避免了各類(lèi)應(yīng)用系統(tǒng)開(kāi)發(fā)過(guò)程中,因不同行業(yè)、不同客戶(hù)導(dǎo)致的軟件定制,節(jié)省了軟件開(kāi)發(fā)維護(hù)成本。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0030]為讓本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能更明顯易懂,以下結(jié)合附圖對(duì)本發(fā)明的【具體實(shí)施方式】作詳細(xì)說(shuō)明,其中:
[0031]圖1為以批發(fā)市場(chǎng)的交易票據(jù)為優(yōu)選樣例展示的遵循本發(fā)明實(shí)施例的打印格式協(xié)議的票據(jù)模板樣例。
[0032]圖2A、2B為對(duì)應(yīng)于圖1的匯總、明細(xì)數(shù)據(jù)表樣例。
[0033]圖3為圖1所示樣例模板結(jié)合圖2所示的數(shù)據(jù)表,解析后生成的票據(jù)樣例。[0034]圖4展示了本發(fā)明一實(shí)施例的軟件模塊框架圖。
[0035]圖5展示了根據(jù)本發(fā)明一實(shí)施例的打印模板文件的解析及打印流程。
【具體實(shí)施方式】
[0036]本發(fā)明所提出的票據(jù)打印方法,充分利用了 XML標(biāo)記的可擴(kuò)展性,定義了一種適合票據(jù)打印的格式協(xié)議。利用格式協(xié)議,可以創(chuàng)建適合各類(lèi)應(yīng)用要求的打印模板。解析打印模板,關(guān)聯(lián)查找數(shù)據(jù)庫(kù),即可獲得待輸出的打印流。由此,只需利用一個(gè)打印軟件即可滿(mǎn)足各類(lèi)應(yīng)用的需求。
[0037]可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Language, XML)是一種基于文本的標(biāo)記語(yǔ)言,用途極為廣泛。本發(fā)明的實(shí)施例充分利用了 XML標(biāo)記的可擴(kuò)展性,自定義了適合文本打印的格式協(xié)議。
[0038]數(shù)據(jù)庫(kù)(Database)是按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù)。SQL(Structured Query Language)結(jié)構(gòu)化查詢(xún)語(yǔ)言,是一種國(guó)際化數(shù)據(jù)庫(kù)查詢(xún)和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢(xún)、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。本發(fā)明的實(shí)施例直接將XML文件與數(shù)據(jù)表(視圖)關(guān)聯(lián),獲取打印實(shí)體數(shù)據(jù)信息,從而可規(guī)避不同行業(yè)、不同客戶(hù)的數(shù)據(jù)差異,使得打印軟件統(tǒng)一,適用面廣。
[0039]一般待打印的業(yè)務(wù)信息,可以分成兩大類(lèi),匯總信息及明細(xì)信息。例如,一筆交易,只有一個(gè)賣(mài)方、一個(gè)買(mǎi)方、一個(gè)匯總金額。但一筆交易可以包含多個(gè)商品的買(mǎi)賣(mài),如一次性購(gòu)置三種商品:蘋(píng)果、梨、葡萄,且三種商品的單價(jià)、成交金額不同。買(mǎi)賣(mài)方信息、總金額、交易日期時(shí)間、收銀員等可以作為匯總信息歸類(lèi);蘋(píng)果、梨、葡萄的單價(jià)及各自的成交金額可作為明細(xì)信息歸類(lèi)。為索引方便,匯總信息與明細(xì)信息可以用兩張不同的數(shù)據(jù)表(或視圖),即匯總表和明細(xì)表表示。然而可以理解的是,本發(fā)明并不以此為限。
[0040]在本發(fā)明實(shí)施例中,定義一個(gè)自由靈活的打印格式協(xié)議,以組織匯總信息及明細(xì)信息。組織這些匯總信息和明細(xì)信息的數(shù)據(jù)表與體現(xiàn)該打印格式協(xié)議的文檔是分離的。通常這些數(shù)據(jù)表保存在數(shù)據(jù)庫(kù)中。該打印格式協(xié)議可以從數(shù)據(jù)庫(kù)中查詢(xún)關(guān)聯(lián)的數(shù)據(jù)表,以獲得用于填充到打印文檔中的匯總信息或明細(xì)信息。一個(gè)匯總信息可與匯總表中的一條數(shù)據(jù)關(guān)聯(lián)。一個(gè)明細(xì)信息可以對(duì)應(yīng)明細(xì)表中的多條數(shù)據(jù)。
[0041]根據(jù)一實(shí)施例,打印格式協(xié)議為樹(shù)形結(jié)構(gòu),包括唯一的根元素和可由根元素引用的多個(gè)子元素。根元素可包含屬性,用于描述匯總信息應(yīng)當(dāng)關(guān)聯(lián)的數(shù)據(jù)表。子元素可包括根據(jù)打印需求而定義的各種元素。典型的子元素類(lèi)型包括文本子元素、數(shù)據(jù)項(xiàng)子元素、循環(huán)子元素、以及打印控制子元素等。
[0042]文本子元素為在票據(jù)上呈現(xiàn)的固定格式信息,比如標(biāo)題、備注文字、空格、制表符、換行等。文本子元素中的所有字符,將原封不動(dòng)地輸出至打印流,從而保證格式的清晰直觀。
[0043]數(shù)據(jù)項(xiàng)子元素用于從該匯總表或該明細(xì)表索引數(shù)據(jù),并在票據(jù)上呈現(xiàn)。數(shù)據(jù)項(xiàng)子元素將包含用于索引數(shù)據(jù)表中對(duì)應(yīng)數(shù)據(jù)的字段名。在一實(shí)施例中,可以使用與數(shù)據(jù)表一致的字段名來(lái)標(biāo)識(shí)具體數(shù)據(jù)項(xiàng)。另外,數(shù)據(jù)項(xiàng)子元素還可包含格式、對(duì)齊等屬性以標(biāo)識(shí)數(shù)據(jù)項(xiàng)的打印格式。
[0044]循環(huán)子元素用于引用一個(gè)或多個(gè)需要循環(huán)處理的子元素,例如數(shù)據(jù)項(xiàng)子元素、文本子元素、打印控制子元素等。循環(huán)子元素可包括一屬性,用于描述票據(jù)的明細(xì)信息應(yīng)當(dāng)關(guān)聯(lián)的明細(xì)表。循環(huán)子元素將循環(huán)查詢(xún)每條數(shù)據(jù),直到所有數(shù)據(jù)均被處理。循環(huán)子元素典型地包含一個(gè)或多個(gè)數(shù)據(jù)項(xiàng)子元素。這些數(shù)據(jù)項(xiàng)子元素中的一個(gè)或多個(gè)可能分別對(duì)應(yīng)數(shù)據(jù)表中的多條數(shù)據(jù)。
[0045]另外,打印格式協(xié)議還可包括打印控制子元素,其定義打印機(jī)的特殊控制格式,t匕如更改字體大小、行列間距、走紙等。打印控制子元素可直接被根元素引用,也可被循環(huán)子元素引用。
[0046]在本發(fā)明的實(shí)施例中,允許開(kāi)發(fā)者和使用者依據(jù)以上的打印格式協(xié)議制作合適的打印模板。例如,開(kāi)發(fā)者可在打印系統(tǒng)中預(yù)存一個(gè)或多個(gè)打印模板供使用者選擇。使用者也可以按需求自行編輯和保存打印模板。
[0047]模板的解析可從模板的根元素開(kāi)始,按順序及層次關(guān)系依次解析各子元素,結(jié)果輸出至打印緩沖區(qū)。模板元素的解析需嚴(yán)格遵循打印格式協(xié)議的要求。
[0048]下面描述基于XML協(xié)議的打印格式協(xié)議的范例。在此將格式化打印協(xié)議命名為XDTP:X表示模板樣式采用XML文件格式,D為database的縮寫(xiě),T表示模板template, P表示打印。
[0049]圖1為以批發(fā)市場(chǎng)的交易票據(jù)為優(yōu)選樣例,遵循本發(fā)明打印格式協(xié)議的票據(jù)模板樣例。如圖1所示,標(biāo)記101表示模板中的文本(text)子元素,其呈現(xiàn)票據(jù)中的固定樣式內(nèi)容。text子元素中的文字、空格、換行等可用于表示模板固定格式,模板解析器原封不動(dòng)地將text子元素內(nèi)容輸出至打印流。樣例中的題頭“朝陽(yáng)農(nóng)貿(mào)批發(fā)大市場(chǎng)”、橫線、雙橫線及“品名單價(jià)重量金額”等均為text子元素,通常text子元素在整個(gè)模板中的占比最大。
[0050]一般待打印的業(yè)務(wù)信息,可以分成兩大類(lèi),匯總信息及明細(xì)信息。例如,一筆交易,只有一個(gè)賣(mài)方、一個(gè)買(mǎi)方、一個(gè)匯總金額。但一筆交易可以包含多個(gè)商品的買(mǎi)賣(mài),如一次性購(gòu)置三種商品:蘋(píng)果、梨、葡萄,且三種商品的單價(jià)、成交金額不同。買(mǎi)賣(mài)方信息、總金額、交易日期時(shí)間、收銀員等可以作為匯總信息歸類(lèi);蘋(píng)果、梨、葡萄的單價(jià)及各自的成交金額可作為明細(xì)信息歸類(lèi)。匯總信息與明細(xì)信息用兩張不同的數(shù)據(jù)表(或視圖)表示。圖2A、2B為對(duì)應(yīng)于圖1的匯總、明細(xì)數(shù)據(jù)表樣例。
[0051]模板根元素的定義如下:
[0052]〈XDTP Table=” ” SqlSuffix=” …” >...</XDTP>
[0053]標(biāo)記102表示樣例模板中的根元素,模板文檔有且僅有一個(gè)根元素XDTP。Table屬性用于描述匯總信息應(yīng)當(dāng)關(guān)聯(lián)的數(shù)據(jù)表(或視圖),它是必要屬性。SqlSuffix在通用sql查詢(xún)語(yǔ)句后面附加后綴。比如 Table=” Trade”, SqlSuffix=” order by BillNo asc”,那么完整的 Sql 查詢(xún)語(yǔ)句為:select*from Trade order by BillNo asc。SqlSuffix 為可選屬性,查詢(xún)結(jié)果對(duì)應(yīng)一條記錄。若數(shù)據(jù)表(或視圖)不只一條記錄,那么可以通過(guò)where條件限制查找結(jié)果,條件可以作為外部的一個(gè)入?yún)ⅰ?br>
[0054]根為第一層,在根元素內(nèi)部的第二層元素,如數(shù)據(jù)項(xiàng)子元素,可以表示匯總表內(nèi)部的字段,如〈BillNo/〉直接表示圖2A所示交易匯總表中的BillNo字段。在根元素內(nèi)部出現(xiàn)的第二層元素, 包括text子元素,通常只輸出一遍。
[0055]如圖2B所示,明細(xì)信息會(huì)包含多項(xiàng)同類(lèi)數(shù)據(jù),例如產(chǎn)品名稱(chēng)(ProductName)、單價(jià)(Price)等,因此使用循環(huán)子元素來(lái)組織明細(xì)信息。[0056]舉例來(lái)說(shuō),循環(huán)子元素的定義如下:
[0057]〈For Table=” ” SqlSuffix=”〈/For〉
[0058]標(biāo)記103表示了樣例中以循環(huán)子元素組織的明細(xì)信息,F(xiàn)or意指循環(huán)處理,對(duì)于同一筆交易,明細(xì)表有多少條記錄,那么循環(huán)輸出多少次。Table與SqlSuffix的屬性含義與根元素相同。For元素內(nèi)部出現(xiàn)的數(shù)據(jù)項(xiàng)子元素,可一律表示明細(xì)表中的同名字段。在模板內(nèi)部允許出現(xiàn)多個(gè)For元素,但不允許For嵌套。
[0059]數(shù)據(jù)項(xiàng)子元素的定義如下:
[0060]〈Field Fmt=”...”Align=”...”Bar=”...,,/>
[0061]標(biāo)記104展示了樣例各數(shù)據(jù)項(xiàng)字段的定義,F(xiàn)ield為數(shù)據(jù)表字段,實(shí)際用字段名替代。Fmt屬性表示輸出長(zhǎng)度定義格式,為可選屬性。例如,F(xiàn)mt=” 10”表示數(shù)據(jù)項(xiàng)以普通字符串方式顯示,且長(zhǎng)度為10個(gè)有效字符,不夠用空格補(bǔ)足,超出部分則截尾;Fmt=”10.2”,表示數(shù)據(jù)項(xiàng)為數(shù)值,且有兩位小數(shù)。若一個(gè)數(shù)據(jù)項(xiàng)子元素未定義Fmt屬性,則表示按普通字符串方式顯示,有多少字符就輸出多少。Align屬性表示數(shù)據(jù)對(duì)齊方式,有兩種值left、right,表示左對(duì)齊、右對(duì)齊,默認(rèn)為左對(duì)齊,后補(bǔ)空格。若一個(gè)元素包含Align屬性,則必須有Fmt屬性。Fmt及Align屬性經(jīng)常用于表格對(duì)齊,不會(huì)因?yàn)閿?shù)據(jù)大小差異而導(dǎo)致上下文錯(cuò)位,從而達(dá)到美化打印的效果。
[0062]對(duì)于數(shù)值型字段,如果需要以條形碼方式展現(xiàn),可添加條碼(Bar)屬性,其值為打印機(jī)支持的條碼類(lèi)型,比如C0DE128c。
[0063]在本范例中,使用Hex元素來(lái)控制打印格式,其定義如下:
[0064]〈Hex Value="...,,/>
[0065]標(biāo)記105表示特殊16進(jìn)制打印命令的定義。因XML為文本文檔,不能直觀地表示不可見(jiàn)字符,而打印機(jī)能識(shí)別的打印命令通常由不可見(jiàn)字符組成。例如P0S2000打印機(jī),向其發(fā)送字符命令0xlB32,表示設(shè)置行間距為1/6英寸。但OxlB不能直接用可見(jiàn)字符表達(dá),需要轉(zhuǎn)義,所以設(shè)計(jì)了通用Hex元素。Value屬性表示16進(jìn)制數(shù)值,針對(duì)上面的例子,Value=" 1B32"。Hex元素豐富了打印模板協(xié)議,提供了萬(wàn)能通用的方法。Hex元素實(shí)際用途極為廣泛,可更改打印字體大小、行列間距,控制換行走紙等。
[0066]圖1所示樣例中,為了將標(biāo)題市場(chǎng)名稱(chēng)放大,所以使用了特殊打印標(biāo)記〈Hex Value=" 1C210C " />,對(duì)于P0S2000打印機(jī),” 1C210C "表示更改漢字大小,按增大I倍的方式顯示。當(dāng)輸出標(biāo)題完畢,需要恢復(fù)字體,所以后接了一個(gè)標(biāo)記〈HexValue=" 1C2100" />,表示恢復(fù)漢字,按默認(rèn)大小顯示。
[0067]位于模板最后的標(biāo)記105的4個(gè)Oa用于走紙換行,后接一個(gè)常用P0S2000打印機(jī)的打印命令” 1B40”,該命令用于清除打印緩沖區(qū),及恢復(fù)各打印命令至默認(rèn)值。
[0068]本發(fā)明上述范例雖然給出了一組明確的標(biāo)記定義,但僅用于舉例以使本領(lǐng)域技術(shù)人員理解。在實(shí)際實(shí)施時(shí),本領(lǐng)域技術(shù)人員可依據(jù)實(shí)際票據(jù)需求,更改標(biāo)記的含義或擴(kuò)展新的標(biāo)記。
[0069圖4展示了根據(jù)本發(fā)明一實(shí)施例的軟件模塊框架圖,說(shuō)明打印控制模塊在整個(gè)軟件系統(tǒng)中的工作流程。參照?qǐng)D4所示,首先,使用者(或開(kāi)發(fā)人員)利用文本編輯工具,根據(jù)應(yīng)用票據(jù)實(shí)際需求,創(chuàng)建合適的票據(jù)模板,并通過(guò)模板上傳模塊401將模板保存至系統(tǒng)的模板庫(kù)402。[0070]業(yè)務(wù)模塊403供使用者(如收銀員)進(jìn)行實(shí)際業(yè)務(wù)操作,以向數(shù)據(jù)庫(kù)404寫(xiě)入交易信息。在數(shù)據(jù)庫(kù)中可以圖2A、2B所示的表格保存交易信息。
[0071]當(dāng)打印控制模塊405收到業(yè)務(wù)的打印請(qǐng)求,從模板庫(kù)402中選擇匹配的模板,解析模板,并結(jié)合數(shù)據(jù)庫(kù)404中的信息,生成票據(jù)信息流,最后發(fā)往打印機(jī)406,完成整個(gè)打印過(guò)程。
[0072]圖5示出本發(fā)明一實(shí)施例的對(duì)模板X(qián)ML文檔的解析及打印流程。參照?qǐng)D5所示,流程如下:
[0073]首先如步驟501,獲得一可擴(kuò)展標(biāo)記語(yǔ)言格式的打印模板。這一打印模板可由打印控制模塊405從模板庫(kù)402中選擇得到。
[0074]此打印模板包括唯一的根元素和可由該根元素引用的多個(gè)子元素,該多個(gè)子元素至少包括文本子元素、數(shù)據(jù)項(xiàng)子元素、循環(huán)子元素和打印控制子元素。根元素可包含第一屬性,用于描述該票據(jù)的匯總信息應(yīng)當(dāng)關(guān)聯(lián)的一匯總表。該文本子元素用于在票據(jù)上呈現(xiàn)固定格式信息。該循環(huán)子元素引用一個(gè)或多個(gè)需要循環(huán)處理的子元素,且該循環(huán)子元素包含第二屬性,用于描述該票據(jù)的明細(xì)信息應(yīng)當(dāng)關(guān)聯(lián)的一明細(xì)表。該數(shù)據(jù)項(xiàng)子元素用于從該匯總表或該明細(xì)表索引數(shù)據(jù)。該匯總表及該明細(xì)表與該打印模板是分離的。打印控制子元素其定義打印機(jī)的特殊控制格式,比如更改字體大小、行列間距、走紙,這通過(guò)打印命令實(shí)現(xiàn)??梢岳斫?,以上子元素并非都必須包含在打印模板中,根據(jù)需要,部分子元素可以省略。
[0075]打印模板的范例可參照?qǐng)D1所示。匯總表及明細(xì)表的范例可分別參照?qǐng)D2A、圖2B所示。
[0076]在步驟502,初始化打印緩沖區(qū),解析該打印文檔的根元素。解析將獲得該根元素的該第一屬性,如圖1中的Table屬性,以根據(jù)該第一屬性查詢(xún)?cè)搮R總表。
[0077]匯總表保存于數(shù)據(jù)庫(kù)中,因此從根元素的屬性中還獲得Sql查詢(xún)語(yǔ)句的條件,構(gòu)造相應(yīng)的Sql查詢(xún)語(yǔ)句,查詢(xún)數(shù)據(jù)表,獲得查詢(xún)結(jié)果,結(jié)果集有且僅有一條數(shù)據(jù)記錄。
[0078]XML文檔為樹(shù)形結(jié)構(gòu),元素間具有確定的層次關(guān)系。在步驟503-513,解析該打印文檔的各個(gè)子元素。具體地說(shuō),在步驟503遍歷根元素的所有子元素。步驟504判斷子元素查找是否成功,如果查找失敗,轉(zhuǎn)至步驟514,否則解析該子元素。
[0079]由于文本(text)子元素在模板文檔中的占比大,所以步驟505,先判斷子元素是否為文本子元素,如果是,那么執(zhí)行步驟506,解析器獲取文本內(nèi)容,將文本信息原封不動(dòng)地輸出至打印緩沖區(qū)。如果否,那么轉(zhuǎn)至步驟507。
[0080]步驟507判斷當(dāng)前子元素是否為循環(huán)子元素,如果是,那么執(zhí)行步驟508,解析循環(huán)子元素的根節(jié)點(diǎn),獲取節(jié)點(diǎn)屬性,屬性包括明細(xì)表名以及Sql查詢(xún)條件,構(gòu)造Sql查詢(xún)語(yǔ)句,查詢(xún)明細(xì)表,結(jié)果集對(duì)應(yīng)多條明細(xì)記錄。
[0081]由于XML文檔為樹(shù)形結(jié)構(gòu),因此后續(xù)執(zhí)行循環(huán)子元素(如For)的子樹(shù)的解析,將循環(huán)子元素作為當(dāng)前根節(jié)點(diǎn),依次遍歷其下所有子元素,組織打印信息輸出至打印緩沖區(qū)。循環(huán)子元素下的子元素多樣化,可以包含文本子元素和數(shù)據(jù)項(xiàng)子元素等,解析過(guò)程類(lèi)似于文檔根節(jié)點(diǎn)。明細(xì)數(shù)據(jù)表包含多少條記錄,那么循環(huán)子元素的子樹(shù)的解析就執(zhí)行多少遍。所有明細(xì)記錄均處理完,表示循環(huán)子元素已經(jīng)解析完畢,那么轉(zhuǎn)至模板根元素的下一個(gè)子元素。
[0082]步驟509判斷當(dāng)前子元素是否為打印控制子元素(如Hex子元素),如果是,那么執(zhí)行步驟510,獲取打印控制子元素的屬性,將文本字符串轉(zhuǎn)成打印命令并輸出至打印緩沖區(qū)。Hex子元素的打印命令為16進(jìn)制數(shù)值。否則,轉(zhuǎn)至步驟511。
[0083]由于特殊標(biāo)記已處理過(guò),剩下的為自定義數(shù)據(jù)項(xiàng)元素。步驟511解析當(dāng)前子元素,獲取元素名稱(chēng),并依次匹配匯總表查詢(xún)結(jié)果集的字段。如果匹配成功,那么執(zhí)行步驟512。如果結(jié)果集中的所有字段均匹配不成功,那么表示打印模板出現(xiàn)未知標(biāo)記,轉(zhuǎn)至步驟513,進(jìn)行錯(cuò)誤處理,登記異常,關(guān)閉文檔解析器,返回打印失敗。
[0084]步驟512展示了數(shù)據(jù)項(xiàng)元素的處理過(guò)程。先獲取數(shù)據(jù)子項(xiàng)元素的屬性,包括Fmt格式屬性(若有的話,下同)、Align對(duì)齊屬性、Bar條碼屬性,后查詢(xún)匯總表結(jié)果集,獲取相應(yīng)數(shù)據(jù)字段的值,按屬性的定義對(duì)字段值進(jìn)行改造,若未定義屬性,那么按普通字符串進(jìn)行處理,最后將結(jié)果輸出至打印緩沖區(qū)。
[0085]步驟514表示文檔根元素的所有子元素已經(jīng)訪問(wèn)完畢,模板解析過(guò)程執(zhí)行完畢,將打印緩沖區(qū)中的打印信息流送至打印機(jī),從而完成整個(gè)打印過(guò)程。
[0086]圖3為實(shí)際生成的票據(jù)樣例,請(qǐng)結(jié)合圖1-圖3觀察打印效果。其中,樣例模板中的〈BuyerName/〉為不帶格式的字段標(biāo)記,對(duì)應(yīng)Trade交易匯總表中的BuyerName字段,表示買(mǎi)方姓名,實(shí)際解析后,被字符串“張三”替換。模板中的〈Weight Fmt=" 7.2" />為循環(huán)子元素For的子元素,帶格式定義,總長(zhǎng)度7位,兩位小數(shù),對(duì)應(yīng)Detail表中的Weight字段,表示凈重,實(shí)際解析后,被數(shù)值字符串"18.86"、" 23.08"替換。
[0087]本發(fā)明上述實(shí)施例的明顯優(yōu)勢(shì)在于:單一的XML模板文件,既標(biāo)識(shí)了打印格式,又包含了交易數(shù)據(jù)項(xiàng),使用非常方便,程序處理高效。由于模板直觀,所見(jiàn)即所得,因此本發(fā)明的實(shí)施例把定制復(fù)雜打印格式的過(guò)程,簡(jiǎn)化成了文本文件的編輯。其次,本發(fā)明標(biāo)準(zhǔn)化了打印軟件,可適用于各類(lèi)文本信息的打印,避免了各類(lèi)應(yīng)用系統(tǒng)開(kāi)發(fā)過(guò)程中,因不同行業(yè)、不同客戶(hù)導(dǎo)致的軟件定制,節(jié)省了軟件開(kāi)發(fā)維護(hù)成本。
[0088]本發(fā)明的范例雖然是在批發(fā)市場(chǎng)應(yīng)用,但也同樣適合超市、銀行等需要打印交易票據(jù)的行業(yè)。如果票據(jù)只有匯總信息,無(wú)明細(xì)的劃分,那么本發(fā)明同樣適用。對(duì)于某些嵌入式系統(tǒng),未安裝數(shù)據(jù)庫(kù),或安裝數(shù)據(jù)庫(kù)但用于其它用途的,本發(fā)明同樣適用,軟件只要處理好自定義標(biāo)記元素與數(shù)據(jù)內(nèi)容的對(duì)應(yīng)關(guān)系即可。
[0089]雖然本發(fā)明已以較佳實(shí)施例揭示如上,然其并非用以限定本發(fā)明,任何本領(lǐng)域技術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),當(dāng)可作些許的修改和完善,因此本發(fā)明的保護(hù)范圍當(dāng)以權(quán)利要求書(shū)所界定的為準(zhǔn)。
【權(quán)利要求】
1.一種票據(jù)打印方法,包括以下步驟: 獲得一可擴(kuò)展標(biāo)記語(yǔ)言格式的打印模板,該打印模板包括唯一的根元素和可由該根元素引用的多個(gè)子元素,該多個(gè)子元素包括文本子元素和數(shù)據(jù)項(xiàng)子元素;該根元素包含第一屬性,用于描述該票據(jù)的匯總信息應(yīng)當(dāng)關(guān)聯(lián)的一匯總表,該文本子元素為票據(jù)上呈現(xiàn)的固定格式信息,該數(shù)據(jù)項(xiàng)子元素用于從該數(shù)據(jù)表索引數(shù)據(jù);其中該數(shù)據(jù)表與該打印模板是分離的; 初始化打印緩沖區(qū),解析該打印文檔的根元素,獲得該根元素的該第一屬性以根據(jù)該第一屬性查詢(xún)?cè)搮R總表; 解析該打印模板的各個(gè)子元素,包括: 當(dāng)該子元素是文本子元素時(shí),將該文本子元素直接保存至打印緩沖區(qū);以及 當(dāng)該子元素是數(shù)據(jù)項(xiàng)子元素時(shí),查詢(xún)?cè)搮R總表以獲得數(shù)據(jù),并據(jù)此構(gòu)造用于輸出至該打印緩沖區(qū)的打印信息; 如果該根元素的所有子元素已經(jīng)遍歷完,將該打印緩沖區(qū)中的打印信息流發(fā)往打印機(jī)。
2.如權(quán)利要求1所述的方法,其特征在于,該匯總表是保存于一數(shù)據(jù)庫(kù),且根據(jù)該第一屬性查詢(xún)?cè)搮R總表的步驟包括,根據(jù)該第一屬性構(gòu)造一數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,以查詢(xún)?cè)摂?shù)據(jù)庫(kù)中的匯總表。
3.如權(quán)利要求1所述的方法,其特征在于,該多個(gè)子元素還包括循環(huán)子元素,該循環(huán)子元素引用一個(gè)或多個(gè)需要循環(huán)處理的子元素,所述一個(gè)或多個(gè)需要循環(huán)處理的子元素包括數(shù)據(jù)項(xiàng)子元素,且該循環(huán)子元素包含第二屬性,用于描述該票據(jù)的明細(xì)信息應(yīng)當(dāng)關(guān)聯(lián)的一明細(xì)表。
4.如權(quán)利要求3所述的方法,其特征在于,所述一個(gè)或多個(gè)需要循環(huán)處理的子元素還包括文本子元素。
5.如權(quán)利要求3所述的方法,其特征在于,在解析該打印模板的多個(gè)子元素時(shí),當(dāng)該子元素是循環(huán)子元素時(shí),獲取該循環(huán)子元素的該第二屬性以根據(jù)該第二屬性查詢(xún)?cè)撁骷?xì)表,并將該循環(huán)子元素作為根節(jié)點(diǎn)依次遍歷其下所有子節(jié)點(diǎn)以組織用于輸出至該打印緩沖區(qū)的打印信息。
6.如權(quán)利要求3所述的方法,其特征在于,該明細(xì)表與該打印模板是分離的。
7.如權(quán)利要求3所述的方法,其特征在于,該明細(xì)表是保存于一數(shù)據(jù)庫(kù),且根據(jù)該第二屬性查詢(xún)?cè)撁骷?xì)表的步驟包括,根據(jù)該第二屬性構(gòu)造一數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,以查詢(xún)?cè)摂?shù)據(jù)庫(kù)中的明細(xì)表。
8.如權(quán)利要求1所述的方法,其特征在于,該多個(gè)子元素還包括打印控制子元素,該打印控制子元素包含用于實(shí)施以下操作的打印命令:更改打印字體大小、行列間距、控制換行走紙。
9.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)需要循環(huán)處理的子元素還包括打印控制子元素,該打印控制子元素包含用于實(shí)施以下操作的打印命令:更改打印字體大小、行列間距、控制換行走紙。
10.如權(quán)利要求8或9所述的方法,其特征在于,在解析該打印模板的各個(gè)子元素時(shí),當(dāng)該子元素是打印控制子元素時(shí),獲取該打印控制子元素的屬性,并輸出至該打印緩沖區(qū)。
11.如權(quán)利要求8或9所述的方法,其特征在于,該打印控制子元素標(biāo)記該打印命令為16進(jìn)制數(shù)值。
12.如權(quán)利要求3所述的方法,其特征在于,該數(shù)據(jù)項(xiàng)子元素包含用于索引該匯總表或該明細(xì)表中對(duì)應(yīng)數(shù)據(jù)的字段名。
13.如權(quán)利要求1所述的方法,其特征在于,該數(shù)據(jù)項(xiàng)子元素包含格式屬性和/或?qū)R屬性。
14.如權(quán)利要求1所述的方法,其特征在于,還包括預(yù)存該打印模板于一打印系統(tǒng)中。
15.如權(quán)利要求1所述的方法,其特征在于,還包括接收對(duì)該打印模板的編輯。
16.一種票據(jù)打印系統(tǒng),包括: 用于獲得一可擴(kuò)展標(biāo)記語(yǔ)言格式的打印模板的裝置,該打印模板包括唯一的根元素和可由該根元素引用的多個(gè)子元素,該多個(gè)子元素包括文本子元素和數(shù)據(jù)項(xiàng)子元素;該根元素包含第一屬性,用于描述該票據(jù)的匯總信息應(yīng)當(dāng)關(guān)聯(lián)的一匯總表,該文本子元素為在票據(jù)上呈現(xiàn)的固定格式信息,該數(shù)據(jù)項(xiàng)子元素用于從該匯總表索引數(shù)據(jù);其中該匯總表與該打印模板是分離的; 用于初始化打印緩沖區(qū),解析該打印模板的根元素,獲得該根元素的該第一屬性以根據(jù)該第一屬性查詢(xún)?cè)搮R總表的裝置; 用于解析該打印模板的各個(gè)子元素的裝置,其中:當(dāng)該子元素是文本子元素時(shí),將該文本子元素直接保存至該打印緩沖區(qū);以及當(dāng)該子元素是數(shù)據(jù)項(xiàng)子元素時(shí),查詢(xún)?cè)搮R總表以獲得數(shù)據(jù),并據(jù)此構(gòu)造用于輸出`至該打印緩沖區(qū)的打印信息。
【文檔編號(hào)】G06F3/12GK103679515SQ201210363585
【公開(kāi)日】2014年3月26日 申請(qǐng)日期:2012年9月26日 優(yōu)先權(quán)日:2012年9月26日
【發(fā)明者】趙斌, 王斌, 錢(qián)旭英, 王琪 申請(qǐng)人:梅特勒-托利多(常州)測(cè)量技術(shù)有限公司, 梅特勒-托利多(常州)精密儀器有限公司, 梅特勒-托利多(常州)稱(chēng)重設(shè)備系統(tǒng)有限公司