Promotic
WikipediaLinkedInYoutubeTwitterFacebook

PmAdo - Praktické příklady

Viz: Objekt PmAdo, PmAdo - 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 při 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 zapotřebí 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í PmAdo 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 PmAdo:
- 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:
VBScriptVyber a zkopíruj do schránky

Dim oAdo, oRs, sSQL, bRes, vValues

Set oAdo = pMe.Pm("../PmAdo")
sSQL = "select * from table1"

'otevření databáze, pokud není otevřená
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'pokud je databáze otevřená, pak lze pokračovat dál
If bRes Then
  'otevření příslušné tabulky
  Set oRs = oAdo.RsOpen("", sSQL, "")
  'zjištění, zda otevření proběhlo úspěšně
  If Pm.IsValid(oRs) Then
    'zjištění, zda tabulka není prázdná
    If oRs.EOF And oRs.BOF Then
      'Pm.Debug "Tabulka (recordset) neobsahuje žádné záznamy"
      pResult = -1
    Else
      'když tabulka není prázdná je možné ji načíst jako 2-rozměrné pole
      vValues = oRs.GetRows()
      pResult = vValues
    End If
  Else
    'Pm.Debug "Chyba otevření tabulky"
    pResult = -1
  End If
Else
  'Pm.Debug "Chyba otevření databáze"
  pResult = -1
End If
 

Zapsání 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 nutné 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 nutné 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 PmAdo, 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 je možné 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 zapotřebí otevřít (=načíst) tabulku (viz Použití metody AddNew). Při změně je nejprve potřeba najít 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:
VBScriptVyber a zkopíruj do schránky

Dim oAdo, oRs, sSQL, bRes, sTime

Set oAdo = pMe.Pm("../PmAdo")

'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 Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'pokud je databáze otevřená, pak lze pokračovat dál
If bRes Then
  'provedeni SQL prikazu
  Set oRs = oAdo.DbExecute("", sSQL, "")

  'ověření, zda přidání skončilo úspěšně
  If oAdo.LastErr = 0 Then
    'pokud výsledkem dotazu je množina záznamů, pak je možné ji dále zpracovat
    Pm.Debug "Nový záznam byl úspěšně zapsán do databáze"
    pResult = 1
  Else
    Pm.Debug "Chyba zapsání nové věty do databáze"
    pResult = -1
  End If
Else
  Pm.Debug "Chyba otevření databáze"
  pResult = -1
End If
 
Použití příkazu update:
VBScriptVyber a zkopíruj do schránky

Dim oAdo, oRs, sSQL, bRes, sTime

Set oAdo = pMe.Pm("../PmAdo")

'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 Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'pokud je databáze otevřená, pak lze pokračovat dál
If bRes Then
  'provedeni SQL prikazu
  Set oRs = oAdo.DbExecute("", sSQL, "")

  'ověření, zda přidání skončilo úspěšně
  If oAdo.LastErr = 0 Then
    'pokud výsledkem dotazu je množina záznamů, pak je možné ji dále zpracovat
    Pm.Debug "Stávající záznam byl úspěšně změněn v databázi"
    pResult = 1
  Else
    Pm.Debug "Chyba změny stávající věty v databázi"
    pResult = -1
  End If
Else
  Pm.Debug "Chyba otevření databáze"
  pResult = -1
End If
 
Použití metody AddNew:
VBScriptVyber a zkopíruj do schránky

Dim oAdo, oRs, sSQL, bRes

Set oAdo = pMe.Pm("../PmAdo")
sSQL = "select * from table1"

'otevření databáze, pokud není otevřená
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

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

  'zjištění, zda otevření proběhlo úspěšně
  If Pm.IsValid(oRs) Then
    '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 Then
      'pokud výsledkem dotazu je množina záznamů, pak je možné ji dále zpracovat
      Pm.Debug "Nový záznam byl úspěšně zapsán do databáze"
      pResult = 1
    Else
      Pm.Debug "Chyba zapsání nové věty do databáze"
      pResult = -1
    End If
  Else
    Pm.Debug "Chyba otevření tabulky"
    pResult = -1
  End If
Else
  Pm.Debug "Chyba otevření databáze"
  pResult = -1
End If
 
Editace stávajícího záznamu:
VBScriptVyber a zkopíruj do schránky

Dim oAdo, oRs, sSQL, bRes, nTime

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

'otevření databáze, pokud není otevřená
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

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

  'zjištění, zda otevření proběhlo úspěšně
  If Pm.IsValid(oRs) Then
    'zjištění, zda tabulka není prázdná
    If oRs.EOF And oRs.BOF Then
      'Pm.Debug "Tabulka (recordset) neobsahuje žádné záznamy"
      pResult = -1
    Else
      oRs.MoveFirst
      Do
        If oRs.Fields.Item("ctime").Value=nTime Then
          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 - PmAdo/edit"
          oRs.Update

          If oRs.Pm_LastErr=0 Then
            'pokud výsledkem dotazu je množina záznamů, pak je možné ji dále zpracovat
            Pm.Debug "Stávající záznam byl úspěšně změněn v databázi"
            pResult = 1
          Else
            Pm.Debug "Chyba změny stávající věty v databázi"
            pResult = -1
          End If
        End If
        oRs.MoveNext

      Loop While Not oRs.EOF
    End If
  Else
    Pm.Debug "Chyba otevření tabulky"
    pResult = -1
  End If
Else
  Pm.Debug "Chyba otevření databáze"
  pResult = -1
End If
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice