Številčenje v SQL podatkovnih bazah III

Naslednji način pridobivanja številke (prvi del, drugi del) je lastna tabela za vsako številčenje. Izmed omenjenih SQL podatkovnih baz (Oracle, MSSql in Sqlite) je Oracle že od nekdaj uporabljal sekvence in avtomatičnega številčenja primarnih ključev ne pozna. Za MSSql in SQLite pa je to osnovni način avtomatičnega številčenja. Kot omenjeno že zadnjič je MSSql sekvence dobil šele v reinkernaciji iz leta 2012, SQLite pa jih še vedno ne pozna.

Za avtomatično številčenje na podlagi primarnega ključa je torej potrebno to določiti že v definiciji tabele:

MSSql:

CREATE TABLE SEQ_RACUNI
(
  SID INT IDENTITY(1,1)
);

SQLite
CREATE TABLE SEQ_RACUNI
(
  SID INTEGER NOT NULL

, PRIMARY KEY(ID)
);

V obeh primerih smo določili tabelo z enim samim poljem, ki se bo avtomatično povečevalo v kolikor mu številke ne določimo. Torej:
INSERT INTO SEQ_RACUNI DEFAULT VALUES

Na ta način torej v MSSql in SQLite podatkovnih bazah dobimo avtomatično številčenje.

POZOR: Seveda pa – glede na sekvence – obstaja velika razlika. Pri sekvencah vsak zahtevek po novi številki samo poveča trenutno vrednost sekvence; v primeru avtomatičnega številčenja primarnih ključev pa se številke zapisujejo v podatkovno bazo in tako imamo za prvih 1000 številk v tabeli 1000 zapisov. To se seveda lahko preprosto reši s periodičnim brisanjem podatkovne tabele:

DELETE FROM SEQ_RACUNI WHERE SID < (SELECT MAX(SID) FROM SEQ_RACUNI)

Številčenje v SQL podatkovnih bazah II

Zadnjič sem vam omenil tri načine avtomatičnega številčenja v SQL podatkovnih bazah, danes pa vam bom prikazal prvega. Posamezne načine vam bom prikazal na primeru treh popularnih SQL baz: Oracle, MSSQL in Sqlite.

Sekvence (SEQUENCE)

Izmed omenjenih treh podatkovnih baz poznata sekvence Oracle in MSSQL (vendar MS samo od letnika 2012 dalje!). Postopek dela s sekvencami je skrajno preprost.

  1. Najprej definiramo novo sekvenco
  2. Ko potrebujemo naslednjo številko jo iz sekvence zahtevamo

To je očitno zelo dober način za pridobivanje avtomatičnih številk. Sekvenco določimo z najmanj petimi parametri (ime sekvence, minimalna vrednost, maksimalna vrednost, preskok in začetna vrednost):

CREATE SEQUENCE sequence_name
  MINVALUE value
  MAXVALUE value
  START WITH value
  INCREMENT BY value;

Primer:
CREATE SEQUENCE seq_racuni
  MINVALUE 1
  MAXVALUE 99999999
  START WITH 1
  INCREMENT BY 1;

Kot je vidno sekvenca ni omejena na zaporedno številčenje, temveč lahko številčimo tudi s korakom večjim od 1 (INCREMENT BY). Ravnotako ni nujno, da se sekvenca začne z 1 (START WITH).

OPOMBA: Seveda je z uporabo najpreprostejše srednješolske matematike tako ali tako preprosto napisati poljubno funkcijo številčenja tako da pač napišemo neko funkcijo y = F(x), kjer X pač raste od 1 do N, y pa je številka, ki nas zanima. Recimo, če želimo začeti številčiti z 8 in potem nadaljevati s korakom 15: y = 8 + 15 * (x – 1)!

Uporabiti takšno sekvenco pa je še bolj preprosto.

V Oracle jo preprosto zahtevamo s funkcijo .nextval:

SELECT seq_racuni.nextval FROM dual;

oziroma
INSERT INTO racuni
  (stevilka_racuna, znesek, datum...)
VALUES
  (seq_racuni.nextval, 1123.4, SYSDATE...);

V MSSQL pa s konstruktom NEXT VALUE FOR:
SELECT NEXT VALUE FOR seq_racuni;

oziroma
INSERT INTO racuni
  (stevilka_racuna, znesek, datum...)
VALUES
  (SELECT NEXT VALUE FOR seq_racuni, 1123.4, SYSDATE...);

Številčenje v SQL podatkovnih bazah

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…

Katere povezave uporablja moja datoteka?

Danes sem na forumu prejel zanimivo vprašanje, katerega rešitev je prav zanimiva. MS namreč spremlja (če mu to dovolite), kaj uporabniki počno in predvsem, česa ne počno. In če neke funkcije veliko uporabnikov ne uporablja jo preprosto skrijejo, da ne moti večine, ki je tako ali tako ne uporablja.

Ena izmed takšnih funkcij, ki je veliko uporabnikov ne uporablja, sam pa jo pri urejanju diplomskih nalog redno uporabljam, je pregled povezav dokumenta.

Kot verjetno veste, lahko Word-ov dokument vsebuje elemente, ki so povzeti iz drugih datoteke (recimo grafe, ki se nahajajo v Excelovi datoteki). Na ta način sta datoteki povezani in ko se graf spremeni v Excelu se sprememba takoj odrazi tudi v Wordu.

Vse lepo in prav, a danes ne bom govoril o tem. Z Word-om 2010 je MS namreč skril funkcijo, ki nam je omogočila pogledati katere povezave vsebuje naša datoteka

Kako priti do tega okna?

Kot rečeno je torej potrebno v Wordu 2010 in nadalnjih malce telovadbe, da pridemo do tega okna:

Najprej odpremo okno z možnostmi našega Word-a

V oknu z možnostmi se postavimo na Orodna vrstica za hitri dostop’. Na desni strani se pokažejo nove možnosti, kjer na vrhu izberemo ‘Vsi ukazi’ v ponujenm seznamu spodaj najdemo ukaz ‘Uredi povezave do datotek’ ter jih dodamo na hitro vrstico.

In tako imamo opcijo v naši hitri vrstici:

Skupno delo

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…

Iskanje celic glede na obliko oz. lastnosti

Iskanje vrednosti v Excelovih tabelah je preprosto in ga takoj obvlada vsak uporabnik. Tako recimo vsi vemo, da lahko poiščemo vse celice, ki imajo vrednost 516 preprosto tako, da izberemo orodje za iskanje (bližnjica CTRL+F, Urejanje / Najdi (Excel pred 2007) oz Osnovno / Urejanje / Poišči in izberi (Excel 2007 in nadalnji)) ter vanj vpišemo vrednost 516 ter kliknemo ‘Nadaljuj iskanje’ ali pa ‘Najdi vse’


Iskanje posebnost

Kaj pa če želimo najti vse združene celice ali pa vse celice, katerih tekst je v rdeči barvi?

Tudi tukaj nam zna Excel priskočiti na pomoč, saj lahko v že omenjenem oknu, natančneje določimo kakšno obliko celice iščemo. Zgoraj desno imamo namreč na voljo gumb ‘Oblika’ s katero določimo obliko in Excel išče celice, ki imajo natanko določeno obliko.

Primer: iskanje združenih celic

Če želimo poiskati vse združene celice izberemo torej orodje za iskanje, iskalni pogoj pustimo prazen, saj nas vsebina ne zanima in izberemo gumb ‘Oblika’. Odpre se novo okno, v katerem določimo obliko celic, ki jih želimo najti. Ker nas zanimajo celice, ki so združene, se postavimo na zavihek ‘Poravnava’ ter označimo, da nas zanimajo združene celice

Ko vse potrdimo, nam Excel prikaže seznam združenih celic oz. nam pokaže posamezne združene celice:

Na enak način lahko recimo najdemo tudi vse celice, ki imajo rdečo barvo ali pa imajo rdečo barvo in so združene.

Če nas ob obliki zanima tudi vrednost pač v okno vnesemo tudi vrednost in tako najdemo vse celice, ki imajo npr. vrednost 516 in so obarvane rdeče.
Ne pozabite počistiti oblikovanja, ko iščete nekaj drugega!

Excel si namreč zapomni kakšno oblikovanje ste izbrali in ob naslednjem iskanju oblikovanje ohrani. Ko torej vi naslednji recimo vnesete iskalni pogoj ‘Ljubljana’ se lahko zgode, da bo Excel vstrajal da te besede ne najde, čeravno vi veste, da se v tabel zagotovo nahaja…

Problem je lahko v tem, da ste prej označili, da vas zanimajo celice z rdečo barvo in Ljubljane z rdečo barvo pa v tabeli recimo ni. Excel vam tudi kaže, kakšno obliko išče, zato bodite na to pozorni

Oblikovanje počistite v padajočem meniju

Zamenjaj/Najdi besedilo samo znotraj označenih celic

V Excelu akcija zamenjevanja znakov ni tako pogosta kot v Wordu a se navkljub vsemu včasih le zgodi, da želite v kakšni veliki tabeli zamenjati neko besedo z drugo besedo. Recimo, da želite besedo ‘rdeč’ zamenjati z besedo ‘moder’.

Akcija je skrajno preprosta, saj samo izberete orodje za zamenjevanje in zaukažete, naj Excel pač besedico ‘rdeč’ zamenja z ‘moder’. To je vse.

Kaj pa če želite zamenjati besedici samo znotraj nekega manjšega področja in ne znotraj celotne tabele? Recimo samo znotraj enega stolpca?

V tem primeru pa se pojavi dilema, saj nikjer v oknu za zamenjavo znakov ni opcije ‘zamenjaj znotraj označenega obsega’. Določite lahko, naj Excel zamenjuje besede samo znotraj lista ali pa znotraj delovnega zvezka. Kaj pa znotraj označenega območja?

In izkaže se, da te opcije ni, ker je to pač privzet Excelov način delovanja. Če torej najprej izberete neko območje in potem izberete orodje za zamenjavo (ali iskanje), bo Excel zamenjal znake (iskal znake) samo znotraj označenega območje, ne da bi mu vi to morali posebej zaukazati!

Dvojni pogled na dokument

Word nam omogoča, da isti dokument hkrati urejamo na dveh različnih mestih znotraj dokumenta. Tako lahko recimo hkrati urejamo uvod in zaključek ali pišemo vsebino in vidimo, kaj se dogaja s kazali.
Uporaba orodja je skrajno preprosta saj je vse, kar je potrebno storiti samo z miško klikniti na opcijo Razdeli, ki se nahaja na zavihku Ogled.

Word nas prestavi v dokument, kamor nariše vodoravno črto, s katero določimo, kje želimo prerezati pogled dokumenta. Ko se odločimo in z miško kliknemo, nam word prikaže isti dokument zgoraj in spodaj.


Med obema deloma se lahko preprosto sprehajamo in ju neodvisno urejamo. Hkrati pa nam Word omogoča tudi neodvisno nastavljanje velikosti pogleda in podobnih elementov…

Edinstvene vrednosti v Excelu III

http://www.matjazev.net/blog/2012/10/16/edinstvene-vrednosti-v-excelu-ii/ kako prešteti edinstvene vrednosti znotraj nekega Excelovega območja in prišli do spoznanja, da omenjena formula deluje samo nad številskimi podatki.

V kolikor pa se med vrednostmi nahajajo tudi nizi znakov, datumi ali kaj tretjega pa opisana metoda odpove.

Poiskati je torej potrebno način, ki bo preštel različne vrednosti neglede na njihovo vsebino. Iščemo torej bolj splošno formulo, ki jo bomo lahko uporabili vedno.

Seveda se sprašujete zakaj nisem te formule zapisal že takoj na začetku saj bo očitno delovala nad vsemi tipi podatkov in je zatorej boljša kot tista, ki sem vam jo predstavil zadnji. Odgovor je seveda v zahtevnosti.

Današnja formula je celo krajša in lepša od FREQUENCY, a je težje razumljiva oz. vem priporočam, da se poglobite v razumevanje zakaj deluje oz. zakaj vrača pravilen rezultat.

Uporabljene formule

Za končni rezultat bomo potrebovali dve vgrajeni Excelovi funkciji SUMPRODUCT in COUNTIF. Funkcijo COUNTIF sem v blogu že opisoval, SUMPRODUCT pa še nisem omenjal.

COUNTIF funkcije preprosto prešteje število celic, ki ustrezajo nekemu pogoju, funkcija SUMPRODUCT pa je bolj podobna mrežnim funkcijam in medsebojno sešteva medsebojne rezultate.

IDEJA REŠITVE

Za vsako celico bomo ugotovili kolikokrat se pojavi na celotnem območju (temu bo služila funkcija COUNTIF).

Sedaj je potrebno te podatke normalizirati, kar pomeni, da če se neka vrednost pojavi N krat, jo bomo mi upoštevali samo 1/N krat… Z drugimi besedami – vse rezultate je potrebno potencirati na -1 oz. 1 deliti z njimi:

Kot vidite lahko normalizirane vrednosti preprosto seštejemo (zato smo jih normalizirali!) dobimo iskani rezultat – število edinstvenih vrednosti ne nekem območju.

In če sedaj opisano idejo zapišemo z eno formulo dobimo sledeč rezultat:

=SUMPRODUCT((A3:A15<>"")/COUNTIF(A3:A15;A3:A15&""))

In to je splošna formula štetja edinstvenih vrednosti v Excelu!

Edinstvene vrednosti v Excelu II

Zadnjič sem prikazal uporabo funkcije FREQUENCY, saj jo bomo potrebovali za štetje edinstvenih vrednosti.

Imamo torej funkcijo, ki nam zna povedati, koliko števil pade v neko območje. Kako lahko to uporabimo za štetje ednistvenih vrednost?

Najprej pomislimo, kaj dobimo, če funkciji FREQUENCY posredujemo isti niz števil v obeh primerih… V tem primeru dobimo za vsako število zapisano kolikokrat se pojavi; toda če se isto število pojavi večkrat, funkcija FREQUENCY za vse ponovitve vrne vrednot 0.

Slednje je zelo pomembno, saj je to ključ naše rešitve, katere ideja je preprosta: »Seštej vse števila, ki jih vrne funkcija FREQUENCY in pri tem vsako število, ki je več kot 1, preprosto upoštevaj kot 1«

Rešitev:

=SUM(IF(FREQUENCY(A1:A100;A1:A100)>0;1))

In to je vse! Ta funkcija prešteje vse edinstvene vrednosti na območju A1 do A100. Ne pozabite pa, da je to matrična funkcija, kar pomeni, da jo morate potrditi s kombinacijo CTRL+SHIFT+ENTER.

Ima pa omenjena funkcija oz. omenjena rešitev manjšo pomanjklivost. Deluje namreč samo in izključno nad številkami. Če želimo prešteti vse edinstvene vrednosti, ki vsebujejo besedilo (recimo edinstvena imena), pa nam omenjena funkcija ne bo mogla prav nič pomagati.

V tem primeru bo potrebno poseči po močnejšem orožju, ki ga bom prikazal naslednjič.