[Risolto]Inser dati proven da un archivio

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

[Risolto]Inser dati proven da un archivio

Messaggio da Ant52 »

Buongiorno, vorrei saper se esiste una soluzione a questo problema:
Ho un file di calc in cui introduco alcuni dati anagrafici per mezzo di una finestra di dialogo. Dati che successivamente con una macro archivio in un file esterno chiamato proprio "Archivio". Se dovessi avere la necessità di introdurre dati già presenti nel file "Archivio" come si può fare per trovarli e copiarli poi nella finestra di dialogo (o direttamente nel file dove poi la finestra di dialogo li inserisce tramite pulsante macro)?
Pensavo ad una ulteriore finestra di dialogo nella quale introdurre nome e cognome e, con una istruzione del tipo "CERCA" confrontare questi due dati con quelli presenti nel file "Archivio" (forse sarebbe meglio però il cod. fiscale per evitare omonimie) ma, in ogni caso non saprei poi come prelevare tutti gli altri dati e trasferirli sul file di destinazione (forse con una banale macro che copia e incolla?). Non ho allegato i files perchè piuttosto grandi e pieni di dati ma spero che la spiegazione sia abbastanza chiara per capire il problema. Grazie anticipatamente per gli eventuali consigli e soluzioni.
Ultima modifica di Ant52 il sabato 21 agosto 2021, 10:57, modificato 1 volta in totale.
OpenOffice 4.1.5 Windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Inserimento dati provenienti da un archivio

Messaggio da patel »

hai pensato bene, ti allego esempi di CERCA

Codice: Seleziona tutto

Sub SearchARange
  REM Author: Andrew Pitonyak
  Dim oSheet
  Dim oRange
  Dim oFoundCell
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oRange = oSheet.getCellRangeByName("A3:b11")
  oFoundCell = SimpleSheetSearch("andrea", oRange, False)
  ThisComponent.CurrentController.Select(oFoundCell)
'  print oFoundCell.String
End Sub

Function SimpleSheetSearch(sString$, oSheet, bWholeWord As Boolean) As Variant
  Dim oDescriptor
  Dim oFound
  REM Create a descriptor from a searchable document.
  oDescriptor = oSheet.createSearchDescriptor()
  REM Set the text for which to search and other 
  REM http://api.openoffice.org/docs/common/ref/com/sun/star/util/SearchDescriptor.html 
  With oDescriptor
    .SearchString = sString$
    REM These all default to false
    REM SearchWords forces the entire cell to contain only the search string
    .SearchWords = bWholeWord
    .SearchCaseSensitive = False
  End With
  REM Find the first one
  oFound = oSheet.findFirst(oDescriptor)
  SimpleSheetSearch = oFound
  
  REM Do you really want to find more instances
  REM You can continue the search using a cell if you want!
  'Do While Not IsNull(oFound)
  '  Print oFound.getString()
  '  oFound = oSheet.findNext( oFound, oDescriptor)
  'Loop
End Function

Sub FindinSheet
  REM Author: Andrew Pitonyak
  Dim oSheet
  Dim oRange
  Dim oFoundCell
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFoundCell =  uFindString("andrea", oSheet)
  ThisComponent.CurrentController.Select(oFoundCell)
'  print oFoundCell.String
End Sub

Function uFindString(sString$, oSheet) As Variant
  Dim nCurCol As Integer
  Dim nCurRow As Integer
  Dim nEndCol As Integer
  Dim nEndRow As Integer
  Dim oCell As Object
  Dim oCursor As Object
  Dim aAddress As Variant
  Dim sFind As String

  oCell = oSheet.GetCellbyPosition( 0, 0 )
  oCursor = oSheet.createCursorByRange(oCell)
  oCursor.GotoEndOfUsedArea(True)
  aAddress = oCursor.RangeAddress
  nEndRow = aAddress.EndRow
  nEndCol = aAddress.EndColumn

  For nCurCol = 0 To nEndCol       'Go through the range column by column,
    For nCurRow = 0 To nEndRow     'row by row.
      oCell = oSheet.GetCellByPosition( nCurCol, nCurRow )
      sFind = oCell.String          'Get cell contents.
      If sFind = sString then
        uFindString = oCell
        Exit Function
      End If
    Next
  Next
End Function
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Inserimento dati provenienti da un archivio

Messaggio da Ant52 »

Per iniziare ringrazio per la rapida risposta che mi chiarisce che il problema può avere una soluzione. Devo aggiungere però che, visto che non ho inviato file di esempio, la soluzione proposta non mi è chiara. Intanto non ho capito dove dovrei introdurre i dati da ricercare se nella mia finestra di dialogo già esistente o, come pensavo io, in un'altra. Poi se ho ben capito ma non ne sono sicuro, mi sembra che la prima macro serva per cercare (e quindi confrontare) un range di celle (A3:B11) che però, se le trova, le stampa non ho capito dove ma non le inserisce in un altro file come pensavo io.
La seconda macro sembra quella che più si adatterebbe al mio problema ma non ho ben capito come funziona.
Della terza ho solo capito (forse) che serve a fare la ricerca in un foglio dai calcolo ma non capisco da dove prende i dati per questa ricerca.
Per concludere o poche idee ma in compenso molto ben confuse.... Credo sia meglio per tutti ridurre al minimo i files ed allegarli così potrei avere dei riferimenti più chiari. Ritengo che questa sia la soluzione migliore a meno che non riesca a spiegarmi, con moltissima pazienza, come funzionano e come vanno applicate quelle macro che mi hai inviato. Attendo risposta per capire come è meglio procedere. Grazie ancora.
OpenOffice 4.1.5 Windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Inserimento dati provenienti da un archivio

Messaggio da patel »

meglio allegare un file ridotto
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Inserimento dati provenienti da un archivio

Messaggio da Ant52 »

Sono perfettamente d'accordo. Pertanto allego il file "Archivio" e quello con la finestra di dialogo che si avvia automaticamente e richiede l'introduzione dei dati anagrafici etc. Dopo avere introdotto tutti i dati delle due parti (per una prova non è necessario mettere anche i dati dell'immobile) bisogna anche introdurre i dati tessera e premere in successione i pulsanti "Inserisci dati immobile"(anche se sarà vuoto)- "Inserisci dati tessera" - Reg. Dati per stampa contr".
A questo punto sia nel foglio1 che nel foglio6 dovrebbero esserci gli stessi dati che poi serviranno per la stampa e per l'archivio contratti. Nel foglio TESSERA dovrebbe esserci una tessera compilata con tutti i dati del locatore che va archiviata con il tasto "Archivia Tessera". Cliccando su questo tasto tutti i dati verranno inseriti nell'Archivio. A questo punto vorrei che, dovendo introdurre i dati di una persona già presente in archivio, non sia necessario digitarli ma prenderli direttamente dall'Archivio e trasferirli nella finestra di introduzione dati o, al limite, anche direttamente nel foglio6 del file che è, in definitiva, quello di transito che mi serve per la stampa. Spero di essere stato chiaro (anche se ho qualche dubbio). Grazie mille per l'aiuto.

P.S. Ho dovuto rimaneggiare moltissimo il file Modulo Prova per rientrare nei 250 KB togliendo l'elenco di tutti i comuni per il calcolo del CAP e quello per il calcolo del cod. fiscale che, credo, si possa calcolare solo per Palermo (PA) - Milano (MI) - Roma (RM)
Allegati
MODULO PROVA.ods
(240.26 KiB) Scaricato 84 volte
Archivio.ods
(16.51 KiB) Scaricato 84 volte
OpenOffice 4.1.5 Windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Inserimento dati provenienti da un archivio

Messaggio da patel »

non riesco ad aprire Modulo prova, probabilmente hai tolto qualcosa che serve all'avvio, comunque sarebbe tutto molto più semplice se l'archivio fosse un foglio di modulo prova invece che in un file separato.
Come esempio ti allego il file archivio1 dove del foglio 2 nella cella g7 c'è il codice fiscale da cercare, la macro cerca ti completa la riga 7
Allegati
Archivio1.ods
(15.18 KiB) Scaricato 83 volte
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Inserimento dati provenienti da un archivio

Messaggio da Ant52 »

Credo che la impossibilità di aprire il Modulo Prova sia dovuta al fatto che avevo messo un blocco all'avvio che testa se si tratta del mio PC o un'altro e quindi non consente l'apertura in altri PC; tuttavia penso che si possa aggirare l'ostacolo disattivando le macro di Oo, aprire il modulo e apportare la modifica in modo che si possa aprire con le macro. Grazie mille per l'esempio che ancora non ho potuto testare. Fammi sapere se riesci ad aprire il file inviato.
OpenOffice 4.1.5 Windows 10
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Inserimento dati provenienti da un archivio

Messaggio da Ant52 »

patel ha scritto:non riesco ad aprire Modulo prova, probabilmente hai tolto qualcosa che serve all'avvio, comunque sarebbe tutto molto più semplice se l'archivio fosse un foglio di modulo prova invece che in un file separato.
Come esempio ti allego il file archivio1 dove del foglio 2 nella cella g7 c'è il codice fiscale da cercare, la macro cerca ti completa la riga 7
Capisco che sarebbe più semplice inserire l'Archivio in un foglio del Modulo in cui introduco i dati ma, per via della privacy, l'Archivio deve risiedere in un file diverso e protetto da password (io in realtà ho solo messo una istruzione che, ad ogni variazione dell'Archivio, prima lo sblocca con una password e poi alla chiusura lo blocca nuovamente ma solo per rendere le celle non modificabili. Non sono riuscito a capire se si può fare la stessa cosa con una password che prima consenta l'apertura del file e poi lo riblocchi).
Invece, a proposito del file di esempio che mi hai inviato, sembra che copi solo una cella (Importo) perchè tutte le altre sono in bianco. In effetti nella macro non mi pare che ci sia l'istruzione che copia il range e lo incolla. Chiedo scusa in anticipo se non ho capito come funziona la tua soluzione che, ripeto, purtroppo non posso utilizzare per il motivo che ho spiegato prima. Grazie sempre per l'aiuto fornito.
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2994
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Inserimento dati provenienti da un archivio

Messaggio da lucky63 »

Allego esempio senza finestre di dialogo.
Penso possa esserti utile come traccia da sviluppare meglio secondo le tue esigenze.
Test - CaricaDatiDaArchivioEsternoSullaBaseDelCodiceFIscale.png
Macro collegata all'evento foglio "contenuto modificato" da adattare nel "Percorso/NomeFileArchivioEsterno".
Ad ogni inserimento del codice fiscale (da inserire in maiuscolo) verifica in modo nascosto la sua presenza o meno all'interno del foglio archivio e in caso di riscontro compila la maschera relativa altrimenti segnala il mancato riscontro.
Notare che ho fatto prove con una copia del tuo file archivio (archivio1.ods) a cui ho rimosso la macro integrata e aggiunto altre due righe di dati.

Codice: Seleziona tutto

Sub CaricaDatiTesseratoDaFileArchivioEsterno
Rem Link del quesito: https://forum.openoffice.org/it/forum/viewtopic.php?f=9&p=64438&sid=1e3cc75f110372bc1630a9456724075c#p64438
Rem ----------------------------------------------------------------------------------------------------------------------------
Rem Dichiara il vettore come nuova istanza associandogli la proprietà Hidden/Nascosto
Rem Non farà mostrare la finestra di caricamento del file di origine
Dim Dummy(0) as New com.sun.star.beans.PropertyValue
Dummy(0).Name = "Hidden"
Dummy(0).Value = True
Rem  Adeguare il Percorso/NomeFile di origine dei dati in base al proprio sistema operativo ...
FileOrigine = StarDesktop.loadComponentFromURL ("file:///home/NomeUtente/Scaricati/Archivio1.ods", "_blank",0, Dummy() )
FoglioOrigine = FileOrigine.Sheets.GetbyName("ARCHIVIO TESSERATI"'(0) 'PrimoFoglio
Rem ----------------------------------------------------------------------------------------------------------------------------

Doc = ThisComponent
Foglio = Doc.sheets.getByName("RicercaTESSERATO")
CodiceFiscaleDiRicerca = Foglio.GetCellRangeByName("B8").String

REM Verifica in quale riga dell'archivio è presente il "CodiceFiscaleDiRicerca"
UltimaRiga = 500
For Riga = 6 to UltimaRiga
CodiceFiscaleInArchivio = FoglioOrigine.GetCellByPosition(6,Riga).String
If CodiceFiscaleDiRicerca = CodiceFiscaleInArchivio Then
NrRiga = Riga
Riga   = UltimaRIga
End If 
Next

Rem Toglie la “protezione senza password” al Foglio
Foglio.unprotect("") 

Rem Puliscce la maschera dai dati precedenti eventualmente presenti
Foglio.getCellRangeByName("B2:B11").clearContents(7)

Rem Segnala che NON è stato trovato altrimenti visualizza i dati di riscontro
If NrRiga = 0 Then
Foglio.GetCellRangeByName("B8").String = "CODICE FISCALE NON TROVATO - RIPROVA"
Else
Foglio.GetCellRangeByName("B2").String  = FoglioOrigine.GetCellByPosition(0,NrRiga).String
Foglio.GetCellRangeByName("B3").String  = FoglioOrigine.GetCellByPosition(1,NrRiga).String
Foglio.GetCellRangeByName("B4").String  = FoglioOrigine.GetCellByPosition(2,NrRiga).String
Foglio.GetCellRangeByName("B5").String  = FoglioOrigine.GetCellByPosition(3,NrRiga).String
Foglio.GetCellRangeByName("B6").String  = FoglioOrigine.GetCellByPosition(4,NrRiga).String
Foglio.GetCellRangeByName("B7").String  = FoglioOrigine.GetCellByPosition(5,NrRiga).String
Foglio.GetCellRangeByName("B8").String  = FoglioOrigine.GetCellByPosition(6,NrRiga).String
Foglio.GetCellRangeByName("B9").String  = FoglioOrigine.GetCellByPosition(7,NrRiga).String
Foglio.GetCellRangeByName("B10").String = FoglioOrigine.GetCellByPosition(8,NrRiga).String
Foglio.GetCellRangeByName("B11").String = FoglioOrigine.GetCellByPosition(9,NrRiga).String
End If

Rem Rimette la “protezione senza password” al Foglio
Foglio.protect("") 

Rem Chiusura file origine dati
FileOrigine.Close(True)
End sub
Allego entrambi.
Allegati
Archivio1.ods
(17.68 KiB) Scaricato 83 volte
Test - CaricaDatiDaArchivioEsternoSullaBaseDelCodiceFIscale.ods
(17.18 KiB) Scaricato 82 volte
nickGiard
Messaggi: 65
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Inserimento dati provenienti da un archivio

Messaggio da nickGiard »

Mi sembra che la gestione dell'interfaccia sia definita e ben strutturata.
Credo sia interessante ragionare sulla banca dati e sua gestione.
Se dovessi avere la necessità di introdurre dati già presenti nel file "Archivio" come si può fare per trovarli
Secondo me il punto debole della soluzione proposta è nel ciclo

Codice: Seleziona tutto

For Riga = 6 to UltimaRiga
CodiceFiscaleInArchivio = FoglioOrigine.GetCellByPosition(6,Riga).String
If CodiceFiscaleDiRicerca = CodiceFiscaleInArchivio Then
NrRiga = Riga
Riga   = UltimaRIga
End If
Next
Nel caso si avessero migliaia di record, la lettura cella per cella diventa molto lenta.
Una prima miglioria sarebbe copiare tutta la colonna in un Array con DataArray, e ciclare sull' Array.
Si potrebbe pensare a strutture dati di supporto, ad esempio la più semplice è una stringa che contenga tutti i Codici Fiscali separati da ";".
Un semplice InStr è in grado di sapermi dire se presente, e nel caso un Split() genera un' Array sul quale ciclare ed individuare l'indice.
Penso che passare l'Array a Python ed usare Index sia ancora più veloce.
L'ottimizzazione dipende anche da quante volte effettuo le ricerche in una sessione di lavoro, se avviene varie volte occorre pensare di rendere disponibili tali dati di supporto rendendoli globali.
Se la ricerca diventa frequente, ad esempio per aggiornamenti massicci periodici e casuali, bisognerebbe pensare a strutture dati tipo Dictionary, ottenute o tramite il service EnumerableMap o meglio il Dictionary di Python.
Qui non è postato alcun codice, ma solo considerazioni di architettura delle soluzioni in ambito tabellare (non Data Base), nel caso interessi approfondire tale discussione anche con esempi, mi rendo disponibile per quanto io possa sapere.
Mi permetto di esporre un mio personale pensiero, quando le tabelle diventano "pesanti", Calc diventa più un contenitore di dati che un gestore degli stessi in quanto le operazioni diventano sempre più lente, per cui bisogna integrarlo con soluzioni di supporto quali Python.
Un saluto e buon lavoro
Nicola con LibreOffice 7.1 (x64) su Windows 11
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Inserimento dati provenienti da un archivio

Messaggio da Ant52 »

[quote="lucky63"]Allego esempio senza finestre di dialogo.
Penso possa esserti utile come traccia da sviluppare meglio secondo le tue esigenze.

Grazie per il file di esempio che certamente può essere di aiuto. Mi è sorto però un problema sostituendo i miei dati a quelli generici cioè:
ho inserito il volume C: al posto di file
Users al posto di home
Lenovo al posto di Nome Utente
Desktop al posto di Scaricati
e ovviamente ho lasciato il nome file Archivio1
ma mi da errore di runtime.
Ho fatto qualche errore? Grazie.
OpenOffice 4.1.5 Windows 10
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: [Risolto]Inserimento da archivio esterno

Messaggio da Ant52 »

Chiedo scusa. Non ho riflettuto sul cambio del titolo o meglio ci ho pensato mentre lo inviavo ed era già troppo tardi,
Ultima modifica di Ant52 il sabato 21 agosto 2021, 12:54, modificato 1 volta in totale.
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2994
Iscritto il: martedì 18 maggio 2010, 17:01

Re: [Risolto]Inser dati proven da un archivio

Messaggio da lucky63 »

Ant52 ha scritto: Grazie mille
Prego.

Notare che inserendo il "risolto" hai troncato alcune parole significative del quesito iniziale.
Se la stringa del quesito era troppo lunga per accettare anche il "risolto" era preferibile :
- eliminare la sola parola originaria "un "
oppure modificare il titolo con uno più preciso tipo:
- Inserimento dati da archivio esterno
...
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

[Risolto]Inserimento dati provenienti da un archivio

Messaggio da Ant52 »

Buongiorno, ho lavorato su questo file modificandolo secondo le mie esigenze e devo dire che funziona perfettamente. Mi è sorto però un problema per me inspiegabile. In pratica, dovendo inserire dei pulsanti da associare a delle macro, non riesco a creare i pulsanti perchè non mi si apre il "controllo formulario". C'è qualche spiegazione a questo e come posso fare per creare i pulsanti ed associarli alle macro? Grazie. Buona giornata.


Grazie mille. Mezz'ora dopo avere inviato la mail mi è venuto in mente che avrei dovuto provare a togliere la protezione del foglio ed infatti era proprio questa la soluzione. Buona serata.
Ultima modifica di Ant52 il lunedì 23 agosto 2021, 20:51, modificato 1 volta in totale.
OpenOffice 4.1.5 Windows 10
Rispondi