Database con calc

Buon pomeriggio,
vorrei usare calc al posto di base per ottenere pochi ma semplici risultati (da ottenere i risultati in foglio "riepilogo). Con movimenti di carico univoci ho “n” movimenti di scarico così che ho il rapporto di “uno a molti”. Come posso “aggregare” i risultati per prodotto come da file allegato ?
Grazie in anticipo
Prova.ods (11.6 KB)

Ciao prova così. Nel foglio “riepilogo”, in B6 metti
=SE.ERRORE(INDICE(Carico.$D$2:$D$40;AGGREGA(15;6;(RIF.RIGA(Carico.$D$2:$D$40)-1)/(Carico.$A$2:$A$40=$A$5);RIF.RIGA(A1)));"")
in C6
=SE.ERRORE(INDICE(Carico.$C$2:$C$40;CONFRONTA(G6;Carico.$D$2:$D$40;0));"")
in D6
=SE.ERRORE(INDICE(Scarico.$C$4:$C$42;CONFRONTA(G6;Scarico.$A$4:$A$42;0));"")
e tiri in basso per quanto ti può servire
In E6 c’è la tua formula. Il totale per praticità l’ho spostato in alto.
Allego esempio.
Database con calc.ods (14.3 KB)

1 Like

magari ho tratto in errore e chiedo scusa: pur tuttavia

  • i movimenti di scarico non vengono “aggregati”
  • occorrerebbe la somma di valori “non contigui”
  • il report dovrebbe essere “dinamico” e contenere solo righe <> 0

riallego file prova
Prova.ods (12.1 KB)

Forse non avevo capito anch’io bene la richiesta.
Comunque per fare ciò che vuoi con le formule ti ripropongo una mia soluzione, dove ho affiancato gli articoli e sostituito le formule di C6 e D6 con
=SOMMA.SE(Carico.$D$2:$D$38;B6;Carico.$C$2:$C$38)
e
=SOMMA.SE(Carico.$D$2:$D$38;B6;Carico.$C$2:$C$38)
e da tirare in basso.
Analogamente ho fatto per gli altri articoli.
Se poi vuoi una cosa come nel tuo esempio, con tutto incolonnato, forse si può fare con le macro, ma in questo caso non saprei aiutarti.
Database con calc(bis).ods (17.7 KB)

1 Like

Grazie mille e di nuovo scusa per non aver posto correttamente la domanda. Sì, sono arrivato anche io ad una soluzione similare ma più semplice.
Avrei bisogno, però, di avere un report in “portrait” come da allegato (gli articoli sono tanti) e, se potessi spiegarmi, come aggiungere (senza copia-incolla) eventuali articoli e/o carichi e scarichi.
Ti lascio il mio indirizzo e-mail (gianvi60@hotmail.it) se puoi chiarirmi ovvero lasciare qua la spiegazione di cui sopra.
In ogni caso grazie tante ancora.
Prova.ods (14.2 KB)

Ciao ho visto che possono esserci stessi prodotti con lotti diversi, può capitare di esserci lo stesso prodotto con lo stesso lotto? quindi ad esempio due volte aaa e due volte #001

Comunque se ti va bene possiamo usare una macro per riprodurre il foglio riepilogo come da tuo esempio, con formule sarebbe molto macchinoso.
Se dovessi optare per la soluzione con macro, il file di esempio deve essere uguale “all’originale”, altrimenti si rischia di perdere solo tempo.

Saluti

aspetta:
gli articoli sono UNICI mentre i lotti sono tanti (usando il linguaggio MySql dovrei dire uno-a-molti) Per intenderci:
art.aaa lotto #001, #005, #010;
art.bbb lotto #00x, #00y, #00z;
art.ccc lotto #00a, #00b, #00c e così via.



fino alla fine degli articoli presenti nella prima tabella

Per cui avrei bisogno di un report che sia così strutturato: raggruppamento per articolo con sotto-raggruppamento per lotto (carico e scarico).

Spero di essere stato chiaro questa volta.
Grazie e saluti

Si sei stato abbastanza chiaro, più tardi ti scrivo una piccola macro.
Ultima domanda, il sistema operativo ??

Allego file con macro.
Prova.ods (13.0 KB)

grazie per l’aiuto ma non riesco a far “girare” la macro

Ecco il perché della mia domanda sul sistema operativo

Aggiungi questa riga prima
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
Se non funziona cambia con questa

Sub Database
Dim Lista()
Dim t As Long
Dim Doc As Object, ShCarico As Object, ShScarico As Object, ShRiep As Object
Doc = ThisComponent
ShCarico = Doc.Sheets.getByName("Carico")
ShScarico = Doc.Sheets.getByName("Scarico")
ShRiep = Doc.Sheets.getByName("riepilogo")

c = ShCarico.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow 



InRange = ShCarico.getCellRangeByName("A2:A" & LastRow+1)
Lista() =  InRange.GetDataArray

Dim collezione As New Collection

On Error Resume Next

For t = 0 To Ubound(Lista) 
  prod = Lista(t)(0)
  collezione.Add(prod, CStr(prod)) 
Next t
On Error Goto 0

c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow 
If LastRow < 4 Then LastRow = 4 
ShRiep.getCellRangeByName("A5:E" & LastRow+1).ClearContents(1+4+16+32)

RigaInizio = 2
    For t = 1 To collezione.Count 
         oDescriptor = InRange.createSearchDescriptor()
          With oDescriptor
               .SearchString = collezione(t)
               .SearchWords = True
               .SearchType = 1  ' cerca nei valori
               .SearchCaseSensitive = False
               
          End With
          oFound = InRange.findFirst(oDescriptor)
          iF Not IsNull(oFound) Then 
              RigaInizio = RigaInizio + 3
              ShRiep.GetCellRangeByName("A" & RigaInizio).String = collezione(t)
              Formatta(ShRiep.GetCellRangeByPosition(0, RigaInizio-1, 4, RigaInizio-1).AbsoluteName)
          End If    
          Do While Not IsNull(oFound)
             r=oFound.getCellAddress.Row
             Col = oFound.getCellAddress.Column
             oFound = InRange.findNext( oFound, oDescriptor)
             Lotto = ShCarico.getCellbyposition(3, r).String
             Q = ShCarico.getCellbyposition(2, r).Value
             RigaInizio = RigaInizio + 1
             ShRiep.GetCellRangeByName("B" & RigaInizio).String = Lotto
             ShRiep.GetCellRangeByName("C" & RigaInizio).Value = Q 
             ShRiep.GetCellRangeByName("D" & RigaInizio).FormulaLocal = "=SOMMA.SE($Scarico.$A:$Scarico.$C;$B" & RigaInizio & ";$Scarico.$C:$Scarico.$C)"
             ShRiep.GetCellRangeByName("E" & RigaInizio).FormulaLocal = "=C"&RigaInizio & "-D"& RigaInizio
          Loop 
      Next t

End Sub

sub Formatta(rng)
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = rng

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:BorderTLBR", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:BorderBLTR", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(7) as new com.sun.star.beans.PropertyValue
args4(0).Name = "BorderOuter.LeftBorder"
args4(0).Value = Array(0,0,0,0,0,0)
args4(1).Name = "BorderOuter.LeftDistance"
args4(1).Value = 0
args4(2).Name = "BorderOuter.RightBorder"
args4(2).Value = Array(0,0,0,0,0,0)
args4(3).Name = "BorderOuter.RightDistance"
args4(3).Value = 0
args4(4).Name = "BorderOuter.TopBorder"
args4(4).Value = Array(0,0,0,0,0,0)
args4(5).Name = "BorderOuter.TopDistance"
args4(5).Value = 0
args4(6).Name = "BorderOuter.BottomBorder"
args4(6).Value = Array(0,0,26,0,0,26)
args4(7).Name = "BorderOuter.BottomDistance"
args4(7).Value = 0

dispatcher.executeDispatch(document, ".uno:BorderOuter", "", 0, args4())
end sub

Come la giro… errore di sintassi BASIC; atteso sub
provato sia con win 10 che con mac OS - L.O. 7.4.5.1

A me funzionano entrambe, fai uno screen dell’errore, figura intera.
Riallego file con entrambe le macro.
Prova (1).ods (14.6 KB)

1 Like

grazie ! funziona solo la seconda macro, però
potresti darmi qualche indicazione per, come e dove studiare la composizione macro


?

Ci sono diverse guide soprattutto in inglese, ad esempio quello di pitonyak e in italiano invece la guida a star office 8.