[ brankec @ 16.05.2008. 21:23 ] @
| Pocetnik sam u SQL-u pa bih trebao pomoc. Imam sledecu tabelu radjenu u excelu
____A_________B_______C_____D________E
1 IME________TIP_____DAN___RED____TIP+RED
2 branko____dolazak____1_____1_____dolazak1
3 branko____dolazak____1_____2_____dolazak2
4 branko____dolazak____1_____1_____odlazak1
5 branko____dolazak____2_____1_____dolazak1
6 branko____odlazak____2_____1_____dolazak1
7 branko____odlazak____2_____2_____odlazak2
8 branko____odlazak____2_____3_____odlazak3
Kolone su sortirane po imenu, tipu pa danu. U excelu ovaj posao resavam na sledeci nacin: Kolonu RED dobijam tako sto u polje d1 unesem broj 1 a ostala polja dobijam sa sledecim if uslovom =IF(AND(C2=C3;B2=B3);D2+1;1). Kolonu TIP+RED dobijam tako sto spojim kolonu tip i red (ocito). Ovaj problem resavam u excelu zato sto ne znam kako bih u accessu u upitu dobio kolonu RED, odnosno TIP+RED. Nedavno sam poceo uciti SQL pa me muci kako da napravim onaj if uslov od malopre. Hvala na svakoj pomoci. |
[ Zidar @ 20.05.2008. 14:01 ] @
Pogledaj Access help za komandu iif (tacno, iif, ne if) iif ima sintaks gotovoo identicnu Excelovoj i moze se koristiti i u kveriju. Bas ono sto ti treba.
:-)
[ brankec @ 20.05.2008. 22:27 ] @
Dobro mi je poznata iif funkcija, ali ono sto mene muci je kako da formulisem uslov da ako je prvi podatak (polje) u odredjenoj koloni jednak drugom podatku onda ... . U excelu je to lako, ali kako to resiti u accessu, to je ono sto mene muci.
[ Scelle @ 21.05.2008. 00:02 ] @
Zaista ne mogu da kazem da sam shvatio tvoj problem u potpunosti - nije mi uopste jasan tvoj prvi post. Ali, ipak sam nesto uradio i nadam se da ce ti pomoci.
Pogledaj u bazi koju sam prikacio upit pod nazivom qryPoredjenje (otvori ga u design modu - ne mozes promasiti, jedini je...  ). Ako zelis da vidis "sirovu" SQL verziju, klikni desnim tasterom misa na njegovu naslovnu liniju i odaberi SQL view.
Ako nisam pogodio problem, molim te da ga malo bolje objasnis - naravno ako zelis da ti pomognemo.
P.S. Zidar je u pravu, iif funkcija je identicna onoj u Excell-u. 
[ brankec @ 21.05.2008. 16:50 ] @
Nastojacu biti jasniji: poredjenje tipa ako je vrijednost u koloni1 jednaka vrijednosti u koloni2 onda uradi nesto u koloni3, inace uradi nesto drugo u koloni3 nije problem.
Problem je u tome kako napisati uslov tipa: ako je vrijednost u koloni1-redu1 (prvi podatak) jednaka vrijednosti u koloni1-redu2 (drugi podatak) onda uradi nesto u koloni2-redu1.
Znaci kako napisati uslov koji se odnosi na vise redova ISTE kolone, a ne razlicitih kolona a istih redova (ovo potonje je sasvim jasno).
[ boki026 @ 21.05.2008. 18:49 ] @
Ne vidim drugi nacin nego da ti ta dva reda iz iste kolone u access-u budu dva razlicita polja (kolone).
[ Getsbi @ 21.05.2008. 19:23 ] @
Da li posle upoređivanja vrijednost u kolona1-red1 sa kolona1-red2 i izvršenja promene u koloni2 reda1 sledi isto takvo poređenje između reda2 i reda3, pa reda 3 reda4........ sve do kraja tabele?
[ brankec @ 21.05.2008. 19:35 ] @
Da GETSBI, upravo tako. Znaci treba mi uslov i petlja.
[ Getsbi @ 21.05.2008. 19:49 ] @
To se može odraditi u VBA kodu i pokrenuti na On Click događaj nekog dugmeta. Zakači primer tabele i nešto testnih podataka u .mdb fajlu pa ću da ti napišem VBA kod. Obavezno napiši uslov u nekoj labeli na formi da bi bilo jasno šta je cilj (svrha) poređenja.
[ brankec @ 21.05.2008. 20:05 ] @
Getsbi ako mozes prvo da mi napises da li je ovaj uslov uopste moguce uraditi u ACCESS-u (mislim preko njegovih funkcija). Posle tvog posta pretpostavljam da ne moze. Drugo, ako ne moze u access-u da li moze u SQL-u (poceo sam uciti microsof sql server 2005). Ako moze kako.
Ako ne moze ni na jedan nacin onda cu prvo da pripremim tabelu pa cu ti najverovatnije sutra posle 15 sati uplodovati (posle mog radnog vremena).
U svakom slucaju hvala ti, a i ostalima.
[ Getsbi @ 21.05.2008. 20:12 ] @
Možda i može ali ja ne znam bolji način.
[ brankec @ 21.05.2008. 20:17 ] @
Posteno od tebe.
[ Zidar @ 21.05.2008. 21:24 ] @
Citat: Problem je u tome kako napisati uslov tipa: ako je vrijednost u koloni1-redu1 (prvi podatak) jednaka vrijednosti u koloni1-redu2 (drugi podatak) onda uradi nesto u koloni2-redu1.
Znaci kako napisati uslov koji se odnosi na vise redova ISTE kolone
U nekim slucajevima, zadatak moze da se resi u kveriju, a nekada ne. U SQL (pa i Accesu) mogu da se kverijima resavaju zadaci tipa "prikazi zbir svih prethodnih rekorda do tekuceg". Takvi kveriji su prilicno komplikovani za pisanje i mogu da budu dosta spori za izvrsavanje. Zbog toga mnogi ljudi pribegavaju programiranju - cesto je lakse napisati proceduralni kod koji neto odradi nego se maltretirati sa komplikovanim kverijem. Nije ni Excel tako naivan kao sto izgleda :-)
Ako vec ucis sql server 2005, obrati paznju na poglavlje od correlated subqueries. U MS SQL mnogo toga moze da se uradi, ali je isto tako prilicno komplikovano. Mnogo toga sto u Accesu ne moze kverijem da se resi, u MS SQL moze.
Postavi konkretan zadatak, pa da pokusamo da pokazemo- kako se to moze (ako moze) uraditi kverijem, i kako se to programira 'na dugme'. NA forumu Baze Podataka imas top temu Mozgalice gde mozes da vidis kakve sve nebuloze mogu da se odrade u SQL i da se programiranje izbegne, berem teoretski.
:-)
[ brankec @ 21.05.2008. 22:15 ] @
Evo upload-ovo sam tabelu TEST u access-u. Ona je sazet oblik onog sto mi koristimo na poslu. Sledi par objasnjenja uz upload:
kolone se sortiraju po imenu, danu i tipu. Prva vrsta tipa (npr dolazak) u jednom danu treba dobiti sufiks 1, druga 2 itd. Znaci dolazak1, dolazak2, odlazak1, privatni odlazak1 itd. Ovo se radi ponovo za svaki novi dan. Znaci za drugi dan ide opet dolazak1, itd. I tako za svako ime.
Tabelu StaTrebaDobiti sam napravio da bi tacno znali sta je krajnji rezultat. Momci hvala vam na pomoci.
[ Getsbi @ 22.05.2008. 10:52 ] @
Da bi Access znao koji od dva ista zapisa da uzme mora mu se obezbediti minimalni uslov za to bar primarnim ključem AutoNumber.
Forma „Form1“ pokreće javnu funkciju “Obrada1()“. Pojašnjenje je u VBA kodu.
Dodao sam kolonu „STATUS“ i nju editovao, da bi bilo jasnije i jednim pogledom uočljiv rezultat umesto gledanja u tabelu „StaTrebaDobiti“. Za ponovno testiranje, pobriši vrednosti iz kolone „STATUS“.
[ Zidar @ 22.05.2008. 18:04 ] @
Dobio si lepo objasnjen kod. Evo sada i kveri koji radi ono sto treba:
Code: SELECT A.IME,
A.DAN,
A.TIP,
(SELECT 1 + COUNT(* )
FROM TEST AS B
WHERE B.IME = A.IME
AND B.DAN = A.DAN
AND B.TIP = A.TIP
AND A.ID > B.ID) AS REDNIBROJ,
A.ID
FROM TEST AS A
ORDER BY A.IME,
A.DAN,
A.ID;
Ovaj query mora da se kuca, ne moze da se uradi ceo u query designer prozoru. Smeta subquery. Subquery je correlated, ima WHERE uslov koji gleda u glavni query. Ako ipak rdosled za RedniBroj nije u redu, probaj da stavis A.ID < B.ID umesto A.ID > B.ID u subkveriju.
Da bi ovo moglo da radi, potreban je ID autonumber, koji definise redosled odlazaka i dolazaka. Bolje bi bilo da imas neko vreme odlaska/dolaska, jer tada ne bi zavisio od fizickog redosleda unosenja u tabelu.

[ brankec @ 22.05.2008. 18:25 ] @
Momci, hvala vam na pomoci. Sad mi treba neko vreme da analiziram kodove i prilagodim svojim potrebama.
[ Getsbi @ 22.05.2008. 18:59 ] @
Eto sad imaš dva rešenja. Zidarevo je svakako elegantnije. Da si u prvom postu objasnio onako dobro kao u svom trećem ne bi čekao 5 dana. 
[ brankec @ 22.05.2008. 19:17 ] @
Covjek se uci dok je ziv.
[ Zidar @ 22.05.2008. 20:31 ] @
Sta je elegantnije, to je stvar ukusa  Ko brze programira nego sto pise kabaste kverije, brze ce isprogramirati sta mu treba i svi srecni. Ja sam suvise lenj da pisem kod, pa otud kveriji.
Mnogo vaznije je sto je Getsbi ukazao na potrebu dodavanja kolone koja odredjue stvarni redosled rekorda u tabeli test. Bez dodavanja necega sto ce poredjati rekorde, kveri ne bi bio moguc, a ni kod ne bi radio. U Excelu je redosled fiksiran - sto vidis u tabeli, to je to i uvek ce biti tako. Access generalno vraca rekorde u proizvoljnom redosledu.

[ brankec @ 22.05.2008. 22:10 ] @
Tabela koju sam upload-ovo je sazeta verzija one tabele koju u praksi koristim. Prava tabela sadrzi kolonu sa siframa radnika koja moze biti i primarni kljuc (postoji jos dve kolone koje mogu biti primarni kljucevi). Tu kolonu nisam ukljucio u sazetu verziju zbog svog neiskustva. Sada mi je jasno da mora biti primarni kljuc.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|