Chcete v OpenOffice.org vystavovať príjmové a výdavkové pokladničné doklady s automatickým vypisovaním sumy slovom? Stiahnite si súbory s makrami, ktoré to umožňujú.
Pri práci s pokladničnými dokladmi je otravná práca pri vypisovaní sumy slovom. Preto si na túto činnosť pripravíme makro v OpenOffice.org, ktoré to urobí za vás. Pravdaže, s tým zároveň súvisí aj vytvorenie príjmového a výdavkového pokladničného dokladu v module Writer s tým, že podobne, ako pri jednoduchých faktúrach budete mať na strane dva doklady, pričom po zadaní údajov do prvého z nich sa pri kopírovaní najprv vypíše automaticky suma slovom a následne sa zadané údaje skopírujú aj do druhého dokladu, takže jednou tlačou vytlačíte doklad pre seba aj pre zákazníka.

Upozorňujeme, že tak isto ako pri faktúrach, ani teraz sa pri kopírovaní neprenáša formátovanie písma či veľkosť buniek tabuľky, pomocou ktorej sú pokladničné doklady vytvorené.
Stiahnite si tlačivo príjmového a výdavkového pokladničného dokladu v slovenskom jazyku.
Pre programátorov uvádzame makro pre prevod reálneho čísla na slovenské slovo, pričom upozorňujeme, že v makre sa testuje, či sa prevádza celá alebo desatinná časť a podľa toho sa skloňujú číslovky jedna a dva (jedno euro – jeden cent, dve eurá – dva centy). Pravdaže, zároveň uvádzame aj makro pre kopírovanie obsahov tabuliek a tlač dokumentu:
function daj_slovne(cislo as Long, euro as boolean) as string
dim rad as integer ' 1 – tisíc, 2 – milion, 3 – miliarda
dim slovne as string
dim analyza as long
slovne=""
if cislo=0 then
' Osobitne musíme ošetriť číslo „nula“
slovne="nula"
else
rad=0
do while cislo<>0
' z čísla vyberieme posledné tri číslice
analyza=cislo mod 1000
' ktoré prevedieme na text
slovne=slovne_stovky(analyza, rad)+slovne
' číslo zmenšíme o už spracovanú časť
cislo=int(cislo/1000)
' a pridáme text rádu, ktorý budeme spracovávať v ďalšom kroku cyklu
if cislo<>0 then
rad=rad+1
slovne=slovne_rady(cislo mod 1000, rad)+slovne
endif
loop
' Vymazanie prebytočných medzier na začiatku a konci slovného znenia
slovne=trim(slovne)
' Úprava prvého slova v prípade, že ide o sto, tisíc na Jednosto, Jedentisíc ...
if (analyza>=100) and (analyza<=199) then
' úprava výsledku pre stovky
slovne="jedno"+slovne ' Jednosto...
endif
if (analyza=1) and (rad=0) then
' úprava výsledku, ak sme prevádzali na text číslo jedna, lebo
' číslovka "jeden" sa skloňuje, t.j. vo financiách sa píše "jeden cent, jedno euro".
if euro then
slovne="jedno"
else
slovne="jeden"
endif
endif
if (analyza=2) and (rad=0) then
' úprava výsledku, ak sme prevádzali na text číslo dva, lebo
' číslovka "dva" sa skloňuje, t.j. vo financiách sa píše "dva centy, dve eurá".
if euro then
slovne="dve"
else
slovne="dva"
endif
endif
if (analyza=1) and (rad>0) then
' úprava výsledku pre ostatné rády
select case rad
case 1, 2, 4, 6, 8
slovne="jeden"+slovne ' jedentisíc, jedenmilión, …
case 3, 5, 7, 9
slovne="jedna"+slovne ' jednamilarda, …
end select
endif
endif
' Prvé písmeno musí byť veľké – zmena
slovne=uCase(left(slovne,1))+right(slovne,len(slovne)-1)
daj_slovne=slovne
end function
function slovne_jedno_cislo(cislo, rad as integer) as string
dim pom_nazov as string
pom_nazov=""
select case cislo
case 1
' Číslovka „jeden“ sa pri rádoch tisíc, milión,... nepíše
if rad=0 then
pom_nazov="jeden"
endif
case 2
' Dvojka sa skloňuje – dva, dvesto, dvetisíc, dvamilióny, dvemiliardy, …
if (rad mod 2)=0 then
pom_nazov="dva"
else
pom_nazov="dve"
endif
case 3
pom_nazov="tri"
case 4
pom_nazov="štyri"
case 5
pom_nazov="päť"
case 6
pom_nazov="šesť"
case 7
pom_nazov="sedem"
case 8
pom_nazov="osem"
case 9
pom_nazov="deväť"
end select
slovne_jedno_cislo=pom_nazov
end function
function slovne_desiatky(jednotky, desiatky as integer) as string
dim pom_nazov as string
pom_nazov=""
select case desiatky
case 1
' desať – devätnásť
select case jednotky
case 0
pom_nazov="desať"
case 1
pom_nazov="jedenásť"
case 2
pom_nazov="dvanásť"
case 3
pom_nazov="trinásť"
case 4
pom_nazov="štrnásť"
case 5
pom_nazov="pätnásť"
case 6
pom_nazov="šestnásť"
case 7
pom_nazov="sedemnásť"
case 8
pom_nazov="osemnásť"
case 9
pom_nazov="devätnásť"
end select
case 2 to 4
' "dsať" – dvadsať až štyridsať
pom_nazov=slovne_jedno_cislo(desiatky,0)+"dsať"+slovne_jedno_cislo(jednotky,0)
case else
' "desiat" – päťdesiat až deväťdesiat
pom_nazov=slovne_jedno_cislo(desiatky,0)+"desiat"+slovne_jedno_cislo(jednotky,0)
end select
slovne_desiatky=pom_nazov
end function
function slovne_stovky(cislo, rad as integer) as string
dim stovky, desiatky, jednotky as integer
dim pom_slovne as string
' z čísla vypreparujeme číslice na mieste jednotiek, desiatok a stoviek
jednotky=cislo mod 10
desiatky=int(cislo/10) mod 10
stovky=int(cislo/100)
pom_slovne=""
' Najprv prevedieme na text jednotky a desiatky (číslo 0 až 99)
if desiatky=0 then
' iba jednotky (čísla 0 až 9)
if stovky=0 then
' celá trojica je číslo 0 až 9 a vtedy sa číslovka 1 a 2 skloňuje podľa rádu
pom_slovne= slovne_jedno_cislo(jednotky,rad)
else
' je to zložené číslo a vtedy sa číslovka 1 a 2 neskloňuje (základný tvar je pre rád 0)
pom_slovne= slovne_jedno_cislo(jednotky,0)
endif
else
' je to číslo od 10 do 99
pom_slovne=slovne_desiatky(jednotky, desiatky)
endif
' teraz k prevedenému dvojcifernému číslu pridáme text o stovkách
select case stovky
case 1
' Pri stovkách sa jednosto píše iba finančne
pom_slovne="sto"+pom_slovne
case 2 to 9
' pridávame príponu "sto" – dvesto až deväťsto
' číslovka 2 sa pri stovkách skloňuje ako pri tisícoch (dvesto – dvetisíc). t.j. tvar pre rád 1
pom_slovne=slovne_jedno_cislo(stovky,1)+"sto"+pom_slovne
end select
slovne_stovky=pom_slovne
end function
function slovne_rady(cislo, rad as integer) as string
' Texty o biliónoch, ... sú teoretické, pretože premenná typu LONG je maximálne 2.147.483.647, t.j.
' dvemiliardystoštyridsaťsedemmiliónovštyristoosemdesiattritisícšesťstoštyridsaťsedem
dim pom_kolko as string
dim predpona as string
predpona=""
pom_kolko=""
select case rad
case 1
predpona="tisíc"
case 2, 3
predpona="mi"
case 4, 5
predpona="bi"
case 6, 7
predpona="tri"
case 8, 9
predpona="kvadri"
end select
if rad=1 then ' tisíce
select case cislo
case 0
pom_kolko=""
case else
pom_kolko=predpona
end select
else
if (rad mod 2)=0 then ' „lióny“ – milión, bilióny, triliónov
select case cislo
case 0
pom_kolko=""
case 1
pom_kolko=predpona+"lión"
case 2 to 4
pom_kolko=predpona+"lióny"
case else
pom_kolko=predpona+"liónov"
end select
else ' „liardy“ – miliarda, biliardy, triliárd
select case cislo
case 0
pom_kolko=""
case 1
pom_kolko=predpona+"liarda"
case 2 to 4
pom_kolko=predpona+"liardy"
case else
pom_kolko=predpona+"liárd"
end select
endif
endif
slovne_rady=pom_kolko
end function
function Suma_Slovom (suma as string) as string
dim poms, cisla, znak as string
dim cela_cast, desatinna_cast as long
dim euro, centy, euro_text, centy_text as string
cisla="0123456789,." ' Definícia čísiel a desatinnej čiarky/bodky
' Vymazanie všetkých znakov okrem čísla a desatinnej čiarky/bodky z reťazca sumy
poms=""
for i=1 to len(suma)
znak=mid(suma,i,1)
if instr(cisla,znak)<>0 then poms=poms+znak
next i
' Vyhľadanie desatinnej čiarky
kde=Instr(poms,",")
if kde=0 then kde=Instr(poms,".")
cela_cast=0
desatinna_cast=0
if kde>0 then
cela_cast=val(left(poms,kde-1))
endif
kde=len(poms)-kde
if kde>0 then
desatinna_cast=val(right(poms,kde))
endif
' Prevod na text
' 0 Eur, 1 Euro, 2-4 Eura, 5 Eur
euro_text=" Eur "
if cela_cast=1 then euro_text=" Euro "
if cela_cast>1 and cela_cast<5 then euro_text=" Eurá "
' 0 Euro centov, 1 Euro cent, 2-4 Euro centy, 5 Euro centov
centy_text=" centov"
if desatinna_cast=1 then centy_text=" cent"
if desatinna_cast>1 and desatinna_cast<5 then centy_text=" centy"
euro=Daj_Slovne(cela_cast, true)
centy=Daj_Slovne(desatinna_cast, false)
Suma_Slovom=euro+euro_text+centy+centy_text
end function
REM Funkcia na výmaz znaku LF z reťazca
function Vymaz_LF (S as string) as string
dim ps as string
ps=s
while instr(ps,chr$(10))<>0 ' Pokiaľ je v reťazci LF
i=instr(ps,chr$(10)) ' Poloha LF
ps=left(ps,i-1)+right(ps,len(ps)-i) ' Ľavá časť pred LF + pravá časť za LF
wend
Vymaz_LF=ps
end function
REM Procedúra vloží sumu slovom a skopíruje "horný" PPD do "dolného"
sub Kopiruj_PPD
dim dokument, tabulkah, tabulkad, bunkah, bunkad as object
dim suma as string
dokument=StarDesktop.CurrentComponent.GetTextTables()
' Výber tabuľky s číselným údajom podľa jej názvu
tabulkah=dokument.GetByName("Tabulka1")
tabulkad=dokument.GetByName("Tabulka2")
' Vloženie sumy slovom
bunkah=tabulkah.getCellByName("B5") ' Zadaná suma číslom
suma=Vymaz_LF(bunkah.GetString)
bunkah=tabulkah.getCellByName("A7") ' Suma slovom
bunkah.SetString("Slovom: "+Cislo_Slovom.Suma_Slovom(suma))
' Kopírovanie "horného" PPD do "dolného"
' A1 – A4
for i=1 to 4
bunkah=tabulkah.getCellByName("A"+trim(str(i))) ' Bunka z "hornej" tabuľky
bunkad=tabulkad.getCellByName("A"+trim(str(i))) ' Bunka z "dolnej" tabuľky
bunkad.SetString(Vymaz_LF(bunkah.GetString)) ' Vlastný prenos
next i
' A7 – A9
for i=7 to 9
bunkah=tabulkah.getCellByName("A"+trim(str(i))) ' Bunka z "hornej" tabuľky
bunkad=tabulkad.getCellByName("A"+trim(str(i))) ' Bunka z "dolnej" tabuľky
bunkad.SetString(Vymaz_LF(bunkah.GetString)) ' Vlastný prenos
next i
' B1 – B6
for i=1 to 6
bunkah=tabulkah.getCellByName("B"+trim(str(i))) ' Bunka z "hornej" tabuľky
bunkad=tabulkad.getCellByName("B"+trim(str(i))) ' Bunka z "dolnej" tabuľky
bunkad.SetString(Vymaz_LF(bunkah.GetString)) ' Vlastný prenos
next i
' B9
bunkah=tabulkah.getCellByName("B9") ' Bunka z "hornej" tabuľky
bunkad=tabulkad.getCellByName("B9") ' Bunka z "dolnej" tabuľky
bunkad.SetString(Vymaz_LF(bunkah.GetString)) ' Vlastný prenos
' C2 – C3
for i=2 to 3
bunkah=tabulkah.getCellByName("C"+trim(str(i))) ' Bunka z "hornej" tabuľky
bunkad=tabulkad.getCellByName("C"+trim(str(i))) ' Bunka z "dolnej" tabuľky
bunkad.SetString(Vymaz_LF(bunkah.GetString)) ' Vlastný prenos
next i
end sub
REM Procedúra vytlačí dokument na defaultnú tlačiareň
sub Tlac_fa
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())
end sub
Je to perfektne spravené, ďakujem.
12. 08. 2010 Jozef 178.40.143.xxx
Copyright © 2002 - 2012 Inet.sk, s. r. o.Všetky práva vyhradenéNeprešlo jazykovou úpravouISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Webhosting Inet.sk