Newsgroup: it.comp.appl.access
Titolo: Query a campi incrociati.....TUTTI I RECORDS

Salve a tutti!
Ho visto e provato gli esempi nel sitocomune di come ottenere tutti i 
records in una query parametrica ma per il mio esempio, forse, non va bene
in quanto:
ipotizziamo una tabella dipendenti
1. iddipendente - contatore chiave primaria;
2. nominativo - testo
3. data - data/ora
4. TipoAssenza - numerico correlata "uno a molti" ad una tabella "Assenze".
La tabella "Assenza" puņ contenere, per esempio, "Ferie","congedo 
straordinario" ecc.ecc.
Creo la query a campi incrociati dove vorrei ottenere TUTTI i record della 
tabella Assenze, come intestazione colonne, nominativo come intestazione 
riga, e il conteggio delle assenze come valore. Ovviamente mi da SOLO se il 
nominativo ha il valore relativo ad uno dei record della tabella Assenze.
Come posso risolvere per ottenere qualcosa del genere:
NOMINATIVO   | FERIE | CONGEDO STRAORDINARIO | ASPETTATIVA | PERMESSO 
SINDACALE |
PIPPO                  |    5               0                      3 
1                                 0
ecc.ecc.
Grazie per la gentile attenzione.
Marco. 

Ciao forse hai fatto un errore nella impostazione delle tue tabelle, devi 
procedere una gestione molti a molti:
1)
crea tre tabelle:
[dipendenti]
iddipendente - contatore chiave primaria
nominativo - testo
data - data/ora
[assenze]
idassenze - contatore cprimaria
iddipendente - numerico
idassenza - numerico
[assenza]
idassenza - contatore chiave primaria
descrizione - testo
2)
relazioni
dipendenti.iddipendente ON assenze.iddipendente
assenza.idassenza ON ASSENZE.IDASSENZA
Devi creare un full outer join come spiegato qui:
http://www.databasejournal.com/features/msaccess/article.php/3516561
Quando hai ottenuto tutti i record , con tutti i dipendenti , e tutte le 
descrizioni dell'assenza, puoi fare la Cross query , basata su quella 
precedente, e di sicuro ti compariranno tutti i dip e le descrizioni, tra 
cui una riga con nominativo in bianco.
Ma per questo chiedo a qualcuno se sa come risolvere.
Ciao.
"Mark" <SPAM_NO_c...@yahoo.it_TOGLI_SPAM_NO> ha scritto nel messaggio 
news:45c6608f$0$14783$4faf...@reader5.news.tin.it...


 
http://www.databasejournal.com/features/msaccess/article.php/3516561
Completo con le query:
Nome:Q_DipAssDes
SELECT Assenza.descrizione, assenze.iddipendente
FROM Assenza LEFT JOIN assenze ON Assenza.idassenza = assenze.idassenza;
-------------------------------------------
Nome:Q_DipAssDes2
SELECT dip.nominativo, 
iif(isnull(Q_DipAssDes.descrizione),"ND",Q_DipAssDes.descrizione) as 
Descrizione
FROM dipendenti AS dip left outer  JOIN Q_DipAssDes ON dip.iddipendente = 
Q_DipAssDes.iddipendente;
union all
SELECT dip.nominativo, 
iif(isnull(Q_DipAssDes.descrizione),"ND",Q_DipAssDes.descrizione) as 
Descrizione
FROM dipendenti AS dip RIGHT JOIN Q_DipAssDes ON dip.iddipendente = 
Q_DipAssDes.iddipendente
WHERE (((dip.nominativo) Is Null));
Nota che hai un controllo se null, metti la scritta ND, altrimenti i null la 
query di crosstab non li becca.
-------------------------------------------------
3 query
Nome:dipendenti_CampiIncrociati
TRANSFORM Count(Q_DipAssDes2.descrizione) AS ConteggioDidescrizione
SELECT Q_DipAssDes2.nominativo
FROM Q_DipAssDes2
GROUP BY Q_DipAssDes2.nominativo
PIVOT Q_DipAssDes2.descrizione;
4 passo
nominativo aspettativa congedo ferie ND straordinario
 1    1
Brandi   2
Gino  1 1
tresc    1
Come vedi hai la colonna ND.
Fai una ultima query :
SELECT dipendenti_CampiIncrociati.nominativo, 
dipendenti_CampiIncrociati.aspettativa, dipendenti_CampiIncrociati.congedo, 
dipendenti_CampiIncrociati.ferie, dipendenti_CampiIncrociati.straordinario
FROM dipendenti_CampiIncrociati
WHERE (((dipendenti_CampiIncrociati.nominativo) Is Not Null));
ed ottieni tutta la lista, e procedi ad una select into eventualmente...

Ooopss..!
Evidentemente era tardi e ho fatto un pò di casini.
Comunque, Antonio, grazie per l'attenzione.
Dunque:
ho una tabella dipendenti:
1, iddipendente - chiave primaria;
2. nominativo - testo.
Tabella Assenze
1. idassenza - chiave primaria;
2. tipoassenza - testo.
Tabella Movimenti
1. idmovimenti - chiave primaria;
2. iddipendente - numerico correlata;
3. idassenze - numerico correlata.
Nella tabella "Movimenti" inserisco i dati. Come posso ottenere quanto
appresso:
Nome | tutti i tipi di assenza |
NOMINATIVO | FERIE | PERMESSO SINDACALE | ecc.ecc.
PIPPO                |   5       |                   0
CAIO                 |   0                            3
Spero di essere stato abbastanza chiaro.
Grazie per l'attenzione.
Marco.


Ciao è perfettamente identica la situazione, fai un database a parte e crea 
le tabelle con i miei stessi nomi, almeno puoi capire come devi cambiare i 
nomi dei campi, se non puoi cambiare la tua struttura.
Quello che ti ho postato prima va benissimo ma devi cambiare i nomi delle 
tabelle, e alla fine, basta ceh fai una query che non ho messo, per 
trasformare i campi NULL in 0 numerico.
Ciao. 

> Ooopss..!
CUT
se vuoi proprio la chicca fai la query via vba che ti prende i nomi delle 
colonne dalla query a campi incrociati, e sulla base di questi procedi a 
fare la query finale. 

 ha scritto nel messaggio 
news:tcHxh.17800$qN4.4...@twister1.libero.it...

Grazie Antonio, ho provato i tuoi suggerimenti e creato un nuovo database 
ma, purtroppo, alla fine, c'è qualcosa che non va. I risultati risultano 
"sballati".
E' vero che mi da tutti i dipendenti e tutte le voci rigurdo le assenze ma 
il calcolo non va.
Fammi sapere.
Grazie.
Marco. 

"Mark" <SPAM_NO_c...@yahoo.it_TOGLI_SPAM_NO> ha scritto nel messaggio 
news:45c75232$0$31676$4faf...@reader1.news.tin.it...

Ok, ho corretto, mancava un TIPO DI JOIN (non ricordo se left o right). 
Adesso i "conti" tornano.
Grazie, gentilissimo.
Marco. 

Esimio Antonio,
ma nell'ultima query, per avere il valore 0 ed eventualmente una somma di 
tutte le assenze?
Grazie ancora.
Marco. 

"Mark" <SPAM_NO_c...@yahoo.it_TOGLI_SPAM_NO> ha scritto nel messaggio 
news:45c755f0$0$1161$4faf...@reader2.news.tin.it...

Costruisci una query su quella a campi incrociati che gestisce i null:
SELECT dipendenti_CampiIncrociati.nominativo, 
IIf(IsNull([aspettativa]),0,[aspettativa]) AS C_aspettativa, 
IIf(IsNull([congedo]),0,[congedo]) AS C_congedo, 
IIf(IsNull([ferie]),0,[ferie]) AS C_Ferie, 
IIf(IsNull([Straordinario]),0,[Straordinario]) AS C_Straordinario
FROM dipendenti_CampiIncrociati
WHERE (((dipendenti_CampiIncrociati.nominativo) Is Not Null));
Ti va bene solo se hai delle causali sempre fisse nel tuo programma, 
altrimetni devi farti una gestione dinamica tramite vba..., non è difficile 
ma devi farti la funzioncina, che si legge i nomi dei campi dalla query a 
campi incrociati e poi si crea una query usando in maniera dinamica i nomi 
dei campi.
Ciao. 

 ha scritto nel messaggio 
news:MRIxh.17646$422.2...@twister2.libero.it...

Per i totaloni fai una colonna che somma tutti i campi delle causali:
C_Totali: [C_Straordinario]+[C_Ferie]+.......................
Ciao. 

 ha scritto nel messaggio 
news:bXIxh.17655$422.2...@twister2.libero.it...

Grazie Antonio,
infatti mi hai preceduto per chiederti se questi "benedetti" campi potessero 
essere creati dinamicamente, cioè, che il tipo di assenza può crescere 
durante l'inserimento dei dati e, quindi, devo, di volta in volta, inserire 
manualmente il criterio nelle query che mi hai suggerito, giusto?
Grazie ancora della squisita disponibilità.
Marco. 

"Mark" <SPAM_NO_c...@yahoo.it_SPAM_NO> ha scritto nel messaggio 
news:45c7860d$0$23970$4faf...@reader3.news.tin.it...

Ciao, per fare una gestione dinamica, dovresti costruirti la query a mano e 
salvarla di volta in volta.
NEll'esempio sotto vengono scorsi tutti i campi della query  a campi 
incrociati e creata una struttura per una nuova tabella, che viene creata.Ti 
serve per capire come creare dinamicamente il tutto.
Public Sub CreaTabella()
    Dim dbDeja As DAO.Database
    Dim tblEmployees As DAO.TableDef
    Dim fldEmployeeNumber As DAO.Field
    Dim queryDef As DAO.queryDef
    ' Specify the database to use
    Set dbDeja = CurrentDb
    Dim Campi As String
    'Read from query
    Dim StrQuery As String
    StrQuery = "dipendenti_CampiIncrociati"
    Set queryDef = dbDeja.QueryDefs(StrQuery)
     Dim MyNames(1 To 100) As String
    Dim CampoAttuale As Integer
    CampoAttuale = 0
    For Each Field In queryDef.Fields
    Campi = Field.Name
    If Campi <> "nominativo" Then
    CampoAttuale = CampoAttuale + 1
    MyNames(CampoAttuale) = Campi
    End If
    'array
    'queryDef.Fields
    Next
    'campo attuale var sentinella per il ciclo per la creazione della 
tabella
    'Set rs = queryDef.OpenRecordset
    ' Create a new TableDef object.
    Set tblEmployees = dbDeja.CreateTableDef("T_Query")
    'dbDeja.CreateQueryDef
    Set fldEmployeeNumber = tblEmployees.CreateField("Nominativo", dbText)
    tblEmployees.Fields.Append fldEmployeeNumber
    For volte = 1 To CampoAttuale
        Set fldEmployeeNumber = tblEmployees.CreateField(MyNames(volte), 
dbNumeric)
        tblEmployees.Fields.Append fldEmployeeNumber
    Next volte
   ' Add the new table to the database.
   dbDeja.TableDefs.Append tblEmployees
   dbDeja.Close
End Sub