IALweb Homepage
Forum Home Forum Home > MS Office > Microsoft Office > Microsoft Access
  New Posts New Posts RSS Feed - CALCOLO DI TOTALI IN REPORT CON DATI VARIABILI
  FAQ FAQ  Forum Search   Events   Register Register  Login Login


REGISTRATEVI su IALWeb forum!

CALCOLO DI TOTALI IN REPORT CON DATI VARIABILI

 Post Reply Post Reply Page  12>
Author
Message
PRINCIPE View Drop Down
Utente Senior
Utente Senior
Avatar

Joined: 04/Ott/2016
Location: MILANO
Status: Offline
Points: 175
Post Options Post Options   Thanks (0) Thanks(0)   Quote PRINCIPE Quote  Post ReplyReply Direct Link To This Post Topic: CALCOLO DI TOTALI IN REPORT CON DATI VARIABILI
    Posted: 25/Nov/2016 at 09:23

Buongiorno a tutti,

dopo le utili indicazioni di WILLY55, che ringrazio, ho realizzato un report a dati variabili su query parametrica a campi incrociati. Le colonne valori sono 5 e mi restituiscono il valore per ogni mese in esame.

Lo scopo del report è quello di rappresentare il flusso di cassa dei 5 mesi successivi a quello in cui si imposta la data di lancio. Dunque è un report che dinamicamente mi restituirà valori in progressione temporale.

Al fine di rappresentare i dati dinamicamente, ho dovuto dunque scrivere un codice VBA per estrarre i dati nel report che pertanto ha caselle di controllo (in un numero fisso) NON ASSOCIATE.

Quesito: come gestire le funzioni di somma parziali/totali per i controlli ?  Se creo un raggruppamento la funzione di somma non riconosce il controllo cui la somma si riferisce.

Se invece do il riferimento ad uno dei valori restituiti dalla query, ma successivamente imposto la data di lancio al mese m+1, ovviamente la funzione di somma và in errore in quanto non trova il recordsource originario di quel periodo che avevo impostato per ottenere la somma di gruppo.


Grazie per l'interessamento.

Francesco (alias Principe)







Edited by PRINCIPE - 25/Nov/2016 at 09:40
Back to Top
Sponsored Links


Back to Top
PRINCIPE View Drop Down
Utente Senior
Utente Senior
Avatar

Joined: 04/Ott/2016
Location: MILANO
Status: Offline
Points: 175
Post Options Post Options   Thanks (0) Thanks(0)   Quote PRINCIPE Quote  Post ReplyReply Direct Link To This Post Posted: 25/Nov/2016 at 12:08

In merito al mio topic in oggetto, ho provato a strutturare una prima query di totalizzazione, da aprire con sottoreport da inserire poi nel report 1 già creato.

Ma ottengo il messaggio di errore:

“Impossibile utilizzare una query SQL pass-through o una query a campi incrociati a colonne non fisse come origine record di una sottomaschera o un sottoreport”

Cortesemente attendo vs indicazioni.

Grazie,


francesco



Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 25/Nov/2016 at 23:17

Piuttosto che effettuare la totalizzazione in un sottoreport, è preferibile sfruttare direttamente le operazioni all'interno del report stesso, effettuando, ad esempio, all'apertura. la somma esclusivamente per i controlli dinamici che vengono forniti dalla query a campi incrociati (in modo da renderlo indipendente dalle colonne fisse).
Schematicamente è quanto sotto riportato:


Private Sub Report_Open(Cancel As Integer)
DoCmd.Maximize
Me.RecordSource = "Query_Campi_Incrociati_mensili_conteggio_filtrata"
Dim qdf As DAO.QueryDef
Dim fld As DAO.Field
Dim rst As DAO.Recordset
Dim Conta As Integer
Set qdf = CurrentDb().QueryDefs("Query_Campi_Incrociati_mensili_conteggio_filtrata")
qdf.Parameters![Forms!MascheraParametriMensile!Anno] = Forms!MascheraParametriMensile!Anno
qdf.Parameters![Forms!MascheraParametriMensile!Mese] = Forms!MascheraParametriMensile!Mese
Set rst = qdf.OpenRecordset
Conta = 1
For Each fld In rst.Fields
    ' Etichetta e controlli nel corpo del report
    Me("Etichetta" & Trim(Conta)).Caption = fld.Name
    Me("Etichetta" & Trim(Conta)).Visible = True
    Me("Controllo" & Trim(Conta)).ControlSource = fld.Name
    Me("Controllo" & Trim(Conta)).Visible = True
    If Conta > 1 Then ' salta il primo controllo parte da 2 a 13 (al massimo)
        ' Totali nel piè pagina report
        Me("Tot" & Trim(Conta)).ControlSource = "=Sum([" & fld.Name & "])"
        Me("Tot" & Trim(Conta)).Visible = True
    End If
    Conta = Conta + 1
Next
Set rst = Nothing
Set qdf = Nothing
Set fld = Nothing
End Sub

che inserito nel demo del link che ti citato nell'altro tuo post:
http://forum.ialweb.it/forum_posts.asp?TID=16466671

di cui ti riporto di nuovo il link per scaricare il demo:
uploads/19428/ReportDinamicoConQueryCampiIncrociati.rar

 


Edited by willy55 - 25/Nov/2016 at 23:21
Willy
Back to Top
PRINCIPE View Drop Down
Utente Senior
Utente Senior
Avatar

Joined: 04/Ott/2016
Location: MILANO
Status: Offline
Points: 175
Post Options Post Options   Thanks (0) Thanks(0)   Quote PRINCIPE Quote  Post ReplyReply Direct Link To This Post Posted: 28/Nov/2016 at 09:13

Buongiorno Willy55, grazie, sostanzialmente, seguendo la tua traccia sono riuscito ad applicare il codice al mio report, operando qualche modifica in ordine all'estensione dei controlli da valutare all'apertura (in quanto ho diversi controlli descrittivi a livello di righe record). Ottengo un totale per ogni colonna. Il problema però è un po' più articolato in quanto:

- devo rappresentare diversi subtotali per almeno 3 gruppi di record descrittivi

- il saldo finale di ogni colonna (mese) deve essere riportato a nuovo come saldo iniziale della colonna successiva

Il mio codice:


Option Compare Database
Option Explicit
Private Sub Report_Close()
DoCmd.Restore
End Sub
Private Sub Report_Open(Cancel As Integer)
DoCmd.Maximize
Me.RecordSource = "QESTRZ"
Dim qdf As DAO.QueryDef
Dim fld As DAO.Field
Dim rst As DAO.Recordset
Dim Conta As Integer
Set qdf = CurrentDb().QueryDefs("QESTRZ")
Set rst = qdf.OpenRecordset
Conta = 1
For Each fld In rst.Fields
    Me("Etichetta" & Trim(Conta)).Caption = fld.Name
    Me("Etichetta" & Trim(Conta)).Visible = True
    Me("Controllo" & Trim(Conta)).ControlSource = fld.Name
    Me("Controllo" & Trim(Conta)).Visible = True
       
     If Conta > 6 Then ' salta il primo controllo parte da 6 a 11 (al massimo)
         ' Totali nel piè pagina report
         Me("Tot" & Trim(Conta)).ControlSource = "=Sum([" & fld.Name & "])"
         Me("Tot" & Trim(Conta)).Visible = True
     End If
     Conta = Conta + 1
 Next
 Set rst = Nothing
 Set qdf = Nothing
 Set fld = Nothing
 End Sub


Grazie.


Francesco [alias Principe]



Edited by willy55 - 28/Nov/2016 at 23:28
Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 28/Nov/2016 at 23:30

In risposta ai tuoi quesiti:

Originally posted by Principe Principe wrote:


Il problema però è un po' più articolato in quanto:
- devo rappresentare diversi subtotali per almeno 3 gruppi di record descrittivi

per inserire dei raggruppamenti (che siano dinamici in base ai dati che vai ad implementare nella query a campi incrociati, la quale alimenta il report) devi agire sulla proprietà GroupLevel in modo da porre il campo, di tuo interesse, nel gruppo:
https://msdn.microsoft.com/en-us/library/office/ff197094.aspx
http://www.techrepublic.com/article/how-to-group-an-access-report-on-the-fly/
http://allenbrowne.com/ser-33.html
http://www.access-programmers.co.uk/forums/showthread.php?t=221786
http://www.mrexcel.com/forum/microsoft-access/485232-modify-group-sort-levels-report-using-visual-basic-applications.html
http://jkafer.com/2014/ms-access-report-dynamically-collapse-groups/

Comunque, considera che puoi filtrare i dati, per ciascun gruppo, in modo da lasciare inalterati i criteri generali e, riunendo i dati, magari, presentare infine una sintesi con i totali.

Originally posted by Principe Principe wrote:


- il saldo finale di ogni colonna (mese) deve essere riportato a nuovo come saldo iniziale della colonna successiva

Il saldo di una colonna che determini nel piè di pagina del report lo puoi anche porre nella intestazione del report  (traslandolo sulla colonna successiva in modo da rappresentare il saldo iniziale di questa)
Puoi generare ciò allo stesso modo come già visto per i totali nel piè pagina report dei post precedenti.

E' chiaro che come cresce la complessità degli elementi (da porre in modo dinamico) e maggiori saranno le intercorrelazioni fra i controlli presenti nel report che devono soddisfare di vincoli.
Per facilitare l'opera, puoi implementare un report che agisca un sottoinsieme predefinito e quando funziona il tutto lo rendi dinamico in base a tutte le colonne che la query a campi incrociati può fornire al report.

PS quando alleghi del codice questo va racchiuso fra tag-code (questa volta ho provveduto personalmente).

 

Willy
Back to Top
PRINCIPE View Drop Down
Utente Senior
Utente Senior
Avatar

Joined: 04/Ott/2016
Location: MILANO
Status: Offline
Points: 175
Post Options Post Options   Thanks (0) Thanks(0)   Quote PRINCIPE Quote  Post ReplyReply Direct Link To This Post Posted: 29/Nov/2016 at 16:09

Grazie per le utili indicazioni anche se non del tutto chiare.

Credo poi di non aver compreso cosa significhi "racchiudere il code dentro il tag"....

ad ogni modo, ho applicato l'istruzione GroupLevel, ma temo di aver sbagliato posizione o comando. Il report non mi restituisce il sub totale atteso (= vuoto).

Dove sto sbagliando ?

Grazie.

Principe


Option Compare Database
Option Explicit
Private Sub Report_Close()
DoCmd.Restore
End Sub
Private Sub Report_Open(Cancel As Integer)
DoCmd.Maximize
Me.RecordSource = "QESTRZ"
Dim qdf As DAO.QueryDef
Dim fld As DAO.Field
Dim rst As DAO.Recordset
Dim Conta As Integer
Set qdf = CurrentDb().QueryDefs("QESTRZ")
Set rst = qdf.OpenRecordset
Conta = 1
For Each fld In rst.Fields
    Me("Etichetta" & Trim(Conta)).Caption = fld.Name
    Me("Etichetta" & Trim(Conta)).Visible = True
    Me("Etichetta" & Trim(Conta)).Caption = fld.Name
    Me("Etichetta" & Trim(Conta)).Visible = True
    Me("Etichetta" & Trim(Conta)).Caption = fld.Name
    Me("Etichetta" & Trim(Conta)).Visible = True
    Me("Controllo" & Trim(Conta)).ControlSource = fld.Name
    Me("Controllo" & Trim(Conta)).Visible = True
    Me("Controllo" & Trim(Conta)).ControlSource = fld.Name
    Me("Controllo" & Trim(Conta)).Visible = True
    Me("Controllo" & Trim(Conta)).ControlSource = fld.Name
    Me("Controllo" & Trim(Conta)).Visible = True
     If Conta > 6 Then ' salta il primo controllo parte da 6 a 20 (al massimo)
         ' Totali nel piè pagina report
         Me("Tot" & Trim(Conta)).ControlSource = "=Sum([" & fld.Name & "])"
         Me("Tot" & Trim(Conta)).Visible = True
         End If
     Conta = Conta + 1
 
  'Set grouping field.
    Me.GroupLevel(0).ControlSource = "DSCRZGRP3"

Next
 Set rst = Nothing
 Set qdf = Nothing
 Set fld = Nothing
 End Sub
 
 


Edited by willy55 - 29/Nov/2016 at 23:10
Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 29/Nov/2016 at 23:11

Nel report il raggruppamento deve essere presente prima di assegnare, a run-time, il campo interessato.
Quindi nel menu di "Ordinamento e raggruppamento" deve essere impostato il "Campo o espressione" con il "Criterio ordinamento" e la relativa "Intestazione Gruppo = Sì".
Altrimenti avresti la necessità (nella struttura del report, a design) di creare il raggruppamento con il metodo CreateGroupLevel
https://msdn.microsoft.com/en-us/library/office/aa221173(v=office.11).aspx

Creato il raggruppamento (che può essere anche con un campo generico) ne assegni il ControlSource (in base al livello) ma piuttosto che porre il codice all'interno del ciclo è preferibile porlo all'esterno:


...
Next
'Set grouping field.
Me.GroupLevel(0).ControlSource = "DSCRZGRP3"
...

Per l'impiego pratico dei tag-code (come previsto dalle norme del forum) vedi seguente link:
http://forum.ialweb.it/forum_posts.asp?TID=16465374&title=tutorial-tag-code
ho modificato io il tuo ultimo post e puoi verificare ciò che è inserito.

Willy
Back to Top
PRINCIPE View Drop Down
Utente Senior
Utente Senior
Avatar

Joined: 04/Ott/2016
Location: MILANO
Status: Offline
Points: 175
Post Options Post Options   Thanks (0) Thanks(0)   Quote PRINCIPE Quote  Post ReplyReply Direct Link To This Post Posted: 01/Dic/2016 at 14:10

Non ne vengo a capo.

Ho fatto svariati numerosi tentativi ma probabilmente sto andando alla cieca senza comprendere cosa vuoi significare nel ragionamento che per te è chiaro ma per me no, ergo non sono un esperto in tema di codici VBA e dunque mi sto intortando, ma non vorrei arrendermi.

[Nel report il raggruppamento deve essere presente prima di assegnare, a run-time, il campo interessato]

che significa?


[Quindi nel menu di "Ordinamento e raggruppamento" deve essere impostato il "Campo o espressione" con il "Criterio ordinamento" e la relativa "Intestazione Gruppo = Sì"]

nell'elenco a discesa del menu ordinamento e raggruppamento trovo solo i campi rinominati come da estrazione query.

Se puoi aiutarmi, te ne sono grato.


Principe




Back to Top
PRINCIPE View Drop Down
Utente Senior
Utente Senior
Avatar

Joined: 04/Ott/2016
Location: MILANO
Status: Offline
Points: 175
Post Options Post Options   Thanks (0) Thanks(0)   Quote PRINCIPE Quote  Post ReplyReply Direct Link To This Post Posted: 01/Dic/2016 at 14:11

Anche per il tema [saldo iniziale riportato da saldo finale mese precedente] non ho capito nulla di come procedere.

Puoi gentilmente essere più chiaro ?

Grazie.


Principe


Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 01/Dic/2016 at 22:01
Cerco di rispondere ai tuoi quesiti:

Originally posted by Principe Principe wrote:


...
[Nel report il raggruppamento deve essere presente prima di assegnare, a run-time, il campo interessato]
che significa?

il report deve avere, al suo interno, un raggruppamento, in modo da variarne il campo di riferimento ed ottenere, nel gruppo, i dati ordinati e raggruppati in base al dato dinamico fornito.
Ad esempio se, nella query a campi incrociati, abbiamo: i dipendenti, i tipi di giustificativi ed i valori con le varie totalizzazioni mensili, si può creare un gruppo per il campo "dipendenti" (di livello 0) ed all'apertura variarne il valore di "ControlSource" con uno dei campi su cui si voglia l'effettivo raggruppamento ed erdinamento.
Quindi, ad esempio, se il "Gruppo" originario è impostato su "Dipendente" e si voglia porre il raggruppamento sul campo "Giustificativo", basterà impostare:


Me.GroupLevel(0).ControlSource = "Giustificativo"

in modo da ottenere.di volta in volta, il gruppo voluto.

Originally posted by Principe Principe wrote:


[Quindi nel menu di "Ordinamento e raggruppamento" deve essere impostato il "Campo o espressione" con il "Criterio ordinamento" e la relativa "Intestazione Gruppo = Sì"]

nell'elenco a discesa del menu ordinamento e raggruppamento trovo solo i campi rinominati come da estrazione query.

E' chiaro che il campo (o i campi) su cui si voglia effettuare il raggruppamento devono essere presenti nella query a campi incrociati, che alimenta il report, in modo che ne puoi selezionare uno, ma variarne, dinamicamente, il contenuto all'occorrenza (in base ai dati da te prestabiliti).

Originally posted by Principe Principe wrote:


Anche per il tema [saldo iniziale riportato da saldo finale mese precedente] non ho capito nulla di come procedere.

Così come effettui (nel piè di pagina del report) il totale, per ciascuna colonna in modo dinamico:


  If Conta > 6 Then ' salta il primo controllo parte da 6 a 20 (al massimo)
         ' Totali nel piè pagina report
         Me("Tot" & Trim(Conta)).ControlSource = "=Sum([" & fld.Name & "])"
         Me("Tot" & Trim(Conta)).Visible = True
  End If

allo, stesso modo, puoi inserire nella intestazione del report i totali, slittandoli di posizione sulle colonne per cui, ad esempio, il saldo che risulta a gennaio viene messo in testa a febbraio e così via; (il calcolo della sommatoria risultante, è il medesimo, per ciascun mese, cambia solo il nome del controllo a cui si fa riferimento).

Per facilitarti, ti aggiorno il db che presenta gli esempi pratici succitati.

uploads/19428/ReportDinamicoConQueryCampiIncrociati.rar

Willy
Back to Top
 Post Reply Post Reply Page  12>
  Share Topic   

Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 10.17
Copyright ©2001-2013 Web Wiz Ltd.

This page was generated in 0,063 seconds.