Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 29. 8. 2011 12:10:10

Billlly_Samotar
Člen
Registrace: 26. 8. 2011
Příspěvků: 18

Vyřešeno - Maximální hodnota ; SQL jako Makro pro update dat v tabulce

Zdravím Vás.
.
Na všechny dotazy co jsem měl jsou zde i odpovědi. Přeji pěkný den.
.
Chtěl bych požádat, zda by někdo byl tak ochotný a napsal zde makro, které bude dělat jednoduchou funkci a to zobrazí nejvyšší hodnotu ve sloupci dané tabulky, k ní přičte jedničku a to je vše. V MS Accessu to jde udělat přes funkci DMax, ale zde v OO Base nevím jak. Mám sloupeček ID (automatické číslo) z kterého by se mohlo vycházet, projít tento sloupec, najít nejvyšší hodnotu, přičíst jedničku a tu uložit do jiného pole.
Nebo druhá možnost, tento příkaz umím normálně v SQL si napsat (TOP1 kde na konci dám řazení DESC). Teď ale nevím, jak by se v makru mohlo s výslednou hodnotou dotazu pracovat -> např. najde to nejvyšší ID 12 tak aby tuto hodnotu to použilo, přičetlo k ní jedničku a tu poté použilo pro jiné pole.
Tak jsem našel Makro, které mi hodnotu z výsledného SQL najde, ale funguje to jen bez funkce TOP, jakmile ji tam dám, hodí se mi chybová hláška -> viz. obrázek i s makrem. Jakmile "TOP 1" smažu zobrazí se čistě jen hodnota a mohu s ní pracovat. Když mi TOP funguje v SQL v OO, je možnost to nějak nastavit i do makra?
.
chyba_sql_top.jpg
.
Děkuji za odpověď.
.
--------------------------------------------------------------------------------
PŮVODNÍ DOTAZ NA FÓRU:
Níže popsané jsem již skoro vyřešil a odpověděl v dalším příspěvku.
Myslím si, že je to pro Vás zcela jednoduchá otázka a přesto pro mne dosti složitá. Databázi v Base sem si už docela pěkně vyšperkoval, ale základ neumím. Rád bych jestli by jste někdo byl tak hodný a upravil zkušební tabulku z přílohy ( New DB.zip ) o tabulce s formulářem kde je pár polí. Co bych v této db potřeboval.
.
Když budu ve formuláři vytvářet nový záznam (řádek) aby se mi automaticky doplnila jedna hodnota v daným formátu. Dát automatické číslo jako primární sloupec není problém a bylo by to i ideální vzít hodnotu z tohoto čísla a použít ji u jiného sloupce kde by byl formát např. doc_2011_xxx kde místo xxx bude číslo vždy o třech znacích od 000, 001, 002 až po 999 (podle toho, kolikátý to bude záznam dle automatického čísla v DB).
.
Nevím jak přenést ve formuláři na pozadí hodnotu jednoho prvku (pole id s číslem) do pole druhého (pole document, kde má být předem definovaný text), aby se automaticky zaktualizovalo a drželo si stále daný formát (že to neudělá doc_2011_1, doc_2011_2 aj.).
.
Kdyby jste si nevěděli rady s tím držením formátu tak alespoň vymyslet a dát sem ukázku nějakého formuláře, kde se bude automaticky přenášet ta hodnota z jedné buňky do druhé (nebo klidně vytvořit vlastní počitadlo pro tu buňku jestli je to snazší či přes update sql dotaz).
.
Díky předem za ochotu.

Editoval Billlly_Samotar (2. 9. 2011 07:59:46)

Offline

#2 29. 8. 2011 18:38:29

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Vyřešeno - Maximální hodnota ; SQL jako Makro pro update dat v tabulce

Jak vložit soubor:
Jak nahrát soubor

ale s base nepomůžu, neovládám

;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 29. 8. 2011 19:37:19

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Vyřešeno - Maximální hodnota ; SQL jako Makro pro update dat v tabulce

Tento seriál nepomůže?
Práce s databází

;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 29. 8. 2011 20:15:58

Billlly_Samotar
Člen
Registrace: 26. 8. 2011
Příspěvků: 18

Re: Vyřešeno - Maximální hodnota ; SQL jako Makro pro update dat v tabulce

Celý ten seriál jsem právěže zezačátku procházel a dostával se do tajů OpenOffice, ale toto jsem nikde nenašel. Ale díky ohledně toho nahrávání souborů. ;-) Já tuším, že pro lidi je to snadné, ale pro znalejší ke kterým se nehlásím neb na to nemám :-)
.
PS: Musím se ještě hóóódně učit :-D
.
Editováno:
.
PS: Tak mazec...vytvořil jsem si DB, chci ji na WIKI uložit a ejhle. Tady jsem zaregistrovaný, ale tyto přihlašovací údaje mi pod WIKI nefungují a píše mi to, že jméno tohoto uživatele není zaregistrováno. Když chci dát registraci přehodí mne to tady na stránky kde jsem přihlášený a dělat nový účet s novou mailovkou jen kvůli tomu, zda náhodou se mi poté nezpřístupní i WIKI no tak to spíše asi bude chyba někde jinde...nevíte prosím kde? Jinak jsem upravil první článek s prosbou a přiložil k ní daný testovací soubor       New DB.zip
.
Děkuji mnohokrát za ochotu.

Editoval Billlly_Samotar (30. 8. 2011 13:05:27)

Offline

#5 1. 9. 2011 08:59:21

Billlly_Samotar
Člen
Registrace: 26. 8. 2011
Příspěvků: 18

Re: Vyřešeno - Maximální hodnota ; SQL jako Makro pro update dat v tabulce

Zdravím Vás.
.
Tak nakonec to celé zbylo na mne a úplně nejsnazší možnou metodou, která mne nakonec napadla jsem učinil konec mému problému.
.
Skoro to už nyní funguje perfektně:

rem ------------------------------------------------------------------------
sub Uprava_pole_dle_jineho(oevent as object)
' Převezme hodnotu z jiného pole (případně doplní - použito u RP s ID)
dim odatum_prijeti,orp,oID,oGrid
dim Pole_pro_zjisteni_delky as String

odatum_prijeti=oevent.source
oGrid=odatum_prijeti.parent
oID=oGrid.getbyname("ID")
orp=oGrid.getbyname("rp")

' zjištění délky pole ID a následně dle toho upravení pro použítí čísla v RP
If Len(oID.text) = 1 Then
   Pole_pro_zjisteni_delky = "00" + oID.text
 ElseIf Len(oID.text) = 2 Then
   Pole_pro_zjisteni_delky = "0" + oID.text
 ElseIf Len(oID.text) > 3 Then
   MsgBox "ID záznamu je větší jak 999, při vytvoření RP makro přenáší jen tři čísla - bude potřeba makro upravit"
 Else
   Pole_pro_zjisteni_delky = oID.text
End If

wait 300 ' 0,3 sec
orp.Text = "RP-S-"& YEAR(NOW()) & "-" & Pole_pro_zjisteni_delky
orp.commit
end sub

.
Z tohoto makra je zřejmé, že doplnění na daný mnou potřebný formát funguje na bázi jednoduché  podmínky. Jakmile aktualizuji Formulářový prvek "Datum přijetí" (odatum_prijeti) spustí se makro, které hodnotu z pole ID (oid; automatické číslo) vezme, zkotroluje podmínkou délku tohoto pole, upraví na požadovaný formát a tuto upravenou hodnotu s označujícím textem zadá do pole RP (orp). Vše vyřešeno až na jeden detail a to funkci automatického pole ID (oID). Když zadávám na požadovaný řádek formuláře nějakou hodnotu tak dokud nepřejdu na jiný záznam, neukáže se tam Automatické číslo ID a mě se vyplní pouze text, který se tam zobrazuje automaticky plus rok. ID díky tomu, že žádné nebylo tak mám prázdnou pozici zde.
.
Je prosím nějaká možnost mít pole, které jakmile začnu psát aby se ihned počítalo a ne až po přejití na další záznam (potvrzení záznamu).
Například udělat nějaké vlastní počitadlo (v MS Accessu jsem měl), které prošlo daný sloupec s čísly, našlo největší, přičetlo jedničku a následně toto číslo mi to vložilo do požadované hodnoty pole. Umíte mi prosím někdo poradit? Nemohu najít funkci, která mi projde sloupec a najde největší hodnotu (v MS Access to byla hodnota DMax).
.
Děkuji předem za odpověď.

Editoval Billlly_Samotar (1. 9. 2011 11:58:49)

Offline

#6 2. 9. 2011 07:58:15

Billlly_Samotar
Člen
Registrace: 26. 8. 2011
Příspěvků: 18

Re: Vyřešeno - Maximální hodnota ; SQL jako Makro pro update dat v tabulce

Tak jsem si se vším, po hledání různých příspěvků a testování, poradil a zde výsledné makro (možná někomu pomůže tongue ):

.
rem---------------------------------------------------------
rem Použije hodnotu pole pro jiné - použito pole ID a následně upraveno a zadáno do RP
sub Uprava_RP_dle_ID_STB(oevent as object)
Dim odatum_prijeti,orp,oID,oGrid
Dim Pole_pro_zjisteni_delky as String
Dim QueryDefinitions As Object 
Dim QueryDefinition As Object 
Dim DatabaseContext As Object 
Dim DataSource As Object 

odatum_prijeti=oevent.source
oGrid=odatum_prijeti.parent
oID=oGrid.getbyname("ID") 'přiřazení hodnoty danému poli
orp=oGrid.getbyname("rp") 'přiřazení hodnoty danému poli
wait 300                  'timer - čeká 0,3 sec

QueryToDo="SELECT max(id)+1 FROM Reklamace_STB ORDER BY  max(id) DESC" 'SQL, kde zobrazí nejvyšší hodnotu a přičte 1
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext") 
DataSource = DatabaseContext.getByName("Databaze")  'pojmenování Databáze -> jak je zaregistrovaná pro účely propojení

If Not DataSource.IsPasswordRequired Then 
   Connection = DataSource.GetConnection("","") 
Else 
      InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler") 
      Connection = DataSource.ConnectWithCompletion(InteractionHandler) 
End If 
Statement = Connection.createStatement() 
ResultSet = Statement.executeQuery(querytodo) ' spuštění SQL dotazu (výše zadán) a následně práce s ním
If Not IsNull(ResultSet) Then                   ' podmínka na výsledek SQL dotazu
   While ResultSet.next 
     Automaticke_cislo = ResultSet.getString(1)
   Wend 
End If 

' zjištění délky výsledku dotazu (pole ID), upravení výsledku podle podmínek a následně použítí čísla dál (pro pole RP)
If Len(Automaticke_cislo) = 1 Then
   Pole_pro_zjisteni_delky = "00" + Automaticke_cislo
 ElseIf Len(Automaticke_cislo) = 2 Then
   Pole_pro_zjisteni_delky = "0" + Automaticke_cislo
 ElseIf Len(Automaticke_cislo) > 3 Then
   MsgBox "ID záznamu je větší jak 999, při vytvoření RP makro přenáší jen tři čísla - bude potřeba makro upravit"
 Else
   Pole_pro_zjisteni_delky = Automaticke_cislo
End If

wait 100 'timer - čeká 0,1 sec
If Len(orp.Text)= 0 Then 'podmínka na zjištění délky pole RP - vyplní se, jestliže je prázdné; jinak zůstává původní hodnota
orp.Text = "RP-S-"& YEAR(NOW()) & "-" & Pole_pro_zjisteni_delky
End If
orp.commit 'přenesení požadovaných hodnot a aktualizace tohoto daného pole
end sub

Offline

Zápatí