{"id":213,"date":"2009-11-26T11:19:00","date_gmt":"2009-11-26T11:19:00","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=213"},"modified":"2009-11-26T11:19:00","modified_gmt":"2009-11-26T11:19:00","slug":"didattica-gambas-creare-database-al-primo-avvio","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/didattica-gambas-creare-database-al-primo-avvio\/","title":{"rendered":"Didattica Gambas &#8211; Creare database al primo avvio"},"content":{"rendered":"<div><span>Quando si crea un software che lavora in stretta connessione con un database, molto spesso quest&#8217;ultimo lo si crea precedentemente e poi lo si copia nella cartella di destinazione una volta installato il nostro programma. Questa tecnica \u00e8 molto pratica ma costringe l&#8217;utente finale a dover eseguire delle operazioni in pi\u00f9 che potrebbero essere evitate. Allora come fare?<\/span><\/p>\n<p><span>E&#8217; possibile ricorrere alla sub _new di Gambas che permette di gestire tutti quelli eventi che si presentano prima di avviare il form.<\/span><\/p>\n<p><span>Posto qui il codice e lo studieremo passo passo.<\/span><\/div>\n<p><span><br \/><\/span><\/p>\n<pre><span><span>   '-- nome database<\/span><\/span><br><span>sName AS String = \"tabella\"                       <\/span><br><span><span>   '-- percorso database<br><\/span><\/span><span>sPercorso AS String = User.Home &\/ \".database\"<\/span><br><span><span>   '-- nuova classe connessione database<br><\/span><\/span><span>$hConn AS NEW Connection                    <br><\/span><span><span>   '-- query di creazione database<\/span><\/span><br><span>sql AS String                               <br><\/span><span><span>   '-- risultato della connessione<\/span><\/span><br><span>hres AS Result                              <br><br>PUBLIC SUB _new()<br><br>'-- se la cartella non esiste la crea<br>IF NOT Exist(sPercorso) THEN MKDIR sPercorso<br><br>'-- se il database non esiste lo crea<br><br>'-- Imposta i parametri di connessione<br>WITH $hConn<br>.Type = \"sqlite3\"<br>.Host = sPercorso<br>.Login = \"\"<br>.Password = \"\"<br>END WITH<br><br>'-- testa esistenza database<br>$hConn.Open<br><br>'-- se non esiste crea il nuovo database<br>IF NOT $hConn.Databases.Exist(sName) THEN<br>$hConn.Databases.Add(sName)<br>$hConn.Close<br>$hConn.Name = sName<br>$hConn.Open()<br>'-- da uno scheletro alla tabella<br>sql = \"CREATE TABLE 'tabella' <\/span><\/pre>\n<pre><span>         ( 'id' INTEGER PRIMARY KEY,<br>      'nome1' VARCHAR(255) DEFAULT NULL,<br>      'nome2' VARCHAR(255) DEFAULT NULL,<br>      'nome3' VARCHAR(255) DEFAULT NULL,<br>      'nome4' VARCHAR(250) DEFAULT NULL,<br>      'nome5' VARCHAR(4) DEFAULT NULL,<br>      'nome6' VARCHAR(10) DEFAULT NULL,<br>      'nome7' VARCHAR(4) DEFAULT NULL);\"<br>hres = $hConn.EXEC(sql)<br>$hConn.Commit<br>END IF<br><br>'-- chiude la connessione<br>$hConn.Close<br><br>END<\/span><\/pre>\n<p><span><br \/><\/span><\/p>\n<div><span>Iniziamo col vedere semplicemente che sono state dichiarate delle variabili a a livello globale che ci permetteranno una facilitazione a livello di codice.<\/span><\/p>\n<p><span>Analizziamo la sub <\/span><span>_new<\/span><span>. Esso prima di tutto testa l&#8217;esistenza della cartella nascosta <\/span><span>.database<\/span><span> presente nella Home dell&#8217;utente. Se tale cartella esiste il programma si avvia normalemente altrimenti la crea. Se essa manca, si intuisce facilmente che vuol dire che \u00e8 il primo avvio di tale programma o che essa \u00e8 stata cancellata e perci\u00f2 deve essere ricreata.<\/span><\/p>\n<p><span>Una volta terminata la parte inerente la cartella si passa all&#8217;analisi della presenza del database. Per tale controllo si parte con l&#8217;impostazione dei vari parametri. Dalla voce <\/span><span>.Type<\/span><span> si pu\u00f2 vedere che in questo caso si sta usando un database di tipo sqlite e pertanto dobbiamo fare riferimento alla sintassi sql esatta. Una volta terminate le impostazioni si apre la connessione col databse mediante <\/span><span>$hConn.Open()<\/span><span>.<\/span><br \/><span>Qui il codice analizza l&#8217;esistenza della tabella; qualora essa non sia presenta ne crea una nuova, chiude la connessione, reimposta il nome e apre la connessione per poterla creare e popolare.<\/span><\/p>\n<p><span>Ora tutto ci\u00f2 che bisogna fare e studiare la sintassi della stringa <\/span><span>sql<\/span><span> che verr\u00e0 poi passata come parametro e letta come una query. Mediante <\/span><span>CREATE TABLE<\/span><span> crea la tabella all&#8217;interno del database di nome &#8216;tabella&#8217; nella quale verranno create le apposite voci nome1, nome2, nome3, &#8230;.etc.<\/span><\/p>\n<p><span>Per praticit\u00e0 preferisco sempre lavorare con voci di tipo striga che poi converto in fase di lettura. Per far ci\u00f2 basta specificare la lunghezza della stringa voluta passandola come parametro alla voce <\/span><span>VARCHAR(lunghezza)<\/span><span>. Si nota che per molte voci tale lunghezza \u00e8 255; alcune voci invece riportano una lunghezza diversa, questo \u00e8 dovuto al fatto che sapendo preventivamente quanto sarebbe stata lunga tale stringa ho reputato opportuno dimensionarla con il valore esatto per una migliore gestione dello spazio disponibile.<\/span><\/p>\n<p><span>Finita la creazione della query la si passa come parametro e si chiude la connessione con il database. Fatto ci\u00f2 \u00e8 tutto pronto e il programma pu\u00f2 partire avendo a disposizione tutti gli elementi utili.<\/span><\/p>\n<p><span>Con poche righe di codice \u00e8 possibile evitare al nostro utente un lavoro in pi\u00f9 e si pu\u00f2 dare al nostro software un aspetto pi\u00f9 &#8220;professionale&#8221;.<\/span><\/div>\n<p><span><br \/>ATTENZIONE: La query sql \u00e8 stata scritta su pi\u00f9 righe per motivi grafici. Quella stringa va scritta tutta insieme o divisa mediante gli opportuni separatori di stringa.<\/p>\n<p><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si crea un software che lavora in stretta connessione con un database, molto spesso quest&#8217;ultimo lo si crea precedentemente e poi lo si copia nella cartella di destinazione una volta installato il nostro programma. Questa tecnica \u00e8 molto pratica ma costringe l&#8217;utente finale a dover eseguire delle operazioni in pi\u00f9 che potrebbero essere evitate. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52,23,4,17],"tags":[],"class_list":["post-213","post","type-post","status-publish","format-standard","hentry","category-didattica","category-gambas","category-opencode","category-sql-database"],"views":2734,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=213"}],"version-history":[{"count":0,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}