Report con riporti dati da periodo precedente

di il
5 risposte

Report con riporti dati da periodo precedente

Buonasera a tutti!

Ho creato un db come inventario di magazzino senza valori, in quanto mi serve solo quantitativo, son riuscito a fare tutto quello che mi serve, ho soltanto un unica difficoltà e spero di riuscirmi a spiegare bene.

Nel report inventario posso scegliere il periodo da --- a, in automatico tengo le entrate e le uscite di quell'articolo con saldo iniziale calcolato sul periodo precedente. E fin qui tutto bene, il problema è che ad esempio ho come saldo iniziale
articolo A --- +10
articolo B --- +15
articolo C --- +20
nelle movimentazioni dell'anno corrente ho
articolo A --- -5
articolo B --- +10
la stampa che vorrei ottenere è
articolo A --- +5
articolo B --- +25
articolo C --- +20
invece ottengo questo
articolo A --- +5
articolo B --- +25

il risultato è che mi stampa articolo A ed articolo B ma non stampa articolo C perchè non movimentato.

I movimenti ed i saldi sono presi da 2 query, una per i movimenti correnti (Query A) ed un altra per i movimenti precedenti (Query B). Se apro la query per i movimenti precedenti mi segnala i 3 articoli senza problemi, ma nella stampa invece nisba, anche inserendo una relazione all'interno della query dove dico di inserire tutti i record della Query B il risultato non cambia.

Spero di essere riuscito a spiegarmi e di riuscire a trovare una soluzione con il Vostro aiuto

Grazie a tutti in anticipo

5 Risposte

  • Re: Report con riporti dati da periodo precedente

    Se ottieni A=+5 e B=+25 vuol dire che TIENI MEMORIA dei corrispondenti saldi di partenza da qualche parte. Penso che devi fare lo stesso per C.
    Oppure può darsi che in Query2 hai un calcolo che andrebbe corretto con una IIf che riprenda la "memoria" in caso di non movimentazioni.
    La cosa migliore è che tu mostrassi la visualizzazione struttura di entrambe le query, oppure i corrispondenti SQL.
  • Re: Report con riporti dati da periodo precedente

    E' molto probabile che vi sia una relazione INNER JOIN, mentre deve essere del tipo OUTER JOIN (LEFT o RIGHT) in modo da avere l’aggiunta delle righe residue di una delle tabelle (non presenti quando si impiega la prima relazione).
    https://support.microsoft.com/it-it/office/collegare-tabelle-e-query-3f5838bd-24a0-4832-9bc1-07061a1478f6
  • Re: Report con riporti dati da periodo precedente

    OsvaldoLaviosa ha scritto:


    Se ottieni A=+5 e B=+25 vuol dire che TIENI MEMORIA dei corrispondenti saldi di partenza da qualche parte. Penso che devi fare lo stesso per C.
    Oppure può darsi che in Query2 hai un calcolo che andrebbe corretto con una IIf che riprenda la "memoria" in caso di non movimentazioni.
    La cosa migliore è che tu mostrassi la visualizzazione struttura di entrambe le query, oppure i corrispondenti SQL.
    Grazie Osvaldo,
    allora io ho

    Tabella Acquisto
    
    ID_Anagrafica ---- Numerico
    Acq_Data ---Data/Ora
    Acq_NDoc --- Numerico
    ID_Ord_Acq --- Numerico
    Acq_Ft_Num --- Testo breve
    ID_Doc_Tipo --- Numerico
    Acq_Note --- Testo lungo
    ID_Acq_Doc --- Contatore (chiave primaria)
    FC --- Si/No
    
    collegata con Acquisto_Movimenti
    
    ID_Acq_Doc --- Numerico
    MOV_Acq_Data --- Data/Ora
    ID_ART --- Numerico
    MOV_Acq_Qta --- Valuta
    ID_MOV_Acq --- Contatore  (chiave primaria)
    
    Tabella Vendite
    
    ID_Anagrafica ---- Numerico
    Ven_Data ---Data/Ora
    Ven_NDoc --- Numerico
    ID_Acq_Doc --- Numerico
    ID_Ord_Ven --- Numerico
    ID_Prod_Doc --- Numerico
    Ven_NCoC --- Testo breve
    ID_Doc_Tipo --- Numerico
    Ven_Note --- Testo lungo
    ID_Ven_Doc --- Contatore (chiave primaria)
    FC --- Si/No
    Ven_Ft_Num --- Testo breve
    
    collegata con Vendite_Movimenti
    
    ID_Ven_Doc --- Numerico
    MOV_Ven_Data --- Data/Ora
    ID_ART --- Numerico
    MOV_Ven_Qta --- Valuta
    ID_MOV_Ven --- Contatore  (chiave primaria)
    
    Estrapolo i dati con una Query UNION (è la prima volta che l'ho usata) chiamata riepMovimenti_dett
    SELECT [ART_Desc], [FC], [Acq_Data], [Denominazione], [Tipo_Doc], [Acq_NDoc], [Acq_Ft_Num], [ID_Ord_Acq], [MOV_Acq_Qta], [AV]
    FROM [riepAcquisti_dett]
    
    UNION ALL SELECT [ART_Desc], [FC], [Ven_Data], [Denominazione], [Tipo_Doc], [Ven_NDoc], [Ven_Ft_Num], [ID_Ord_Ven], [MOV_Ven_Qta], [AV]
    FROM [riepVendite_dett];
    
    ho poi una Query riepREP_Giacenza basata sulla Query Union con filtro tramite maschera di dialogo su campo FC
    IIf(IsNull([Maschere]![Parametri Stampa]![Classificazione]);[FC];IIf([Maschere]![Parametri Stampa]![Classificazione]="Fonti Controllate";-1;0))
    e su campo Acq_Data
    Between [Maschere]![Parametri Stampa]![DataDa] And [Maschere]![Parametri Stampa]![DataA]
    e creato 5 campi calcolati in più:
    Acquisto: IIf([AV]="A";[MOV_Acq_Qta];0)
    
    Vendita: IIf([AV]="V";[MOV_Acq_Qta];0)
    
    Saldo: [Acquisto]-[Vendita]
    
    Qta: IIf([AV]="A";[MOV_Acq_Qta];[MOV_Acq_Qta]*-1)
    
    Tipo: IIf([FC]=Vero;"Fonti Controllate";"100% PEFC")
    ho poi una Query riepREP_Giacenza_Saldi basata sulla Query Union con filtro tramite maschera di dialogo su campo FC
    IIf(IsNull([Maschere]![Parametri Stampa]![Classificazione]);[FC];IIf([Maschere]![Parametri Stampa]![Classificazione]="Fonti Controllate";-1;0))
    e su campo Acq_Data con formula Dove
    <[Maschere]![Parametri Stampa]![DataDa]
    e campo MOV_Acq_Qta con formula Somma chiamato SalIn

    ho poi il report riep_Giacenza con codice vba
    Option Compare Database
    Dim SaldoIn As Double
    Dim TotR As Double
    
    
    Private Sub Corpo_Print(Cancel As Integer, PrintCount As Integer)
    
    'Questo codice mi da il saldo progressivo per gruppo addizionato al saldo iniziale dell'articolo
    TotR = Me.Progressivo + SaldoIn
    
    Me.Prog.Value = TotR
    
    End Sub
    
    Private Sub IntestazioneGruppo1_Format(Cancel As Integer, FormatCount As Integer)
    
    'Questo codice mi recupera il saldo iniziale per l'articolo e lo assegna ad una casella di testo nel report
        If IsNull(DLookup("SalIn", "riepREP_Giacenza_Saldi", "ART_Desc = " & Chr$(34) _
        & Me.ART_Desc & Chr$(34))) Then
            SaldoIn = "0"
        Else
            SaldoIn = DLookup("SalIn", "riepREP_Giacenza_Saldi", "ART_Desc = " & Chr$(34) _
            & Me.ART_Desc & Chr$(34))
        End If
    
        Me.SI.Value = SaldoIn
    
    End Sub
    
    Private Sub Report_NoData(Cancel As Integer)
        MsgBox "Nessun dato per questo report. Annullamento del report..."
        Cancel = -1
    End Sub
    
    Private Sub Report_Close()
        DoCmd.Close acForm, "Parametri Stampa"
    End Sub
    Private Sub Report_Open(Cancel As Integer)
        DoCmd.OpenForm "Parametri Stampa", , , , , acDialog, "Parametri Stampa"
        If Not IsLoaded("Parametri Stampa") Then
            Cancel = True
        End If
    End Sub
    
    Private Sub Report_Page()
    
    'Questo codice mi crea la riquadratura in stampa per il report
    Me.ScaleMode = 7
    Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), , B
    End Sub
    
    
    Ho provato a creare una query ed inserire query giacenza e query giacenza saldi, con outer join tra giacenza saldi e giacenza per inserire tutti i record inseriti nei saldi, il problema è che poi nei dati c'è un secondo filtro FC, tra i saldi ci sono solo record con FC = 0 mentre tra i dati dell'anno in corso ci sono dati con FC = -1 e nel fare la stampa questi ultimi non compaiono

    Mi sono sicuramente fermato ad una fesseria oppure ho affrontato male il problema, ma ormai dopo un paio di giorni che ci penso non ricordo quasi più neppure da dove sono partito

    ps. inserisco anche un link dove ho caricato un dummy del db

    grazie in anticipo
  • Re: Report con riporti dati da periodo precedente

    Premetto che i database con molti calcoli da fare...non sono il mio forte. Pertanto non sono sicuro se sia "giustificabile" separare Acquisti da Vendite. Secondo il MIO punto di vista Acquisti e Vendite possono essere considerati "omogenei". Si parlerà in generale di Operazioni. Siccome entrambi Acquisti e Vendite hanno sempre e comunque i loro "documenti" che li rappresentano, si possono tranquillamente "omogeneizzare". Per distinguere se si tratta di Acquisto o Vendita, aggiungi un campo di DISCRIMINAZIONE.

    Se la mia analisi è o può essere "errata"...preferisco fermarmi e lasciare ad utenti più esperti il prosieguo...
  • Re: Report con riporti dati da periodo precedente

    OsvaldoLaviosa ha scritto:


    Per distinguere se si tratta di Acquisto o Vendita, aggiungi un campo di DISCRIMINAZIONE.
    Infatti nella query union ho creato il campo AV dove per gli acquisti imposta A e per le vendite imposta V, se era questo che intendevi con un campo di discriminazione

    ho anche modificato il post precedente dove ho inserito un link per il download di una copia dummy per chi volesse/potesse dare un occhiata all'eventuale macello che ho fatto

    inoltre ho diviso acquisti e vendite perchè gli acquisti sono univoci, ma le vendite possono provenire da acquisti o da produzione, dove poi la produzione verrà dagli acquisti. ad esempio compro tot mc di tronchi, li trasformo in listelli e poi vendo i listelli, oppure compro tronchi vendo tronchi
    mi è sembrata la strada più corretta, anche se, se ci fossero suggerimenti per migliorare sono sempre aperto visto che comunque le mie conoscenze accumulate negli anni vengono da autodidatta e seguendo il forum e le guide
Devi accedere o registrarti per scrivere nel forum
5 risposte