Somma di sottoreport su report

di il
25 risposte

Somma di sottoreport su report

Salve,
ho creato due tabelli, di cui una principale dove ci sono i seguenti campi:
ID
data
... ed altri valori
nella seconda tabella i seguenti campi:
ID
data
descrizione
importo
le tabelle tra loro sono relazionata tramite la data.
Devo creare un report dove siano indicati i campi della prima tabella e la somma di "importi" in funzione della data.
Nel sottoreport al piè di pagina ho indicato la somma degli importi e nel report principale ho creato una casella di testo la quale ha come origine di controllo la somma degli importi del sottoreport. Il tutto funziona, savo quanto non sono presenti dati nella seconda tabella, condizione che può capitare.

Come posso risolvere questo problema.
Grazie

25 Risposte

  • Re: Somma di sottoreport su report

    alessio.mirandoli ha scritto:


    Salve,
    ho creato due tabelli, di cui una principale dove ci sono i seguenti campi:
    ID
    data
    ... ed altri valori
    nella seconda tabella i seguenti campi:
    ID
    data
    descrizione
    importo
    le tabelle tra loro sono relazionata tramite la data.
    Devo creare un report dove siano indicati i campi della prima tabella e la somma di "importi" in funzione della data.
    Nel sottoreport al piè di pagina ho indicato la somma degli importi e nel report principale ho creato una casella di testo la quale ha come origine di controllo la somma degli importi del sottoreport. Il tutto funziona, savo quanto non sono presenti dati nella seconda tabella, condizione che può capitare.
    Come calcoli la somma degli importi nel sottoreport?
    Dov'è la casella di testo che ha come origine controllo la somma degli importi del sottoreport?
    Cosa compare nella casella di testo del report principale quando non ci sono importi nel sottoreport?
    Questa pagina di Microsoft ha la sua veneranda età ma può essere la soluzione:
  • Re: Somma di sottoreport su report

    Nel piè di pagina del sottoreport ho inserito una casella di testo con il valore della somma;
    Una seconda casella di testo è nel report principale e fa riferimento a quella del sottoreport;
    Penso che l'indicazione che tu mi hai dato riguardo la pagina Microsoft sia corretta, solo che sbaglio qualcosa.
    =IIf([Subrpt].[Report].[HasData]=Vero;[Subrpt].[Report]![Somma];0)
    la risposta è : #Nome?

    Subrpt è il nome del mio sottoreport
    Somma è il valore che devo indicare se diverso da 0
  • Re: Somma di sottoreport su report

    alessio.mirandoli ha scritto:


    ...
    Penso che l'indicazione che tu mi hai dato riguardo la pagina Microsoft sia corretta, solo che sbaglio qualcosa.
    =IIf([Subrpt].[Report].[HasData]=Vero;[Subrpt].[Report]![Somma];0)
    Sicuro di aver scritto bene? Riporto la parte che interessa della pagina indicata nel post #2
    =IIF([SubRpt].Report.HasData=True, [SubRpt].Report![TotTrasporto], 0)

    alessio.mirandoli ha scritto:


    ...
    Una seconda casella di testo è nel report principale
    ovvio, ma in quale sezione del report principale? (ammesso che serva ancora saperlo, una volta sistemata la sintassi)
  • Re: Somma di sottoreport su report

    La casella di testo è nel corpo del report principale;
    la sintassi
    =IIf([Subrpt].[Report].[HasData]=Vero...
    sembra non dare il corretto valore
  • Re: Somma di sottoreport su report

    C'è la possibilità di allegare il DB, così sarebbe più semplice?
  • Re: Somma di sottoreport su report

    Versione Microsoft
    =IIF([SubRpt].Report.HasData=True, [SubRpt].Report![TotTrasporto], 0)

    Versione tua

    alessio.mirandoli ha scritto:


    ...
    =IIf([Subrpt].[Report].[HasData]=Vero
    La differenza sta nella parentesi quadrate.
  • Re: Somma di sottoreport su report

    Il problema è che quando vado ad inserire la corretta sintassi nell'origine controllo, in automatico vengono aggiunte le parentesi quadrate.
    Io ho un office 2010 pro
  • Re: Somma di sottoreport su report

    alessio.mirandoli ha scritto:


    Il problema è che quando vado ad inserire la corretta sintassi nell'origine controllo, in automatico vengono aggiunte le parentesi quadrate.
    Ritiro tutto: le parentesi quadrate vengono aggiunte in automatico.
    Sto incontrando qualche difficoltà anch'io a riprodurre il problema e relativa soluzione. Su A2002 non ha fatto una piega, con A2013 non ne esco. Strano. Ho bisogno di pensarci.

    alessio.mirandoli ha scritto:


    c'è la possibilità di allegare il DB, così sarebbe più semplice?
    Sì, ma credo che tu non riesca a farlo direttamente qui, se non hai raggiunto un determinato numero di post che abilità la scheda "Invia allegato". Devi caricarlo su un host esterno (purché non sia necessaria una registrazione, almeno per me).
  • Re: Somma di sottoreport su report

    Sei riuscito a scoprire qualcosa?
  • Re: Somma di sottoreport su report

    alessio.mirandoli ha scritto:


    sei riuscito a scoprire qualcosa?
    Una cosa che mi lascia senza parole: su A2002 funziona tutto, perfettamente. Con A2013 non cavo un ragno dal buco. Lo stesso db, creato con A2002, dove funziona tutto, se lo apro senza toccarlo con A2013 funziona. Appena ci metto le mani, anche solo per riscrivere lo stesso codice, con A2013 non funziona più. Ammetto di non aver profuso ore e ore di prove ma... non capisco. La spiegazione c'è, sicuramente, ma non ne esco.
  • Re: Somma di sottoreport su report

    Ho riscontrato anche io la stessa cosa. Se salvo il db in una versione precedente e lo apro con la versione precedente funziona correttamente, soltanto che non funziona più nulla se devo aggiungere anche solo una semplice somma
  • Re: Somma di sottoreport su report

    Philcattivocarattere ha scritto:


    Una cosa che mi lascia senza parole: su A2002 funziona tutto, perfettamente. Con A2013 non cavo un ragno dal buco. Lo stesso db, creato con A2002, dove funziona tutto, se lo apro senza toccarlo con A2013 funziona. Appena ci metto le mani, anche solo per riscrivere lo stesso codice, con A2013 non funziona più. Ammetto di non aver profuso ore e ore di prove ma... non capisco. La spiegazione c'è, sicuramente, ma non ne esco.

    alessio.mirandoli ha scritto:


    ho riscontrato anche io la stessa cosa. Se salvo il db in una versione precedente e lo apro con la versione precedente funziona correttamente...
    Ci sto ancora lavorando, non mi arrendo. Però metto a disposizione di tutti quello che ho combinato. E' un estratto, ridotto al minimo indispensabile, del db Northwind distribuito con A2002 (notare che è scritto in italano, le date sono stravecchie e il campo [Trasporto] è in Lire! )
    Ci sono due tabelle, Clienti ed Ordini, in relazione uno a molti. Ho creato due report con la composizione guidata, per gradire, rptClienti e rptOrdini. Normalissimi.
    Sulla falsariga di rptClienti ho creato rptMain, il report principale. Sulla falsariga di rptOrdini ho creato subOrdini. In subOrdini ho aggiunto, nel piédireport, la somma di [Trasporto]. In rptMain inserisco poi come subOrdini come sottoreport, con il classico trascinamento da mouse, e nella sezione Corpo ho creato una casella di testo non associata con questa origine dati:
    =IIf(subOrdini.Report.HasData=Vero;subOrdini.Report!TotFreight;0)
    Il controllo container del sottoreport si chiama subOrdini, come il sottoreport (di default la procedura lo chiama così)
    Tutto questo fatto da un computer con Windows Vista ma soprattutto Access 2002 (manco si pensava ai 64bit a quel tempo). Va tutto. I Clienti che non hanno alcun ordine (vedi "FISSA" o "PARIS" ad esempio) hanno 0 nella casella di testo che prende la somma dal sottoreport.
    Apro lo stesso file mdb su un computer con Win 8.1 64bit ed A2013 32bit. Funziona tutto. Lo converto in accdb. Continua a funzionare. Da quest'ultimo computer apro rptMain in struttura, creo una nuova casella di testo e scrivo nell'origine dati la stessa istruzione della casella di testo che già esisteva e per non correre rischi lo faccio con il copia-incolla.
    Ho messo la label delle due caselle di testo come SubTotale2002 (nel senso che è stato creato con A2002) e SubTotale2013 (seguendo la stessa logica). La prima casella di testo continua a funzionare, nella seconda compare sempre #Nome?
    Siccome sono molto incapace con gli allegati, carico i file su un host. Qualche antivirus potrebbe non consentirne il download (in passato è successo) ma il mio non fa una piega.
    I file si chiamano
    1) SommaSubReport2000.mdb (l'ho convertito in formato 2000 per chi volesse aprirlo con quella versione)
    2) SommaSubReport2013.accdb
    (resteranno disponibili per 28 giorni dal 12/12/2015)
    http://www.fileconvoy.com/dfl.php?id=g863b7493ed9448c09997596539579096fff1ccdaf
    Sono uguali, solo salvati in due formati diversi ma l'errore si presenta sempre.
    Non mi arrendo ma la cosa è veramente strana.
  • Re: Somma di sottoreport su report

    Philcattivocarattere ha scritto:


    Philcattivocarattere ha scritto:


    Una cosa che mi lascia senza parole: su A2002 funziona tutto, perfettamente. Con A2013 non cavo un ragno dal buco. Lo stesso db, creato con A2002, dove funziona tutto, se lo apro senza toccarlo con A2013 funziona. Appena ci metto le mani, anche solo per riscrivere lo stesso codice, con A2013 non funziona più. Ammetto di non aver profuso ore e ore di prove ma... non capisco. La spiegazione c'è, sicuramente, ma non ne esco.

    alessio.mirandoli ha scritto:


    ho riscontrato anche io la stessa cosa. Se salvo il db in una versione precedente e lo apro con la versione precedente funziona correttamente...
    Ci sto ancora lavorando, non mi arrendo.
    ...
    Non mi arrendo ma la cosa è veramente strana.
    Dove non arriva l'origine del controllo arriva il codice. Nel controllo non associato presente nel corpo del report principale, togliere l'origine controllo. Nell'evento Format o Print (ho provato solo l'anteprima di stampa e il risultato è identico) del corp del report principale scrivere
    Private Sub Corpo_Print(Cancel As Integer, PrintCount As Integer)
    If Me!subOrdini.Report.HasData Then
        Me!NomeTxtBox.Value = Me!subOrdini.Report!TotFreight.Value
    Else
        Me!NomeTxtBox.Value = 0
    End If
    End Sub
    dove TotFreight è il controllo del sottoreport che contiene la somma delle spese di trasporto e che ha come origine
    =Somma([Trasporto])
    Resta però l'interrogativo di partenza. Grrrrr.
  • Re: Somma di sottoreport su report

    In merito all'inconveniente verificatosi:

    Philcattivocarattere ha scritto:


    Resta però l'interrogativo di partenza. Grrrrr.
    Da una breve visione del demo allegato, si osserva che nel report principale (rptMain) la casella di testo (testo10) con anteposta etichetta "SubTotale2002", ha origine controllo:
    
    =IIf(subOrdini.Report.HasData=Vero;subOrdini.Report!TotFreight;0)
    
    e funziona in tutte le versioni di Access con cui ho effettuato il test (2000, 2002, 2003, 2007 e 2013);

    mentre la casella di testo (testo12) con anteposta etichetta "SubTotale2013" (ove nella versione 2013, rispetto alla 2002, viene effettuata una conversione automatica con i nomi degli oggetti e proprietà fra parentesi quadre) la quale ha origine controllo:
    
    =IIf([subOrdini].[Report].[HasData]=Vero;[subOrdini].[Report]![TotFreight];0)
    
    confermo che NON funziona in Access 2000, 2002, 2003, 2007 e 2013 in quanto fornisce, appunto, "#Nome" sintomo di un errore nell'origine controllo.
    Tale errore permane nelle nuove versioni in ACCDB mentre con le vecchie versioni MDB se si genera nuovamente l'origine controllo (anche assegnando la forma degli oggetti posti fra parentesi quadre)
    
    =IIf([subOrdini].[Report].[HasData]=Vero;[subOrdini].[Report]![TotFreight];0)
    
    viene effettuato correttamente il calcolo proveniente dal sottoreport.
    Questo indica che l'operazione di auto correzione che avviene, in MDB, può accedere al subreport mentre ciò non avviene in ACCDB (permanendo l'errore sull'oggetto).
    Infatti l'errore "#Name" si verifica quando Access non trova i campi associati al controllo, in quanto ogni oggetto viene memorizzato in una mappa, con il suo nome e un identificativo univoco in modo da accedere attraverso un puntatore alle proprietà e metodi associati.
    Quando un oggetto viene salvato, il suo nome nella mappa viene aggiornato in modo da riflettere il riferimento al nuovo oggetto.

    Quindi è da ritenere che l'operazione automatica che avviene variando l'origine del controllo, in MDB, funzioni perché viene risolto l'accesso al subreport ed eseguito pertanto il codice associato.
    Come ulteriore verifica in ACCDB si può notare che indipendentemente dalla verifica della presenza dei dati (con metodo Report.HasData) anche presentare il semplice risultato del controllo nel sottoreport (TotFreight) questo non viene soddisfatto e si ottiene sempre "#Name".
    Ciò è sintomo di una diversa gestione della sequenza e gerarchia nella gestione del modello ad oggetti di generazione del report e subreport.
    Ciò potrebbe risiedere nelle operazioni di autocorrezione che Access pone in essere al momento della imputazione dall'origine del controllo (che seppure permettono la visualizzazione del controllo calcolato nel subreport) non aggiornano correttamente il puntatore all'oggetto.
    Ad ulteriore verifica è da evidenziare che la variazione da te apportata, applicabile anche su evento Format
    
    Private Sub Corpo_Format(Cancel As Integer, PrintCount As Integer)
    If Me!subOrdini.Report.HasData Then
        Me!NomeTxtBox.Value = Me!subOrdini.Report!TotFreight.Value
    Else
        Me!NomeTxtBox.Value = 0
    End If
    End Sub
    
    che determina il corretto totale del subreport (nella versione ACCDB) conferma che nella formattazione del report questo accede al campo calcolato nel sottoreport e produce il valore esatto (quindi accede all’oggetto) mentre ciò non avviene nella interpretazione dell’origine del controllo.

    A corollario, se può essere utile ad un lettore, dal momento che con le varie versioni di Access si sono individuate tutta una serie di problematiche legate alla totalizzazione in un main report con i dati di un subreport presento alcuni link:

    - autocorrezione

    https://support.office.com/en-sg/article/Set-name-AutoCorrect-options-b475af37-dcf8-477e-a9d8-32ca9c1d4623
    http://allenbrowne.com/bug-03.htm
    http://www.utteraccess.com/forum/index.php?showtopic=1753967

    - errore #Name? in un controllo
    http://answers.microsoft.com/en-us/office/forum/office_2010-access/name-appears-in-a-calculated-form-field-in-access/9861c9e7-a440-4ef2-9842-7909752b4fa3?db=5&auth=1

    - diversità nel calcolo fra report (o maschera) principale che riprende un sottoreport (o sottomaschera) rilevato con il passaggio da Access 2003 a 2007
    http://allenbrowne.com/RecordCountError.htm

    - impiego del metodo "HasData" per gestire il sottoreport al fine di verificare se questo abbia dati (in modo da ottenere il totale nel report principale e non l’errore in caso di mancanza di valori del sottoreport)
    http://accessdatabasetutorial.com/2014/03/04/microsoft-access-reports-passing-totals-from-a-subreport-into-the-main-report/
    http://www.techrepublic.com/blog/microsoft-office/how-to-show-access-subreport-totals-in-main-report/
    http://www.tek-tips.com/viewthread.cfm?qid=65555

    - impiego della sintassi completa nella gerarchia degli oggetti
    https://support.microsoft.com/en-us/kb/11335

    - utilizzo della funzione Val
    https://support.microsoft.com/en-us/kb/20883

    - disporre un ulteriore Subtotale nel Subreport nella sezione Group footer.
    http://www.utteraccess.com/forum/subreport-grand-total-ma-t2001534.html
    http://www.access-programmers.co.uk/forums/showthread.php?t=203250

    - gestione dell'errore (con IsError)
    http://www.pcreview.co.uk/threads/reports-sub-reports-running-sum-and-no-data.4040275/


    - accesso alle variabili di totalizzazione (in quanto Access non memorizza i valori calcolati)
    https://support.microsoft.com/en-us/kb/11335
Devi accedere o registrarti per scrivere nel forum
25 risposte