Gestionale con MySql e OpenOffice – 6 prima macro

L’utilità di avere un front-end come openoffice è che offre una sequenza di oggetti grafici che si relazionano al server mysql in maniera efficiente. Insomma viene evitato lo smazzo non da poco di creare un’interfaccia grafica per il server mysql.
L’efficienza è aumentata dal fatto questi oggetti grafici e le loro funzioni possono essere manipolati da riga di codice con l’uso delle macro.
Per un excursus sulle macro di openoffice e il modo con cui si scrive codice guardare qui.

Siamo arrivati ad avere una pagina-formulario con una tabella che si collega alla tabella fatture di mysql, e una sotto-tabella che per ogni fattura mostra quali scadenze ci sono e con che data.

Tuttavia dal momento che nella tabella fatture si fa uso di un menu a tendina per inserire le ragioni sociali, nel momento in cui dovessimo registrare una fattura che riporta una ragione sociale nuova, mai registrata, saremmo impossibilitati a inserire il nome.

Allora dovremmo andare nella sezione tabelle del file base, aprire la tabella elenco_nominativi, inserire il nominativo, tornare alla nostra pagina-formulario, chiuderla e riaprirla e così troveremmo nel menu a tendina la ragione sociale appena inserita.

Una procedura assolutamente non professionale e comunque molto onerosa dal punto di vista del tempo perso.

Si può risolvere andando ad aggiungere un oggetto-formulario con cui si disegna una griglia collegata alla tabella elenco_nominativi, si aggiunge un campo di testo dove poter scrivere e si applica una macro che va a visualizzare nella griglia appena disegnata solo i nominativi che contengono il testo che viene scritto nel campo di testo. Per fare questo:

Si apre in modo bozza la nostra pagina-formulaio (tasto destro – modifica).
Si clicca su navigatore formulario si clicca sul capostitpite Moduli, tasto destro → NuovoFormulario. (Da solo dovrebbe chiamarsi Formulario 1).
Tasto destro su Formulario 1proprietà
Nella scheda dati si seleziona Tipo di contenuto: Comando SQL
Nel campo Contenuto si clicca sui tre puntini … → (finestra aggiungi tabella o query) → si seleziona la tabella elenco_nominativi → clicca Aggiungi → clicca Chiudi.
Fare doppio clic su *, cliccare su salva e chiudere la finestra.

Si ha quindi:

Per creare una griglia si clicca su Formulario 1 dentro il navigatore formulario. Poi si clicca su campo di controllo tabella come si è fatto qua.

Si crea una griglia con una sola colonna contente il campo nominativi_en.

Dal momento che ho solo la colonna nominativi_en, quando inserisco una riga il campo attivo_en verrà riempito per difetto col numero 1 (attivo), come impostato da mysql, invece il campo tipo_en non ha un valore per difetto e quindi verrebbe riempiro da null. Per evitare questo si fa così nella pagina-formulario:

Si crea un campo Campo numerico (Campo di testo o Campo formattato) che appartenga a Formulario 1. Quindi tasto destro → Campo di controllo → nella scheda generale Visibile: no, Valore predefinito: 1 (fornitore, dal momento che siamo sulle fatture di acquisto); nella scheda Dati → Campo di dati: Tipo_en.

Ora se avviamo il formulario si vede che è ora possibile inserire nella griglia appena creata nuove ragioni sociali, senza quindi dover andare ad aprire la tabella elenco_nominativi dentro la sezione tabelle.
Però restano 2 problemi.

1) per vedere se una ragione sociale è presente devo scorrere l’intera colonna coi nominativi (e può essere molto lunga e quindi il procedimento rischia di diventare laborioso)
2) quando inserisco un nuovo nominativo questo non appare nel menu a tendina della griglia fatture.
Aggiungo quindi un campo di testo dove poter inserire il nominativo che si cerca.
Per fare questo io utilizzo una campo di testo:
Dal navigatore formulario si clicca su Formulario (non su Formulario 1) e poi sul tasto Campo di testo:

,

lo si disegna nella pagina-formulario. Non si associa nessun campo a questa casella. Infine dal navigatore formulario si cambia il nome (tasto dx → proprietà → scheda generale → Nome) della campo di testo in Nominativo
.
Siccome mentre scrivo dentro il campo di testo andrò ad aggiornare ad ogni tasto che digito il contenuto del Form elenco_nominativi è importante che il campo di testo non sia un oggetto appartenente al Form elenco_nominativi, altrimenti ad ogni tasto premuto si crea un cortocircuito per cui si aggiorna – cancellandosi – anche il testo che sto scrivendo.

Serve quindi fare una macro.

Si fa:
StrumentiMacroOrganizza macro …office Basic → nella sezione Macro da è preferibile selezionare il file primodatabase → Si clicca su nuovo → si dà il nome al modulo (Modulo 1) e si clicca OK → si clicca su modifica.

Serve poi ricordarsi di andare su strumentiopzioni → sezione openoffice → Sicurezza → Sicurezza delle macro e impostare Medio. Chiudere primodatabase e aprire cliccando su abilita macro per attivare l’uso delle macro.

Si accede quindi alla pagina delle macro. Di solito contiene una funzione vuota Main.

Si scrive in fondo al foglio (in questo caso sotto la funzione Main, dopo end sub):

sub trova_clienti(oEv)

oEv cattura l’evento che attiva la procedura: nel nostro caso il rilascio di un tasto della tastiera

Questo comando ottiene nella variabile Form il controllo dell’oggetto Formulario, che relaziona la tabella mysql fatturecon il file di base
Form = ThisComponent.Drawpage.Forms.getByname(“Formulario”)
Poi prendiamo anche il Formulario 1, quello che gestisce la relazione con la tabella elenco_nominativi
fb = ThisComponent.Drawpage.Forms.getByName(“Formulario 1”)
Prendiamo controllo anche della casella da cui stiamo scrivendo il nome della ragione sociale, che è un oggetto di Form (il primo formulario)
testo=Form.getbyname(“Nominativo”)
Infine recuperiamo il codice del tasto che è stato premuto e che ha generato questo evento. L’evento “tasto” è illustrato qui L’elenco dei codici tasto è presente qui
tasto = oEv.keyCode

se il tasto è un numero o una lettera oppure uno spazio, un cancella, un backspace, una virgola un punto sottrazione moltiplicazione divisione maggiore minore uguale (e poco altro) azioniamo la procedura

if (tasto > 255 and tasto < 266) or (tasto > 511 and tasto < 538) or (tasto > 1282 and tasto < 1296) or (tasto = 0) then
‘MIGLIORIA: BISOGNEREBBE METTERE CHE SE SI SCRIVE \ APPARE UN MESSAGGIO CHE TE LA RIFIUTA
contenuto= “”
acquisiamo il contenuto del campo di testo da cui stiamo scrivendo
contenuto = testo.text
n serve per analizzare di carattere in carattere il testo scritto nel campo, u invece memorizza l’ultimo apice ( ‘ ) incontrato
n = 1
u = 1
Salviamo la lunghezza della stringa contenuta nel campo di testo
lun_str = len(contenuto)
Dal momento che l’apice ( ‘ ) nei comandi SQL delimitano i valori serve che quando il nome contiene
‘un apice questo venga raddoppiato di modo da rendere il comando SQL leggibile dal server

while n < lun_str+1
Mid(contenuto,n,1) estrae dalla stringa contenuto una sottostringa che comincia dal carattere n di contenuto e prosegue per un carattere (ossia: estrae il carattere n)
if Mid(contenuto,n,1) = “‘” then
‘ Se il carattere n è un apice si spezza in due la stringa (la parte prima dell’ultimo apice trovato e la parte che segue) e si aggiunge un altro apice in mezzo
contenuto = Mid(contenuto, 1, n) + “‘” + Mid(contenuto, n+1, lun_str-u)
Si memorizza in u la posizione del carattere successivo all’ultimo apice trovato
u=n+2
Siccome abbiamo aggiunto un carattere (l’apice) ora la stringa è più lunga di 1, quindi aumento lun_str e serve che il
‘ciclo while non analizzi il prossimo carattere perché sarebbe un apice e questo genererebbe un ciclo infinito quindi faccio n=n+1

n=n+1
lun_str=lun_str+1
end if
passo al carattere successivo
n=n+1
wend

Scrivo il comando SQL: prendo tutte le colonne dalla tabella elenco_fornitori, solo le righe in cui il campo `tipo_en` è 1 (fornitore) e `nominativi_en` contiene la stringa memorizzata in contenuto.
‘INSTR infatti è una funzione SQL che restituisce l’indice che una sottostringa ha all’interno di una stringa.
‘Se al posto di imporre >0 si fosse impostato INTRS(…) = 1 si sarebbero trovate tutte le stringhe che cominciano con la sottostringa
contenuto
‘Infine si ordinano le righe della query in ordine di nominativo crescente
‘Per fare l’apice diagonale `, nei sistemi operativi linux si preme AltGr ‘

comando= “SELECT `elenco_nominativi`.* FROM `elenco_nominativi` WHERE `tipo_en` = ‘1’ AND INSTR(`elenco_nominativi`.`nominativi_en`,'”+contenuto+”‘) > 0 ORDER BY `nominativi_en` ASC”

‘Si imposta il comando SQL del formulario fb e si ricarica il formulario per far appartire il risultato della nuova query
fb.command = comando
fb.reload
‘tasto giu

elseif tasto=1024 then
Se si preme il tasto “freccia giù” il formulario fb va giù di una riga (a meno che non sia già all’ultima riga o alla riga “afterlast”).
‘(nel mio caso non prende Last ma prende afterLast anche quando è l’ultima riga).

if fb.isLast or fb.isafterLast then
else
fb.next
end if

‘tasto su
elseif tasto=1025 then
Se si preme il tasto “freccia su” il formulario fb va su di una riga (a meno che non sia già alla prima riga o alla riga “beforefirst”.
if fb.isfirst or fb.isbeforeFirst then
else
fb.previous
end if
end if

end sub

Poi serve aggiornare le caselle di riepilogo per permettere che un nuovo nominativo appaia subito nel menu a tendina del campo ragione sociale della griglia fatture. Per questo serve un’altra macro:

sub aggiornacombo
Form = ThisComponent.Drawpage.Forms.getByName(“Formulario”)
a = Form.getbyname(“Campo di controllo tabella 1”)
Per trovare il nome di del campo ragionesociale_fat clicco tasto dx sulla intestazione della colonna ragionesociale_fat → proprietà → scheda Generale → vedo il campo Nome
b=a.getbyname(“NumericField2”)
b.refresh()
end sub

In questa macro si ottiene l’oggetto-formulario delle fatture e da questo si ottiene la griglia e da questa si ottiene la colonna con la casella di riepilogo (ragionesociale_rag). Infine si fa il refresh della casella di riepilogo.

In alcuni casi è capitato che openoffice chiedesse che ogni variabile venisse dichiarata prima di essere usata. Non so da cosa dipenda, comunque se succede è sufficiente dichiarare all’inizio della procedura tutte le variabili che si usano, ad es:

Dim Form as Object

Ora serve associare gli eventi alle macro.

Per quel che riguarda la casella combinata appena aggiunta: si fa doppio clic sul campo di testo (o tasto destro proprietà) → scheda Eventi → si va sul campo Dopo aver premuto il tasto → si clicca i tre puntini → Si clicca su Macro… → si sceglie la macro trova_clienti.

Per quel che riguarda l’aggiornamento della casella di riepilogo serve far si che la lista si riaggiorni ogni volta che si esegue un’azione sulla tabella elenco_nominativi.

Da navigatore formulario si clicca su Formulario 1, tasto destro → proprietà → scheda eventi
Scegliamo il campo Dopo l’azione sul record → tre puntini → andiamo a prendere la macro aggiornacombo.

Ora è preferibile aggiungere un’etichetta con scritto “Cerca” affianco al campo di testo, per rendere chiaro all’utente che da quel campo non può inserire dati ma solo ricercare i nominativi.

Si clicca su Testo fisso: , lo si disegna nella pagina-formulario e si fa tasto destro → proprietà → Scheda GeneraleDidascalia: “Cerca:”

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: