Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

creazione di un report che compari record in base a "data per singolo anno"

  1. #1
    L'avatar di Elimar
    Elimar non è in linea Scribacchino
    Ciao a tutti,
    mi rendo conto che il titolo sia molto "criptico", ma vi assicuro che rispecchia in pieno la situazione che ho in testa adesso .... una gran confusione.
    Cerco di spiegarvi il mio problema e spero che la risposa che al momento mi sono dato, "non si può fare", non sia quella definitiva.

    Ho una tabella che mi riporta uno storico delle commissioni che sono state pagate raggruppate per tipologia e competenza.

    Questa tabella ha i seguenti campi:
    1. periodo
    2. causale
    3. TipoComm
    4. AccorpamentoXTotali
    5. Importo

    vorrei creare un report di questo tipo:
    di default alla data del mese precedente a quello di esecuzione utilizzando il seguente costrutto
    DateSerial(Year(Date()),Month(Date()),0);
    
    e determinerei gli anni precedenti come segue:
    DateSerial(Year(Date())-1,Month(Date()),0)
    DateSerial(Year(Date())-2,Month(Date()),0)
    ... e così via

    per comodità le date sopra le nominerò Anno, Anno -1, Anno -2, ...

    per definire i totali pensavo di sommare tutto ciò che va da data 1/1/Year(Anno) a Anno e così per ogni anno che dovrò controllare.
    Quindi vorrei creare una query o un report che evidenzi i dati in questo modo:
    Nome:   Cattura.JPG
Visite:  57
Grandezza:  31.6 KB

    spero di essere stato chiaro.

    Avevo pensato ad una query a campi incrociati, ma non riesco a capire se sia fattibile e come farlo


    grazie mille per ogni eventuale aiuto
    ℹ️ Leggi di più su Elimar ...

  2. #2
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    si certo
    prova questo SQL
    TRANSFORM Sum(prova_post.valore) AS SommaDivalore
    SELECT prova_post.commissione
    FROM (SELECT 'AA' & Year(Date())-Year([dataEvento]) AS PERIODO, prova.commissione, prova.valore FROM prova where year(Date())-Year(dataEvento)<4)  AS prova_post
    GROUP BY prova_post.commissione
    PIVOT prova_post.PERIODO;
    
    in questo modo avrai nomi di campi fissi e sarà facile poi creare il report
    variando il "<4" con "<numero a tuo piacimento" vari il numero di anni in colonna

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Non sono proprio convinto che sia così semplice realmente funzionale fare un report basato su una CrossTab... in quanto la presenza, quindi il mumero, dele colonne non è scontata sia costante in quanto dipende dai dati...
    Penserei invece ad una soluzione da codice su FORMAT del corpo inserendo un raggruppamento che consenta di creare i SubTotali... ed il totale generale nel piedipaginareport.
    ℹ️ Leggi di più su @Alex ...

  4. #4
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    Si Alex, concordo con te che in caso di mancanza di dati così non funzionerebbe ma si può sempre aggiungere una tabella di anni (eventualmente anche "al volo" da codice) per forzare la presenza del numero di colonne desiderate sempre (basta un left join)
    qualcosa del genere
    select year(date()) as anno
    union select year(date())-1 as anno
    union select year(date())-2 as anno
    union select year(date())-3 as anno
    
    da mettere come base (come sub) a cui agganciare in left join i dati


    EDIT: dimentico a volte che Access (a differenza di altri db) non acceatta questo tipo di SQL se non specificando un FROM , problema facilmente aggirabile aggiungendo un FROM da una tabella di una riga (ad esempio una di SETUP?!) oppure da una tabella (meglio con pochi record per ottimizzare) con un TOP 1
    Ultima modifica di muttley005; 15-05-2021 08:55 

  5. #5
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    qualcosa del genere
    TRANSFORM Sum(dati.valore) AS SommaDivalore
    SELECT dati.commissione
    FROM 
       (
       select top 1 year(date()) as anno from qualsiasitabella
       union
       select top 1 year(date())-1 as anno from qualsiasitabella
       union
       select top 1 year(date())-2 as anno from qualsiasitabella
       unnion select top 1 year(date())-3 as anno from qualsiasitabella
       )  AS tempo 
       LEFT JOIN 
       (
       SELECT year([dataEvento]) AS anno, tabDati.commissione, tabDati.valore 
       FROM tabDati
       WHERE year(Date())-Year(dataEvento)<4
       )  AS dati 
      ON tempo.anno = dati.anno
    where dati.commissione is not null
    GROUP BY dati.commissione
    PIVOT 'AA' & Year(Date())-[tempo].[anno];
    
    Ultima modifica di muttley005; 15-05-2021 08:58 

  6. #6
    L'avatar di Elimar
    Elimar non è in linea Scribacchino
    Scusate se non ho risposto prima, ma ho cercato di capire i vostri suggerimenti, ma senza esisti confortanti per me.
    Spero di non farvi arrabbiare, ma ho analizzato il problema sotto un altro punto di vista che vorrei sottoporre al vostro giudizio.

    Se usassi il between and? posso mettere tutti gli importi che mi interessano su colonne, certo dovrei intervenire ogni anno ad aggiungere un parametro ma potrebbe essere una soluzione.
    solo che non riesco ad usare correttamente between and, mi restituisce un errore:

    SELECT cCommissioniStorico.tipologiaStorComm, cCommissioniStorico.accorpTipStorComm, Sum(arrotonda([importoStorComm],2)) AS impo
    FROM cCommissioniStorico
    WHERE (((cCommissioniStorico.periodoStorComm) Between DateSerial(Year(DateSerial(Year(Max([periodoStorComm])),Month(Max([periodoStorComm])),0)),1,1) And DateSerial(Year(Max([periodoStorComm])),Month(Max([periodoStorComm])),0)))
    GROUP BY cCommissioniStorico.tipologiaStorComm, cCommissioniStorico.accorpTipStorComm;
    
    e l'errore è il seguente:

    "Impossibile avere una funzione di aggregazione nella clausola WHERE (((cCommissioniStorico.periodoStorComm) Between DateSerial(Year(DateSerial(Year(Max([periodoStorComm])),Month(Max([periodoStorComm])),0)),1,1) And DateSerial(Year(Max([periodoStorComm])),Month(Max([periodoStorComm])),0)))"


    Nel codice è riportato solo un anno, però visto che già non funziona non ho continuato.
    grazie a tutti per il tempo che mi state dedicando
    ℹ️ Leggi di più su Elimar ...

  7. #7
    L'avatar di Elimar
    Elimar non è in linea Scribacchino
    invece per tornare al vostro suggerimento, io lo avevo adattato così:

    TRANSFORM Sum(importoStorComm) AS Somma
    SELECT cCommissioniStorico.tipologiaStorComm
    FROM 
       (
       select top 1 year(DateSerial(Year(Date()),Month(Date()),0)) as anno from cCommissioniStorico
       union
       select top 1 year(DateSerial(Year(Date())-1,Month(Date()),0)) as anno from cCommissioniStorico
       union
       select top 1 year(DateSerial(Year(Date())-2,Month(Date()),0)) as anno from cCommissioniStorico
       union 
    select top 1 year(DateSerial(Year(Date())-3,Month(Date()),0)) as anno from cCommissioniStorico
       )  AS tempo 
       LEFT JOIN 
       (
       SELECT year([periodoStorComm]) AS anno, CcommissioniStorico.TipologiaStorComm, cCommissioniStorico.importoStorComm 
       FROM cCommissioniStorico
       WHERE year(Date())-Year(periodoStorComm)<4
       )  AS dati 
      ON tempo.anno = dati.anno
    where ccommissioniStorico.TipologiaStorComm is not null
    GROUP BY ccommissioniStorico.TipologiaStorComm
    PIVOT 'AA' & Year(Date())-[tempo].[anno];
    
    ma mi restituisce il seguente errore:

    il riferimento al campo specificato 'cCommissioniStorico.tipologiaStorComm' potrebbe essere relativo a più tabelle elencate nella clausola dell'istrizuzione SQL.

    dove sbaglio??

    grz
    ℹ️ Leggi di più su Elimar ...

  8. #8
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    scusa ma hai provato ciò che ti ho scritto?
    praticamente è pappa pronta (che non si dovrebbe) ... devi solo cambiare i nomi delle tabelle e campi

    EDIT: sovrapposti... ora guardo la tua SQL

  9. #9
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    sbagli perchè nella query padre delle 2 sub i campi non fanno + riferimento all'originaria ma chiaramente alla sub
    quindi non devi + fare riferimento a ccommissioniStorico.TipologiaStorComm ma a dati.TipologiaStorComm
    se guardi la mia lo vedi, e lo vedi anche dalla JOIN delle due SUB ... TEMPO.anno = DATI.anno

  10. #10
    L'avatar di Elimar
    Elimar non è in linea Scribacchino
    Grazie infinite per la dritta ...
    ora devo lavorare sulle date in modo da far sì che il totale non sia di tutto l'anno, ma del periodo di anno uguale per tutti.
    cioè se nel 2021 ho i dati al 30/04, dovrò raffrontare i dati al 30/04 anche degli anni precedenti.

    muttley005 ti sono immensamente grato e so già che non potrò mai sdebitarmi.
    ℹ️ Leggi di più su Elimar ...

+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo

Potrebbero interessarti anche ...

  1. Ordinare combobox in base alla data("vera")
    Da enricotb1994 nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 07-02-2017, 13:46
  2. Risolto: LibreOffice "BASE" - Connessione a db MYSQL "drive JDBC non caricati" non li vede
    Da CMCS nel forum LibreOffice, OpenOffice e altro
    Risposte: 5
    Ultimo Post: 30-07-2014, 12:45
  3. Risposte: 4
    Ultimo Post: 22-05-2014, 14:04
  4. Risposte: 11
    Ultimo Post: 02-10-2012, 15:51
  5. Risposte: 6
    Ultimo Post: 08-12-2010, 22:59