Alaska Xbase++

Alaska Xbase++
Programiranje u Xbase++

15. 03. 2015.

2.1 Alaska Xbase++ Tehnika štampanja tekst dokumenta


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)


PREUZMI IZVORNI KOD ZA OVAJ PROGRAM

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: