Makrá v OpenOffice.org – pokladničné doklady II.

Július Pastierik  /  18. 08. 2010, 00:00

Pre používateľov z Českej republiky prinášame príjmové a výdavkové pokladničné doklady s automatickým vypisovaním sumy slovom v českom jazyku.

 

V predchádzajúcom dieli sme vám ukázali makrá a súbory príjmových a výdavkových pokladničných dokladov v slovenskom jazyku. Pravdaže, podobne, ako pri faktúrach, ani teraz sme nezabudli na používateľov z Českej republiky a pripravili sme pre nich osobitné verzie týchto dokladov.



Stiahnite si tlačivo príjmového a výdavkového pokladničného dokladu v českom jazyku.

Pre programátorov zároveň uvádzame makro pre prevod reálneho čísla na české slovo (makro pre kopírovanie tabuliek a tlač už nie, pretože je totožné pre obidva jazyky), pričom znovu upozorňujeme na to, že v makre sa testuje, či sa prevádza celá alebo desatinná časť a podľa toho sa skloňujú číslovky jedna a dva (jedna koruna – jeden halíř, dvě koruny – dva halíře):

function daj_slovne(cislo as Long, koruna 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 "jedna" sa skloňuje, t.j. vo financiách sa píše "jedna koruna, jeden halíř".
   if koruna then
    slovne="jedna"
   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 "dvě koruny, dva halíře".
   if koruna then
    slovne="dvě"
   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
' Pre stovky, kde sa skloňuje číslovka 2 použijeme hodnotu rad=3
dim pom_nazov as string
 pom_nazov=""
 select case cislo
  case 1
   ' Číslovka „jedna“ sa pri rádoch tisíc, milión,... nepíše
   if (rad=0) then
    pom_nazov="jedna"
   endif
  case 2
   ' Dvojka sa skloňuje – dva, dvěstě, dvatisíce, dvamilióny, dvěmiliardy, …
   select case rad
    case 0, 1, 2 ' dva, dva tisíce, dva milióny
     pom_nazov="dva"
    case 3
     pom_nazov="dvě" ' dvě stě, dvě miliardy
    case 4
     pom_nazov="dva" ' dva bilióny
    case 5
     pom_nazov="dvě" ' dvě biliardy
    case 6
     pom_nazov="dva" ' dva trilióny
    case 7
     pom_nazov="dvě" ' dvě triliardy
    case 8
     pom_nazov="dva" ' dva kvadrilióny
    case 9
     pom_nazov="dvě" ' dvě kvadriliardy
   end select
  case 3
   pom_nazov="tři"
  case 4
   pom_nazov="čtyři"
  case 5
   pom_nazov="pět"
  case 6
   pom_nazov="šest"
  case 7
   pom_nazov="sedm"
  case 8
   pom_nazov="osm"
  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, pom_jednotky as string
 pom_nazov=""
 select case desiatky
  case 1
   ' desať – devätnásť
   select case jednotky
    case 0
     pom_nazov="deset"
    case 1
     pom_nazov="jedenáct"
    case 2
     pom_nazov="dvanáct"
    case 3
     pom_nazov="třináct"
    case 4
     pom_nazov="čtrnáct"
    case 5
     pom_nazov="patnáct"
    case 6
     pom_nazov="šestnáct"
    case 7
     pom_nazov="sedmnáct"
    case 8
     pom_nazov="osmnáct"
    case 9
     pom_nazov="devatenáct"
   end select
   jednotky=0
  case 2 to 4
   ' "cet" – dvacet až čtyřicet
   pom_nazov=slovne_jedno_cislo(desiatky,0)+"cet"
  case 5
   pom_nazov="padesát"
  case 6
   pom_nazov="šedesát"
  case 7, 8
   ' "desár" – sedmdesát, osmdesát
   pom_nazov=slovne_jedno_cislo(desiatky,0)+"desát"
  case else
   ' devatesát
   pom_nazov="devadesát"
 end select
 pom_jednotky=slovne_jedno_cislo(jednotky,0)
 if pom_jednotky<>"" then
  ' pri finančných číslach sa nepíše medzera
  pom_nazov=pom_nazov+pom_jednotky
 endif
 slovne_desiatky=pom_nazov
end function

function slovne_stovky(cislo, rad as integer) as string
dim stovky, desiatky, jednotky as integer
dim pom_slovne, pom_stovky, pom_stovky_c 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=""
 pom_stovky=""

 ' 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
 pom_stovky_c=slovne_jedno_cislo(stovky,3)
 select case stovky
  case 1
   ' Pri stovkách sa jednosto píše iba finančne
   pom_stovky="sto"
  case 2
   ' dvě stě
   pom_stovky="stě"
  case 3, 4
   ' tři sta, čtyři sta
   pom_stovky="sta"
  case 5 to 9
   ' pět set až devět set
   pom_stovky="set"
 end select
 if pom_stovky_c<>"" then
  ' pri finančných číslach sa nepíše medzera
  pom_stovky=pom_stovky_c+pom_stovky
 endif
 if pom_slovne="" then
  pom_slovne=pom_stovky
 else
  ' pri finančných číslach sa nepíše medzera
  pom_slovne=pom_stovky+pom_slovne
 endif
 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
   select case cislo
    case 1
     predpona="tisíc"
    case 2 to 4
     predpona="tisíce"
    case else
     predpona="tisíc"
   end select
   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ónů"
   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 koruna, halire, koruna_text, halire_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 Korun, 1 Koruna, 2-4 Koruny, 5 Korun
 koruna_text=" Korun "
 if cela_cast=1 then koruna_text=" Koruna "
 if cela_cast>1 and cela_cast<5 then koruna_text=" Koruny "
 ' 0 halířů, 1 halíř, 2-4 halíře, 5 halířů
 halire_text=" halířů"
 if desatinna_cast=1 then halire_text=" halíř"
 if desatinna_cast>1 and desatinna_cast<5 then halire_text=" halíře"
 koruna=Daj_Slovne(cela_cast, true)
 halire=Daj_Slovne(desatinna_cast, false)

 Suma_Slovom=koruna+koruna_text+halire+halire_text
end function

 

Neprehliadnite: