Určitě jako správní programátoři dáváte přednost
psaní kódu před nudným čtením manuálů. Po poněkud
méně záživném minulém díle se dnes dostaneme k tvůrčí
práci. Pokud jste se při jeho čtení ošívali, vězte že
to bylo napsáno pro vaše dobro. Dnes nás totiž čeká
napsání prvních řádek kódu v prostředí Caché (ne,
nebojte se, není to nic složitého a každá nova
zkušenost se jednou může hodit) tříd.

Pro osvětlení Java projekce z Caché použijeme
účetní aplikaci. Na několika třídách si budeme
prezentovat vytvoření jednoduché aplikace, jež pro
ukládání dat a částečně i pro aplikační logiku
použije schopnosti platformy Caché a uživatelské
rozhraní ponechá na libovůli vývojáře. V našem
případě libovůle rovná se Java.

Náš model sestává z jednoho rozhraní, 4
persistentních tříd a jedné třídy provádějící
aplikační logiku. Pro ulehčení práce je možno projekt
stáhnout zde. Tím se
vyhneme, pokud nejsme z Caché již zběhlí, nutnosti
trávit čas přemýšlením nad vytvořením modelu.

Model aplikace vypadá takto:

Model Ucto

Třídy Syntetika a Analytika představují účty hlavní knihy, do
nich jsou ukládány informace o zůstatcích. Třídy
Denik a Zapis slouží k
uchovávání chronologicky řazených účetních zápisů.

Aplikační logika, tedy to co nás zajímá nejvíce,
se odehrává ve třídě Operace.

V tomto okamžiku máme k dispozici dva možné
scénáře.

  1. Aplikační logiku budeme vykonávat na straně
    Java serveru, tím pádem nebudeme potřebovat třídu
    Operace a do Javy vystavíme výše uvedené třídy
    Syntetika, Analytika,
    Denik a Zapis.
  2. Aplikační logiku ponecháme v Caché a pak nám
    bude stačit vystavit do Javy pouze třídu Operace.

My si předvedeme oba scénáře.

Nejdříve scénář č. 1:

Nejdříve ke třídě Operace
definujeme projekci do Javy, pro nás nejdůležitějším
parametrem je ROOTDIR do kterého
zadáme kořenový adresář pro generované java soubory.
Logicky budeme chtít, aby tento adresář ukazoval do
adresáře se zdrojovými soubory projektu otevřeného v
IDE.

Definice projekce tedy může vypadat třeba takto:

Projection Java As %Projection.Java(ROOTDIR
= "C:\Java\netbeans\mojeucto\src\mojeucto\");

K tomu, aby se vygeneroval java zdrojový soubor už
stačí jen třídu zkompilovat. Výsledný Java soubor zde
nebudeme probírat, ale doporučuji abyste se na něj ve
svém vývojovém prostředí podívali, pomůže Vám to
pochopit mechanismus volání funkčnosti Caché.

Zde je odkaz na online dokumentaci, který Vám
pomůže rychle se zorientovat v tom, jak přidat
projekci ke třídě.

Nakonec nám zbývá už jen napsat jednoduchou Java
třídu pro otestování funkčnosti našeho modelu.

Výsledný Java kód může vypadat třeba takto (opět
prosím o shovívavost, snažím se mít kód co nejkratší
aby zbytečně nezabíral celý článek)

package mojeucto;





import com.intersys.objects.*;


import com.intersys.classes.*;


import java.util.*;


import java.io.*;


import java.text.SimpleDateFormat;





/**


* Demo aplikace prezentujici propojeni Java aplikace
a Cache.


* v teto variante mame aplikacni logiku
implementovanu na strane Cache serveru


* a tak nam staci udelat Java projekci pouze nad
jednou tridou v Cache - tridou


* vykonavajici onu logiku - ucto.demo.Operace


* @author dkutac


*/


public class Main {

public
Database cacheConnection = null;


String url="jdbc:Cache://localhost:56773/WEB";





public Main() {


}





public static void main(String[] args) throws
Exception {

Main runner
= new Main();


java.util.Date today = new java.util.Date();


java.sql.Date dnes = new
java.sql.Date(today.getTime());





String ref = runner.prompt("Identifikace
dokladu:");


String popis = runner.prompt("Popis dokladu:");


Double castka =
Double.parseDouble(runner.prompt("Castka k
zauctovani:"));


SimpleDateFormat formatter = new
SimpleDateFormat("dd.mm.yyyy");


java.sql.Date datum = new
java.sql.Date(formatter.parse(runner.prompt("Datum
transakce ve tvaru DD.MM.YYYY:")).getTime());


String rozpis = runner.prompt("Ucetni predpis ve
tvaru MD|D:");


// napr. "AB2007/01","Vyber hotovosti z
uctu",500,"28.2.2007","211000|221000"


runner.zauctuj(ref,popis, castka, datum, rozpis
);


}





/**


* Provede zauctovani ucetniho dokladu


* @param reference - jednoznacna externi identifikace
dokladu


* @param popis - volny popis ucetniho zapisu


* @param castka - castka transakce


* @param den - datum zauctovani


* @param ucetniPredpis - textove vyjadreni ucetniho
predpisu ve tvaru MD|D, napr. 211000|221000


*/


public void zauctuj(String reference, String popis,
Double castka, java.sql.Date den, String
ucetniPredpis ){

if
(connectToCache(url)) {

try {


ucto.demo.Operace op = new
ucto.demo.Operace(cacheConnection);


op.zauctujDoklad(reference,popis,castka,den,ucetniPredpis);


cacheConnection.closeAllObjects();


cacheConnection.close();

} catch (Exception ex) {


ex.printStackTrace();

}

} else {


System.out.println("Nelze se připojit ke Caché");

}

}





/**


* Provede pripojeni k databazi Cache


* @param url - retezec s url pripojeni k databazi
Cache


*/


public boolean connectToCache(String url) {

try {

// ucet a
heslo ke Cache si pripadne dosad podle sve
konfigurace


cacheConnection = CacheDatabase.getDatabase
(url,"_system","sys");


return true;

} catch (Exception ex) {


System.out.println( "Caught exception: " +
ex.getClass().getName() + ": " + ex.getMessage()
);


ex.printStackTrace();


return false;

}

}





/**


* Utilita pro vstup informaci z prikazove radky


* @param prompttext - text zobrazeny u prikazove
radky


*/


public String prompt(String prompttext) throws
Exception {


BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));


System.out.println(prompttext);


return br.readLine();

}

}

Druhý scénář si ukážeme v příštím díle.