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.