Archive for the ‘Razvoj’ Category

Davčne blagajne

Ponedeljek, November 9th, 2015

V januarju 2016 bo v Sloveniji obvezna uporaba davčnih blagajn za vse gotovinska plačila. Na spletni strani FURS-a si lahko preberete vse tehnične specifikacije potrebne za davčno potrjevanje računov.

Kako poteka davčno potrjevanje računov

V osnovi je to zelo preprost in uporaben sistem. Pred izpisom (izdajo računa) se morate namreč povezati na strežnik davčne uprave in nanj prenesti podatke o računu, FURS pa vam vrne edinstveno številko EOR (Edinstvena Oznaka Računa), ki jo morate izpisati na računu in s katero dokazujete, da ste račun tudi zares poslali na FURS.

Ozadje

Seveda pa se podrobnosti vedno skrivajo v ozadju in povezava na FURS niti ni tako trivialno preprosta oz. povezava je preprosta, saj gre za standarden internetni protokol, vendar pa je tja potrebno poslati digitalno podpisan račun in tukaj se stvari malce zapletejo.

Zastonj rešitev na dlani

Da bi se ne bilo potrebno vsakumur ukvarjati s:

  • podrobnostmi digitalnega podpisa,
  • podrobnostmi izračuna zaščitne številke (ZOI)
  • podrobnostmi izrisa QR kode

sem na GITHub-u odprl rešitev, ki je vsakomur na voljo povsem brezplačno. Za uporabo rešitve potrebujete le računalnik z operacijskim sistemom Windows. Ker je v SLO še kar nekaj blagajn, ki tečejo na operacijskem sistemu Windows XP, je podprt tudi slednji.

Minimalne zahteve za uporabo te povsem zastonj rešitve je:

  1. Win XP, SP 3, .NET 4.0 – ali seveda katerikoli novejši WIN sistem
  2. Uporaba .NET razvojnega okolja (C#, VB.NET ali pa tudi kakšnega bolj eksotičnega, a teh verjetno ni veliko 🙂 )
Izgled testnega programa

Izgled testnega programa

Kaj pa če ne uporabljate .NET razvojnega okolja

V tem primeru pa seveda ponujene knjižnice ne morete neposredno izkoristiti, a dokler vaš program teče v WIN okolju je problem rešen. Ponudim vam lahko namreč sledeč možnosti povezave:

  1. EXE program, ki ga pokličete iz vašega programa in slednji
    • Pregleda račun ali slednji vsebuje vse zahtevane elemente
    • Izračuna zaščitno kodo (ZOI)
    • Obda račun z zahtevano ovojnico
    • Ga digitalno podpiše in pošlje na FURS
    • Od FURS-a sprejme odgovor in ga posreduje v vaš program
    • Podroben opis EXE programa najdete tukaj.
  2. WIN service, ki nadzoruje dve poljubni mapi in čim vi odložite podatke o računu v prvo mapo, jih program vzame, obdela, pošlje na FURS (enako kot v primeru EXE programa) in rezultat izpiše v izhodno mapo
  3. V kolikor želite uporabiti knjižnico sami in elemente zvezati neposredno v vaš program, vam lahko ponudim ActiveX komponento, ki naredi vse našteto
  4. Če imate zares veliko blagajn pa lahko vse skupaj zavrtite na nekem strežniku in ponudim vam lahko ASP.NET spletne storitve ki izvedejo vse omenjeno.

V kolikor torej potrebujete rešitev pišite na info@matjazev.net in rešitev boste dobili na dlani 😉

XAML DataGrid using one DataTable as lookup

Četrtek, Februar 26th, 2015

Problem:

I have a DataTable with lookup column into another table. Another table is a small table so all the records can fit in small combobox and the user wants to be able to select lookup record with combobox.

Solution:

XAML has DataGridComboBoxColumn, but it is difficult to bind, because DataGridComboBoxColumn can’’t bind to Windows binding source. It is obviously quite know problem, but I could’n’t find an easy solution.

Test tables:

MAIN_TABLE 
{ 
  ID, 
  SubTableID, 
  ... other fields ...
}

SUB_TABLE 
{ 
  ID, 
  Description 
}

Naive

Naive solution, that doesn’’t work

<DataGrid ItemsSource="{Binding mainTable}">
  <DataGrid.Columns>
    <DataGridTextColumn Header="ID" 
                        Binding="{Binding ID}" />
    <DataGridTextColumn Header="SubID" 
                        Binding="{Binding SubTableID }" />
    <DataGridComboBoxColumn Header="Desc" 
                            ItemsSource="{Binding subTable}}" <!-- can't bind! -->
                            SelectedValueBinding="{Binding SubTableID}"
                            SelectedValuePath="ID" 
                            DisplayMemberPath="Description" />
  </DataGrid.Columns>            
</DataGrid>

The solution doesn’’t work because – for some reason– DataGridComboBoxColumn can’’t bind subTable even if it is defined exactly as mainTable in datasource for the whole xaml window.

Solution

The solution is quite easy. Create a resource that binds to sub table and then use that resurce sa data source 🙂


<DataGrid ItemsSource="{Binding mainTable}">
  <DataGrid.Resources>
    <CollectionViewSource x:Key="cvsSubTable" 
                          Source="{Binding subTable }"/> <!-- can bind! -->
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="ID" 
                        Binding="{Binding ID}" />
    <DataGridTextColumn Header="SubID" 
                        Binding="{Binding SubTableID }" />
    <DataGridComboBoxColumn Header="Desc" 
                            ItemsSource="{Binding Source={StaticResource cvsSubTable }}"  <!-- now it is ok! --> 
                            SelectedValueBinding="{Binding SubTableID}"
                            SelectedValuePath="ID" 
                            DisplayMemberPath="Description" />
  </DataGrid.Columns>            
</DataGrid>         

Lost 4 hours on that! Grrrr..

Številčenje v SQL podatkovnih bazah

Četrtek, Oktober 31st, 2013

V razvoju prej ali slej naletimo na problem, ko moramo zapise številčiti. Vsakemu dokumentu pač moramo določiti edinstveno številko, ki pa mora biti ob tem še zaporedna.

Vse SQL podatkovne baze poznajo avtomatično številčenje primernega ključa – ko torej v tabelo dodamo nov zapis, slednji dobi naslednjo zaporedno številko. To imenujemo tehnično številčenje zapisov. Problem pa se pojavi, ko potrebujemo vsebinsko številko dokumenta.

Za lažje razumevanje problema, si predstavljajmo tipično podatkovno tabelo, v kateri imamo poslovne dokumente – predračune, račune, dobavnice… Vsi različni dokumenti so v isti tabeli, a vsak med njimi mora imeti lastno vsebinsko številko. Primer:

#  DOKUMENT     VSEB. ŠT.   OSTALI PODATKI

1  Predračun    PR-1/2013   ... itd ...
2  Predračun    PR-2/2013   ... itd ...
3  Račun        RA-1/2013   ... itd ...
4  Dobavnica    DO-1/2013   ... itd ...
5  Predračun    PR-3/2013   ... itd ...
6  Predračun    PR-4/2013   ... itd ...
7  Račun        RA-2/2013   ... itd ...
8  Dobavnica    DO-2/2013   ... itd ...
9  Dobavnica    DO-3/2013   ... itd ...

Kot je lepo vidno v tabeli ima vsak tip dokumenta lastno številčenje.

Kako določiti vsebinsko številko?

Opcij je seveda več a nekako jih lahko uredimo v tri sklope:

  1. Sekvence – če jih podatkovna baza podpira.
  2. Lastna tabela za vsak tip številčenja – za vsak tip dokumenta narediti lastno tabelo, ki določi naslednjo številko
  3. Ena tabela za vso številčenje – za vse številčenje uporabiti eno samo tabelo

Sekvence

Dobro

  • Rešitev namenjena temu konkretnemu problemu

Slabo

  • Ne poznajo jo vse podatkovne baze

Lastna tabela za vsako številčenje

Dobro

  • Deluje v vseh SQL bazah
  • Zelo podobna rešitev kot sekvence

Slabo

  • Veliko malih tabel
  • Vse tabele je potrebno ustvariti vnaprej ali pa v programu vedno preverjati ali tabela obstaja ali ne.

Za vso številčenje uporabiti eno samo tabelo

Dobro

  • Deluje v vseh SQL bazah
  • Preprosta rešitev
  • Ni veliko dodatnega dela

Slabo

  • Ni primerna za SQL baze z veliko hkratnimi uporabniki

V naslednjih prispevkih bom podrobneje predstavil vsako izmed možnosti…

Univerzalni temeljni dohodek (UDT)

Petek, Oktober 4th, 2013

Zaradi drugih obveznosti mi je malce zmanjkalo časa za vzdrževanje bloga in zato sem razmišljal, da je čas za malce drugačno objavo.

Tako se danes ne bom posvetil računalniški tematiki, temveč socialni. Že nekaj časa se tudi v Sloveniji pogovarjamo o tki. univerzalnem temeljnem dohodeku (UTD). Ideja ni nova, a družba je že tako napredovala, da jo lahko tudi uresničimo.

Kaj je UDT?

Temeljni dohodek je dohodek, brezpogojno dodeljen vsem na individualni osnovi brez preverjanja premoženjskega stanja in brez delovne zahteve. Je oblika zagotovila minimalnega dohodka, ki se od obstoječih oblik v različnih evropskih državah razlikuje na tri pomembne načine:

  1. izplačuje se posameznikom in ne gospodinjstvom;
  2. izplačuje se ne glede na kakršenkoli dohodek iz drugih virov;
  3. izplačuje se brez zahteve po opravljanju kakršnegakoli dela ali pripravljenosti sprejeti ponujeno službo.

Prosim premislite, prebrskajte sami. To ni podpora lenuhom to je pot v boljši in pravičnejši svet.

Če se strinjate z mano (in seveda mnogimi drugimi) vas prosim, da idejo podprete s podpisom, ki bo omogočil vložitev pobude v kolesje EU.

Predstavitveni film (za SLO podnapise kliknite spodaj oznako CC (ob spodnjem desnem robu videa)): https://www.youtube.com/watch?v=zru79jcVTt4

Stran za podporo in podpis: http://basicincome2013.eu/ubi/sl/

Hvala!

Dodatek (31.10.2013 – dan varčevanja!)

Za vse, ki se še niste odločili

Nov zakon o spletnih piškotkih

Torek, Junij 25th, 2013

S  15. junijem je stopil v veljavo spremenjeni Zakon o elektronskih komunikacijah (ZEKom-1), ki zaostruje pravila glede uporabe spletnih piškotkov.

Spletni piškotki so majhne datoteke, ki se shranijo na računalnik obiskovalca spletne strani. Skrbijo za boljšo uporabniško izkušnjo, spremljanje statistik, napredno spletno oglaševanje in še marsikaj.

Po novem zakonu smo upravljalci spletnih strani dolžni opozoriti obiskovalca o piškotkih, ki jih nalagamo na vašo napravo, s katero se povezujete na splet.

Spletišče Matjazev.NET sestavljajo štirje sklopi:

  • Osnovno spletišče Matjazev.NET, s splošnimi informacijami o podjetju, nasveti, zastonj in plačljivo programsko opremo, knjigami….
  • Blog, ki ga trenutno berete
  • Forum, kjer najdete brezplačno pomoč pri uporabi MS Pisarne
  • Spletišče MEXCEL.biz, kjer najdete brezplačne dodatke za vaš MS Excel.

Nekoč smo na omenjenih spletiščih uporabljali programsko opremo Google Analytics, ki nam je omogočila spremljati koliko obiskovalcev se ustavi na naših spletnih straneh ter tudi, kaj vas najbolj zanima.

Z uveljavitvijo tega zakona je omenjena storitev postala brezpredmetna, saj jo ima vsak obiskovalec možnost izključiti in tako postanejo njeni rezultati napačni oz. nenatančni in nimajo več smisla.

S tem razlogom na spletišču ne uporabljamo Google Analytics programske opreme in tudi nobene druge programske opreme s pomočjo katere bi vas kakorkoli spremljali.

Piškotki, ki jih na naših spletnih straneh uporabljamo

MExcel.BIZ

Na spletišču Mexcel.biz uporabljamo dva piškotka, ki sta za delovanje strani nujno potrebna, zato sta dovoljena tudi v novem zakonu o elektronskih komunikacijah:

  • PHPSESSID je piškotek, ki nam omogoča vzdrževanje seje in je standarden PHP piškotek
  • lang je piškotek, s katerim si zapomnimo vašo izbrano jezikovno različico in z njegovo pomočjo se na stran vedno vrnete v izbranem jeziku.

Ker sta oba piškotka dovoljena vas za posebno dovoljenje ne sprašujemo!

Matjazev.NET

  • PHPSESSID je piškotek, ki nam omogoča vzdrževanje seje in je standarden PHP piškotek
  • PREF je piškotek, ki vam omogoča iskanje po spletišču in uporablja google tehnologijo iskanja

Na spletišču pa imate tudi možnost branja in pisanja komentarjev, kar nam zagotavlja tehnologija Disqus, ki pa uporablja lastne piškotke in za uporabo slednjih vas posebej vprašamo.

Matjazev.NET/blog

Na spletišču pa imate možnost deljenja vsebine, kar nam zagotavlja tehnologija ShareThis, ki uporablja lastne piškotke in za uporabo slednjih vas posebej vprašamo.

MExcel.BIZ/forum

Spletišče teče na tehnologiji phpBB3, ki za delovanje potrebuje piškotke, saj brez njih ne more teči, zato vas za uporabo slednjih posebej ne vprašamo.


Skupno delo

Ponedeljek, Junij 3rd, 2013

Kot že ptički čivkajo je Microsoft v novi različici MS podprl skupinsko delo več uporabnikov na istem dokumentu. Osebno se mi to zdi uporabna možnost in dodatek novi pisarni ki pa ima en velik problem… Vsi ljudje še namreč nimate najnovejše MS pisarne… Pa tudi tako hitro je še ne bodo/boste imeli.

V vmesen času pa lahko podobno – seveda zelo okrnjeno – a vseeno zelo uporabno možnost skupinskega urejanja dokumenta izkusite povsem zastonj in povsem internetno – torej brez potrebe kakršne koli instalacije na lokalni računalnik- kar hkrati pomeni tudi uporabo z različnimi napravami in različnimi operacijskimi sistemi.

Programska oprema se imenuje MoPad in nastaja pod okriljem Mozzila fundacije, dosegljivo pa je na spletni strani https://etherpad.mozilla.org/.

Preizkusite ne bo vam žal…

Dinamični graf

Sreda, December 28th, 2011

Počasi je, preko prispevkov o dinamičnih območjih in o poimenovanjih območij, zares prišel čas, da si ogledamo izdelavo dinamičnega grafa. To je graf, ki prikaže toliko podatkov, kot jih zapišete.

S pomočjo tega »trika« imate tako možnost ustvariti graf enkrat za vselej in ne vedno, ko se poveča število podatkov. Tipična uporaba je ob prikazu poslovanja, ki prikazuje mesece in vsak mesec se pojavi nova postavka zato je potrebno izrisati nov graf… Ali pač ne ;).

(more…)

Manjka podatek?

Četrtek, Oktober 20th, 2011

Včasih se zgodi, da v večji Excelovi tabeli ugotovimo, da nam nek podatek manjka. Največkrat to ugotovimo, ker ima tabela premalo vrstic.

Večina tabel je namreč zgrajenih tako, da imajo v nekem stolpcu (ponavadi na levi strani) pač nek urejen podatke, ki mu na desni strani sledijo podatki. Ta urejen podatek na levi strani je lahko številka, datum, ura…

Problem je torej sledeč: »Kako najti, kateri podatek nam manjka?«

Za lažjo predstavo vzemimo konkreten problem, kjer imate tabelo v katero vsak delovnik vpišete podatke o prodaji. Seveda je to popolnoma enakovredno primeru, ko dobite neke podatke iz centralnega računalnika na osnovi delovnih dni. Ali pa podatke o urah…

Vsem tem tabelam je torej skupno, da imajo nek stolpec, v katerem bi se morali nahajati naraščujoči podatki a eden (ali več) manjka. Da jih nekaj manjka preprosto ugotovite, tako da pogledate velikost tabele. Če bi morali biti v tabeli podatki za delovne dni potem bi v tej tabeli moralo biti toliko vrstic kolikor je delovnih dni.. pa jih ni ?… Kateri manjka?

Dobro, tabelo lahko pregledujete ročno in iščete datum ki manjka a to je zamudno in dokaj vrjetno, da se boste zmotili oz. težko našli vse datume. Zaposliti je torej potrebno računalnik!

Delovni dnevi

Zanalašč sem vzel težji primer, saj vam bom tako prikazal rešitev več problemov hkrati. Najprej moramo najti delovne dneve!

Vpišite torej prvi datum. Z miško razpotegnite datume navzdol in Excel bo v vsako naslednjo celico zapisal nov (naslednji) datum. S tem ste dobili stolpec z naraščujočimi datumi.


Sedaj je potrebno še ugotoviti kateri dnevi so delovni (če bi imeli kje seznam praznikov bi vpletli še te, a danes pač predpostavimo, da so delovni dnevi vsi dnevi razen sobote in nedelje. Dan v tednu nam vrne funkcija WEEKDAY.

Zatorej v sosednji stolpec zapišemo funkcijo =WEEKDAY(<celica z datumom>;2) in razpotegnemo navzdol:

Pridružimo dneve iz naše originalne tabele

S pomočjo dodatka MExcel tem datumom pridružimo datume iz naše tabele. S tem dobimo še eno vrstico z datumi.

Kdo manjka?

Sedaj imamo seznam datumov, oznako za kateri dan v tedni gre in zraven še seznam datumov iz naše originalne tabele. Tukaj lažje že na oko vidimo kateri datum manjka… seveda pa je še mnogo bolje zaposliti Excel in mu reči:

Če je oznaka dneva manjša od 6 (torej ponedeljek – petek) in je sosedna celica prazna (ni datuma) potem je to napaka, sicer je vse OK:

=IF(AND(Q5<6;ISBLANK(R5));"MANJKA";".")

Pa jih imamo - vse packe ;)

MExcel.biz

Nedelja, Junij 5th, 2011

Vabljeni na premierno otvoritev nove blagovne znamke MExcel, ki se skriva na spletišču www.mexcel.biz. Gre za Excelovega pomočnika, čarovnika, ko vam bo skrajno poenostavil združevanje tabel v Excelu.

Programski dodatek MExcel bo v prihodnosti rastel in pridobival več orodij in čarovnikov a že v prvi izdaji ponuja izjemno orodje za združevanje tabel, s pomočjo katerega lahko podatke združite do 10x hitreje kot to sicer omogočajo vgrajene Excelove tabele.

Prednosti

  • Združevanje po več ključnih podatkih hkrati
  • Združevanje podatkov tako po horizontali kot vertikali
  • Dodajanje nezdruženih podatkov v rezultat
  • Neobčutljivost na format ključnih podatkov
  • Preprostost uporabe – ne potrebujete znanja Excela, saj lahko s pomočjo čarovnika tabeli združi vsak uporabnik
  • Nad veliko množico podatkov (tabele večje od 500.000 zapisov) je združevanje do 10x hitrejše kot v kombinaciji funkcij VLOOKUP ali INDEX in MATCH!

Slabosti

  • “Slabost” čarovnika je samo v dejstvu, da ga Excel ne pozna in ga morate torej naknadno doinstalirati… A instalacija je skrajno preprosta in intuitivna. 🙂

Vabilo

Vabim vas torej, da si orodje naložite, ga preizkusite in napišete svoje mnenje…

Ščitenje resursov v VBA končni primer

Četrtek, Februar 17th, 2011

Za konec tega kratkega sprehoda skozi ščitenje resursov v okolju VBA (prvi del, drugi del in tretji del), si poglejmo še zaključni primer, torej ščitenje dostopa do datoteke.

Prikazal bom preprost razred, ki hrani številko (VBA do datotek prihaja preko številk, ki jih dodeli posamezni datoteki) in v kolikor je številka postavljena, kar pomeni, da je bila datoteka odprta, jo ob uničenju objekta zapre in uniči številko.

Z uporabo takšnega razreda oz. spremenljivke tega razreda lahko zanesemo na dejstvo, da bo vsaka datoteka, ki smo jo odprli tudi zaprta.

Razred za zaščito dostopa datotek

Option Explicit

' tu hranimo ID datoteke
Private idDatoteke

Private Sub Class_Initialize()
  ' na začetku ID-ja datoteke ne poznamo,
  ' saj datoteke še nismo odprli
  idDatoteke = -1
End Sub

Private Sub Class_Terminate()
  ' v kolikor smo datoteko odprli
  ' jo tudi zapremo
  If (idDatoteke > 0) Then
    Close #idDatoteke
  End If
End Sub

' s to funkcijo datoteko odpremo in tudi izvemo ali
' nam je odpiranje uspelo ali ne
Public Function Odpri(imeDatoteke As String, _
                      vhod As Boolean) As Boolean
  ' predpostavimo, da nam odpiranje ne bo usplo
  Odpri = False

  ' pridobimo novo število
  idDatoteke = FreeFile

  ' v primeru napake odregiramo
  On Error GoTo napaka

  ' ali želimo datoteko pisati ali brati
  If (vhod) Then
    Open imeDatoteke For Input As idDatoteke
  Else
    Open imeDatoteke For Output As idDatoteke
  End If

  ' če smo prišli do sem, je odpiranje uspelo
  Odpri = True

  ' končamo
  Exit Function

napaka:
  ' če smo tu, pomeni, da odpiranje ni uspelo
  idDatoteke = -1
End Function

' samo okrajšava gornje funkcije
Public Function OdpriZaBranje(imeDatoteke As String) _
                              As Boolean
  OdpriZaBranje = Me.Odpri(imeDatoteke, True)
End Function

' samo okrajšava gornje funkcije
Public Function OdpriZaPisanje(imeDatoteke As String) _
                              As Boolean
  OdpriZaPisanje = Me.Odpri(imeDatoteke, False)
End Function

' lastnost, ki nam vrne identifikacijsko
' številko datoteke, preko katere se bomo
' nanjo sklicevali
Public Property Get id()
  id = idDatoteke
End Property

Primer uporabe

Option Explicit

Sub beriDatoteko(ime As String)
  ' ustvarimo spremenljivko
  Dim dat As New clsDatoteka

  ' v kolikor datoteke ne moremo odpreti končamo
  If (Not dat.OdpriZaBranje(ime)) Then Exit Sub

  ' spremenljivka, kamor bomo prebrali vsebino
  Dim vrstica

  ' vrtimo se dokler ne pridemo na konec datoteke
  Do While Not EOF(dat.id)
    Line Input #1, vrstica ' preveremo vsebino
    MsgBox vrstica ' in jo izpišemo
  Loop

  ' datoteka se bo zaprla sama
End Sub

Sub pisiDatoteko(ime As String)
  ' ustvarimo spremenljivko
  Dim dat As New clsDatoteka

  ' v kolikor datoteke ne moremo odpreti končamo
  If (Not dat.OdpriZaPisanje(ime)) Then Exit Sub

  ' pišemo
  Print #dat.id, "Prva vrstica v datoteki"
  Print #dat.id, "Druga vrstica v datoteki"
  Print #dat.id, "Tretja vrstica v datoteki"
End Sub

Sub Test()
  Dim ime As String

  ime = "d:\test.out"

  ' to ne bo uspelo
  beriDatoteko ime

  ' če ste ustrezno ureili ime bo to uspelo
  pisiDatoteko ime

  ' če je uspelo pisanje, bo tudi branje
  beriDatoteko ime
End Sub