[Risolto] Ciclo for/if in macro genera pwd

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

[Risolto] Ciclo for/if in macro genera pwd

Messaggio da geovign »

Devo attribuire un codice ad ogni operazione eseguita nel foglio "Movimenti Fert" in modo da identificare in modo univoco qualunque operazione eseguita.
Questo mi dovrebbe permettere di gestire al meglio il mio Quaderno di Campagna ed evitare di modificare o cancellare movimenti che risultano eseguiti nello stesso giorno e con ugual prodotto.
Ho trovato in rete una funzione per generare password che fa al caso mio e che mi dà la possibilità di creare stringhe anche di soli due caratteri.
Ho quindi provato ad impostare un ciclo for/if in modo da evitare stringhe doppie, ma ovviamente non funziona. (Standard.Codici.Genera_codici)
Non ottengo errori, la stringa mi viene inserita regolarmente nel campo della maschera, ma non esegue il controllo di eventuali doppi.
Dove ho sbagliato?
Se avete soluzioni più semplici sono accettate volentieri.
Saluti
Geo

EDIT: Mi sono dimenticato di dire che la macro in oggetto viene eseguita solamente con il pulsante "Registra acquisto fertilizzante" nel foglio "Movimenti Fert" dove nella relativa maschere è presente il campo "Codice". Geo
Allegati
MovFert per codici.ods
(41.49 KiB) Scaricato 114 volte
Ultima modifica di charlie il domenica 3 febbraio 2019, 14:52, modificato 2 volte in totale.
Motivazione: Aggiunti spunta verde e [Risolto]
LibO 7 su LinuxMint 21
Avatar utente
Eramad
Volontario
Volontario
Messaggi: 278
Iscritto il: martedì 10 aprile 2018, 14:56
Località: Pistoia

Re: Ciclo for/if in macro genera pwd

Messaggio da Eramad »

Purtroppo sono a lavoro e ho dato solo un occhio velocissimo alla macro ma mi è subito saltato all'occhio che il ciclo FOR ha un difetto per come lo hai scritto: quando trova una password doppia, la rigenera ma poi non ricontrolla se quella generata è uguale ad altre prima. (spero di essermi fatto capire)

Dovresti provare ad inserire un i=4 dopo "pippo=Passwdgen_Implementation(1, 1)" e toglierei quel "exit sub" perchè mi sa che così non solo non ricontrolla le password prima (per questo metterei i=4 così da farlo ripartire col controllo dall'inizio) ma non continua nemmeno con quelle dopo perchè appena IF è vero esce dal ciclo (quindi se hai 10 password e la seconda è uguale a pippo, lui ne crea una nuova ed esce...senza controllare le altre fino alla 10)

Il discorso è un po contorto ma purtroppo ti scrivo di furia...magari se non riesci a risolvere poi ci butto un occhi con più calma o comunque arriverà qualcuno che sa spiegarsi meglio (e ci capisce anche di più magari)
Apache OpenOffice 4.1.5 su Windows 10

Se hai risolto il problema, ricordati di aggiungere [RISOLTO]: viewtopic.php?f=9&t=5661
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ciclo for/if in macro genera pwd

Messaggio da patel »

vedendo la tua macro sembra che tu generi un codice di una sola lettera, perché ? aumentando la lunghezza del codice è più difficile avere doppioni.
inoltre non capisco la riga

Codice: Seleziona tutto

		if Sheet.getCellbyposition("I", i).string = pippo then
getCellbyposition vuole il numero di riga e colonna, altrimenti devi usare byName
-------------------
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
Avatar utente
Eramad
Volontario
Volontario
Messaggi: 278
Iscritto il: martedì 10 aprile 2018, 14:56
Località: Pistoia

Re: Ciclo for/if in macro genera pwd

Messaggio da Eramad »

@patel...anche io non pensavo funzionasse e invece GetCellByPosition accetta anche scritta così.

Comunque io infatti consiglierei anche un'altra modifica pensandoci.
Creerei altre 2 variabili e sostituirei

Codice: Seleziona tutto

Passwdgen_Implementation(1, 1)
con

Codice: Seleziona tutto

Passwdgen_Implementation(variabile1, variabile2)
il risultato sarebbe:

Codice: Seleziona tutto

variabile1 = 1
variabile2 = 2
For i = 4 to LastRow
  if Sheet.getCellbyposition("I", i).string = pippo then
    variabile1 = variabile1 + 1
    variabile2 = variabile2 + 1
    pippo=Passwdgen_Implementation(variabile1, variabile2)
    i = 4
  end if
Next i
Apache OpenOffice 4.1.5 su Windows 10

Se hai risolto il problema, ricordati di aggiungere [RISOLTO]: viewtopic.php?f=9&t=5661
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Ciclo for/if in macro genera pwd

Messaggio da geovign »

Grazie ad entrambi.
@patel
- Giusto; genero una pwd con una sola lettera per verificare esclusivamente il corretto funzionamento della macro. A regime utilizzerò due lettere, che dovrebbero essere più che sufficenti.
- Se sostituisco getCellByName a getCellByPosition mi va in errore Basic e devo riavviare LibreOffice6 (non mi ricordo l'errore che visualizza, ma non posso fare altro se voglio continuare)
- Con if Sheet.getCellbyposition("I", i).string = pippo then , se ho capito bene la funzione del ciclo if/then, indico la seguente condizione: se esiste una cella nella colonna I e riga da 4 a LastRow uguale al valore pippo .... rigenera pippo e ricontrolla
- @Eramad
- Tutto chiaro il primo post. Ho provato quanto dici ma non riparte il ciclo se riscontra un valore doppio, che regolarmente viene visualizzato nel campo della maschera
- Inserendo le due variabili non vado a modificare il tipo di pwd che genera la funzione Passwdgen_Implementation ? Da profano direi di si. Prima di provare vorrei, se possibile, avere conferma di ciò.

Spero di essere stato chiaro nelle delucidazioni.
Ma non capisco ancora perchè ... non gira.
LibO 7 su LinuxMint 21
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Ciclo for/if in macro genera pwd

Messaggio da geovign »

Allora ho provato:

Codice: Seleziona tutto

sub Genera_codice
dim a As Object
dim LastRow As Long
dim pippo as string
Doc=ThisComponent
Sheet=Doc.sheets.getByName("Movimenti Fert")
a = Sheet.createCursor
a.gotoEndOfUsedArea(false)
LastRow = a.RangeAddress.EndRow

pippo=Passwdgen_Implementation(1, 1)

For i = 4 to LastRow
	if Sheet.getCellByPosition(8, i).string = pippo then
	pippo=Passwdgen_Implementation(1, 1)
	i = 4
	end if
rem		exit for
next i
dlg.getControl("TextField4").text = pippo
end sub
e la macro funziona quasi regolarmente. Al termine delle possibili soluzioni, nel campo della maschera non compare nulla quindi non esistono più alternative ... spero che sia così.
Ma resta un problema: l'uscita dal ciclo dove bisogna metterla? Se decommento la riga exit for riappaiano le stringhe doppie. Se la lascio commentata non esce dalla sub al termine delle possibili alternative.
Geo
LibO 7 su LinuxMint 21
Avatar utente
Eramad
Volontario
Volontario
Messaggi: 278
Iscritto il: martedì 10 aprile 2018, 14:56
Località: Pistoia

Re: Ciclo for/if in macro genera pwd

Messaggio da Eramad »

Non devi decommentare ma fare in modo che se non esistono più possibilità con 1 solo carattere passi a creare pwd con 2 caratteri per esempio.
Per questo motivo avevo messo le variabili 1 e 2...che fanno proprio quello che hai intuito: modificano il tipo di pwd
Apache OpenOffice 4.1.5 su Windows 10

Se hai risolto il problema, ricordati di aggiungere [RISOLTO]: viewtopic.php?f=9&t=5661
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Ciclo for/if in macro genera pwd

Messaggio da geovign »

@patel: in merito al tuo intervento ho risposto, ma sicuramente in modo non corretto. Rileggendo il post da te scritto mi sono accorto che quanto quotato era solamente a chiarimento della tua successiva affermazione. Quindi parte della mia risposta è da considerarsi inopportuna visto il tuo livello di conoscenza della materia. Chiedo venia.

A questo punto ho trovato, grazie a voi, la quadra della macro ed il corretto funzionamento.
Quindi adesso ho impostato i valori della pwd (per me codice univoco) con due lettere e mi ritrovo con oltre 300 combinazioni possibili, più che sufficienti. Inoltre ho indicato il numero della colonna (8) invece della lettera (I) nella condizione if getCellByPosition.
Metto risolto, ma chiedo se fosse possibile lasciare aperta la discussione in quanto mi piacerebbe approfondire quanto proposto da Eramad.
Modificando la macro come detto da Eramad (ma soprattutto da come ho capito), da una prima e veloce prova, genera esclusivamente pwd con tre caratteri. Ed ha senso perchè se indico "variabile1 +1" è come se scrivessi il numero 2.
Quindi non ho capito nulla su come/dove mettere la variabile.
Geo
Allegati
MovFert per codici definitivo.ods
(35.65 KiB) Scaricato 95 volte
LibO 7 su LinuxMint 21
Avatar utente
Eramad
Volontario
Volontario
Messaggi: 278
Iscritto il: martedì 10 aprile 2018, 14:56
Località: Pistoia

Re: Ciclo for/if in macro genera pwd

Messaggio da Eramad »

Se usi le variabili (o anche una sola della 2...tipo basterebbe usare la variabile1 per cambiarne la lunghezza) devi usarle in modo che ti genera sempre pwd di lunghezza 1 finchè è possibile e che inizi a crearne di lunghezza 2 se non sono più disponibili quelle da 1...e così via.

Rileggendo la mia macro mi sono accorto che, come sempre, la fretta porta all'errore.
La macro è un po più macchinosa e contorta ma comunque fattibile.

Purtroppo l'ora tarda non mi permette di mettermi a scriverla...ma vedrò di farlo appena possibile....sempre se nel frattempo non ci sei arrivato da solo o la scrive qualcun altro.
Apache OpenOffice 4.1.5 su Windows 10

Se hai risolto il problema, ricordati di aggiungere [RISOLTO]: viewtopic.php?f=9&t=5661
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da patel »

ma perché vuoi generare dei codici random ? questo ti obbliga a poi controllare i doppioni, tanto vale creare una stringa o un vettore di caratteri ed assegnarne uno alla volta e quindi sicuramente diverso. Altra alternativa è usare il numero di riga come codice
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da geovign »

Ciao Patel,
perchè è la prima idea che mi è venuta in mente: generatore di pwd. Trovata e provata la funzione, mi sono accorto che, con al massimo due cifre, uscivano doppioni.
Sono testardo e curioso, quindi ho provato ad impostare un controllo.
Come da primo post, sono assolutamente aperto ad altre soluzioni, ma intanto questa l'ho risolta adattandola alle mie esigenze e posso continuare il mio "lavoro" di assemblaggio del quaderno di campagna (che fatica però ... l'ignoranza si paga).
Quindi pur avendo risolto il mio problema, la mia curiosità mi porta ad affrontare soluzioni migliorative (vedi quella proposta da Eramad) oppure a nuove soluzioni che non conosco (vedi le tue), ma presumo che per la seconda bisogna aprire un nuovo post o no?
Saluti
Geo
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da patel »

Se intendi approfondire sarebbe meglio aprire una nuova discussione, magari allegando soltanto un esempio semplificato senza finestre di dialogo
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da geovign »

@patel
Ok. Lo preparo, poi appena ho un attimo di tempo, tra ultimare il quaderno e potature varie, apro la discussione.
@Eramad ed ovviamente altri
Se devo arrivarci da solo ad una ipotetica soluzione, ci risentiamo forse fra qualche mese ... Se mi accompagnate ci risentiamo quasi giornalmente ... Se viene proposta una soluzione pronta, spero di capirla altrimenti studio o vi tormento finchè non l'ho capita.
Nel frattempo ci penso.
Geo
LibO 7 su LinuxMint 21
Avatar utente
Eramad
Volontario
Volontario
Messaggi: 278
Iscritto il: martedì 10 aprile 2018, 14:56
Località: Pistoia

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da Eramad »

Prendendo questo caso specifico e volendo usare un modo "empiristico" diciamo e molto veloce da inserire...potresti mettere un conteggio.
Quindi...sapendo che con un carattere solo hai 10 possibilità, puoi mettere che quando il contatore arriva a 10 la variabile1 cambia il valore da 1 a 2 così che la macro inizia a generare pwd lunghe 2 caratteri.

Poi come dice @patel si potrebbe semplificare il processo di generazione pwd ma....ci vediamo alla prossima discussione ;)
Apache OpenOffice 4.1.5 su Windows 10

Se hai risolto il problema, ricordati di aggiungere [RISOLTO]: viewtopic.php?f=9&t=5661
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da geovign »

Capito il concetto. Giusto se genero tutte le pwd consecutivamente o meglio giusto se uso tutte le possibilità in un sol colpo.
Ma tutte le volte che esco e poi rientro nella sub il contatore mi parte da zero, quindi non funzionerebbe più il metodo. o no?
Altra cosa invece sarebbe modificare la condizione di if tipo (non è corretta, non funziona ma giusto per farmi capire) con annidato il cilo for

Codice: Seleziona tutto

if pippo <> "" then
	For i = 0 to LastRow
		if	Sheet.getCellByPosition(0, i).string = pippo then
			pippo=Passwdgen_Implementation(1, 1)
			i = 0
		end if
	next i
else .......
end if
In sostanza condizionare il ciclo in funzione del valore assunto da pippo, però non riesco ad impostarlo correttamente. EDIT Sempre che sia possibile!
Spero di essere stato chiaro e di non aver partorito una cavolata.
Geo
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da patel »

geovign ha scritto:Capito il concetto. Giusto se genero tutte le pwd consecutivamente o meglio giusto se uso tutte le possibilità in un sol colpo.
Ma tutte le volte che esco e poi rientro nella sub il contatore mi parte da zero, quindi non funzionerebbe più il metodo. o no?
Io abbandonerei la generazione random, ma non ho capito se questi codici devono stare in una unica colonna oppure no, se la colonna è unica puoi usare il num di riga, altrimenti puoi scrivere l'ultimo codice in una cella di servizio e ripartire da quello quando esci e rientri.
Un esempio semplificato sarebbe utile
Mi sono accorto solo adesso che mi sono ripetuto :crazy:
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da geovign »

@patel
capita ... anche ai migliori.
comunque ti rispondo. I codici devono stare su di una stessa colonna ed allego un file di esempio semplificato (scrive solo i codici) ripulito da tutto, che sarà poi oggetto lo stesso della nuova discussione di cui sopra. Però non riesco a capire i passaggi successivi.

Poi provo poi a risponderemi da solo:
il ciclo

Codice: Seleziona tutto

if	Sheet.getCellByPosition(0, i).string = pippo then
			pippo=Passwdgen_Implementation(1,1)
			i = 0
		end if
non ha fine ed è perpetuo. Quindi per interrompere il ciclo bisognerebbe impostare un limite ai controlli al termine della disponibilità di pwd.
E' possibile farlo?
Geo

EDIT Dimenticavo il file
Allegati
Testpwd.ods
(14.54 KiB) Scaricato 65 volte
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da patel »

una volta esaurite le 9 lettere a disposizione è ovvio che il ciclo non termina mai, trova solo doppioni.
non è molto più semplice usare questa ?

Codice: Seleziona tutto

sub Cod_Mov
	Doc=ThisComponent
	Sheet=Doc.sheets.getByName("Foglio1")
	a = Sheet.createCursor
	a.gotoEndOfUsedArea(false)
	LastRow = (a.RangeAddress.EndRow) + 1
	oRangeAddress = Sheet.getCellRangeByName("A" & Lastrow).getRangeAddress()
	Sheet.insertCells(oRangeAddress, com.sun.star.sheet.CellInsertMode.ROWS)
	Sheet.getCellRangeByName("A" & LastRow).string = LastRow

end sub
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [RISOLTO] Ciclo for/if in macro genera pwd

Messaggio da geovign »

Adesso ho capito cosa intendevi. Sicuramente molto più semplice e potrebbe sostituire quanto di macchinoso da me fatto.
Nel mio caso reale, che prevede anche incastri di dati con altre tabelle e priorità di esecuzione di macro, ho bisogno di provarla con calma.
Adesso però ho bisogno di portare a termine quando impostato con quello che funziona, ma sicuramente proverò.
Di certo la macro proposta me la tengo in archivio, sicuramente mi servirà se continuerò a "progettare" per mio diletto.
Grazie
Geo
LibO 7 su LinuxMint 21
Rispondi