29.10.07

Kako pronaci poslednji AUTO_INCREMENT?

Pitanje je kako pronaci poslednji AUTO_INCREMENT?

Odgovor je funkcija LAST_INSERT_ID() koja vraca broj poslednjeg auto_inc koji je uradjen u bazi.
S obzirom da funkcija vraca vrednost koja se odnosi samo na postojeceg klijenta eto resenja za nasa prebacivanja tj. necemo morati da radimo select max(id)....
Za opsirnije o ovoj funkciji pogledajte :
http://dev.mysql.com/doc/refman/5.0/en/stored-procedure-last-insert-id.html


www.baco.co.yu

18.10.07

Lista MySQL Server Error Codes

Na adresi
http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
imate kompletan spisak za gresaka sa kodovima istih, trebace vam za hendlovanje...

Povratne informacije sa servera (procedure, funkcije,triggeri)

Pošto težište bacamo na serverski deo što se tiče razvoja, postujem jedan članak o tome kako možete sa server da dobijete neku povratnu informaciju da li je nešto prošlo kako treba ili nije.
Konkretno, dajem dva mala primera da vidite kako nesto može da se realizuje u tom pravcu:

Prvi primer:
Varijable sa kojom će te se susretati na serverskoj strani su one sa prefiksom @. To su varijable globalnog tipa na nivou sesije (ovaj koncept je MySql maznuo iz ORACLE-a). Ako imate neku varijablu koji bilo gde postavite na neku vrednost, u toku cele sesije je možete pozivati i koristiti tu vrednost. ako se na isti nalog (npr. root) loguje više korisnika istovremeno, svako će imati svoju kopiju iste varijable - ovo možete i da proverite. Znači, ako Vam za bilo šta zatreba ovo onda je korsitite, korisna je stvarčica. Evo i primera:






Naravno ako bilo kada u toku iste sesije pozovete datu promenljivu, dobićete njenu upisanu vrednost. Ovo je dobro da možete da pri obradama generisete poruke sa servera i prikazujete ih na klijentu. Ovo ima upotrebu ako želite da na nivou sesije čuvate neke podatke (kada je pristupio korisnik sistemu, šta je radio, neke druge poruke,...)


Drugi primer:
IN/OUT/INOUT varijable - na server strani MySql-a možete da kreirate proceduru u kojoj imate jedan ili više IZLAZNIH parametara. Evo primer kako rade izlazni parametri:


/*AKO POSTOJI BRISEMO PROCEDURU*/
DROP PROCEDURE if EXISTS OUT_DEMO;
/*KREIRAMO PROCEDURU*/
CREATE PROCEDURE out_demo(IN p_ulaz int,OUT p_izlaz int)
BEGIN
DECLARE i int DEFAULT 0 ;
SET p_izlaz := p_ulaz*2;
END;
/*ZOVEMO PROCEDURU DA VIDIMO KAKO TO SVE RADI*/
CALL OUT_DEMO(1,@S);
/*PROVERAVAMO REZULTAT*/
SELECT @S;



www.baco.co.yu

17.10.07

Problemi sa dužinom podataka pri importu sa drugim izvora

Prebacivao sam u našu shemu podatke iz drugih baza (Oracle, XML,DBF, Access...) i jedna od stvari koja može pri migraciji podataka da stvara probleme - ovde najviše mislim na presipanje podataka za FinSyM - to će biti neminovnost, je memorija koju zauzimaju naši karakteri mogu da naprave mnogo problema (dešava se da nije uvek 1 znak 1 byte). Postoji više načina čuvanja naših karaktera, pa da predstavim moguće situacije:
  1. Podaci se cuvaju u YUCII karakteru (š,č,ć,ž,đ) - sa ovim nema problem sve bude kako treba, jedan karakter je jedan char u bazi
  2. Podaci se čuvaju u ASCII karakteru (^,[,],#...) - sa ovim takođe nema problema, jedan karakter je jedan char u bazi. Jedina akcija nakon upucavanja koja treba da se odradi je da se realizuje UPDATE NEKA_TABELA SET NEKO_POLJE=REPLACE(NEKO_POLJE,'^','Č') i onda COMMIT i stvar je rešena.
  3. Podaci se cuvaju kao KUKE i KVAKE (ae,....,/\) - sa ovim zna da bude problema, jer na primer: imamo proizvod koji se zove PŠENICA, to u bazi zauzima 7 char-ova dok PaeENICA zauzima preko 20 karaktera. Ovo jako pravi problem jer ce sa baze generisati greska kako je prekoračena maksmalna dužina polja (npr. VACHAR(7)). Onda treba posvetiti pažnju ovakvim problemima i anticipirati ovakav vid izuzetaka u radu.


www.baco.co.yu

15.10.07

Ogranicenja obracuna

Zbog prosirenja funkcionalnosti postoji sledece ogranicenje u procesu obracunavanja:
Nije moguce koristiti formulu na elementu obracuna koji ce se pojavljivati i na ponderisanim i na pojedinacnim analizama. Razlog je taj sto se u formuli mora navesti i tabela koja se gleda. Resenje koje treba implementirati je neka vrsta parsera koji ce formulu srediti u real-time modu, dinamicki neposredno pre izvrsavanja...
Ovo je od interesa samo za kukuruz, jer do sada je sve ostalo proslo bez problema.

Labels:

12.10.07

Primer za obradu na serveru pomocu uskladištenih procedura

Dajem jedan skolski primer (nije nalickan do kraja ali je koncept regularan i tako cemo raditi) koji radi i koji prebacuje profakturu u fakturum, upisuje jedan slog u zaglavlje fakture na osnovu podataka iz profakture i onoiko slogova stavki koliko ima u stavkama profakture.
ovo radi nad shemom aragon-a, pa proanalizirajte kako se to radi jer cemo SVE OBRADE raditi na ovaj nacin kroz procedure.

Naravno, sada nisam imao vremena da definisem i EXCEPTION HANDLER-e i slicno ali kada napravimo sve za produkciju to ce izgledati mnogo detaljnije.

SRC CODE:


/*brisemo proceduru ako postoji*/
DROP PROCEDURE IF EXISTS p_profak_fak;

/* kreiramo proceduru p_profak_fak
* ulazni parametri su broj (ID) profakture,
* i sifra radnika koji radi obradu*/
CREATE PROCEDURE p_profak_fak(IN p_brojprofakture int,IN p_sifrad int)
COMMENT 'PREBACIVANJE PROFAKTURA => FAKTURA'
BEGIN

/*upisujemo u zaglavlje fakture */
INSERT
INTO f_fakzag
(dat_izd,
parid,
status_dok,
parime,
datknj,
genbroj,
tip,
sifrad,
brspoljdo,
nacnas,
datum_valute,
datum_prometa)

/*na osnovu SELECT-a odabrane profakture*/
SELECT(SELECT now()
FROM dual) /*tekuce vreme*/,parid /*sifra partnera je ista*/,
status_dok /*
dokument je OK */
,parime /*naziv partnera je isti prepisuje se*/,NULL /*datum
knjizenja je NULL-faktura nije proknjizena*/
,NULL /*GENBROJ je NULL unece se triggerom*/,'U' /*ULAZNA FAKTURA*/
,p_sifrad,id /*ovo je broj profakture SPOLJNI DOKUMENT*/,'P' /*
faktura je nastala od profakture*/
,datum_valute /*prepisuje se*/,datum_prometa

/*prepisuje se*/
FROM f_profakzag

/* BIRAMO SAMO JEDNU PROFAKTURU
* SA WHERE ID USLOVOM*/
WHERE id = p_brojprofakture;

/* potvrdimo transakciju za zaglavlje
* zbog ID-fakture da uensemo u stavke*/
COMMIT;

/*UNOSIMO STAVKE FAKTURE*/
INSERT
INTO f_faktab
(id,
zagid,
sifrob,
opis,
kol,
cena,
pdvproc,
vrednost,
parbatproc,
ukupno)

/*NA OSNOVU SELECT-a iz stavki profakture*/
SELECT id,(SELECT max(id)
FROM f_fakzag) /*zaglavlje se trazi upitom*/,sifrob,opis,kol,cena
,pdvproc,vrednost,rabatproc,ukupno
FROM f_profaktab pft
WHERE pft.zagid = p_brojprofakture;

/*potvrdimo citavu transakciju*/
COMMIT;
END



PROCEDURU POZIVATE SA:

call p_profak_fak(1,1);

www.baco.co.yu

SQL - napredne tehnike Knowledge Expert


Jedna od korisnih stvari (alata) za učenje SQL-a za MySql server je i KnowledgeExpert u okviru alata Toad for MySql (www.quest.com/toad-for-mysql/). Alat TOAD for MySql je bestplatan, pa ga slobodno koristite.

Knowledge eXpert je ugrađena baza znanja u vezi sa SQL-om, ne samo sintaksom, nego i sa puno prime
ra iz domena transakcija, procedura, sigurnosti i održavanja baze. Jako bi bilo korisno da instalirate Toad u verziji 3 i da prostudirate šta sve može da se nađe u Knowledge eXpertu.
Moje iskustvo sa TOAD-om i Knowledge eXpertom za ORACLE baze je više nego odlično, pa nam ostaje da probamo isto to sa MySql-om

Knowledge expret ima standardni meni za pretragu i prikaz strukture dokumentacije (index,search, topic,locate...) pa je lako pronaći ono što Vam treba.





www.baco.co.yu