[ mika @ 27.05.2005. 08:55 ] @
Zdravo svima.

Pravim neku vrstu kadrovske evidencije, doduše trivijalnu, i potrebna mi je forma/report koja kao kolone ima 1-31 podatke o danima u mesecu, a kao redove podatke o imenima radnika. Upit je relativno jednostavan:

Code:

TRANSFORM 
     Format(Sum(tblListe.Time),"#.00") AS SumOfTime
SELECT 
     tblEmployees.Name
FROM 
     tblEmployees INNER JOIN tblListe ON tblEmployees.IdEmp = tblListe.IdEmp
WHERE 
     format(tblListe.Datum, "m") = 4
GROUP BY 
     tblEmployees.Name
PIVOT 
     Format(tblListe.Datum,"dd");


...koji pravi baš takav prikaz. Problem je u sledećem: ponekad nisu definisane sve kolone, npr. vikendom nema nikakvih unosa, ili je februar pa ima 28 dana, pa mi se u polju čiji je recordsource nepostojeći (npr. 29, 30, 31 u slučaju februara), javlja ono "#Name?", u okviru polja. E sad, ja bih da izbegnem to, tj. na mestima gde nemam recordsource za polje, da se to polje ne ispiše. Da li je ovo moguće? Probao sam preko conditional formatinga, ali ne ide. Rešenje vidim u unbound formi i nekoj funkciji PopulateRecordSet koju bih napravio i kojom bih "ručno" punio formu, ali mi se to rešenje čini nezgrapnim. Dakle, postoji li neko bolje i jednostavnije rešenje?

Pozdrav, nadam se da ste me razumeli!
[ tacka @ 27.05.2005. 13:19 ] @
ja sam u jednom takvom slucaju u upitu pravio polja tipa:
polje 1:sum(iif(format(tbllista.datum;"dd")=1;sati;0))
to je za 1 dan
polje 2:sum(iif(format(tbllista.datum;"dd")=2;sati;0))
to je za 2 dan
stim da ti 30 februar u polju ima 0 sati
[ Zidar @ 27.05.2005. 13:49 ] @
Ako su ti polja nazvana definisana kao
"1","2","3",...."28",'29","30","31"
onda unesi svih 31 u query property "Column Headings".
U tom slucaju ce cross tab query da vrati tacno ta polja, bez obzira ima li ili nema podatka za njih.
[ mika @ 27.05.2005. 14:44 ] @
Jeste, ali Access ne dozvoljava da unesem više od jednog polja kao column heading, u tome je problem. Jedino da probam da napravim nekako podupit kao uniju koja će da vraća svih 31 polje tipa:

Code:
UNION SELECT "01" UNION SELECT "02".... UNION SELECT "31"


Ovo sam pokušao, ali neće.
[ tacka @ 27.05.2005. 16:14 ] @
SELECT Table1.id, Table1.ime, Sum(IIf(Format(Table2!datum,"dd")=1,Table2!sati,0)) AS 1, Sum(IIf(Format(Table2!datum,"dd")=2,Table2!sati,0)) AS 2, Sum(IIf(Format(Table2!datum,"dd")=3,Table2!sati,0)) AS 3, Sum(IIf(Format(Table2!datum,"dd")=4,Table2!sati,0)) AS 4, Sum(IIf(Format(Table2!datum,"dd")=5,Table2!sati,0)) AS 5
FROM Table1 INNER JOIN Table2 ON Table1.id = Table2.id
GROUP BY Table1.id, Table1.ime;
[ Zidar @ 27.05.2005. 21:05 ] @
Probaj ovako:
Kvari "qryEmpDayTime":
Code:

SELECT tblEmployees.IdEmp, tblEmployees.Name, Year([Datum]) AS Godina, Month([Datum]) AS mesec, Day([Datum]) AS Dan, tblListe.Time
FROM tblEmployees INNER JOIN tblListe ON tblEmployees.IdEmp = tblListe.EmpID;

pa onda Kross tab kveri "qryEmpDayTime_Crosstab":
Code:

TRANSFORM Sum(qryEmpDayTime.Time) AS SumOfTime
SELECT qryEmpDayTime.IdEmp, qryEmpDayTime.Godina, qryEmpDayTime.mesec, Sum(qryEmpDayTime.Time) AS [Total Of Time]
FROM qryEmpDayTime
GROUP BY qryEmpDayTime.IdEmp, qryEmpDayTime.Godina, qryEmpDayTime.mesec
PIVOT qryEmpDayTime.Dan In (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31);


Obrati paznju na ono
Code:

PIVOT qryEmpDayTime.Dan In (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.......)


To IN (......) se ili kuca u SQL prozoru, ili otvoris cross tab kveri u dizajn modu, pa kliknes na povrsinu gde povezujes tabele i onda kliknes na View Properties i odes u Column headings i tamo uneses ono sto je u zagradi - 31 dan.

Dva kverija sam upotrebio umesto jednog samo zbog jasnoce pisanja.

[ izonic @ 28.05.2005. 23:09 ] @
evo mozda ovo pomogne
[ mika @ 30.05.2005. 09:32 ] @
Super, hvala svima na odgovorima, ključ je bio u liniji:

Code:
PIVOT qryEmpDayTime.Dan In (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.......)


Samo sam tu liniji modifikovao u svom upitu, i sve je profunkcionisalo kako treba... Zidar, Izonic i ostali-genijalci ste! Uz opasku da sam konačno naučio da koristim funkciju day(Datum) umesto format(Datum,"d"), toliko logično...