Uvod
U Clipper-u je štampanje dokumenata, koji su proizvođeni od
strane poslovne aplikacije, vršeno na matrične
printere (najčešće Epson kompatibilne) koji su bili povezani na računar
preko paralelnog lpt1 ili prn porta. Ovo štampanje je vršeno direktno na printer
putem komandi:
SET CONSOLE OFF
SET PRINT ON
? „Tekst“
SET PRINT OFF
SET
CONSOLE ON
ili
SET DEVICE TO PRINTER
@ 01,01 SAY „Tekst“
SET DEVICE TO
SCREEN
Ali je najčešće korišćena tehnika da se dokument prvo
štampa u tekst fajl komandama:
SET CONSOLE OFF
SET PRINTER TO dokument.txt
SET PRINT ON
? „Tekst“
SET PRINTER TO
SET PRINT OFF
SET CONSOLE ON
Pa se dobijeni tekst fajl dokument.txt zatim koristi i za
ekranski pregled iz nekog od editora ili viewera teksta, i za štampu na
matričnom printeru komandama:
fajlzastampu = "dokument.txt"+"
LPT1"
RUN COPY &fajlzastampu
ili
fajlzastampu = "dokument.txt"+"
LPT1/B"
RUN COPY &fajlzastampu
Iz ovog razloga, većina starih Clipper aplikacija ima
skoro ceo mehanizam za štampanje dokumenata prilagođen ovoj vrsti štampe, koja
se pokazala kao najprostija i najbrža za realizovanje (za kodiranje) a ujedno
jasna i pregledna u DOS CRT modu ekranskog pregleda. Takođe, i svi komandni CHR
kodovi ugrađeni u finalni tekst fajl dokument.txt kao što su kodovi: EJECT odnosno
CHR(12), zatim CHR(13), CHR(10), CHR(14),CHR(15), CHR(18) i ostali, bili su
aktivirani i u štampanom dokumentu koji je kasnije štampan komandom:
fajlzastampu = "dokument.txt"+" LPT1/B"
RUN COPY &fajlzastampu
Sve opisano može se bez ikakvih problema i bez ikakvih
izmena u izvornom kodu izvesti i iz Alaska Xbase++. Dobiće se identičan tekst
fajl dokument.txt i isti fajl može se pregledati na ekranu monitora iz bilo kog
editora, najčešće iz Windows standardnog editora NOTEPAD.EXE komandom:
RunShell(„dokument.txt“,“notepad.exe“). Ovaj fajl može se štampati na svakom
Windows printeru iz notepad.exe sa File -> Print. Ovaj fajl može se takođe
pod Windowsom štampati iz aplikacije ili iz BAT fajla i na matričnom printeru
povezanom na LPT1 port komandom:
fajlzastampu = "dokument.txt"+"
LPT1/B"; RUN COPY &fajlzastampu
ali ova komanda će često praviti problem, jer najnovije
verzije Windows-a ne dozvoljavaju direktan pristup printeru kao što je to
dozvoljavao DOS.
Alaska Xbase++ pored ovog štampanja na matričnom printeru
vezanom na lpt1 port i pored štampanja iz notepad.exe na Windows printer (laserski, stylus, i matrični printeri koji
štampaju preko Windows drajvera i koji su najčešće vezani na USB port) može da
iz aplikacije, iz svojih procedura,
štampa direktno na izabrani Windows
printer red po red teksta ili ceo tekst fajl dokument.txt. Ovo štampanje iz Alaska Xbase++ realizuje se preko Xbase
Part odnosno preko klase XbpPrinter() i objekata izvedenih iz ove klase.
Pisanje koda za štampanje jednog komplikovanijeg tekst
dokumenta koji ima i zaglavlje (heder) i tabelu i podnožje (footer), numeraciju
strana, međuzbirove i zbirove po stranama, fiksiran broj redova na strani, i
ostalo, takođe je komplikovan posao, jer se većim delom mora koristiti objektno
programiranje u Xbase++. Upotreba eXpress++ biblioteka u mnogome uprošćava
stvar eliminisanjem objektnog programiranja i svođenjem celog posla kodiranja
na stare Clipper komande ? i @.
Ovaj deo knjige o Xbase++ ima zadatak da prikaže,
razrađenu, testiranu i korišćenu u CSYSTEMS™ aplikacijama, jednu od mogućih
tehnika štampanja tekst dokumenta iz Xbase++ aplikacije na Windows printere
putem Xbase++ komandi za štampanje, i na kraju preko upotrebe eksternog
programa report generatora: FastReport for Xbase++.
Uz ovaj deo knjige proložena je kompletna
Xbase++/eXpress++ aplikacija sa izvornim kodom, koja demonstrira opisane
tehnike štampanja (CSYSTEMS_STAMPANJE.EXE)
1. Formiranje tekst dokumenta kao TXT fajla
Sledeće procedure i funkcije predstavljaju kod koji se može,
uz minimalne korekcije, primeniti u bilo kojoj aplikaciji.
Start aplikacije:
#include
"common.ch" // Xbase++
#include
"Appevent.ch"
#include
"Xbp.ch"
#include
"Gra.ch"
#include
"Font.ch"
#include
"xbtsys.ch" // XbTools
III++
#include
"dcdialog.ch" // eXpress++
#include
"dcgra.ch"
#include
"RESURSI\bazne.ch"
PROCEDURE
AppSys()
SET CHARSET TO ANSI; SET DATE FORMAT TO
"DD.MM.YYYY"
DC_DOTHOTKEY(180) // DOTPROMPT SA CHR(180)
SETCANCEL(.F.) // TURN OFF ALT+C
RETURN
PROCEDURE
MAIN()
PUBLIC ;
Spi_dok
:= "TEST.DBF" ,;
Spi_dokD := "TESTD.NTX" ,;
Spi_dokB := "TESTB.NTX"
PUBLIC naziv_dokumenta := "TEST
DOKUMENT"
IF FILE( spi_dok )=.F.
// c_greska()/c_poruka() -
BAZNE\C_poruka_greska.prg
c_greska("Baza podataka
TEST.DBF","Nije nađena:")
testdbf_kreate() // CREATE DBF
testdbf_indeks() // CREATE NTX
testdbf_napuni() // CREATE RECORD
c_poruka("Baza podataka
TEST.DBF","Napravljena:")
ENDIF
stampanje_Xbase_eXpress_txtfajl() // TXT
EDITOR
stampanje_Xbase_eXpress_windows() // USB
PRINTER
stampanje_Xbase_eXpress_doslpt1() // LPT1
PRINTER
stampanje_FastReport_generator() // USB PRINTER
RETURN
|
Procedure koje se pozivaju
iz menija ili preko komandnih dugmadi:
FUNCTION
stampanje_Xbase_eXpress_txtfajl()
USE (spi_dok) NEW EXCLUSIVE
SET INDEX TO (Spi_dokD), (Spi_dokB)
GO TOP
KTR_PREGLED() // _STAMPANJE.PRG
CLOSE DATABASES
RETURN
NIL
FUNCTION
stampanje_Xbase_eXpress_windows()
USE (spi_dok) NEW EXCLUSIVE
SET INDEX TO (Spi_dokD), (Spi_dokB)
GO TOP
KTR_STAMPANJE_WIN() // _STAMPANJE.PRG
CLOSE DATABASES
RETURN
NIL
FUNCTION
stampanje_Xbase_eXpress_doslpt1()
USE (spi_dok) NEW EXCLUSIVE
SET INDEX TO (Spi_dokD), (Spi_dokB)
GO TOP
KTR_STAMPANJE_DOS() // _STAMPANJE.PRG
CLOSE DATABASES
RETURN
NIL
FUNCTION
stampanje_FastReport_generator()
USE (spi_dok) NEW EXCLUSIVE
SET INDEX TO (Spi_dokD), (Spi_dokB)
GO TOP
// STAMPA_DOKUMENTA_FASTREPORT.PRG
// REPORT\KTR.FR3 and CSYSTEMS9.DLL
STAMPA_DOKUMENTA_FASTREPORT("KTR.FR3")
CLOSE DATABASES
RETURN
NIL
|
Procedure i funkcije koje
obavljaju posao pripreme štampe i štampanja:
FUNCTION
broj_redova_nastrani()
* Hederi, footeri i margina dokumenta = 23
reda
* Promena fonta u Condensed sa CHR(15)
zauzima 1 red
* EJECT komanda ili chr(12) kod zauzima 1
red
* Ovo je ukupno zauzetih 25 redova na
strani.
* Ovde zadati broj redova odnosi se samo na
stavke
* tekst dokumenta, odnosno na redove teksta
koji se
* kao uskladišteni podaci dobijaju iz DBF
fajla.
* Ako se ovde zada 35 redova to će biti 60
redova
* ako se zada max. 60 redova to će biti 85
redova
LOCAL cbroj, nbroj
IF
FILE("KEPU_broj_redova_nastrani.cfg")=.F.
MemoWrit("KEPU_broj_redova_nastrani.cfg","60")
ENDIF
cbroj := ALLTRIM(MemoRead( "KEPU_broj_redova_nastrani.cfg"
))
nbroj := VAL(cbroj)
nbroj := INT(nbroj)
nbroj := ABS(nbroj)
IF nbroj == 0
nbroj := 60
ENDIF
RETURN
nbroj
|
/*
PREGLED TXT FAJLA IZ TXT EDITORA NOTEPAD.EXE I SL. */
PROCEDURE
KTR_PREGLED()
/*
SISTEM POSTAVLJANJA ŠTAMPE ISTOG BROJA REDOVA NA STRANI */
PRIVATE broj_redova := 60 // default
PRIVATE broj_redova :=
broj_redova_nastrani()
PRIVATE txt := "test.txt"
DELETE FILE (txt)
IF PERIOD_formiraj(txt) = .T.
tekst_fajl(txt)
ENDIF
RETURN
FUNCTION tekst_fajl(txt)
IF FILE("list.exe")=.F.
c_greska("nema TXT
editora")
RETURN NIL
ENDIF
IF FILE(txt)
q :=
runshell(txt,"list.exe")
* q :=
runshell(txt,"notepad.exe")
ELSE
c_greska(txt,"nema TXT
dokumenta")
ENDIF
RETURN NIL
|
/*
ŠTAMPANJE TXT FAJLA NA WIN LASERSKOM PRINTERU */
PROCEDURE
KTR_STAMPANJE_WIN()
//
SISTEM POSTAVLJANJA ŠTAMPE ISTOG BROJA REDOVA NA STRANI
//
broj redova na strani =
//
samo stavke čistog teksta bez Heder-a i footer-a tabele,
//
heder-a i footer-a strane i top margin-e strane
PRIVATE broj_redova := 60 // 60 za
PORTRAIT, 35 za LANDSCAPE
//
ili
broj_redova := broj_redova_nastrani() //
učitava se iz CFG fajla
//
PARAMETRI ZA LASERSKI PRINTER:
PRIVATE heder := 12 // HEDER TABELE 12 redova
PRIVATE footer := 4 // FOOTER TABELE 4 reda
PRIVATE lasergornjamargina := 1
// TOP MARGIN 1 red
PRIVATE laserheder := 4
// HEDER STRANE 4 reda
PRIVATE laserfooter := 2 // FOOTER STRANE 2 reda
//
svega 23 reda
PRIVATE txt := "test.txt"
DELETE FILE (txt)
IF PERIOD_formiraj(txt) = .T.
PERIOD_stampaj_win(txt)
ENDIF
RETURN
|
/*
ŠTAMPANJE TXT FAJLA NA DOS LPT1 MATRIČNOM PRINTERU */
PROCEDURE
KTR_STAMPANJE_DOS()
//
SISTEM POSTAVLJANJA ŠTAMPE ISTOG BROJA REDOVA NA STRANI
PRIVATE broj_redova := 60 // default
PRIVATE broj_redova :=
broj_redova_nastrani()
PRIVATE txt := "test.txt"
DELETE FILE (txt)
IF PERIOD_formiraj(txt) = .T.
PERIOD_stampaj_dos(txt)
ENDIF
RETURN
|
/*
UPIT ZA WIN LASERSKI PRINTER */
PROCEDURE
PERIOD_stampaj_win(txt)
SET CHARSET TO ANSI
IF broj_redova == 60
orjentacija := 1 // portrait
ELSE
orjentacija := 2 // landscape
ENDIF
VRATI := ;
AlertBox( ,; // xc_alertbox.prg
"Štampa Listova
Knjige", {" Da "," Ne
"},;
I__printer2,; // ICON - RESURSI\bazne.ch
"Laserski printer" )
IF VRATI = 1
/* PROCEDURA ZA ŠTAMPANJE */
etxt2printer1(txt,; // o__etxt2printer1.prg
orjentacija,; // orjentacija portrait/landscape
naziv_dokumenta,; // heder
"COBA Systems" ,; // footer
4,; // leva margina
lasergornjamargina ,;// gornja margina
8) // veličina fonta
8,9,10,12...
ENDIF
RETURN
|
/*
UPIT ZA DOS LPT1 MATRIČNI PRINTER */
PROCEDURE
PERIOD_stampaj_dos(txt)
SET CHARSET TO ANSI
VRATI := ;
AlertBox( ,; // xc_alertbox.prg
"Štampa Listova
Knjige", {" Da "," Ne
"},;
I__printer2,; // ICON - RESURSI\bazne.ch
"Matrični printer" )
IF VRATI = 1
/* PROCEDURA ZA ŠTAMPANJE */
etxt2lpt(txt) // o__etxt2lpt.prg
ENDIF
RETURN
|
/*
FORMIRANJE PERIODA ZA PREGLED I ZA ŠTAMPU ZA PERIOD */
FUNCTION
PERIOD_formiraj(txt)
PRIVATE radno := SELECT()
PRIVATE DATUM1,DATUM2,opis_perioda,period
PRIVATE naziv_tabele := naziv_dokumenta,
cDialog
SET DATE FORMAT TO "DD.MM.YYYY"
// Postavi period od DATUMA1 DO DATUMA2
direktno
// preuzimanjem min i max datuma iz DBF
fajla,
// ili zadaj period ručnim upisom DATUM1 i
DATUM2
// ili preuzmi DATUM1 i DATUM2 iz CFG fajla:
// preuzimanje min i max datuma iz DBF
fajla:
SET ORDER TO 1
GO TOP
DATUM1 := DAT0_
GO BOTTOM
DATUM2 := DAT0_
GO TOP
opis_perioda := ;
"Period od "+DTOC(DATUM1)+"
do "+DTOC(DATUM2)
period := opis_perioda
ec_p() // Coba ili
// cDialog :=
DC_WaitOn("Formiranje...") // eXpress++
TXTFAJL_formiraj(txt) // formiraj - make
txt file
// DC_Impl(cDialog) // eXpress++ ili
ec_k() // Coba
RETURN
.T.
|
Kreiranje test baze
podataka – kreiranje DBF fajla
FUNCTION testdbf_kreate() // CREATE DBF
LOCAL radno := SELECT(), astructure :=
{}
SELECT 0 // prvo slobodno područje
aStructure := { ;
{ "COBA_" ,"N", 7, 0 } ,;
{ "ZNAK_" ,"C", 1, 0 } ,;
{ "FLAG_" ,"C", 1, 0 } ,;
{ "STAT_" ,"C", 1, 0 } ,;
{ "BRJ0_" ,"C", 12, 0 } ,;
{ "DAT0_" ,"D", 8, 0 } ,;
{ "OPIS_DOK_" ,"C", 25, 0 } ,;
{ "VDOK_" ,"C", 2, 0 } ,;
{ "NALO_" ,"C", 8, 0 } ,;
{ "DOBS_" ,"C", 4, 0 } ,;
{ "ZADUZENO_" ,"N", 15, 2 } ,;
{ "RADUZENO_" ,"N", 15, 2 } ,;
{ "DAT1_" ,"D", 8, 0 } ,;
{ "UPL1_" ,"N", 15, 2 } ,;
{ "GKDUG_" ,"N", 15, 2 } ,;
{ "GKPOT_" ,"N", 15, 2 } ,;
{ "GKRUC_" ,"N", 15, 2 } ,;
{ "GKRAB_" ,"N", 15, 2 } ,;
{ "GKPDV_" ,"N", 15, 2 } ,;
{ "GKPRP_" ,"N", 15, 2 }
;
}
DbCreate( "TEST.DBF",
aStructure, "DBFNTX" )
USE // zatvori TEST.DBF
SELECT(radno)
RETURN NIL
|
Kreiranje test baze
podataka – kreiranje NTX fajla
FUNCTION
testdbf_indeks() // CREATE NTX
LOCAL radno := SELECT()
IF FILE("TEST.DBF")=.F.
RETURN .F.
ENDIF
USE TEST.DBF NEW EXCLUSIVE
IF NetErr()
S_NET("Rekonstrukcija
podataka")
RETURN .F.
ENDIF
ec_p("Rekonstrukcija podataka")
// PRIVATE cDialog :=
DC_WaitOn("Rekonstrukcija podataka")
DELETE FILE TESTD.NTX
DELETE FILE TESTB.NTX
INDEX ON DTOS(DAT0_) TO TESTD.NTX
INDEX ON BRJ0_ TO TESTB.NTX
USE
// DC_Impl(cDialog)
ec_k()
SELECT(radno)
RETURN
.T.
|
Kreiranje test baze
podataka – kreiranje slogova DBF fajla
FUNCTION
testdbf_napuni() // CREATE RECORD
USE TEST.DBF NEW EXCLUSIVE
IF NETERR()
s_net()
RETURN NIL
ENDIF
SET DATE GERMAN
SET CENTURY ON
ec_p("Formiranje...") //
progres-bar dok traje operacija
// cDialog :=
DC_WaitOn("Formiranje...")
// napravi prvi slog...
append blank
replace ;
COBA_ with 7, ;
ZNAK_ with '4', ;
FLAG_ with ' ', ;
STAT_ with '+', ;
BRJ0_ with 'IZVOD-005 ', ;
DAT0_ with ctod('09.01.2009'), ;
OPIS_DOK_ with 'DNEVNI PAZAR OD
06.01.09.', ;
VDOK_ with ' ', ;
NALO_ with ' ', ;
DOBS_ with '0000', ;
ZADUZENO_ with 0.00, ;
RADUZENO_ with 0.00, ;
DAT1_ with ctod('09.01.2009'), ;
UPL1_ with 33200.00, ;
GKDUG_ with 0.00, ;
GKPOT_ with 0.00, ;
GKRUC_ with 0.00, ;
GKRAB_ with 0.00, ;
GKPDV_ with 0.00, ;
GKPRP_ with 0.00
// ...i tako dalje, dok se ne formira 318
slogova
// kraj formiranja i punjenja slogova
COMMIT
INDEX ON DTOS(DAT0_) TO TESTD.NTX
GO TOP
xx := 0
DO WHILE .NOT. EOF()
xx := xx + 1
REPLACE COBA_ WITH xx
SKIP
ENDDO
INDEX ON BRJ0_ TO TESTB.NTX
USE
// DC_Impl(cDialog) // kraj za progres-bar
operacije
ec_k() // kraj za progres-bar operacije
RETURN
NIL
|
Procedure i funkcije koje
obavljaju posao formiranja tekst dokumenta odnosno ASCII teksta i TEST.TXT
fajla iz podataka TEST.DBF fajla:
FUNCTION
TXTFAJL_formiraj(txt)
* IZ GLAVNOG PROGRAMA: broj_redova = 60
// broj redova na strani (stavke bez
zaglavlja i kraja)
PRIVATE brojac_redova,
brojac_strana,ukupno_strana
brojac_redova=0
brojac_strana=0
ukupno_strana=0
* Fiksiranje perioda obrade izvestaja:
*
datum1 - datum pocetka
izvestaja - ukljucen u izvestaj
*
datum2 - datum kraja izvestaja - ukljucen u izvestaj
*
datum00 - datum pocetka knjige
- datum prve stavke u knjizi
*
datum01 - datum za dan manji
od zadatog pocetnog datuma1 izvestaja
*
datum02 - datum kraja knjige
*
Period01 - string - opis
perioda: datum00 - datum01
*
Period02 - string - opis
perioda: datum00 - datum2
* Period12 - string - opis perioda: datum1 - datum2
* SHEMA:
*
|<
period03 >|
*
|
|
*
|< period02 >| |
*
|
| |
*
|< period01 >|
| |
*
| | | |
*
*------------**----------------*---------------*
*
| ||< period12
>| |
*
| || | |
*
| || | |
*
početak |početak kraj kraj
*
knjige |perioda perioda knjige
*
datum00 |datum1 datum2 datum02
* |
* datum za dan manji
* od datuma početka perioda
* datum01
* Potrebno je dobiti 4 izveštaja:
* 1. izveštaj za celu knjigu: period03 od datum00 do datum02
* 2. izveštaj za vreme: period01 od datum00 do datum01
* 3. izveštaj za period: period12 od datum1 do datum2
* 4. izveštaj za vreme: period02
PRIVATE datum00, datum01, Period01,
Period02, Period12
*-----------------------------------------------------------------
*
DB:
*
Spi_dok := "TEST.DBF"
*
Spi_dokD := "TESTD.NTX" // INDEX ON DTOS(DAT0_) TO TESTD.NTX
*
Spi_dokB := "TESTB.NTX" // INDEX ON BRJ0_ TO TESTB.NTX
*
USE (Spi_dok) NEW SHARED ALIAS "TEST"
*
SET INDEX TO (Spi_dokD), (Spi_dokB)
*-----------------------------------------------------------------
SET ORDER TO 1 // indeks po datumu DTOS(DATO_)
GO TOP
datum00
:= DAT0_ // datum pocetka
knjige - datum prve stavke u knjizi
GO BOTTOM
datum02
:= DAT0_ // datum kraja
knjige - datum zadnje stavke u knjizi
GO TOP
*
datum1 = public
*
datum2 = public
IF datum1 > datum00 // OK
ELSE
datum1 := datum00 // prvi datum perioda
ne može biti manji od datuma početka
ENDIF
IF datum2 > datum02 // OK
datum2 := datum02 // drugi datum
perioda ne može biti veći od datuma kraja
ELSE
//datum2 := datum02 // drugi datum
perioda ne može biti veći od datuma kraja
ENDIF
******************************************************
PUBLIC period_knjige :=
dtoc(datum1)+" "+dtoc(datum2)
******************************************************
// msgbox(period_knjige,"***")
datum01 := datum1-1 // datum za dan manji
od zadatog pocetnog datuma1 izvestaja
// OPIŠI PERIODE:
IF datum01 > datum00
// kad je datum početka perioda (minus
jedan dan) veći od datuma početka
// knjige, period počinje od datuma
početka perioda
Period01 := DTOC(datum00)+' -
'+DTOC(datum01)
ELSE
// kad je datum početka perioda (minus
jedan dan) jednak ili manji od
// datuma početka knjige period počinje od
datuma početka knjige
Period01 := 'DO DATUMA:' +' '+DTOC(datum01)
ENDIF
Period02 := DTOC(datum00)+' -
'+DTOC(datum2)
Period12 := DTOC(datum1) +' -
'+DTOC(datum2)
// FORMIRAJ PERIODE:
PRIVATE ;
PERIOD01_DBF :=
gdetmp(,,"1"),;
PERIOD12_DBF :=
gdetmp(,,"D"),;
PERIOD12_NTX :=
gdetmp(,,"N"),;
PERIOD02_DBF :=
gdetmp(,,"2"),;
PERIOD03_DBF := gdetmp(,,"3")
* PERIOD01_DBF - podaci od početka
knjige do početka zadatog perioda
COPY ALL TO (PERIOD01_DBF) FOR DAT0_
>= datum00 .and. DAT0_ <=
datum01
* PERIOD12_DBF - podaci od početka
zadatog perioda do kraja zadatog perioda
COPY ALL TO (PERIOD12_DBF) FOR DAT0_
>= datum1 .and. DAT0_ <= datum2
* PERIOD02_DBF - podaci od početka
knjige do kraja zadatog perioda
COPY ALL TO (PERIOD02_DBF) FOR DAT0_
>= datum00 .and. DAT0_ <= datum2
* PERIOD03_DBF - podaci od početka
knjige do kraja knjige
* COPY ALL TO (PERIOD03_DBF) // FOR
DAT0_ >= datum00 .and. DAT0_ <=
datum02
// FORMIRAJ PUBLIC ZBIROVE ZA PERIODE:
****************************************
* Formiranje stanja od pocetka knjige
do
* kraja knjige:
* datum00 - datum02
****************************************
* PERIOD03() // zbir za period03 =
datum00 - datum02
// PUBLIC eVARIJABLE:
eZADUZENO, eRADUZENO, eUPL1, ebrojac
****************************************
* Formiranje stanja od pocetka knjige
do
* zadnjeg datuma perioda:
* datum00 - datum2
****************************************
PERIOD02() // zbir za period01 =
datum00 - datum01
// PUBLIC oVARIJABLE:
oZADUZENO, oRADUZENO, oUPL1, obrojac
****************************************
* Formiranje stanja od pocetka knjige
do
* pocetnog datuma perioda:
* datum00 - datum01
****************************************
PERIOD01() // zbir za period01 =
datum00 - datum01
// PUBLIC yVARIJABLE:
yZADUZENO, yRADUZENO, yUPL1, ybrojac
****************************************
* Formiranje stanja za zadati period
*
* datum1 - datum2
****************************************
PERIOD12() // zbir za period12 = datum1
- datum2
// PUBLIC xVARIJABLE:
xZADUZENO, xRADUZENO, xUPL1, xbrojac
*************************************************************************
//PRIVATE
txt := Gde_Exe()+"\TXT\t.txt"
DELETE FILE (txt)
SET PRINTER TO (txt)
SET PRINT ON
SET CONSOLE OFF
? CHR(15)
// uključi condensed mod -> ovo zauzme jedan štampani red
// pa prva strana ima jedan red
više kada se broje redovi
// za laser, zato se mora ili
ukloniti sa prve strane,
// ili poništiti na prvoj
strani, ili dodati na svaku stranu
// inicijalizacija zbirova:
PRIVATE
zCOBA ,zZADUZENO ,zRADUZENO
,zUPL1, zBrojac
STORE 0 TO
zCOBA ,zZADUZENO ,zRADUZENO
,zUPL1, zBrojac
// ZA PERIOD01:
// Broj strana koji je obradjen - jedna
strana ima redova = broj_redova:
brojac_redova := ybrojac // broj redova
za period01 dobijen iz PERIOD01()
brojac_strana :=
ABS(brojac_redova/broj_redova) // broj strana za period01
brojac_redova :=0 // postavi brojač redova na nulu
prethodne_strane := brojac_strana // broj
strana za period01
****************************************
* STANJE ZA ZADATI PERIOD: PERIOD12_DBF
* izmedju pocetnog i krajnjeg
* zadatog datuma: datum1 - datum2
* formiranje i stampa:
****************************************
radno := SELECT()
USE (PERIOD12_DBF) NEW EXCLUSIVE ALIAS
"PERIOD12" // pomocna.dbf
IF neterr()
s_net("Oštećenje podataka")
QUIT
ENDIF
INDEX ON DTOS(DAT0_) TO (PERIOD12_NTX)
GO TOP
PRIVATE ;
prenos_brojac := ybrojac,; //
prenos_zaduzeno := yZADUZENO,; // PRENOS IZ PRETHODNOG PERIODA
prenos_raduzeno := yRADUZENO,; // koji se štampa u hederu
prenos_upl1 := yUPL1 // naredne strane
***************************************
Heder_T(naziv_tabele) // štampa Naslov Tabele
***************************************
**********************
DO WHILE .NOT. EOF()
**********************
//
ZBIR ZA JEDNU STRANU
zBrojac :=
zBrojac+1
zZADUZENO :=
zZADUZENO + ZADUZENO_
zRADUZENO :=
zRADUZENO + RADUZENO_
zUPL1 :=
zUPL1 + UPL1_
//
ZBIR: PRENETO STANJE SA PRETHODNE STRANE UVEĆANO ZA ZBIR ZA STRANU
//
KUMULIRANJE:
prenos_brojac :=
prenos_brojac + 1
prenos_zaduzeno :=
prenos_zaduzeno + ZADUZENO_
prenos_raduzeno :=
prenos_raduzeno + RADUZENO_
prenos_upl1 :=
prenos_upl1 + UPL1_
? ' |'+STR(COBA_,4,0)+'|'+;
DTOC(DAT0_)+'|'+;
BRJ0_+'|'+;
VDOK_+'|'+;
DOBS_+'|'+;
OPIS_DOK_+'|'+;
STR(ZADUZENO_,15,2)+'|'+;
STR(RADUZENO_,15,2)+'|'+;
STR(UPL1_,15,2)+'|'
//----------------------------------------------------------------
// KRAJ STRANE
brojac_redova := brojac_redova+1
IF brojac_redova ==
broj_redova // KRAJ STRANE
brojac_redova := 0
datum01 := DAT0_ // uzmi datum zadnje stavke na strani
*************************
Footer_T() // stampaj Footer - podnozje
*************************
EJECT // predji na sledecu
stranu-list
SETPRC(0,0)
? CHR(15)
*************************
Heder_T(naziv_tabele) // stampaj Heder - zaglavlje
*************************
STORE 0 TO zCOBA, zZADUZENO,
zRADUZENO, zUPL1, zBrojac
// postavi zbir za stranu na
nulu
ENDIF // IF brojac_redova =
broj_redova // KRAJ STRANE
//----------------------------------------------------------------
SKIP
*****************
ENDDO
*****************
SELECT "PERIOD12"
USE
SELECT(radno)
*******************************************
Footer_T()
*******************************************
*******************************************
Potpis_K(brojac_strana,prethodne_strane)
*******************************************
EJECT
SETPRC(0,0)
? CHR(18)
SET
PRINTER TO
SET
PRINT OFF
SET
CONSOLE ON
RETURN
NIL
|
Procedure za formiranje
Hedera, Footera i Potpisa tekst dokumenta
*
FUNCTION Heder_T() // štampa hedera tabele
*
FUNCTION Footer_T() // štampa footera
tabele
*
FUNCTION Potpis_K() // štampa potpisa
tabele
*************************************************************************
FUNCTION
Heder_T() // štampa hedera tabele
*************************************************************************
PARAMETERS
naslov_knjige
*
HEDER Tabele
*
Formira:
*
Heder (zaglavlje) tabele sa naslovima kolona tabele,
*
Broj strane tabele uvecava za 1 i ispisuje ga,
*
i stampa preneto stanje zbirova sa prethodne strane.
*
Promenljive iz prethodnog programa:
*
brojac_strana - broj obradjenih
strana od pocetka knjge do ove strane
*
Period01 - opisno period od
pocetka knjige do ove strane (datumi)
*
prenos_promenljive - kumulativni zbir od pocetka knjige do ove strane
*
prenos_Brojac - broj redova (slogova DBF) od pocetka knjige do ove strane
brojac_strana := brojac_strana+1
IF datum01 > datum00
Period01 := DTOC(datum00)+' -
'+DTOC(datum01)
ELSE
Period01 = 'DO DATUMA:' +' '+DTOC(datum01)
ENDIF
PRIVATE BRR := STR(prenos_brojac,4)
*************************************************************************
*
prenos_zaduzeno // prenos sa
prethodne strane
*
prenos_raduzeno // koji se
štampa u hederu
*
prenos_upl1 // naredne
strane
// preneto sa prethodnog lista:
PRIVATE Ezad,Eraz,Eupl
Ezad
= STR(prenos_zaduzeno,15,2)
Eraz
= STR(prenos_raduzeno,15,2)
Eupl
= STR(prenos_upl1 ,15,2)
? '
'+"Obrazac KEPU"+space(88)+'Strana '+ALLTRIM(STR(brojac_strana,10,0))
? '
'+"OBVEZNIK: "+"COBA Systems Software"+" MESTO "+"Kragujevac"+"
OBJEKAT-PRODAJNO MESTO"+" Prodavnica suvenira"
? '
'+"KNJIGA EVIDENCIJE PROMETA I USLUGA ZA"+' - '+opis_perioda
? '
-'+'----'+'-'+'----------'+'-'+'------------'+'-'+'--'+'-'+'----'+'-'+'-------------------------'+'-'+'---------------'+'-'+'---------------'+'-'+'---------------'+'-'
? ' |'+'RED.'+'|'+'DATUM '+'|'+'DOKUMENT '+'|'+'VD'+'|'+'ŠIF.'+'|'+'OPIS DOKUMENTA '+'|'+' ZADUŽENJE
'+'|'+' RAZDUŽENJE '+'|'+'
UPLATA '+'|'
? ' |'+'BROJ'+'|'+'DOKUMENTA
'+'|'+'BROJ '+'|'+' '+'|'+'DOB.'+'|'+' '+'|'+' '+'|'+' '+'|'+' '+'|'
? ' |'+'
'+'|'+' '+'|'+' '+'|'+' '+'|'+'KUP.'+'|'+' '+'|'+' '+'|'+' '+'|'+' '+'|'
? '
-'+'----'+'-'+'----------'+'-'+'------------'+'-'+'--'+'-'+'----'+'-'+'-------------------------'+'-'+'---------------'+'-'+'---------------'+'-'+'---------------'+'-'
? ' |'+' 1
'+'|'+' '+' '+' '+' '+' '+' '+'
'+' '+' 2 '+'|'+' 3
'+'|'+' 4 '+'|'+' 5
'+'|'
? '
-'+'----'+'-'+'----------'+'-'+'------------'+'-'+'--'+'-'+'----'+'-'+'-------------------------'+'-'+'---------------'+'-'+'---------------'+'-'+'---------------'+'-'
? ' |'+ BRR
+'|'+ SPACE(10) +'
'+'PRENOS: '+' '+' '+' '+'
'+' '+ Period01+SPACE(2)
+'|'+ Ezad +'|'+ Eraz
+'|'+ Eupl +'|'
? '
-'+'----'+'-'+'----------'+'-'+'------------'+'-'+'--'+'-'+'----'+'-'+'-------------------------'+'-'+'---------------'+'-'+'---------------'+'-'+'---------------'+'-'
RETURN(0)
*************************************************************************
FUNCTION
Footer_T() // štampa footera tabele
*************************************************************************
*
*
FOOTER TABELE sa zbirovima tabele:
*
Stampa:
*
Zbir stanja za jednu stranu
(z) promenljive,
*
Zbir stanja od pocetka godine do datuma2 (y) promenljive.
*
Iz prethodnog programa koriste se promenljive:
*
(z) - zbirovi DBF za jedan list
knjige
*
brojac - broj redova tabele (slogova
u DBF) za jedan list knjige
*
prenos_promenljive - zbirovi DBF za period od pocetka knjige do datuma2
*
prenos_Brojac - broj redova tabele
(slogova u DBF) za isti period
*
Period02 - opis perioda od pocetka knjige do datuma2
zBR
= +STR(zBrojac,4)
eBR
= +STR(prenos_Brojac,4)
*
prenos_zaduzeno // prenos sa
prethodne strane + zbir ove strane
*
prenos_raduzeno // koji se
štampa u footeru
*
prenos_upl1 // naredne
strane
//
preneto sa prethodnog lista + zbir za ovu stranu:
PRIVATE Ezad,Eraz,Eupl
Ezad
= STR(prenos_zaduzeno,15,2)
Eraz
= STR(prenos_raduzeno,15,2)
Eupl
= STR(prenos_upl1 ,15,2)
//
ZBIR ZA STRANU (samo stavke na strani)
PRIVATE zEzad,zEraz,zEupl
zEzad
= STR(zZADUZENO,15,2)
zEraz
= STR(zRADUZENO,15,2)
zEupl
= STR(zUPL1 ,15,2)
//
zEupl =
STR(zZADUZENO+zRADUZENO,15,2)
? '
-'+'----'+'-'+'----------'+'-'+'------------'+'-'+'--'+'-'+'----'+'-'+'-------------------------'+'-'+'---------------'+'-'+'---------------'+'-'+'---------------'+'-'
? ' |'+ zBR
+'|'+ space(10) +'|'+'ZA
STRANU: '+'|'+' '+'|'+'
'+'|'+'
'+'|'+ zEzad +'|'+ zEraz +'|'+ zEupl +'|'
? ' |'+ eBR
+'|'+ space(10) +'|'+'U K U P N
O:'+'|'+' '+'|'+' '+'|'+' '+'|'+ Ezad +'|'+ Eraz +'|'+ Eupl +'|'
? '
-'+'----'+'-'+'----------'+'-'+'------------'+'-'+'--'+'-'+'----'+'-'+'-------------------------'+'-'+'---------------'+'-'+'---------------'+'-'+'---------------'+'-'
? chr(13)+chr(10)
RETURN
NIL
*************************************************************************
FUNCTION
Potpis_K() // štampa potpisa tabele
*************************************************************************
PARAMETERS brojac_strana, prethodne_strane
PRIVATE ukupno_strana
ukupno_strana := brojac_strana -
prethodne_strane
? "
Ukupno strana: "+alltrim(str(ukupno_strana,10,0))
? "
SASTAVIO:
OVERAVA:"
? "
_________
_________"
? "
"
? chr(13)+chr(10)
RETURN(0)
|
Procedure za formiranje
zbirova za periode u tekst dokumentu
* FUNCTION PERIOD03() // zbir za period03 =
datum00 - datum02
* FUNCTION PERIOD02() // zbir za period02 =
datum00 - datum2
* FUNCTION PERIOD01() // zbir za period01 =
datum00 - datum01
* FUNCTION PERIOD12() // zbir za period12 =
datum1 - datum2
**************************************************************************
FUNCTION PERIOD03() // zbir za period03 =
datum00 - datum02
**************************************************************************
/*
* Formiranje stanja od početka knjige do
kraja knjige:
* datum00 - datum02
*/
LOCAL radno := SELECT()
PUBLIC eZADUZENO :=0, eRADUZENO :=0, eUPL1
:=0, ebrojac := 0
USE (PERIOD03_DBF) NEW SHARED ALIAS
"PERIOD03"
IF NetErr()
s_net()
RETURN nil
ENDIF
GO TOP
SUM ALL ZADUZENO_, RADUZENO_, UPL1_ TO
eZADUZENO, eRADUZENO, eUPL1
COUNT ALL TO ebrojac // broj stavki tabele - redova tabele
USE
SELECT(radno)
RETURN nil
**************************************************************************
FUNCTION PERIOD02() // zbir za period02 =
datum00 - datum2
**************************************************************************
/*
* Formiranje stanja od početka knjige do
zadnjeg datuma perioda:
* datum00 - datum2
*/
LOCAL radno := SELECT()
PUBLIC oZADUZENO :=0, oRADUZENO :=0, oUPL1
:=0, obrojac := 0
USE (PERIOD02_DBF) NEW SHARED ALIAS
"PERIOD02"
IF NetErr()
s_net()
RETURN nil
ENDIF
GO TOP
SUM ALL ZADUZENO_, RADUZENO_, UPL1_ TO
oZADUZENO, oRADUZENO, oUPL1
COUNT ALL TO obrojac // broj stavki tabele - redova tabele
USE
SELECT(radno)
RETURN nil
**************************************************************************
FUNCTION PERIOD01() // zbir za period01 =
datum00 - datum01
**************************************************************************
/*
* Formiranje stanja od početka knjige do
pocetnog datuma perioda:
* datum00 - datum01
*/
LOCAL radno := SELECT()
PUBLIC yZADUZENO :=0, yRADUZENO :=0, yUPL1
:=0, ybrojac := 0
USE (PERIOD01_DBF) NEW SHARED ALIAS
"PERIOD01"
IF NetErr()
s_net()
RETURN nil
ENDIF
GO TOP
SUM ALL ZADUZENO_, RADUZENO_, UPL1_ TO
yZADUZENO, yRADUZENO, yUPL1
COUNT ALL TO ybrojac // broj stavki tabele - redova tabele
USE
SELECT(radno)
RETURN nil
**************************************************************************
FUNCTION PERIOD12() // zbir za period12 =
datum1 - datum2
**************************************************************************
/*
* Formiranje stanja za zadati period:
* datum1 - datum2
*/
LOCAL radno := SELECT()
PUBLIC xZADUZENO :=0, xRADUZENO :=0, xUPL1
:=0, xbrojac := 0
USE (PERIOD12_DBF) NEW SHARED ALIAS
"PERIOD12"
IF NetErr()
s_net()
RETURN nil
ENDIF
GO TOP
SUM ALL ZADUZENO_, RADUZENO_, UPL1_ TO
xZADUZENO, xRADUZENO, xUPL1
COUNT ALL TO xbrojac // broj stavki tabele - redova tabele
USE
SELECT(radno)
RETURN nil
|
ŠEMA RADA:
stampanje_Xbase_eXpress_txtfajl()
// TXT EDITOR
KTR_PREGLED() // _STAMPANJE.PRG
stampanje_Xbase_eXpress_windows() // USB
PRINTER
KTR_STAMPANJE_WIN() // _STAMPANJE.PRG
stampanje_Xbase_eXpress_doslpt1() // LPT1
PRINTER
KTR_STAMPANJE_DOS() // _STAMPANJE.PRG
stampanje_FastReport_generator() // USB PRINTER
STAMPA_DOKUMENTA_FASTREPORT("KTR.FR3")
// STAMPA_DOKUMENTA_FASTREPORT.PRG
broj_redova_nastrani()
PERIOD_formiraj(txt) // zadaj period
TXTFAJL_formiraj(txt) // formiraj - make
txt file
tekst_fajl(txt) // pregled tekst fajla
PERIOD_stampaj_dos(txt) // štampa tekst fajla
etxt2lpt() // štampa tekst fajla na matričnom
printeru
PERIOD_stampaj_win(txt) // štampa tekst fajla
etxt2printer1() // štampa tekst fajla na laserskom
printeru
2. Štampanje tekst dokumenta kao TXT fajla na LPT1 printer
Procedure koje obavljaju
posao štampanja na matrični LPT1 printer:
Ove
procedure spakovane su u modul o__etxt2lpt.prg
i funkciju etxt2lpt() (dati u
prilogu ovog poglavlja u folderu BAZNEX i u ovom tekstu pod naslovom BAZNE
FUNKCIJE). Pošto su primenljive za sve situacije, prebačene su u sekciju
baznih zajedničkih funkcija koje se koriste od strane svih aplikacija.
Pogledajte naslov BAZNE FUNKCIJE - etxt2lpt()
|
3. Štampanje tekst dokumenta kao TXT fajla na USB printer
Procedure koje obavljaju
posao štampanja na Windows USB printer:
Ove
procedure spakovane su u modul o__etxt2printer1.prg
i u tom modulu u funkciju etxt2printer1() (dati u prilogu ovog poglavlja u folderu BAZNEX i u ovom tekstu pod naslovom BAZNE FUNKCIJE.) Pošto su
primenljive za sve situacije, prebačene su u sekciju baznih zajedničkih
funkcija koje se koriste od strane svih aplikacija. Pogledajte naslov BAZNE
FUNKCIJE etxt2printer1().
|
4. Štampanje tekst dokumenta preko FastReport generatora na Windows USB printer ili Windows LPT printer
Procedure koje obavljaju
posao štampanja na Windows USB printer koristeći eksterni program Report
Generator: Fast Report for Xbase++
Ove
procedure spakovane su u folder FR u module
FastRep.prg,
Fastrep.ch,
Croatian.frc (Serbian.frc),
stampa_dokumenta_fastreport.prg,
priprema_dokumenta_za_stampu.prg
stampa_dokumenta_fastreport_naslov.prg,
stampa_dokumenta_fastreport_tabela.prg,
a za štampu tekst dokumenta
koriste matricu odnosno fajl: KTR.FR3 koji se nalazi u priloženom folderu
REPORT, kao i program fastreport u fajlu: CSYSTEMS9.DLL
Ovi fajlovi su dati kao
prilog uz ovo poglavlje, a kompletno objašnjenje načina štampanja preko
FastReport generatora za Alaska Xbase++ dato je u posebnom poglavlju ove
knjige.
|
Nema komentara:
Objavi komentar