Zde jsou uvedeny jednotlive typy, rady a odpovedi resici nejcasteji se vyskytujici chyby a problemy. Forma je znacne neusporadana, ale je dana postupnym vznikem a prubeznymi zmenami tohoto textu. ***** Datove typy v databazi Oracle ****************************************** ------------------------------------------------------------------------------ Pri definici databazovych tabulek je velice vhodne pouzivat POUZE nasledujici typy databazovych polozek : DATE - datum NUMBER - celociselne nebo realne cislo specifikovaneho rozsahu VARCHAR2 - znakovy retezec specifikovane delky Pouziti jinych datovych typu muze zpusobit neocekavane problemy na neocekavanych mistech. Napr. datovy typ CHAR neni mozne pouzit v polozkach definujicich relaci mezi databazovymi tabulkami. ***** Jednoznacne generovane seriove cislo *********************************** ------------------------------------------------------------------------------ Nejprve je nutne vytvorit si v databazi generator ciselne rady. Zadate SQL prikaz : create sequence serial; Potom je mozne pouzivat jeho hodnoty kdekoliv je nutne. Ve formulari nebo jinde zadate napr. : insert into zbozi (cislozbozi,nazevzbozi,jednotka,cena) values (serial.nextval,'testtttt','ks',11.11); commit; Pricemz vyraz "serial.nextval" zavola generator pojmenovany serial a vrati jeho dalsi dosud nepouzitou hodnotu. Hodnota je jedinecna v ramci cele databaze. Takto vytvoreny serializator je ovsem mozne pouzit POUZE v SQL prikazech (select, insert, ...), ne v jazyce PL/SQL (napriklad prikaz :blok.polozka := serial.nextval nelze provest !). Serializator lze vsak pouzit v nastaveni pocatecnich hodnot polozek. a to tak, ze pocatecni hodnota se uvede :SEQUENCE.JMENO_SEQUENCE.NEXTVAL Proto je mozna lepsi pomoci prikazu SELECT si zjistit maximalni hodnotu dane polozky, zvetsit ji o 1 a ulozit do nove polozky (v novem zaznamu). ***** Po spusteni formulare neni viditelne zadne okno ************************ ------------------------------------------------------------------------------ Je nutne mit vytvorene vlastni menu. Potom v Properties tohoto modulu menu (tedy napr. v Properties objektu "mojemenu", nikoliv v objektu "Main menu") zvolite PL/SQL Editor. Objevi se okno podobne oknu zadavani prikazu triggeru, pouze v okenku typ kodu nebude "Trigger" ale bude tam "Menu Startup Code". Tento kod se spusti az po spusteni formulare a tedy v dobe, kdy uz jsou okna znama (proto na zavirani nepohodlnych oken neni mozne pouzit trigger PreForm, protoze se spusti jeste pred spustenim formulare, kdy okna jeste nejsou znama, a tedy prilis brzy). V tomto okne zadate nasledujici prikazy: Hide_Window('WINDOW0'); Jako parametr uvedete jmena nepohodlnych oken, ktera chcete zavrit. Je mozne zde uvest dalsi prikazy. --set_window_property('WINDOW0',WINDOW_STATE,MAXIMIZE); set_window_property('WINDOW0',VISIBLE,PROPERTY_FALSE); set_window_property(FORMS_MDI_WINDOW,WINDOW_STATE,MAXIMIZE); set_window_property(FORMS_MDI_WINDOW,TITLE,'System spravy dat'); ***** ListBox s polozkami vybranymi z databaze ******************************* ------------------------------------------------------------------------------ Definujete si objekt typu List Box. Do nej na vhodnem miste naplnite hodnoty vybrane z databzove tabulky. Takovym vhodnym mistem muze byt trigger PreBlock v bloku, kde je ListBox definovan. Na tomto vhodnem miste zadate nasledujici prikazy: DECLARE group_id RecordGroup; /* group_id je skupina zaznamu, do ktere se prikazem SELECT vyberou vety z databazove tabulky */ list_id Item := Find_Item('zbozilist'); /* list_id je ukazatel na zvoleny objekt typu ListBox, ktery chceme naplnit. Misto jmena zbozi_list je samozrejme nutne doplnit spravne jmeno Vaseho ListBoxu */ status NUMBER; /* pomocna promenna */ BEGIN /* Tlacitko 'Ukaz dialog' zobrazi dialogove okno s nekolika checkboxy, radio buttony a listboxem. Protoze okno DialoWin ma v properties nastaveny Window Style na 'Dialog' a Modal na 'True' (parametry jsou popsany opet v helpu), Oracle pozna, ze se jedna o zvlastni typ okna, ktere musi byt vzdy v popredi. Neni proto nutne pouzivat prikaz Go_Block. */ Show_Window ('DIALOGWIN',50,50); Go_Block ('DIALOGBLK'); /* ** Vytvori se skupina zaznamu, ktera ma dva sloupce. Tyto dva sloupce jsou ** dulezite kvuli ListBoxu, ktery vyzaduje, aby kazdy radek seznamu obsahoval ** sve jmeno a hodnotu. ** Misto jmena zbozi_names je nutne zadat nejake svoje jednoznacne jmeno ** teto skupiny. ** Do prikazu SELECT zadate potrebne parametry. Je vhodne (dulezite pro nasledujici ** funkci Populate_List) vybirany sloupec ** jako v prikladu zadat dvakrat, protoze skupina zaznamu ma dva sloupce, ** ktere je nutne naplnit. Nejlepsi je vybrat dvakrat tutez hodnotu, kterou ** bude ListBox interpretovat jednou jako nazev a podruhe jako hodnotu radku ** seznamu. ** Existuje-li uz tato skupina (typicky proto, ze zminene okno otvirate ** podruhe, je nutne ji nejprve zrusit a pote vytvorit znovu s novym obsahem. */ group_id := Find_Group('zbozi_names'); If Not Id_Null (group_id) Then Delete_Group (group_id); end if; group_id := Create_Group_From_Query('zbozi_names','SELECT zbozi.nazevzbozi, to_char(zbozi.cislozbozi) FROM zbozi'); status := Populate_Group(group_id); /* ** Prikaz Populate_Group provede prikaz SELECT a naplni skupinu zaznamu daty. */ Populate_List(list_id,group_id); /* ** Prikaz Populate_List podstrci skupinu zaznamu do ListBoxu, ktery ji posleze ** zobrazi. */ END; ***** Chyba "Unable to INSERT record" **************************************** ------------------------------------------------------------------------------ Pokud se pri behu formulare objevi tato chyba, znamena, ze Oracle neni schopen zadana data ulozit do databazove tabulky. Zde je seznam moznych pricin a reseni : - Problem: Pri definici databaze jste zadali omezujici podminky na hodnoty nekterych databazovych polozek, napr., ze polozka nesmi byt prazdna, jeji musi byt jedinacna, apod. Tyto podminky nove zadana veta nesplnuje. Reseni: Zadejte data spravne vzhledem k omezujicim podminkam. Pozor na spravny format datumu. - Problem: Nedostatek pameti. Kdyz se Oraclu nedostava pamet na ulozeni vety do databaze, ohlasi to takovymto hloupym zpusobem. Reseni: Uvolnete pamet, zejmena ukoncenim ostatnich nepotrebnych uloh, jako Netscape, ... - Problem: V databazovem bloku, ktery zpristupnuje polozky dane tabulky mate nadefinovane dalsi polozky, ktere v databazi nejsou (tyto polozky obsahuji napr. soucty, jmena, apod.). Pri volani Commit nebo Commit_Form se Oracle snazi do databaze ulozit vsechny polozky, ktere se v danem bloku vyskytuji bez ohledu, zda do databaze patri nebo ne. Operace INSERT se pochopitelne nepovede kvuli prebyvajicim polozkam. Reseni: Prebyvajici polozky, ktere nepatri do databaze, presunte do jineho bloku, ktery je zobrazen na teze plose. - popis priciny chyby - viz. tip "Podrobnejsi popis k chybove hlasce". ***** Zobrazeni polozek databaze pri otevreni okna *************************** ------------------------------------------------------------------------------ Do triggeru, ktery otvira okno se prida prikaz Execute_Query, ktery vybere a v bloku zobrazi vsechny polozky dane databaze. Pokud po pouziti prikazu Execute_Query neobsahuje okno zadne objekty a nezobrazi se, pravdepodobnou pricinou je vyvolani prikazu Execute_Query prilis brzy. Tedy jeste pred tim, nez je dany blok pristupny. Prikazy v trigru When_Button_Pressed tlacitka otvirajiciho okno : Show_Window ('ListWin'); Go_Block ('Prac'); Execute_Query (ALL_RECORDS); Pokud chcete v otviranem bloku zobrazit je nektere DB vety - viz. tip "Trideni a vyber vet zobrazenych v bloku" ***** Zruseni aktualni databazove vety *************************************** ------------------------------------------------------------------------------ Pokud je v bloku Zbozi zobrazen seznam vet z databazove tabulky zbozi a je treba aktualni vetu zrusit, napr. stiskem tlacitka, musi se vykonat nasledujici prikazy (napr. v triggeru When_Button_Pressed prislusneho tlacitka) : Go_Block ('Zbozi'); Delete_Record; Commit; Prikaz Go_Block je nutny, protze v okamziku stisku talcitka je aktualnim blok, ve kterem je tlacitko definovano, a ne blok obsahujici polozky DB tabulky. ***** Trideni a vyber vet zobrazenych v bloku ******************************** ------------------------------------------------------------------------------ Kdyz definujete blok zobrazujici vety dane databazove tabulky, je mozne take urcit vety, ktere budou v bloku zobrazeny, a poradi, v jakem budou vypsany. Deje se tak pomoci nastaveni parametru bloku v okne Properties: Ve skupine parametru "Database" je parametr "ORDER BY Clause". Zadanim jmena databazove polozky nebo jmen databazovych polozek oddelenych carkami se urci trideni vet zobrazenych v bloku. Vety budou setrideny podle hodnot zadanych polozek. Princip je stejny jako zadani klausule ORDER BY v prikazu SELECT. Ve skupine parametru "Database" je parametr "WHERE Clause". Zde zadana podminka urcuje kriterium vyberu vet zobrazenych v bloku. Do podminky je mozne zadat krome jmen databazovych polozek (sloupcu dane tabulky) take konstanty, ale i globalni a vazane promenne. Princip je stejny jako zadani klauzule WHERE v prikazu SELECT. Druhym zpusobem, jak dosahnout tehoz je pouzit nasledujici sekvence prikazu : go_block('BLOK1'); select * into :BLOK1.id,:BLOK1.jmeno,:BLOK1.prijmeni from tabulka where psc = :BLOK2.psc and adresa = :BLOK2.adresa; Seznam polozek za klicovym slovem into ovsem musi obsahovat vsechny polozky z bolku BLOK1. ***** Vazane promenne ******************************************************** ------------------------------------------------------------------------------ Vazane promenne slouzi k manipulaci s hodnotami ulozenymi v objektech. Nektere objekty v sobe obsahuji hodnotu, napr. Text Item editovany text, cislo, ..., Display Item zobrazovanou hodnotu, Check Box zvolenou hodnotu, apod. S temito hodnotami se pracuje pomoci vazanych promennych. Syntaxe je nasledujici : :Jmeno_bloku.Jmeno_objektu kde Jmeno_Objektu je jmeno objektu, s jehoz hodnotou pracuji (ne Label!) Jmeno_Bloku je jmeno bloku, ve kterem je tento objekt definovan Napr.: :MujBlok.CelkSuma := 2500; If :MujBlok.Jmeno = 'Novak' Then ... S vazanou promennou se pracuje jako s kazdou jinou. ***** Formatovaci maska objektu ********************************************** ------------------------------------------------------------------------------ V okne Properties ve skupine parametru Data je parametr Format Mask, kde je mozne zadat format, v jakem se bude hodnota objektu zobrazovat nebo zadavat. Takto je mozne napr. zmenit format datumu z anglickeho na cesky. Podrobnejsi popis jednotlivych formatu je v helpu (po stisku F1). ***** Tisk sestavy z formulare *********************************************** ------------------------------------------------------------------------------ Primo z formulare je mozne zahajit tisk vystupni sestavy, napr. po stisku tlacitka. Definice sestavy pochopitelne uz musi byt pomoci Report Designeru vytvorena a prelozena do spustitelneho tvaru (viz. dev2000.doc). Dosahne se toho zadanim nasledujiciho prikazu do napr. trigru tlacitka : Run_Product (REPORTS, 'p:\ex_rep.rep', SYNCHRONOUS, RUNTIME, FILESYSTEM, '', NULL); Presny popis prikazu Run_Product je v helpu. Nyni strucne k jednotlivym parametrum : REPORTS znamena, ze se ma spustit Reports Runtime a vytisknout vystupni sestava 'p:\...' je uplne jmeno souboru, ve kterem je prelozena definice sestavy. Pripona .rep znamena, ze se jedna o prelozeny spustitelny tvar definice sestavy SYNCHRONOUS znamena, ze po dobu tisku sestavy nebude mozne pracovat ve formulari. Az po dokonceni tisku se rizeni navrati zpet do formulare. RUNTIME ??? viz help FILESYSTEM definice sestavy se ma hledat v souboru posledni dva parametry nejsou povinne. Tento prikaz vytiskne sestavu na obrazovku. Je samozrejme mozne tisk presmerovat jinam. ***** Manual jazyka PL/SQL *************************************************** ------------------------------------------------------------------------------ V souboru PLSQL.DOC je dosti podrobne popsan jazyk PL/SQL. Jazyk je hodne nezavisly na hostitelskem prostredi (Oracle Forms), takze v manualu nejsou bohuzel popisy builtin funkci. Ty zkusime zpracovat podle vhodnych materialu pozdeji. V manualu je vsak kompletni popis syntaxe jazyka, pouziti promennych a konstant, kurzoru a tabulek, ruznych programovych konstrukci a vyjimek. Je tam seznam podporovanych datovych typu, jak se konvertuji typy, jake ma PL/SQL operatory, a jake jsou jejich priority. ***** Export a import dat z/do Oraclu do/z externiho souboru ***************** ------------------------------------------------------------------------------ Je popsan v souboru DEV2000.DOC v kapitole Data Manager. ***** Zmena struktury databazove tabulky ************************************* ------------------------------------------------------------------------------ >>> UPOZORNENI <<< Jak ve Schema Manageru, tak i primo v SQL neni mozne rusit sloupce tabulky! Neni mozne ani menit nazev sloupce tabulky! Neni mozne menit primarni klice! Je mozne pouze menit vlastnosti sloupce tabulky (typ, velikost, ...) a pridavat do tabulky nove sloupce. ***** Prepinani oken ********************************************************* ------------------------------------------------------------------------------ Prepinani oken pomoci prikazu Show_Window, resp. Hide_Window a Go_Block skutecne funguje, je ale nutne spravne nastavit v Properties objektu Okno (Window), Plocha (Canvas) a Blok (Block) kde se jednotlive objekty budou zobrazovat. Tj. plocha, aby byla viditelna ve spravnem okne, okno melo spravnou plochu a blok byl viditelny na spravne plose. ***** Zavirani oken ********************************************************** ------------------------------------------------------------------------------ Student Michal Kana objevil zpusob, kterak zavrit a z obrazovky odstranit nepotrebne okno. Puvodne doporucovana sekvence prikazu hide_window('...'); go_block('...'); totiz obcas zpusobovala to, ze zavirane okno zustalo na obrazovce viditelne, pouze se prekrylo oknem novym. Reseni je jednoduche, staci pouze a jen prehodit poradi prikazu: go_block('...'); hide_window('...');. a zavirane okno skutecne zmizi z obrazovky. Vysvetleni me napada toto: Prikazem Hide_Window skryjete dane okno. Protoze ale toto okno je stale aktualni, opet se zobrazi. Prikaz Go_Block zpusobi prepnuti na jine okno, to se stane aktualnim a zobrazi se (pres to puvodni). Obracenim poradi techto prikazu se dosahne toho, ze puvodni skryvane okno je v dobe vykonavani prikazu Hide_Window uz neaktualni, protoze prikaz Go_Block presunul ohnisko (focus) na jine okno, a muze se proto v klidu zavrit. ***** Vypis objektu vlastnika schematu *************************************** ------------------------------------------------------------------------------ Pokud si chcete vypsat vsechny objekty (tabulky, triggery, sekvence, ...), ktere jste vytvorili a ktere vlastnite, lze pouzit preddefinovany pohled USER_OBJECTS, tj. v SQL Plus napsat dotaz: select OBJECT_NAME, OBJECT_TYPE from USER_OBJECTS; Podrobneji viz Server Admin's Guide, kap.9. ***** Podrobnejsi popis k chybove hlasce ************************************* ------------------------------------------------------------------------------ Pokud se v radku 'status' objevi chybova hlaska, ktera sama o sobe mnoho nerika (unable to perform query, unable to insert...), lze presnejsi pricinu zjistit z menu Forms Runtime, pomoci Help/Display Error. Zobrazi se prikaz, ktery chybu vyvolal, a podrobnejsi popis priciny. Vzdy se zobrazuji informace o posledni chybe. Aby tato polozka menu byla dostupna, musi byt soucasti menu i 'default' menu, tj. 'menu module' property formulare musi byt nastavena na 'default'. ***** Predani parametru do sestavy ******************************************* ------------------------------------------------------------------------------ Zde je jeden (z moznych) zpusobu, jak predat parametry do tiskene vystupni sestavy. V Object Navigatoru se nadefinuje Record Group stejneho typu (se stejnymi polozkami), jako vraci dotaz vybirajici data tistena v sestave. V tomto priklade se zminena skupina zaznamu jmenuje PRINT_QUERY. V teto skupine zaznamu (Record Group) zadame dotaz, ktery vybira potrebna data podmninkou, ktera obsahuje vazane promenne, apod. V triggeru tlacitka, ktere spousti tisk sestavy se zadaji nasledujici prikazy : DECLARE pl_id ParamList; rows NUMBER; BEGIN IF NOT (Populate_Group('PRINT_QUERY') = 0) THEN message('Chyba pri vytvareni Record Group !'); ELSE rows := Get_Group_Row_Count('PRINT_QUERY'); IF (rows = 0) THEN message('Nebyly nalezeny zadne zaznamy !'); ELSE /* Kontrola, zda seznam parametru jiz neexistuje. Kdyz ano, je zrusen */ pl_id := Get_Parameter_List('tmpdata'); IF NOT Id_Null(pl_id) THEN Destroy_Parameter_List( pl_id ); END IF; /* Vytvori se seznam parametru predavanych do Report Runtime */ pl_id := Create_Parameter_List('tmpdata'); /* Do seznamu parametru se prida parametr MY_QUERY, ktery nahradi dotaz v sestave vyhledavajici tistena data. Pred tiskem sestavy se tedy data nebudou vyhledavat pomoci dotazu zadaneho v definici sestavy, ale vezmou se data vybrana v Record Group MY_QUERY. V definici sestavy se totiz dotaz vybirajici data k tisku jmenuje MY_QUERY. Zadanim tohoto parametru se zameni hodnoty z PRINT_QUERY za dotaz MY_QUERY a vytisknou se data z PRINT_QUERY */ Add_Parameter(pl_id,'MY_QUERY',DATA_PARAMETER,'PRINT_QUERY'); /* Spusti se tisk sestavy. V predposlednim parametru se preda ukazatel na seznam parametru tmpdata. */ Run_Product(REPORTS, 'p:\oracle\print.rep', SYNCHRONOUS, RUNTIME, FILESYSTEM, pl_id, NULL); END IF; END IF; END; ***** Predani parametru do sestavy II **************************************** ------------------------------------------------------------------------------ Tento zpusob je prevzaty primo z dokumentace Oraclu (a navic funguje), proto ho lze povazovat za spravny (jeden ze spravnych). V triggeru tlacitka, ktere spousti tisk sestavy se vytvori promenna typu 'seznam parametru', do ktere se ulozi parametr predavany do sestavy. V tomto priklade se do parametru 'co' ulozi cislo tistene faktury. declare pl_id paramlist; begin /* Kontrola, zda seznam parametru jiz neexistuje. Kdyz ano, je zrusen */ pl_id := Get_Parameter_List('tmpdata'); IF NOT Id_Null(pl_id) THEN Destroy_Parameter_List( pl_id ); END IF; /* Vytvori se seznam parametru predavanych do Report Runtime */ pl_id := Create_Parameter_List('tmpdata'); /* Do seznamu parametru se prida parametr CO, ktery obsahuje cislo tistene faktury. Protoze parametr je textovy (TEXT_PARAMETER), je nutne cislo faktury (F_C) prevest na textovy retezec. */ Add_Parameter(pl_id, 'co', TEXT_PARAMETER, to_char(:b_vydej.f_c)); /* Spusti se tisk sestavy. V predposlednim parametru se preda ukazatel na seznam parametru tmpdata. */ Run_Product(REPORTS, 'p:\skolicka\dsi\projekt\xkanam00.rep', SYNCHRONOUS, RUNTIME, FILESYSTEM, pl_id, NULL); end; V definici sestavy v datovem modelu je dotaz Q1, ktery vybira data ze souboru faktur. V tomto dotazu se v prikazu select pouzije parametr CO predany do sestavy z formulare. Kupodivu nevadi, ze parametr je textovy a cislo faktury numericke. select DATUM, F_C, ICO from FAKTURY where F_C = :co Tento zpusob predavani parametru zda se mi rozumny. ***** Dokumentace k Oraclu *************************************************** ------------------------------------------------------------------------------ Spousta uzitecne dokumentace je ulozena na CDcku nazvanem client73 v adresari DOC. Je to instalacni CDcko Oracle Enterprise Manageru a dalsich systemovych nastroju. CDcko je zalozeno na stroji AJA. Pri praci je vhodne si je namapovat jako lokalni disk. Seznam uzitecnych manualu: A32089_1.PDF - popis sitovych chybovych hlaseni A32534_1.PDF - Oracle Server Concepts A32535_1.PDF - Oracle Server Administrator's Guide A32536_1.PDF - Oracle Server Application Developer's Guide A32538_1.PDF - popis jazyka SQL A32539_1.PDF - popis chybovych hlaseni jednotlivych programu Oraclu A32542_1.PDF - popis jazyka PL/SQL A34986_2.PDF - Oracle WebServer User's Guide A42396_1.PDF - Oracle Server for Win NT Getting Started A42483_1.PDF - Network Products Troubleshooting Guide A42561_1.PDF - SQL*Plus Quick Reference A42562_1.PDF - SQL*Plus User's Guide and Reference A43686_1.PDF - SQL*Plus User's Guide for Windows 95/NT A pokud se Vam nechce hledat ten spravny soubor, muzete pouzit soubor Doclib73.PDF - obsah a odkazy na vsechny manualy ktery obsahuje do kategorii rozdeleny seznam vsech manualu na CDcku, takze je mozne najit ten spravny manual celkem rychle. ***** Personal Oracle a Windows NT ******************************************* ------------------------------------------------------------------------------ Informace pro ty, kdoz si nainstalovali doma na svem pocitaci Personal Oracle pod Windowsy NT. Mozna se nemuzete po spusteni Forms Designeru spojit s lokalni databazi. Zkuste v takovem pripade zkontrolovat konfiguraci Windowsu a Oraclu, zejmena v programu SQL Net Easy Configuration (Start - Programy - Oracle pro Windows NT - SQ Net Easy ...) zkontrolujte spravnost nastaveni spojeni s databazi. Typ spojeni by mel byt TCP/IP (?) ***** Chyba pri spousteni noveho formulare *********************************** ------------------------------------------------------------------------------ Pri vytvareni noveho formulare ve Forms Designeru si formular nejprve ulozte na disk ( nejlepe P: ) a teprve potom ho spustte. Jinak muze dojit k chybe a ukonceni Forms Designeru (diky konfliktu pristupovych prav pod Win NT). ***** Slozene klice ********************************************************** ------------------------------------------------------------------------------ Pokud je to mozne, doporucuji Vam vyhnout se pouzivani slozenych cizich klicu (slozene primarni klice nevadi). Slozene cizi klice Vam vyrazne zesloziti programovani Vasi aplikace, protoze to, co Oracle udela v pripade jednoducheho ciziho klice sam a automaticky, budete muset v pripade slozeneho ciziho klice programovat sami. ***** Paleta tlacitek a aktualni blok **************************************** ------------------------------------------------------------------------------ Paleta tlacitek generovana na pozadani Oraclem pri vytvareni bloku ma jednu zvlastnost. Pri behu aplikace pracuje vzdy s AKTUALNIM blokem, ne tedy vzdy s tim, ke kteremu byla vytvorena. Napr. si vytvorite blok a paletu tlacitek pro tabulku KNIHY. Spustite aplikaci a tlacitka <, >, ... presouvaji ukazatel mezi vetami tabulky knih. Pokud je ale aktualni blok titulu (kurzor blika v nektere polozce tohoto bloku), presunuji zminena tlacitka ukazatel v tabulce titulu. Chcete-li, aby tlacitka pracovala vzdy a porad jen s jednim danym blokem, je treba do trigru techto tlacitek pridat jako prvni prikaz Go_Block ('nejaky_blok'); kde nejaky_blok je blok s tabulkou, ve ktere se chcete pohybovat (v nasem priklade blok KNIHY). ***** Umisteni obrazku na plochu ********************************************* ------------------------------------------------------------------------------ Obrazky na formulari lze zobrazit dle nasledujicich pokynu: 1. Na vybrany CANVAS vlozit objekt IMAGE a zapomatovat si jmeno tohoto objektu (napr. IMAGE67) 2. Ve vhodnem triggeru (napr. PreBlock v bloku lezicim v nasem CANVASu) naplnit obrazek podle nasledujiciho kodu: DECLARE photo_filename VARCHAR2(80); -- promenna = cesta k souboru s bitmapou BEGIN photo_filename := 'P:\DSI\1.bmp'; -- cesta Read_Image_File( photo_filename, 'bmp', 'IMAGE67'); -- naplni obrazek, -- 'bmp' = typ bitmapy, -- 'IMAGE67' jmeno obrazku na CANVASu - musi existovat END; -- informace bez zaruky, podrobny popis v helpu, -- MaReK Krejpsky (xkrejp00) ***** Texty a cisla chybovych hlaseni **************************************** ------------------------------------------------------------------------------ Cisla chyb a texty chybovych hlaseni je mozne najit v helpu Forms Designeru. V menu vyberte funkci Help -> Contents. V zalozce Contents pak otevrete knihu Troubleshooting a v ni jsou kapitoly RunForm Messages, Designer Messages a Generate Messages obsahujici popisy jednotlivych chyb. ***** Prenos dat ze skoly domu *********************************************** ------------------------------------------------------------------------------ Dalsim jednoduchym a fungujicim zpusobem, jak si prenest data ze skoly domu, je ve skole pouzit Database Designer (ktery navic doma nemate) a vygenerovany SQL skript pouzit ve skole i doma. Spustite ho tedy ve skole, aby vznikly tabulky v databazi ve skole. Prenesete si ho v souboru domu, spustite doma a budete mit identicke tabulky doma i ve skole. Naplneni tabulek daty pak znamena vytvorit jednoduchou aplikaci (formular), kterou pouzijete pro naplneni tabulek daty. ***** Ceske datum ************************************************************ ------------------------------------------------------------------------------ Chcete-li se vyhnout zadavani a zobrazovani datumu v imlicitnim anglickem tvaru 08-JAN-78, pak v Properties (vlastnostech) dane polozky typu Date zadejte ci opravte nasledujici udaje: Sekce Data Format Mask : FMDD.MM.YYYY Maximum Length : 10 Sekce Database Query Length : 10 Znaky "FM" znamenaji, ze se nemusi jednociferna cisla dnu a mesicu vypisovat s pocatecni nulou, protoze si ji Oracle doplni sam. Format DD.MM.YYYY snad nepotrebuje vysvetleni. Protoze takto zadane datum bude mit 10 znaku, je treba nastavit maximalni delku pro editaci a dotazovani take na 10. ***** Vyreseni(?) nedostatku pameti ****************************************** ------------------------------------------------------------------------------ Trpi-li Oracle nedostatkem pameti, pozabijejte vsechny ostatni bezici nepotrebne programy a procesy. Pokud ani to nepomuze, zkuste se podivat do temporary adresare (nejcasteji C:\TMP nebo C:\TEMP) a zruste z nej vsechny soubory. Uvolni se tak misto na swapovaci soubor a pribyde tak potrebna pamet. ***** Odkazovani se na objekty a polozky ************************************* ------------------------------------------------------------------------------ Potrebujete-li se odkazat na nejakou polozku, tlacitko, apod., kdyz napr. menite jeho vlastnosti procedurou Set_Item_Property, kdyz menite jeji hodnotu prirazenim, apod. zkuste nasledujici zpusoby: :Jmeno_Bloku.Jmeno_Objektu_nebo_polozky 'Jmeno_Objektu_Nebo_Polozky' Nebo varianty na toto tema. Protoze prirazenbi vyzaduje prvni zpusob :KNIHA.NAZEV := 'Babicka'; ale zmena vlastnosti vyzaduje druhy zpusob: Set_Item_Property ('OK_TLACITKO',Displayed,PROPERTY_FALSE); ***** Osetreni chyb ********************************************************** ------------------------------------------------------------------------------ Jako reakci na chybu Oracle implicitne vypisuje anglicke chybove hlaseni. Chcete-li chyby osetrit jinak, lepe a radostneji, definujte trigr ON-ERROR nejlepe primo ve formulari, ve kterem chcete na vyskyt chyb reagovat. V tomto trigru bude nasledujici nebo podobny kod (prevzato z prikladu v adresari EXAMPLE) : /* Tento trigger reaguje na vyskyt jakekoliv chyby pri behu aplikace a slouzi pro zachytavani chybovych hlaseni Oraclu a jejich dalsi zpracovani, napr. zobrazeni chyboveho hlaseni pekne a cesky. Mel by byt vzdy definovan ve formulari a ne v nejakem bloku. Nasledujici priklad je prevzat primo z helpu a jen nepatrne upraven. */ DECLARE lv_errcod NUMBER := ERROR_CODE; lv_errtyp VARCHAR2(3) := ERROR_TYPE; lv_errtxt VARCHAR2(80) := ERROR_TEXT; AlNum Number; AlID Alert; -- Ukazatel na alert /* ERROR_CODE je standardni vestavena funkce vracejici cislo chyby. Cisla chyb je mozno najit v helpu : Help -> Contents -> Troubleshooting -> RunForm Messages, Designer Messages a Generate Messages ERROR_TYPE je standardni vestavena funkce vracejici typ chyby ERROR_TEXT je standardni vestavena funkce vracejici text chyboveho hlaseni. */ BEGIN -- Najdu si alert, ktery bude zobrazovat chybove hlaseni -- Tento alert musite pochopitelne mit ve formulari vytvoreny. AlID:=Find_Alert ('CautionAlert'); -- podle cisla chyby se identifikuje o kterou chybu se jedna -- a podle toho se zobrazi prislusne chybove hlaseni. IF (lv_errcod = 40508) THEN Begin -- Nastavim text zobrazovaneho chyboveho hlaseni Set_Alert_Property (AlID,Alert_Message_Text, 'Z neznameho duvodu se bohuzel nepodarilo ulozit vetu do databaze.'); AlNum := Show_Alert (AlID); -- Funkce Show_Alert zobrazi pozadovany alert a vraci cislo stisknuteho -- tlacitka (vraci hodnoty podle preddefinovanych konstant). end; ELSIF (lv_errcod = 40505) THEN Begin Set_Alert_Property (AlID,Alert_Message_Text, 'Z neznameho duvodu se nepodarilo vybrat data z databaze.'); AlNum := Show_Alert (AlID); end; ELSE -- Vsechny ostatni chyby busou ohlaseny standardnim zpusobem, -- tedy zobrazenim puvodniho chyboveho hlaseni Message(lv_errtyp||'-'||to_char(lv_errcod)||': '||lv_errtxt); END IF; -- !!! Dulezita vec !!! -- Kdykoliv kontrola v trigru nevysla a doslo k chybe, je NUTNO -- volat proceduru RAISE, ktera vyvola vyjimku a nedovoli tak -- opustit misto, kde doslo k chybe (napr. polozku, ve ktere je -- chybna hodnota. RAISE Form_Trigger_Failure; END; ***** Zadrhel s ulozenymi funkcemi ******************************************* ------------------------------------------------------------------------------ Ulozene funkce (obdoba ulozenych procedur), NENI VHODNE pouzivat na plneni primarnich klicu! Zde je uvedena vzorova situace: Ulozena funkce spocita maximalni hodnotu primarniho klice a vrati ji zvetsenou o jednicku. Tato hodnota je ulozena do primarniho klice nove vkladane vety a tato veta je Commitem ulozena do tabulky. >>> Toto nefunguje <<< Mozna reseni jsou: - hodnotu noveho primarniho klice nepocitat ulozenou funkci, ale zjistit si ji "primo na miste" - vetu do databaze ulozit volanim INSERT - nepotrebny primarni klic (ktery je definovan jen proto, aby se nemusel pouzit slozeny primarni klic) zrusit a nahradit jinym, treba slozenym, primarnim klicem (ve Schema Manageru zrusit definici primarniho klice, ulozit zmenu, definovat novy, tentokrat slozeny primarni klic a zmenu ulozit), ktery nebude potrebovat plneni ulozenou funkci. ***** Predavani parametru do kurzoru ***************************************** ------------------------------------------------------------------------------ Kdyz vytvarite kurzor a potrebujete do nej predat parametr (typicky nejakou hodnotu do klauzule WHERE), postupujte takto: Declare Cursor C1 IS SELECT * FROM POHYBY WHERE POHYBY.IDZBOZI = :ZBOZI.CISLOZBOZI; Tento kurzor vybere z tabulky POHYBY vsechny pohyby daneho druhu zbozi, tedy zbozi prave vybraneho v tabulce ZBOZI. Zbozi je identifikovano svym cislem ulozenym v promenne CisloZbozi. Je dulezite v klauzuli WHERE uvest na prvnim miste jmeno sloupce tabulky (POHYBY.IDZBOZI) a vazanou promennou (:ZBOZI.CISLOZBOZI), ktera obsahuje cislo hledaneho zbozi, uvest az na druhem miste a bez apostrofu. Podivate-li se do souboru PLSQL.DOC, najdete dalsi zpusoby zapisu kurzoru. Dale je mozne pouzit parametricky kurzor (opet viz. PLSQL.DOC).