Archivi tag: formulario

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

Gestionale con MySql e OpenOffice – 4 primo Formulario


Una volta installato mysql e libre/open office, creato la prima tabella in sql, modificata per renderla più funzionale usando una seconda tabella “elenco”, si passa a creare un Form in libreoffice o openoffice.

Da questo momento in poi mi riferirò specificamente a openoffice, dal momento che in alcuni dettagli mi è parso più stabile rispetto a libreoffice, ad esempio le left join andavano in crash, Anche se in effetti mi è parso che in alcuni casi anche openoffice avesse alcune difficoltà con le left join: in particolare non riusciva a gestire elenchi lunghi generati da left join. Inoltre i report – anche se noi non li utilizziamo – sono più agevoli in openoffice. Tuttavia libreoffice sembra in qualche caso avere delle funzioni in più.

In ogni caso di qui in poi mi riferisco a openoffice, anche se i due programmi sono intercambiabili e utilizzano gli stessi file, con la stessa estensione .odb.

Va poi specificato che openoffice e libreoffice non hanno la stabilità dei programmi proprietari ad esempio della microsoft, quindi ci possono essere piccoli o grandi bug a seconda del computer dove sono installati: quello che viene detto qui, funziona sul mio computer e in linea di massima funziona in tutti gli altri ma può anche capitare che alcune funzionalità si inceppino semplicemente passando da un pc all’altro (per esempio le left join facevano esplodere libreoffice ma non davano particolari problemi in openoffice.
Tuttavia oltre a essere programmi liberi, permettono molta più possibilità di inventiva per il programmatore rispetto ai programmi proprietari.

Quindi si apre openoffice base.

Si seleziona
collega ad un database esistentescegliendo “mysql, poi
connetti con ODBC”
poi si clicca su sfoglia e si seleziona la sorgente dati, da noi si chiamava banalmente
odbcname.
Poi si inserisce l’utente, da noi root,
Infine si selezionea “
no, non registrare il database” e si dà il nome al file. Noi lo chiameremo “primodatabase

nella prima schermata è anche possibile scegliere “collega ad un database esistente” → “odbc”. Tuttavia questa scelta a me ha creato qualche problema di comunicazione tra base e mysql.

Un file ODF è suddiviso in quattro parti: Tabelle, Query, Formulari, Report.

Nel nostro caso quando il file si apre sono già presenti le tabelle create su MySql. Dal momento che le tabelle le creiamo e modifichiamo direttamente da mysql non useremo la sezione tabelle di openoffice base, anche se a volte torna utile aprire una tabella da openoffice, mentre magari si sta impostando una query o un altro comando in MySql.

Anche la sezione query ha un interesse marginale per i nostri scopi (ma anche in generale impostare query ha una utilità ridotta). Le nostre query verranno eseguite direttamente all’interno dei forulari. Una volta che si sanno fare quelle si possono fare quante query si vogliono.

La sezione report è più interessante ma ha il limite di poter usare – per quel che ne so – una sola tabella o query alla volta

Si va nella sezione Formulari, e si clicca su “Crea formulario in vista struttura”.

Appare il formulario vuoto.
Un formulario è composto da alcuni oggetti, alcuni visuali altri non visuali, che interagiscono col database oltre ad altri oggetti fissi che non interagiscono col database.
Soprattutto i formulari sono composti da degli oggetti non visuali “Forms”, ossia proprio “Formulari”.
Nonostante il nome sia lo stesso il formulario inteso come la pagina bianca appena apparsa è un foglio su cui si possono disegnare tabelle o inserire campi di testo, mentre i Forms, ossia sempre i Formulari, che sono contenuti dentro al foglio, sono degli oggetti invisibili che hanno il compito di comunicare con il database.
Ogni form può connettersi al massimo a una tabella o una query proveniente dal database mysql.

La prima cosa da fare in un formulario, in un foglio vuoto è quella di andare ad inserire ed impostare il primo Form.

Si clicca sull’icona “navigatore formulario” in basso a sinistra (da non confondersi col navigatore del documento di openoffice):

Si clicca col tasto destro su Moduli → Nuovo → Formulario

Qualora non fosse visibile il tasto del navigatore, serve attivare il gruppo “Struttura del formulario” andando a selezionarlo in Visualizza → Barra degli strumenti.
Stessa cosa per i controlli del formulario che devono essere visibili. Si gestiscono da Visualizza → Barra degli strumenti → Controlli per formulario

Si ottiene la seguente finestra

Si clicca tasto destro su “Moduli” poi → Nuovo → Formulario e si ottiene:

Una volta giunti qui suggerisco di salvare il formulario, inteso come pagina, prima di procedere. Si clicca File → Salva.

Salvare il formulario permette di evitare di dover inserire nelle proprietà la sorgente dati. In ogni caso se venisse richiesta vi andrebbe inserito il file di base stesso a cui il formulario appartiene (“primodatabase”).

Da questa schermata si fa tasto destro sul formulario → modifica e si entra nel formulario in modalità di modifica.

Ora si clicca di nuovo sul navigatore

Tasto destro su Formulario, sotto la scritta Moduli → proprietà.

Nella tab “Dati” nel campo “Tipo di contenuto” si seleziona “Comando SQL” e si scrive nel campo “Contenuto”:

SELECT * FROM fatture;

Che vuol dire: tieni in memoria tutte le colonne della tabella fatture.

Nella tab “Dati” è in generale opportuno selezionare come “Tipo di contenuto”Comando SQL”. Questo perchè permette poi di manipolare meglio il form attraverso le macro che possono cambiare quel comando SQL che introduciamo ma che non potrebbero agire a riguardo se scegliessimo una Tabella o una Query.

Ora, si clicca la freccia in basso a sinistra o comunque si deve arrivare a cliccare “Altri campi di controllo”.

E si seleziona l’icona griglia:

Con il mouse si indica l’area che si vuole ricoprire con la griglia (è conveniente all’inizio farla piuttosto grande), e si segue il wizard per la composizione delle colonne della griglia. Inizialmente si può anche selezionare il tasto =>> che aggiunge alla griglia tutte le colonne presenti nella tabella del formulario (che nel nostro caso è SELECT * FROM fatture; ossia è la tabella fatture).

Per capire che cosa fa il wizard della griglia si può allargare la griglia a sufficienza così che sia possibile cliccare tasto sulla barra dell’intestazione della griglia destro, fuori dalle colonne già esistenti. Si seleziona “Nuova colonna” e quindi Campo di testo, che è una modalità che va bene un po’ per tutto.

Oppure se si ha a che fare con un numero si può scegliere campo numerico, campo data o campo formattato se si ha a che fare con una data o con un campo che si preferisce formattare come si fa con writer o calc (i corrispettivi open di word e excel). Se si ha un campo binario si può scegliere l’opzione Casella di controllo. Campo maschera serve per vincolare la digitazione di quel campo: se voglio che in quel campo si inseriscano tre lettere e sue numeri, col campo a maschera riesco a imporre all’utente questo formato.
Invece Casella combinata e soprattutto Casella di riepilogo presentano funzioni più avanzate che useremo per unire i campi numerici come ragionesociale_fat ai nominativi corrispondenti negli elenchi,

Ora di può cliccare su Modo bozza on/off:

E “eseguiamo” il nostro formulario.

In griglia non appare niente ancora perchè non abbiamo inserito dati in tabella. Si può provare a inserire dati in tabella (ricordandosi che il campo ragionesociale_fat è per ora ancora un campo numerico dove si possono inserire solo numeri interi).

E’ il caso di ricordare che i dati che scriviamo in griglia verranno trascritti nella tabella collegata del database (nel nostro caso la tabella fatture) solo quando andiamo a capo di una riga. Quando ci sono dati scritti in griglia ma non ancora passati alla tabella del database vengono segnalati con una matita nella barra laterale sinistra della grigli che sostituisce il triangolino verde che è invece presente quando tutte le cose scritte in griglia sono state anche memorizzate nella tabella del database.

Dopo aver provato a inserire righe nella tabella, si possono cancellare le righe che si sono scritte cliccando col tasto destro sulla barra laterale sinistra della griglia, a livello della riga che si vuole eliminare e selezionando Elimina righe.

Ora per prima cosa serve che nel campo ragionesociale_fat appaia il nominativo in lettere della ditta che si intende indicare.

Per fare questo creiamo in mysql una tabella in cui ogni nominativo sia associato a un numero.

Apriamo la workbench, entriamo in nuovoschema, e creiamo una nuova tabella (vedi qui su come creare tabelle) che chiamiamo elenco_nominativi, con due colonne, la colonna idelenco_nominativi,(con PK, NN, AI) e la colonna nominativi_en di tipo VARCHAR(127) con NN.

Ora, quando si creano nuove tabelle o le si modifica o si agisce in qualche modo sulla struttra dello schema tramite workbench, può capitare che base (libreoffice base) non recepisca le modifiche. E’ per questo opportuno andare nella sezione tabelle e cliccare da menu Visualizzaaggiorna tabelle. Oppure serve salvare i formulari aperti, chiuderli, salvare il file di base, e chiudere il file. Una volta che tutte le finestre relative al file primodatabase.odb siano state chiude si può riaprire il file, e lo si ritrova aggiornato.

Ora andiamo sulla sezione “tabelle”, e apriamo la tabella elenco_nominativi (se non appare probabilmente l’avete creata nello schema sbagliato) e inseriamo sotto la colonna nominativi_en un po’ di “nomi”.

Inseriamo:

Mario srl
Verdi spa
Arch. Bianchi
Ing Rossi
Mario Rossi

Si ricorda che nella prima colonna idelenco_nominativi non si deve scrivere niente perchè è una colonna che aggiorna automaticamente il database.

Ora ritorniamo nella sezione Formulari e riapriamo il formulario creato in precedenza con tasto destro → modifica.

Clicchiamo con tasto destro sopra la colonna ragionesociale_fat e scegliamo Sostituisci con → Casella di riepilogo.

Ora si clicca di nuovo con tasto destro sopra ragionesociale_fat e stavolta però si sceglie Colonna… che permette di entrare nelle proprietà della colonna.

Si va nella sezione Dati e sul campo Tipo del contenuto della lista si seleziona Sql.

Si clicca quindi sui puntini a lato del campo Contenuto elenco

Si entra in una finestra apposita dove già dovrebbe comparire la finestra Aggiungi tabella o query. Se non apparisse è sufficiente cliccare su inserisci → Aggiungi tabella o query.

Si fa doppio click sulla tabella elenco nominativi, e si può cliccare Chiudi.

Sulla tabellina che appare nella sezione alta si fa doppio click prima su nominativi_en e poi su idelenco_nominativi. Si può cliccare quindi su salva e si può uscire da questa finestra.

Ora nella sezione Dati della colonna ragionesociale_fat, nel campo Contenuto elenco dovrebbe apparire questo comando:

SELECT `nominativi_en`, `idelenco_nominativi` FROM `nuovoschema`.`elenco_nominativi` AS `elenco_nominativi`

Che andiamo a modificare aggiungendo la clausola finale ORDER BY, clausola sql che permette di ordinare una query a seconda del campo è composta da ODER BY nomecampo ASC (oppure DESC a seconda se si vuole ordinare in maniera crescente o descrescente):

SELECT `nominativi_en`, `idelenco_nominativi` FROM `nuovoschema`.`elenco_nominativi` AS `elenco_nominativi` ORDER BY `nominativi_en` ASC

Possiamo ora eseguire il nostro formulario cliccando sul tasto Modo bozza on/off.

Se prima avevamo lasciato una riga con un numero intero da 1 a 4 nel campo ragionesociale_fat ora ci appare un nome. Il nome associato a quel numero nella tabella elenco_nominativi

Si noti che se ci si posiziona nel campo ragionesociale_fat, anche se non è possibile vedre il cursore, si può scrivere con la tastiera “mario ” apparirà la scritta “Mario Rossi” ma appena si procede e si arriva a scrivere “mario s” apparirà il nominativo di “Mario srl”.
Mi accorgo ora che questa funzione presente in openoffice, non è ancora stata implementate in libreoffice.

Per ora abbiamo sistemato la parte che riguarda il campo ragionesociale_fat.

Per quanto riguarda il campo idfatture, si tratta di un campo eccezionale, come lo sono tutti i campi id.
Si incrementa da solo e soprattutto ogni volta che una futura tabella vorrà fare riferimento a una certa fattura indicherà proprio il numero del campo id.
E’ quindi importante che questo numero non venga modificato perché scombinerebbe le eventuali associazioni.
Inoltre, nella tabella del nostro formulario, la colonna id costringe l’utente ogni volta a battere invio per uscire da un campo che non utilizza e che non deve utilizzare.
Eliminiamo quindi la colonna idfatture.

Ri-clicchiamo sul tasto Modo bozza on/off e andiamo a cliccare col tasto destro sulla colonna idfatture e selezioniamo Elimina Colonna.

Dopodichè clicchiamo e manteniamo premuto sul campo data_dat e trasciniamo col mouse senza mollare a sinistra arrivando all’inizio della colonna ragionesociale_fat, qui molliamo la presa.
La data dovrebbe così apparire nella griglia come il primo campo, e la ragione sociale come il secondo.

Clicchiamo su salva per salvare il formulario.