Wobsah

# Słužba SFDatabases.Database

Słužba Database přistup k datowym bankam skići, kotrež su pak zasadźene pak w dokumentach Base wopisane. Tuta słužba metody skići, kotrež:

- Přistup k datam w tabelach datoweje banki dóstawaja.

- Wotprašowanja SELECT wuwjedu a agregatne funkcije přewjedu.

- Akciske instrukcije kaž INSERT, UPDATE, DELETE atd. wuwjedu.

Kóžda instanca słužby Database jednotliwu datowu banku reprezentuje a skići přistup k jeje tabelam, wotprašowanjam a datam.

Tuta słužba přistup k formularam abo rozprawam w dokumenće Base njeskići, kotryž datowu banku wobsahuje. Zo byšće přistup k formularam w dokumenće Base dóstał, wužiwajće metodu FormDocuments słužby Base.

Wšě wuměny mjez tutej słužbu a datowej banku so jenož z pomocu SQL stawaja.

SQL-instrukcije dadźa so w direktnym abo indirektnym modusu wuwjesć. W direktnym modusu so instrukcija do engine datoweje banki přenošuje, bjez kontrole abo přepruwowanja syntaksy.

K dispoziciji stajene tykački jednore tabele a lisćiny wotprašowanjow wopřijimaja kaž tež přistup k datam datoweje banki.

Zo byšće SQL-instrukcije čitajomniše činił, móžeće róžkate spinki "[]" wužiwać, zo byšće mjena tabelow, wotprašowanjow a polow wobdał, město toho, zo byšće druhe wobdawace znamješka wužiwał, kotrež su jenož za wěste relacionalne systemy za rjadowanje datowych bankow (RDBMS). Ale dźiwajće na to, zo wobdawace znamješka w tutym konteksće zawjazne su.

## Wobchadźenje z transakcijemi

Po standardźe datowa banka z transakcijemi w modusu „auto-commit“ wobchadźa, to rěka, zo so po kóždej SQL-instrukciji sfiksowanje (commit) přewjedźe.

Wužiwajće metodu SetTransactionMode, zo byšće standardne zadźerženje změnił, kotrež manuelne sfiksowanja (commits) a cofnjenja (rollbacks) zmóžnja.

Metodźe Commit a Rollback so wužiwatej, zo byštej transakcije wobmjezowałoj.

W LibreOfficeDev je pjeć typow modusow transakciskeje izolacije, kaž su w skupinje konstantow com.sun.star.sdbc.TransactionIsolation definowane:

Konstanta | Hódnota | Interpretacija
--- | --- | ---
NONE | 0 | Wobchadźenje z transakcijemi je znjemóžnjene a datowa banka je do standardneho modusa „auto-commit“ stajena.
READ_UNCOMMITTED | 1 | Móža „dirty reads“ (špatne čitanja), „non-repeatable reads“ (njewospjetujomne čitanja) a „phantom reads“ (fantomowe čitanja) wustupować. Jeli linka so přez transakciju měnja, móže druha transakcija tute změny čitać, samo hdyž njejsu so sfiksowali.
READ_COMMITTED | 2 | Zadźěwa špatnym čitanjam („dirty reads“) , ale njewospjetujomne čitanja (non-repeatable reads) a fantomowe čitanja (phantom reads) móža wustupować. Tuta runina tomu zadźěwa, zo so linki z njesfiksowanymi změnami čitaja.
REPEATABLE_READ | 4 | Zadźěwa špatnym čitanjam („dirty reads“) a njewospjetujomnym čitanjam („non-repeatable reads“). Fantomowe čitanja („phantom reads“) wšak móža wustupować. Njezadźěwa jenož tomu, zo so njesfiksowane daty čitaja, zadźěwa tež tomu, zo dwě čitanskej operaciji w samsnej transakciji rozdźělnej wuslědkaj wudawatej.
SERIALIZABLE | 8 | Zadźěwa špatnym čitanjam („dirty reads“), njewospjetujomnym čitanjam („non-repeatable reads“) a fantomowym čitanjam („phantom reads“). Přidatnje k wobmjezowanjam předchadneje runiny, so tež zaručuje, zo datowa sadźba, kotraž klawsli WHERE wotpowěduje, w samsnej transakciji njezměnjena wostawa.

Čitajće stronu Wikipedije wo izolaciji w systemach datowych bankow (němsce), zo byšće wjace wo transakciskej integriće zhonił.

## Słužbowe wuwołanje

Před wužiwanjom słužby Database dyrbi so biblioteka ScriptForge začitać abo importować:

• Makra Basic sej wužaduja, zo so biblioteka ScriptForge z pomocu slědowaceho přikaza začituje:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Skripty Python sej import z modula scriptforge wužaduja:
from scriptforge import CreateScriptService

### Syntaksa:

Zo byšće instancu słužby Database wutworił, móžeće metodu CreateScriptService wužiwać:

CreateScriptService("SFDatabases.Database", [filename: str], [registrationname], [readonly], [user, [password]]): svc

W horjeka wopisanej syntaksy móžeće pak „SFDatabases.Database“ pak „Database“ jako prěni argument metody CreateScriptService wužiwać.

### Parametry:

filename: Mjeno dataje Base. Dyrbi so w notaciji SF_FileSystem.FileNaming zwuraznić.

registrationname: Mjeno zregistrowaneje datoweje banki. Jeli filename je podate, njeměł so tutón argument wužiwać.

Jeli wšak registrationname je podate, njeměł so parameter filename definować.

readonly: Postaja, hač so datowa banka jako přećiwo pisanju škitana wočinja (standard = True).

user, password: Přidatnej zwiskowej parametraj serwera datoweje banki.

### Přikład:

##### W Basic

          GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
          Dim myDatabase as Object
          Set myDatabase = CreateScriptService("Database", "/home/user/Documents/myDB.odb")
          ' Wotprašowanja, SQL-instrukcije, … wuwjesć
          myDatabase.CloseDatabase()

##### W Python

          from scriptforge import CreateScriptService
          myDatabase = CreateScriptService("Database", "/home/user/Documents/myDB.odb")
          # Wotprašowanja, SQL-instrukcije, … wuwjesć
          myDatabase.CloseDatabase()

## Přistup k datowym bankam ze słužbu UI

Je tež móžno, přez słužbu ScriptForge.UIpřistup k datowej bance dóstać, kotraž je z dokumentom zwjazana, kak so w slědowacymaj přikładomaj pokazuje:

##### W Basic

          Dim myDoc As Object, myDatabase As Object, ui As Object
          Set ui = CreateScriptService("UI")
          Set myDoc = ui.OpenBaseDocument("/home/user/Documents/myDB.odb")
          ' Wužiwar a hesło so deleka podawatej, jeli trjeba
          Set myDatabase = myDoc.GetDatabase()
          ' Wotprašowanja, SQL-instrukcije, … wuwjesć
          myDatabase.CloseDatabase()
          myDoc.CloseDocument()

##### W Python

          ui = CreateScriptService("UI")
          doc = ui.OpenBaseDocument("/home/user/Documents/myDB.odb")
          # Wužiwar a hesło so deleka podawatej, jeli trjeba
          myDatabase = doc.GetDatabase()
          # Wotprašowanja, SQL-instrukcije, … wuwjesć
          myDatabase.CloseDatabase()
          doc.CloseDocument()

Metoda GetDatabase, kotraž so horjeka w přikładźe wužiwa, je dźěl słužby Base ScriptForge.

## Kajkosće

Mjeno | Přećiwo pisanju škitany | Typ | Wopisanje
--- | --- | --- | ---
Queries | Haj | Matriks znamješkowych rjećazkow | Lisćina składowanych wotprašowanjow.
Tables | Haj | Matriks znamješkowych rjećazkow | Lisćina składowanych tabelow.
XConnection | Haj | XConnection | Objekt UNO, kotryž aktualny zwisk datoweje banki reprezentuje.
XMetaData | Haj | XDatabaseMetaData | Objekt UNO, kotryž metadaty reprezentuje, kotrež atributy systema datoweho banka wopisuja.

Lisćina metodow w słužbje datoweje banki
CloseDatabase Commit CreateDataset DAvg DCount DMin | DMax DSum DLookup GetRows OpenFormDocument OpenQuery | OpenSql OpenTable Rollback RunSql SetTransactionMode

## CloseDatabase

Začinja aktualny zwisk datoweje banki.

### Syntaksa:

db.CloseDatabase()

### Přikład:

        myDatabase.CloseDatabase() ' Basic

        myDatabase.CloseDatabase() # Python

## Commit

Fiksuje wšě aktualizacije, kotrež su so w předchadnym wołanju Commit abo Rollback přewjedli.

Tuta metoda so ignoruje, jeli sfiksowanja so po kóždej SQL-instrukciji awtomatisce přewjedu, t. r. datowa banka je na modus „auto-commit“ nastajena.

### Syntaksa:

db.Commit()

### Přikład:

##### W Basic

          ' Transakcisku runinu „REPEATABLE_READ“ nastajić
          myDB.SetTransactionMode(4)
          myDB.RunSql("UPDATE ...")
          myDB.Commit()
          myDB.RunSql("DELETE ...")
          ' Někajke wuměnjenje testować, prjedy hač so sfiksowanje přewjedźe
          If bSomeCondition Then
              myDB.Commit()
          Else
              myDB.Rollback()
          End If
          ' Modus „auto-commit“ wobnowić
          myDB.SetTransactionMode()

##### W Python

          myDB.SetTransactionMode(4)
          myDB.RunSql("UPDATE ...")
          myDB.Commit()
          myDB.RunSql("DELETE ...")
          if some_condition:
              myDB.Commit()
          else:
              myDB.Rollback()
          myDB.SetTransactionMode()

## CreateDataset

Wutwori słužbowu instancu Dataset na zakładźe tabele, wotprašowanja abo SQL-přikaza SELECT.

### Syntaksa:

db.CreateDataset(sqlcommand: str, opt directsql: bool, opt filter: str, opt orderby: str): svc

### Parametry:

sqlcommand: Mjeno tabele, mjeno wotprašowanja bo płaćiwy SQL-přikaz SELECT. Identifikuje dadźa so přez róžkate spinki wobdać. Tutón argument na wulkopisanje dźiwa.

directsql: Stajće tutón argument na True, zo byšće přikaz bjez předźěłanja do toho přez LibreOfficeDev direktnje na engine datoweje banki pósłał (standard = False).

filter: Podawa wuměnjenje, kotremuž datowe sadźby dyrbja wotpowědować, zo bychu so do wróćeneje datoweje sadźby přijeli. Tutón argument so jako SQL-přikaz WHERE bjez klučoweho słowa „WHERE“ zwuraznja.

orderby: Podawa porjad datoweho wobstatka jako SQL-přikaz ORDER BY bjez klučoweho słowa „ORDER BY“.

### Přikład:

Slědowace přikłady w Basic a Python datowy wobstatk z datowymi sadźbami tabele z mjenom „Kupcy“ wróća.

##### W Basic

          oDataset = myDatabase.CreateDataset("Kupcy", Filter := "[Name] LIKE 'A'")

##### W Python

          dataset = myDatabase.CreateDataset("Kupcy", Filter = "[Name] LIKE 'A'")

## DAvg, DCount, DMin, DMax, DSum

Wobličuje podatu agregatnu funkciju za polo abo wuraz, kotryž k tabeli słuša.

Na přeće móžeće SQL-klawslu WHERE jako filter podać, kotryž so před agregatnej funkciju nałožuje.

### Syntaksa:

db.DAvg(expression: str, tablename: str, [criteria: str]): any

db.DCount(expression: str, tablename: str, [criteria: str]): any

db.DMin(expression: str, tablename: str, [criteria: str]): any

db.DMax(expression: str, tablename: str, [criteria: str]): any

db.DSum(expression: str, tablename: str, [criteria: str]): any

### Parametry:

expression: SQL-wuraz, w kotrymž su pólne mjena z róžkatymi spinkami wobdate.

tablename: Mjeno tabele (bjez róžkatych spinkow).

criteria: Klawsla WHERE bjez klučoweho słowa „WHERE“, w kotrejž su pólne mjena z róžkatymi spinkami wobdate.

### Přikład:

Slědowacy přikład připušća, zo dataja Employees.odb ma tabelu z mjenom EmployeeData.

##### W Basic

          GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
          Dim myDB as Variant
          Set myDB = CreateScriptService("Database", "/home/user/Databases/Employees.odb")
          ' Liči ličbu sobudźěłaćerjow w tabeli
          MsgBox myDB.DCount("[ID]", "EmployeeData")
          ' Wróći sumu wšěch mzdow w tabeli
          MsgBox myDB.DSum("[Salary]", "EmployeeData")
          ' Deleka su někotre přikłady za to, kak tabele dadźa so filtrować
          MsgBox myDB.DCount("[ID]", "EmployeeData", "[Position] = 'Manager'")
          MsgBox myDB.DCount("[ID]", "EmployeeData", "[Position] = 'Sales' AND [City] = 'Chicago'")
          MsgBox myDB.DCount("[ID]", "EmployeeData", "[FirstName] LIKE 'Paul%'")

##### W Python

          myDB = CreateScriptService("Database", "/home/user/Databases/Employees.odb")
          bas = CreateScriptService("Basic")
          bas.MsgBox(myDB.DCount("[ID]", "EmployeeData"))
          bas.MsgBox(myDB.DSum("[Salary]", "EmployeeData"))
          bas.MsgBox(myDB.DCount("[ID]", "EmployeeData", "[Position] = 'Manager'"))
          bas.MsgBox(myDB.DCount("[ID]", "EmployeeData", "[Position] = 'Sales' AND [City] = 'Chicago'"))
          bas.MsgBox(myDB.DCount("[ID]", "EmployeeData", "[FirstName] LIKE 'Paul%'"))

## DLookup

Wobličuje SQL-wuraz za jednotliwu datowu sadźbu, kotraž so přez klawslu WHERE wróća, kotraž je přez parameter Criteria definowana.

Jeli wotprašowanje wjacore datowe sadźby wróća, so jenož prěnja wobkedźbuje. Wužiwajće parameter OrderClause, zo byšće postajił, kak so maja wuslědki wotprašowanja sortěrować.

### Syntaksa:

db.DLookup(expression: str, tablename: str, [criteria:str], [orderclause: str]): any

### Parametry:

expression: SQL-wuraz, w kotrymž su pólne mjena z róžkatymi spinkami wobdate.

tablename: Mjeno tabele (bjez róžkatych spinkow).

criteria: Klawsla WHERE bjez klučoweho słowa „WHERE“, w kotrejž su pólne mjena z róžkatymi spinkami wobdate.

orderclause: Klawsla ORDER BY bjez klučoweju słowow „ORDER BY“. Pólne mjena měli so z róžkatymi spinkami wobdać.

### Přikład:

##### W Basic

          MsgBox myDB.DLookup("[FirstName]", "EmployeeData", Criteria := "[LastName] LIKE 'Smith'", OrderClause := "[FirstName] DESC")
          MsgBox myDB.DLookup("[Salary]", "EmployeeData", Criteria := "[ID] = '3'")
          MsgBox myDB.DLookup("[Quantity] * [Value]", "Sales", Criteria := "[SaleID] = '5014'")

##### W Python

          bas = CreateScriptService("Basic")
          bas.MsgBox(myDB.DLookup("[FirstName]", "EmployeeData", criteria = "[LastName] LIKE 'Smith'", orderclause = "[FirstName] DESC"))
          bas.MsgBox(myDB.DLookup("[Salary]", "EmployeeData", criteria = "[ID] = '3'"))
          bas.MsgBox(myDB.DLookup("[Quantity] * [Value]", "Sales", criteria = "[SaleID] = '5014'"))

## GetRows

Składuje wobsah tabele abo wuslědki wotprašowanja SELECT abo SQL-přikaz w dwudimensionalnej matriksy. Prěni indeks w matriksy linkam wotpowěduje a druhi indeks so na špalty poćahuje.

Hornja mjeza da so za ličbu wróćenych linkow podać. Na přeće dadźa so špaltowe mjeno w prěnjej lince matriksy zasadźić.

Wróćena matriks budźe prózdna, jeli so žane linki njewróćeja a špaltowe hłowy trěbne njejsu.

### Syntaksa:

db.GetRows(sqlcommand: str, directsql: bool = False, header: bool = False, maxrows: int = 0): any

### Parametry:

sqlcommand: Mjeno tabele abo wotprašowanja (bjez róžkatych spinkow) abo SQL-přikaz SELECT.

directsql: Hdyž hódnota nastajenja je True, so přikaz SQL na jednotku datoweje banki bjez analyzy do toho sćele. Standard je False. Tutón argument so za tabele ignoruje. Za wotprašowanja so te nastajenje nałožuje, kotrež je so postajiło, hdyž je so wotprašowanje definowało.

header: Hdyž to je True, prěnja linka wróćeneje matriksy špaltowe hłowy wobsahuje.

maxrows: Maksimalna ličba linkow, kotrež so maja wróćić. Standard je nul, štož rěka, zo limit za ličbu wróćenych linkow njeje.

### Přikład:

Deleka su někotre přikłady za to, kak metoda GetRows da so wužiwać:

##### W Basic

          Dim queryResults as Variant
          ' Wróći wšě linki w tabeli ze špaltowymi hłowami
          queryResults = myDB.GetRows("EmployeeData", Header := True)
          ' Wróći prěnje 50 datowych sadźbow sobudźěłaćerjow, zrjadowane po polu ‚FirstName‘
          queryResults = myDB.GetRows("SELECT * FROM EmployeeData ORDER BY [FirstName]", MaxRows := 50)

##### W Python

          queryResults = myDB.GetRows("EmployeeData", header = True)
          queryResults = myDB.GetRows("SELECT * FROM EmployeeData ORDER BY [FirstName]", maxrows = 50)

## OpenFormDocument

Wočinja podaty formularowy dokument w normalnym modusu. Tuta metoda słužbowu instancu FormDocument wróća, kotraž podatemu formularowemu dokumentej wotpowěduje.

Jeli formularowy dokument je hižo wočinjeny, so wokno formularoweho dokumenta aktiwizuje.

Jeli podaty formularowy dokument njeeksistuje, so Nothing wróći.

### Syntaksa:

svc.OpenFormDocument(formdocument: str): svc

### Parametry:

formDocument: Mjeno za FormDocument, kotryž so ma wočinić, jako znamješkowy rjećazk, kotryž wulkopisanje wobkedźbuje.

### Přikład:

##### W Basic

Najwjace formularowych dokumentow so w korjenjowym zapisu dokumenta Base składuje a da so prosće z pomocu jich mjenow wočinić, kaž w slědowacym přikładźe:

        Dim oFormDoc As Object
        oFormDoc = myDB.OpenFormDocument("myFormDocument")

Jeli formularowe dokumenty su w rjadowakach organizowane, dyrbi so mjeno rjadowaka zapřijeć, zo by so formularowy dokument jako wočinjeny postajił, kaž so w slědowacym přikładźe pokazuje:

        oFormDoc = myDB.OpenFormDocument("myFolder/myFormDocument")

##### W Python

        formDoc = myDB.OpenFormDocument("myFormDocument")

        formDoc = myDB.OpenFormDocument("myFolder/myFormDocument")

## OpenQuery

Wočinja wokno datoweho napohlada podateho wotprašowanja a wróći instancu słužby Datasheet.

Jeli wotprašowanje njeda so wočinić, so Nothing wróći.

### Syntaksa:

db.OpenQuery(queryname: str): obj

### Parametry:

queryname: Mjeno eksistowaceho wotprašowanja jako znamješkowy rjećazk, kotryž wulkopisanje wobkedźbuje.

### Přikład:

##### W Basic

          myDatabase.OpenQuery("MyQuery")

##### W Python

          myDatabase.OpenQuery("MyQuery")

## OpenSql

Wuwjedźe SQL-přikaz SELECT, wočinja wokno Datowy napohlad z wuslědkami a wróća instancu słužby Datasheet.

### Syntaksa:

db.OpenSql(sql: str, directsql: bool): obj

### Parametry:

sql: Znamješkowy rjećazk, kotryž płaćiwy SQL-přikaz SELECT wobsahuje. Identifikatory dadźa so z róžkatymi spinkami wobdać.

directsql: Hdyz to je True, so SQL-přikaz na engine datoweje banki bjez analyzy do toho sćele (standard = False).

### Přikład:

##### W Basic

          myDatabase.OpenSql("SELECT * FROM [Customers] ORDER BY [CITY]")

##### W Python

          myDatabase.OpenSql("SELECT * FROM [Customers] ORDER BY [CITY]")

## OpenTable

Wočinja wokno datoweho napohlada podateje tabele a wróći instancu słužby Datasheet.

### Syntaksa:

db.OpenTable(tablename: str): obj

### Parametry:

tablename: Mjeno eksistowaceje tabele jako znamješkowy rjećazk, kotryž wulkopisanje wobkedźbuje.

### Přikład:

##### W Basic

          myDatabase.OpenTable("MyTable")

##### W Python

          myDatabase.OpenTable("MyTable")

## Rollback

Přetorhnje wšě změny, kotrež su so na datowej bance wot poslednjeho wołanja Commit abo Rollback přewjedli.

### Syntaksa:

db.Rollback()

### Přikład:

##### W Basic

          myDB.SetTransactionMode(1)
          myDB.RunSql("UPDATE ...")
          ' ...
          If bSomeCondition Then
              myDB.Rollback()
          End If

##### W Python

          myDB.SetTransactionMode(1)
          myDB.RunSql("UPDATE ...")
          # ...
          if bSomeCondition:
              myDB.Rollback()

## RunSql

Wuwjedźe akciske wotprašowanje SQL-přikaza kaž wutworjenje tabele kaž tež zasadźowanje, aktualizowanje a hašenje datowych sadźbow.

Metoda True wróća, hdyž je wuspěšne.

Metoda RunSql so ze zmylkowej zdźělenku wotpokazuje, jeli datowa banka je so do toho w modusu „read-only“ wočiniła.

### Syntaksa:

db.RunSql(sqlcommand: str, directsql: bool = False): bool

### Parametry:

sqlcommand: Mjeno wotprašowanja (bjez róžkatych spinkow) abo SQL-přikaz.

directsql: Hdyž to je True so SQL-přikaz na engine datoweje banki bjez analyzy do toho sćele. (standard = False). Za wotprašowanja je nałožene nastajenje te, kotrež je so stajiło, hdyž je so wotprašowanje definowało.

### Přikład:

##### W Basic

          myDatabase.RunSql("INSERT INTO [EmployeeData] VALUES(25, 'Smith', 'John')", DirectSQL := True)

##### W Python

          myDatabase.RunSql("INSERT INTO [EmployeeData] VALUES(25, 'Smith', 'John')", directsql = True)

## SetTransactionMode

Definuje runinu izolacije w transakcijach datoweje banki.

Po standardźe datowe banki transakcije w modusu „auto-commit“ rjaduja, to rěka, zo so Commit awtomatisce po kóždym SQL-přikazu wuwjedźe.

Wužiwajće tutu metodu, zo byšće izolacisku runinu transakcijow manuelnje postajił. Hdyž druhi transakciski modus hač NONE je nastajeny, dyrbi skript eksplicitnje metodu Commit wuwołać, zo by změny na datowu banku nałožił.

Tuta metoda True wróća, hdyž je wuspěšna.

Hdyž so transakciski modus měnja, so wšě instancy Dataset začinjeja, kotrež su so z aktualneje datoweje banki wutworili.

### Syntaksa:

db.SetTransactionMode(transactionmode: int = 0): bool

### Parametry:

transactionmode: Podawa transakciski modus. Tutón argument dyrbi jedna z konstantow być, kotrež su w com.sun.star.sdbc.TranslationIsolation definowane (standard = NONE)

Čitajće wotrězk Wobchadźenje z transakcijemi horjeka, zo byšće wjace wo runinach transakciskeje izolacije zhonił, kotrež so w LibreOfficeDev wužiwaja.

### Přikład:

##### W Basic

          myDB.SetTransactionMode(com.sun.star.sdbc.TransactionIsolation.REPEATABLE_READ)
          oDataset = myDB.CreateDataset("SELECT ...")
          ' ...
          ' Transakciski modus na standard wróćo stajić
          myDB.SetTransactionMode()

##### W Python

          from com.sun.star.sdbc import TransactionIsolation
          myDB.SetTransactionMode(TransactionIsolation.REPEATABLE_READ)
          dataset = myDB.CreateDataset("SELECT ...")
          # ...
          myDB.SetTransactionMode()

Wšě rutiny Basic ScriptForge abo identifikatory, kotrež so z podsmužku „_“ započinaja, su za interne wužiwanje wuměnjene. Njejsu za to myslene, so w makrach Basic abo skriptach Python wužiwać.

Podobne temy

Słužba SFDatabases.Datasheet

Słužba SFDatabases.Dataset

Słužba SFDocuments.Document

Słužba SFDocuments.Form

ScriptForge.UI service

Prošu podpěrajće nas!