Promotic
WikipediaLinkedInYoutubeTwitterFacebook

PmaAdo - Praktické příklady

Viz: Objekt PmaAdo, PmaAdo - Podrobný popis objektu
 
Operace připojení k databázi je časově relativně náročná a časté připojování/odpojování k/od databáze může vést k tomu, že aplikace bude přetížená. Proto se doporučuje provést připojení k databázi po spuštění aplikace a odpojení od databáze při zastavování aplikace.
 
Zavření databáze je vhodné provést až po provedení všech potřebných operací s databází (nejčastěji až při ukončení aplikace).
 
Během práce s databázemi je nutno si vždy ověřit, zda prováděná operace byla provedena úspěšně nebo zda skončila chybou.
 
Práci s databází pomocí PmaAdo v systému PROMOTIC lze rozdělit na dva základní způsoby:
 
 

Načtení dat do aplikace

Posloupnost operací při načítání dat do PROMOTIC aplikace objektem PmaAdo:
- připojení k databázi
- otevření příslušné tabulky
- zpracování dat v aplikaci
- zavření příslušné tabulky
- (volitelně: uzavření databáze)
 
Jednotlivé operace jsou znázorněny v následujícím příkladu:
Příklad:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, vValues;

oAdo = pMe.Pm("../PmaAdo");
sSQL = "select * from table1";

//otevření databáze, pokud není otevřená
if (!oAdo.DbIsOpen())
bRes = oAdo.DbOpen();
else
bRes = true;

//pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
//otevření příslušné tabulky
oRs = oAdo.RsOpen("", sSQL, "");
//Zjistí, zda otevření proběhlo úspěšně
if (Pm.IsValid(oRs))
{
//Zjistí, zda tabulka není prázdná
if (oRs.EOF && oRs.BOF)
{
//Pm.Debug "Tabulka (recordset) neobsahuje žádné záznamy"
return -1;
}
else
{
//pokud tabulka není prázdná, pak je ji možné načíst jako 2-rozměrné pole
vValues = oRs.GetRows();
return vValues;
}
}
else
{
//Pm.Debug "Chyba otevření tabulky"
return -1;
}
}
else
{
//Pm.Debug "Chyba otevření databáze"
return -1;
}
 

Zápis dat z aplikace do databáze

Zápis může být proveden jedním ze dvou způsobů:
1. Zápis dat do tabulky bez jejího předchozího otevření
2. Otevření tabulky a přidání nového řádku do této otevřené tabulky
 
Při zápisu/změně prvním způsobem je nutno provést následující kroky:
- připojení k databázi
- zapsání/změna dat v databázi
- (volitelně: uzavření databáze)
Tento způsob zápisu využívá SQL příkazů INSERT nebo UPDATE.
 
Při zápisu/změně druhým způsobem je nutno provést následující kroky:
- připojení k databázi
- otevření tabulky a příp. nalezení odpovídajícího záznamu
- zapsání/změna dat v databázi
- (volitelně: uzavření databáze)
Tento způsob zápisu využívá metody objektu PmaAdo, AdoRecordset atd.
 
První způsob je šetrnější k aplikaci i k databázi, protože není nutné otevírat příslušnou tabulku a načítat jednotlivé řádky tabulky do paměti. Pro přidání nového řádku do tabulky pak stačí použít příkaz typu INSERT INTO (viz Použití příkazu insert into). Pro změnu stávajícího řádku lze použít příkaz typu UPDATE (viz Použití příkazu update). Tyto SQL příkazy musí být zapsány v syntaxi SQL jazyka dle použitého databázového systému. Tento způsob práce s databázemi tedy vyžaduje znalost dotazovacího jazyka SQL pro konkrétní databázi.
 
Druhý způsob nevyžaduje podrobnější znalost dotazovacího jazyka SQL, nicméně je náročnější (zejména paměťově) pro celou aplikaci i pro databázi, protože i pro přidání nového řádku je nutno otevřít (=načíst) tabulku (viz Použití metody AddNew). Při změně je nutno najít nejdřív příslušný záznam a ten pak upravit (viz Editace stávajícího záznamu). Proto je tento způsob plně použitelný pouze při tabulkách s malým počtem záznamů. Lze také upravit SQL dotaz pro otevření tabulky tak, aby vrátil pouze omezenou část záznamů (ideálně pouze jeden záznam) - např. použitím složených SQL dotazů např. takto:
"select * from table1 where ctime = (select max(ctime) from table1)"
Pro tento účel se nedoporučuje používat omezovací klauzule typu select TOP, LIMIT atd..
Použití příkazu insert into:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, sTime;

oAdo = pMe.Pm("../PmaAdo");

//formát času pro MSSQL
sTime = Pm.FormatDate(Pm.Time, 20);

//formát času pro Oracle
sTime = Pm.FormatDate(Pm.Time, 21);

//formát času pro MySQL
sTime = Pm.FormatDate(Pm.Time, 22);

sSQL = "insert into table1(ctime, ctemperature, cpress, cstatus, cnote) values (" + sTime + ", 12.5, 1.5, 5, 'New record - INSERT')";

//otevření databáze, pokud není otevřená
if (!oAdo.DbIsOpen())
bRes = oAdo.DbOpen();
else
bRes = true;

//pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
//provedeni SQL prikazu
oRs = oAdo.DbExecute("", sSQL, "");

//ověření, zda přidání skončilo úspěšně
if (oAdo.LastErr == 0)
{
//pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Nový záznam byl úspěšně zapsán do databáze");
return 1;
}
else
{
Pm.Debug("Chyba zapsání nové věty do databáze");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}
 
Použití příkazu update:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, sTime;

oAdo = pMe.Pm("../PmaAdo");

//formát času pro MSSQL
sTime = Pm.FormatDate(Pm.Time, 20);

//formát času pro Oracle
sTime = Pm.FormatDate(Pm.Time, 21);

//formát času pro MySQL
sTime = Pm.FormatDate(Pm.Time, 22);

sSQL = "update table1 set ctemperature = 26.5, cPress = 1.83, cstatus = 8, cnote = 'change record UPDATE' where ctime = " + sTime;

//otevření databáze, pokud není otevřená
if (!oAdo.DbIsOpen())
bRes = oAdo.DbOpen();
else
bRes = true;

//pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
//provedeni SQL prikazu
oRs = oAdo.DbExecute("", sSQL, "");

//ověření, zda přidání skončilo úspěšně
if (oAdo.LastErr == 0)
{
//pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Stávající záznam byl úspěšně změněn v databázi");
return 1;
}
else
{
Pm.Debug("Chyba změny stávající věty v databázi");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}
 
Použití metody AddNew:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes;

oAdo = pMe.Pm("../PmaAdo");
sSQL = "select * from table1";

//otevření databáze, pokud není otevřená
if (!oAdo.DbIsOpen())
bRes = oAdo.DbOpen();
else
bRes = true;

//pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
//otevření příslušné tabulky
oRs = oAdo.RsOpen("", sSQL, "lock:optimistic;");

//Zjistí, zda otevření proběhlo úspěšně
if (Pm.IsValid(oRs))
{
//pokud chceme přidat nový záznam, pak není nutné zjišťovat, zda tabulka není prázdná
oRs.AddNew();
oRs.Fields.Item("ctime").Value = Pm.Time;
oRs.Fields.Item("ctemperature").Value = 12.5;
oRs.Fields.Item("cpress").Value = 1.5;
oRs.Fields.Item("cstatus").Value = 5;
oRs.Fields.Item("cnote").Value = "New record - AddNew";
oRs.Update();

if (oRs.Pm_LastErr==0)
{
//pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Nový záznam byl úspěšně zapsán do databáze");
return 1;
}
else
{
Pm.Debug("Chyba zapsání nové věty do databáze");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření tabulky");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}
 
Editace stávajícího záznamu:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, nTime;

oAdo = pMe.Pm("../PmaAdo");
nTime = Pm.Time;
sSQL = "select * from table1";

//otevření databáze, pokud není otevřená
if (!oAdo.DbIsOpen())
bRes = oAdo.DbOpen();
else
bRes = true;

//pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
//otevření příslušné tabulky
oRs = oAdo.RsOpen("", sSQL, "lock:optimistic;");

//Zjistí, zda otevření proběhlo úspěšně
if (Pm.IsValid(oRs))
{
//Zjistí, zda tabulka není prázdná
if (oRs.EOF && oRs.BOF)
{
//Pm.Debug "Tabulka (recordset) neobsahuje žádné záznamy"
return -1;
}
else
{
oRs.MoveFirst();
do
{
if (oRs.Fields.Item("ctime").Value==nTime)
{
oRs.Fields.Item("ctemperature").Value = 26.5;
oRs.Fields.Item("cpress").Value = 1.83;
oRs.Fields.Item("cstatus").Value = 8;
oRs.Fields.Item("cnote").Value = "Change record - PmaAdo/edit";
oRs.Update();

if (oRs.Pm_LastErr==0)
{
//pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Stávající záznam byl úspěšně změněn v databázi");
return 1;
}
else
{
Pm.Debug("Chyba změny stávající věty v databázi");
return -1;
}
}
oRs.MoveNext();

} while (! oRs.EOF)
}
}
else
{
Pm.Debug("Chyba otevření tabulky");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}

Historie:
Pm8.03.21: Vytvořeno
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice