{"id":27012,"date":"2024-03-26T09:00:21","date_gmt":"2024-03-26T08:00:21","guid":{"rendered":"https:\/\/help.qualiware.it\/qw-help\/?p=27012"},"modified":"2025-12-23T10:46:37","modified_gmt":"2025-12-23T09:46:37","slug":"classi-di-supporto","status":"publish","type":"post","link":"https:\/\/help.qualiware.it\/qw-help\/classi-di-supporto\/","title":{"rendered":"Classi"},"content":{"rendered":"<p>La piattaforma QualiWare consente di utilizzare tutte le funzioni e le classi dei linguaggi Visual Basic e C# messe a disposizione dalla piattaforma .NET 4.7.2 (vedere&nbsp;<a href=\"https:\/\/docs.microsoft.com\/it-it\/dotnet\/framework\/additional-apis\/\" target=\"_blank\" rel=\"noopener\">qui<\/a>).<\/p>\n<p>Per rendere pi\u00f9 semplici le operazioni pi\u00f9 comuni, come quali la connessione ad un database, l&#8217;esecuzione di una query, l&#8217;aggiornamento di una tabella, o la gestione di array e collezioni, sono disponibili le seguenti classi aggiuntive.<\/p>\n<p>&nbsp;<\/p>\n<p><a name=\"QWDatabase\"><\/a><\/p>\n<h2>QWDatabase<\/h2>\n<p>La classe QWDatabase consente di aprire una connessione verso un database Microsoft SQL e Oracle.<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim DB as new QWDatabase(&lt;tipo&gt;,false)<\/pre>\n<p>dove &lt;tipo&gt; pu\u00f2 assumere i valori &#8220;SQL SERVER&#8221; o &#8220;ORACLE&#8221;<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Proprieta\"><\/a>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">Active<\/span>: <\/strong>se assegnato a <em>True<\/em>, la connessione al database viene aperta, altrimenti viene chiusa<\/li>\n<li><strong><span style=\"color: #993300;\">CommandTimeout<\/span><\/strong>: time-out di esecuzione di un comando in secondi (default=600)<\/li>\n<li><strong><span style=\"color: #993300;\">DatabaseName<\/span><\/strong>: nome del database<\/li>\n<li><strong><span style=\"color: #993300;\">LoginString<\/span><\/strong><span style=\"color: #993300;\">: <\/span><span style=\"color: #000000;\">credenziali di accesso al database, nel formato &lt;utente&gt;\/&lt;password&gt;<\/span><\/li>\n<li><span style=\"color: #800000;\"><strong>QWSession<\/strong><\/span>: restituisce l&#8217;oggetto di tipo QWSession corrispondente alla sessione attiva al momento<\/li>\n<li><strong><span style=\"color: #993300;\">ServerName<\/span><\/strong>: nome del server<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">BeginTrans()<\/span><\/strong>: inizia una transazione<\/li>\n<li><strong><span style=\"color: #993300;\">Commit()<\/span><\/strong>: conclude una transazione confermando le modifiche<\/li>\n<li><strong><span style=\"color: #993300;\">ExecuteSQL(&lt;sql&gt;)<\/span><\/strong><span style=\"color: #000000;\">: esegue l&#8217;istruzione SQL passata come parametro, ritornando il numero di righe eventualmente modificate<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">RollBack()<\/span><\/strong>: conclude una transazione annullando tutte le modifiche effettuate<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Esempio\"><\/a>Esempio<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim DB As New QWDatabase(\"SQL SERVER\", False)\r\nDB.ServerName = \"serverqw\"\r\nDB.DatabaseName = \"qualiware\r\nDB.LoginString = \"sa\/12334!#\"\r\nDB.Active=true<\/pre>\n<p>&nbsp;<\/p>\n<h2>QWRowSet<\/h2>\n<p>Questa classe rappresenta un insieme di record di database.<\/p>\n<h4>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">EndOfSet<\/span><\/strong>: ritorna&nbsp;<em>True<\/em> se il puntatore del record corrente \u00e8 oltre l&#8217;ultimo record.<\/li>\n<li><strong><span style=\"color: #993300;\">Fields(&lt;nome campo&gt;).value<\/span><\/strong>: consente di recuperare il valore del campo &lt;nome campo&gt; della riga corrente. NOTA: la funzione prevede che ogni colonna omonima di una gi\u00e0 esistente nella query sia chiamata con un indice progressivo che parte da 1. Ad esempio, se nella query ci sono 3 colonne chiamate <code>COLUMN<\/code>, la seconda e la terza colonna (in ordine di scrittura all&#8217;interno della query) dovranno essere chiamate come <code>COLUMN1<\/code> e <code>COLUMN2<\/code>.<\/li>\n<li><strong><span style=\"color: #993300;\">Filter<\/span><\/strong>: consente di filtrare ulteriormente le righe caricate nella tabella dal server. Funziona esclusivamente se la tabella ha la propriet\u00e0 <code>AllowAllRecords = True<\/code>, e non \u00e8 possibile utilizzare parametri.<\/li>\n<li><strong><span style=\"color: #993300;\">State<\/span><\/strong>: stato della riga: 1=non modificata, 2=in corso di modifica, 3=nuova e non ancora salvata.<\/li>\n<\/ul>\n<h4>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">BeginFilter()<\/span><\/strong>: porta le righe in modalit\u00e0 &#8220;filtro&#8221;. Dopo l&#8217;esecuzione di questa istruzione, \u00e8 possibile assegnare ai vari campi i valori che si vogliono filtrare &#8211; si veda l&#8217;esempio in fondo al paragrafo. Il filtro diventer\u00e0 effettivo all&#8217;esecuzione del metodo <code>ApplyFilter<\/code>.<\/li>\n<li><strong><span style=\"color: #993300;\">ApplyFilter()<\/span><\/strong>: applica il filtro assegnato. Se la <code>QWTable<\/code> a cui l&#8217;oggetto appartiene ha <code>AllowAllRecords = False<\/code>, va prima effettuata una chiamata <code>SetRange<\/code>.<\/li>\n<li><strong><span style=\"color: #993300;\">ClearFilter()<\/span><\/strong>: rimuove il filtro applicato.<\/li>\n<li><strong><span style=\"color: #993300;\">BeginLocate()<\/span><\/strong>: porta le righe in modalit\u00e0 &#8220;ricerca prima occorrenza&#8221;. Dopo l&#8217;esecuzione di questa istruzione, \u00e8 possibile assegnare ai vari campi i valori che si vogliono cercare &#8211; si veda l&#8217;esempio in fondo al paragrafo. La ricerca verr\u00e0 effettuata all&#8217;esecuzione del metodo <code>ApplyLocate<\/code>.<\/li>\n<li><strong><span style=\"color: #993300;\">ApplyLocate()<\/span><\/strong>: <span style=\"color: #000000;\">esegue la ricerca, ritornando&nbsp;<em>True&nbsp;<\/em>se il record \u00e8 stato trovato, e posizionando il puntatore del record sulla riga trovata.&nbsp;Se la <code>QWTable<\/code> a cui l&#8217;oggetto appartiene ha <code>AllowAllRecords = False<\/code>, va prima effettuata una chiamata&nbsp;<code>SetRange<\/code>.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">ApplyLocate(&lt;condition&gt;)<\/span><\/strong>: <span style=\"color: #000000;\">esegue la ricerca applicando la condizione specificata nel parametro &lt;condition&gt;. Se si utilizza questo metodo, non \u00e8 necessario richiamare <code>BeginLocate<\/code>. Se la <code>QWTable<\/code> a cui l&#8217;oggetto appartiene ha <code>AllowAllRecords = False<\/code>, va prima effettuata una chiamata&nbsp;<code>SetRange<\/code><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Bookmark()<\/span><\/strong>: <span style=\"color: #000000;\">ritorna un array associativo che rappresenta il segnalibro della riga corrente, da utilizzare per ritornare sulla riga stessa successivamente.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">GoTo(&lt;bookmark&gt;)<\/span><\/strong>: <span style=\"color: #000000;\">si posiziona sulla riga identificata dall&#8217;array associativo che rappresenta il segnalibro precedentemente recuperato utilizzando la funzione <code>Bookmark<\/code>.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Count()<\/span><\/strong>: <span style=\"color: #000000;\">restituisce il numero di righe contenute nell&#8217;oggetto tabella&nbsp;<\/span><\/li>\n<li><span style=\"color: #993300;\"><strong>SetIndex(&lt;nome indice&gt;)<\/strong><\/span>: <span style=\"color: #000000;\">imposta l&#8217;indice specificato come nuovo indice virtuale dell&#8217;insieme di righe. Per reimpostare l&#8217;indice di default, basta passare una stringa vuota come argomento<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">FindKey(&lt;valore campo 1&gt;,&lt;valore campo 2&gt;,&#8230;)<\/span><\/strong><span style=\"color: #000000;\">: si posiziona sulla riga della tabella avente i valori dei campi dell&#8217;indice corrente uguali a quelli specificati. Restituisce&nbsp;<em>True<\/em> se la riga \u00e8 stata trovata,&nbsp;<em>False <\/em>altrimenti. Di default, l&#8217;indice corrente \u00e8 la chiave primaria della tabella.<br \/>\nN.B. Se la <code>QWTable<\/code> a cui l&#8217;oggetto appartiene ha <code>AllowAllRecords = False<\/code>, verr\u00e0 effettuata un&#8217;interrogazione sul server e la tabella stessa conterr\u00e0 una sola riga, quella trovata. Questa modalit\u00e0 di ricerca \u00e8 da preferire rispetto a BeginLocate\/ApplyLocate in quanto offre prestazioni migliori e comporta un traffico di rete minore.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">SetRange(&lt;valore campo 1&gt;,&lt;valore campo 2&gt;,&#8230;)<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">: filtra tutti i record aventi i valori dei campi dell&#8217;indice corrente uguali a quelli specificati. Di default, l&#8217;indice corrente \u00e8 la chiave primaria.<br \/>\n<\/span><\/span>N.B. <span style=\"color: #000000;\">: Se la <code>QWTable<\/code> a cui l&#8217;oggetto appartiene ha <code>AllowAllRecords = False<\/code>, verr\u00e0 effettuata un&#8217;interrogazione sul server. Questa modalit\u00e0 di filtro \u00e8 da preferire rispetto a BeginFilter\/ApplyFilter in quanto offre prestazioni migliori e comporta un traffico di rete minore.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">First()<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">: posiziona il puntatore del record corrente sulla prima riga. Ritorna&nbsp;<em>False<\/em> se la tabella non contiene righe.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Last()<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">: posiziona il puntatore del record corrente sull&#8217;ultima riga. Ritorna <em>False<\/em> se la tabella non contiene righe.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Next(&lt;numero righe&gt;)<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">: sposta il puntatore del record corrente di &lt;numero righe&gt; in avanti se il valore \u00e8 positivo, indietro se \u00e8 negativo. Se il parametro non viene specificato, il puntatore viene spostato alla riga successiva. La funzione ritorna&nbsp;<em>False<\/em> se lo con lo spostamento il puntatore \u00e8 andato oltre l&#8217;ultima riga o prima della prima riga.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Refresh()<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">: ricarica i dati dal server mantenendo le condizioni di filtro impostate.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">RefreshRow()<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">: ricarica dal server la riga corrente.<\/span><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a name=\"QWTable\"><\/a><\/p>\n<h2>QWTable<\/h2>\n<p>La classe QWTable consente di interagire con il database, interrogandolo e aggiornandone i dati senza la necessit\u00e0 di costruire manualmente le istruzioni di INSERT, UPDATE e DELETE. I record selezionati tramite una query SQL vengono caricati in un buffer in memoria rappresentato dall&#8217;oggetto <strong>RowSet<\/strong>, che pu\u00f2 essere navigato sequenzialmente e le cui colonne possono essere accedute tramite l&#8217;array associativo&nbsp;<strong>Fields.<\/strong><\/p>\n<h4 align=\"left\"><a name=\"QWTable_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim q as new QWTable()<\/pre>\n<h4 align=\"left\"><a name=\"QWTable_Proprieta\"><\/a>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">Active<\/span>: <\/strong><span style=\"color: #000000;\">se assegnato a <em>True<\/em>, la tabella viene aperta e la query SQL specificata viene eseguita, recuperando i dati. Se assegnata a <em>False<\/em> la tabella viene chiusa.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">AllowAllRecords<\/span><\/strong>: <span style=\"color: #000000;\">se assegnato a&nbsp;<em>True<\/em>, e la query SQL specificata \u00e8 del tipo &#8220;select * from &lt;tabella&gt;&#8221;, al momento dell&#8217;apertura tutti i record contenuti in &lt;tabella&gt; vengono caricati. Se \u00e8 assegnato a <em>False<\/em>, non viene caricato alcun record al momento in cui la tabella viene aperta, ma viene assegnata solo la struttura. I record verranno caricati al momento in cui si utilizzeranno i metodi <strong>FindKey<\/strong> oppure <strong>SetRange&nbsp;<\/strong>dell&#8217;oggetto <strong>RowSet<\/strong>. Il default di questa propriet\u00e0 \u00e8&nbsp;<em>True<\/em>.&nbsp;<\/span><br \/>\n<span style=\"color: #000000;\">N.B. \u00e8 fortemente consigliabile assegnare questa propriet\u00e0 a&nbsp;<em>False<\/em> quando la tabella che viene interrogata contiene molti records e non si ha necessit\u00e0 di esaminarli tutti, ma verranno utilizzati i suddetti metodi per caricare solo i dati di interesse.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Database<\/span><\/strong>: oggetto di tipo <strong>QWDatabase<\/strong> che contiene il database al quale l&#8217;oggetto QWTable si deve collegare.<\/li>\n<li><strong><span style=\"color: #993300;\">Indexes<\/span><\/strong><span style=\"color: #993300;\">: <\/span><span style=\"color: #000000;\"><span style=\"color: #000000;\">array associativo contenente l&#8217;elenco degli indici utilizzabili per le ricerche e i filtraggi effettuati con <strong>FindKey<\/strong> e <strong>SetRange<\/strong>. Gli indici sono virtuali (non devono cio\u00e8 corrispondere ad un indice fisico sulla tabella) e possono essere creati nel seguente modo: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\">q.Indexes(\"&lt;nome indice&gt;\")=\"&lt;campo1&gt;,&lt;campo2&gt;,...\"<\/code>. Si pu\u00f2 impostare un indice virtuale come indice corrente della tabella utilizzando il metodo <strong>SetIndex<\/strong>&nbsp;dell&#8217;oggetto RowSet.<br \/>\nN.B. la chiave primaria \u00e8 l&#8217;indice impostato di default e non deve essere assegnata a questo array associativo.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Params<\/span><\/strong>: array associativo da utilizzare per assegnare i parametri della query SQL, con la seguente modalit\u00e0: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\">q.params(\"&lt;nome parametro&gt;\")=&lt;valore&gt;<\/code><span style=\"color: #000000;\">.<br \/>\nNOTA: i parametri devono essere assegnati dopo la query e prima di <code>Active = True<\/code>.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">SQL<\/span><\/strong><span style=\"color: #000000;\">: query SQL da eseguire. Eventuali parametri devono essere preceduti dal carattere &#8220;:&#8221;, mentre il nome pu\u00f2 essere arbitrario.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">RequestLive<\/span><\/strong><span style=\"color: #000000;\"><span style=\"color: #000000;\">: assegnare a&nbsp;<em>False<\/em> se l&#8217;oggetto non verr\u00e0 utilizzato per aggiornare i dati a&nbsp;<em>True<\/em> altrimenti. In quest&#8217;ultimo caso, la query non pu\u00f2 contenere clausole JOIN o funzioni di aggregazione, ma deve ritornare i dati da una sola tabella con l&#8217;unica possibilit\u00e0, eventualmente, di utilizzare la clausola WHERE. <\/span>Il default di questa propriet\u00e0 \u00e8&nbsp;<em>True<\/em>.&nbsp;<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">DontExecuteTrigger<span style=\"color: #000000;\">: <\/span><\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">assegnare a <i>True <\/i>per inibire l&#8217;esecuzione di eventuali <a href=\"https:\/\/help.qualiware.it\/qw-help\/qwntsec_trigger_cfgform\/\">trigger<\/a> attivati dall&#8217;aggiornamento della tabella<\/span><\/span><span style=\"color: #993300;\"><span style=\"color: #000000;\">.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Do_Log<span style=\"color: #000000;\">: <\/span><\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">assegnare a <i>False <\/i>per inibire la registrazione su LOGDOC degli aggiornamenti effettuati sulla tabella. Deve essere assegnato dopo l&#8217;assegnazione &#8220;Active=True&#8221;.<\/span><\/span><\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWTable_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">AbandonRecord()<\/span><\/strong>: abbandona le modifiche effettuate al record corrente, riportando i valori nel buffer a quelli presenti nel database.<\/li>\n<li><strong><span style=\"color: #993300;\">BeginAppend()<\/span><\/strong>: aggiunge un record vuoto alla tabella, ed il puntatore si sposter\u00e0 automaticamente su di esso.<\/li>\n<li><strong><span style=\"color: #993300;\">CancellaRecords(&lt;msgerr&gt;)<\/span><\/strong>: cancella tutti i record nella tabella, ritornando&nbsp;<em>True<\/em> se l&#8217;operazione \u00e8 andata a buon fine,&nbsp;<em>False<\/em> altrimenti. In quest&#8217;ultimo caso, la variabile &lt;msgerr&gt; restituisce l&#8217;errore.<\/li>\n<li><strong><span style=\"color: #993300;\">Delete(&lt;msgerr&gt;)<\/span><\/strong>: cancella il record corrente, ritornando <em>True<\/em> se l&#8217;operazione \u00e8 andata a buon fine,&nbsp;<em>False<\/em> altrimenti. In quest&#8217;ultimo caso, la variabile &lt;msgerr&gt; restituisce l&#8217;errore.<\/li>\n<li><strong><span style=\"color: #993300;\">Replace(&lt;nome campo&gt;,&lt;valore&gt;)<\/span><\/strong><span style=\"color: #000000;\">: assegna al campo &lt;nome campo&gt; il valore &lt;valore&gt; per la riga corrente.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">Requery()<\/span><\/strong>: esegue nuovamente la query.<\/li>\n<li><strong><span style=\"color: #993300;\">SaveRecord(&lt;errmsg&gt;)<\/span><\/strong>: salva sul database le modifiche alla riga corrente,&nbsp;ritornando&nbsp;<em>True<\/em> se l&#8217;operazione \u00e8 andata a buon fine,&nbsp;<em>False<\/em> altrimenti. In quest&#8217;ultimo caso, la variabile &lt;msgerr&gt; restituisce l&#8217;errore.<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWTable_Esempio\"><\/a>Esempi<\/h4>\n<p>Il seguente esempio mostra come aprire la tabella Articoli e aggiungere un record<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim DB As New QWDatabase(\"SQL SERVER\", False)\r\nDB.ServerName = \"serverqw\"\r\nDB.DatabaseName = \"qualiware\r\nDB.LoginString = \"sa\/12334!#\"\r\nDB.Active=true\r\n\r\nDim q as new QWTable\r\nq.DataBase=DB\r\nq.Sql=\"select * from ARTIC\"\r\nq.RequestLive=True\r\nq.AllowAllRecords=False\r\nq.Active=True\r\n\r\nq.BeginAppend()\r\nq.Replace(\"CODICE\",\"010\")\r\nq.Replace(\"DESCRIZION\",\"Descrizione 010\")\r\nq.Replace(\"UNMIS\",\"PZ\")\r\n\r\nDim ok as Boolean\r\nDim msg as String=\"\"\r\nok=q.SaveRecord(msg)\r\nIf not ok\r\n   form.Alert(msg)\r\nEnd If\r\n\r\nq.Active=false<\/pre>\n<p>Il seguente esempio mostra come scorrere tutti i record di una tabella, aggiornandoli, dopo avere selezionato quelli di interesse tramite il metodo RowSet.SetRange.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim ok as Boolean \r\nDim msg as String=\"\" \r\nDim q as new QWTable\r\nq.DataBase=DB\r\nq.Sql=\"select * from VARIAB\"\r\nq.RequestLive=True\r\nq.AllowAllRecords=False\r\nq.Active=True\r\n\r\nq.RowSet.SetRange(\"010\") ' Il primo campo della chiave primaria di VARIAB \u00e8 il codice articolo, e seleziona tutte le variabili dell'articolo \"010\"\r\nwhile ok and not q.RowSet.EndOfSet\r\n      q.Replace(\"NOTE\",\"\")\r\n      ok=q.SaveRecord(msg)\r\n      If not ok\r\n         form.Alert(msg)\r\n      End If\r\n      q.RowSet.Next()\r\nEnd While\r\n\r\nq.Active=false<\/pre>\n<p>Il seguente esempio apre una tabella specificando i parametri<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim q as new QWTable()\r\nq.DataBase=DB\r\nq.Sql=\"select * from VARIAB v join ARTIC a on a.CODICE=v.CODICE where a.CODICE=:CODICE\"\r\nq.RequestLive=False\r\nq.AllowAllRecords=False\r\nq.Params(\"CODICE\")=\"010\"\r\nq.Active=True\r\n<\/pre>\n<p>Il seguente esempio cerca un record in una tabella utilizzando FindKey<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim q as new QWTable()\r\nq.DataBase=DB\r\nq.Sql=\"select * from CLIFOR\"\r\nq.RequestLive=False\r\nq.AllowAllRecords=False\r\nq.Active=True\r\n\r\nif q.Rowset.FindKey(\"C0001\")\r\n   ........<\/pre>\n<p>Il seguente esempio applica un filtro ad una tabella, utilizzando un indice virtuale.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim t as New QWTable() \r\nt.DataBase=DB \r\nt.Sql=\"select * from DOCUMENT\" \r\nt.RequestLive=False \r\nt.AllowAllRecords=False \r\nt.Active=True\r\n\r\nt.Indexes(\"virtualIndex\") = \"TIPO,TIPO_CONT\"\r\nt.RowSet.SetIndex(\"virtualIndex\")\r\nt.RowSet.SetRange(\"AUDIT\", \"ISO\") ' filtra tutti i documenti di tipo \"AUDIT\" e sottotipo \"ISO\"\r\n\r\nt.RowSet.BeginFilter()\r\nt.RowSet.Fields(\"NUMBER1\").value = 2023\r\nt.RowSet.ApplyFilter() ' filtra tutti i documenti PROVE che hanno NUMBER1=2023\r\n<\/pre>\n<p><a name=\"QDaemonTableDef\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>QDaemonTableDef<\/h2>\n<p>Classe utilizzata per effettuare in modo pratico l\u2019importazione di un set di dati in una tabella di QualiWare.<\/p>\n<h4>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #990000;\">Gest_name<\/span><\/strong>: Nome del file (comprensivo di percorso) nel caso in cui l\u2019importazione debba essere fatta da file CSV<\/li>\n<li><strong><span style=\"color: #990000;\">Gest_sql<\/span><\/strong>: query SQL da eseguire per avere i dati da importare nel caso l\u2019importazione avvenga da database. Da notare che la query \u00e8 sempre eseguita sul database di QualiWare, pertanto per importare dati da un database esterno quest\u2019ultimo dovr\u00e0 essere interrogabile dal database di QualiWare, eventualmente configurando un Linked Server o una Materialized View.<\/li>\n<li><span style=\"color: #990000;\"><strong>Gest_Separator<\/strong><\/span>: Separatore del file nel caso l\u2019importazione venga fatta da file CSV. Pu\u00f2 assumere i valori \u201cTabDelimited\u201c, \u201cCSVDelimited\u201d (default), \u201cDelimited(&lt;carattere delimitatore&gt;)\u201c, \u201cFixedLength\u201c. Quest\u2019ultima opzione \u00e8 disponibile dalla versione 2015.17.2i e va usata nel caso le colonne non siano separate da un separatore ma abbiano lunghezza fissa.<\/li>\n<li><span style=\"color: #990000;\"><strong>Gest_ColumnNames<\/strong><\/span>: oggetto DBArray che contiene i nomi da attribuire alle colonne del file CSV nel caso in cui l\u2019intestazione NON contenga il nome delle colonne. Se questo oggetto non viene assegnato, \u00e8 necessario che la prima riga del file contenga i nomi delle colonne. Nel caso in cui il formato sia a lunghezza fissa (Gest_Separator=\u201dFixedLength\u201d) \u00e8 necessario specificare oltre al nome della colonna anche la lunghezza, aggiungendo la stringa \u201d text width &lt;lunghezza&gt;\u201c.<\/li>\n<li><span style=\"color: #990000;\"><strong>Gest_CharacterSet<\/strong><\/span>: specifica il character set del file. Pu\u00f2 essere \u201cANSI\u201d, \u201cOEM\u201d o \u201c65001\u201d (=UTF-8). Per importare file contenenti caratteri in alfabeti come il cirillico, l\u2019ebraico o il greco, usare \u201cANSI\u201d o \u201c65001\u201d.<\/li>\n<li><strong><span style=\"color: #990000;\">Q95_name<\/span><\/strong>: Nome tabella del database di QualiWare nella quale verranno copiati i dati<\/li>\n<li><span style=\"color: #990000;\"><strong>Keys<\/strong><\/span>: oggetto DBArray contenente i campi che compongono la chiave che verr\u00e0 usata nella tabella di destinazione per verificare se il record \u00e8 gi\u00e0 esistente<\/li>\n<li><span style=\"color: #990000;\"><strong>Campi<\/strong><\/span>: oggetto AssocArray che definisce la mappatura dei campi. La chiave \u00e8 il nome del campo sulla tabella di QualiWare, mentre il contenuto pu\u00f2 essere o il nome della colonna nel file\/tabella di partenza oppure un CodeBlock (espressione lambda VB.NET) che effettua il calcolo del valore a partire da uno o pi\u00f9 campi della tabella di origine. Al CodeBlock vengono passati due parametri: il primo \u00e8 l\u2019oggetto Fields del file\/tabella di partenza, il secondo \u00e8 l\u2019oggetto Fields della tabella di QualiWare di destinazione.<br \/>\n\u00c8&nbsp;possibile non specificare alcuna mappatura, nel qual caso verr\u00e0 effettuata una mappatura automatica in base al nome dei campi.<\/li>\n<li><span style=\"color: #990000;\"><strong>AfterSave<\/strong><\/span>: CodeBlock da eseguire dopo il salvataggio di una riga. Deve richiedere obbligatoriamente un parametro cui viene passato l\u2019oggetto QWTable che contiene la tabella di destinazione.<\/li>\n<\/ul>\n<p>Per maggiori informazioni, consultare la pagina <strong><a href=\"https:\/\/help.qualiware.it\/qw-help\/qwntsec_task_cfgform\/\">Configurazione script per task<\/a><\/strong> dedicata all\u2019oggetto.<\/p>\n<p>&nbsp;<\/p>\n<p><a name=\"DBArray\"><\/a><\/p>\n<h2>DBArray<\/h2>\n<p>La classe DBArray \u00e8 una implementazione di un array monodimensionale ad espansione dinamica. Gli elementi dell&#8217;array possono essere di qualsiasi tipo (stringa, numero, oggetti).<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim A as new DBArray(&lt;elemento 1&gt;, &lt;elemento 2&gt;, ...)<\/pre>\n<p>dove &lt;elemento 1&gt;, &lt;elemento 2&gt;, &#8230; rappresentano gli elementi da inserire nell&#8217;array creato. Se non vengono specificati, l&#8217;array verr\u00e0 creato senza elementi (dimensione zero).<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Proprieta\"><\/a>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">Size<\/span><\/strong>: restituisce la dimensione corrente dell&#8217;array.<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">Add(&lt;elemento&gt;)<\/span><\/strong>: aggiunge l&#8217;elemento specificato aumentando di una unit\u00e0 la dimensione dell&#8217;array.<\/li>\n<li><strong><span style=\"color: #993300;\">Delete(&lt;indice&gt;)<\/span><\/strong>: elimina l&#8217;elemento nella posizione &lt;indice&gt; (la prima posizione \u00e8 la numero &#8220;1&#8221;), diminuendo di una unit\u00e0 la dimensione dell&#8217;array<\/li>\n<li><strong><span style=\"color: #993300;\">Dir(&lt;percorso&gt;)<\/span><\/strong>: alimenta l&#8217;array con l&#8217;elenco dei file contenuti nel percorso specificato. E&#8217; possibile inserire anche percorsi con wildcard.<\/li>\n<li><strong><span style=\"color: #993300;\">Item(&lt;indice&gt;)<\/span><\/strong>: restituisce l&#8217;elemento nella posizione &lt;indice&gt;. Per recuperare un elemento \u00e8 comunque possibile omettere &#8220;Item&#8221; e indicizzare direttamente l&#8217;oggetto.<\/li>\n<li><strong><span style=\"color: #993300;\">Scan(&lt;elemento&gt;)<\/span><\/strong>: determina l&#8217;indice dell'&lt;elemento&gt; nell&#8217;array, restituendo &#8220;0&#8221; se non esiste. NOTA: &lt;elemento&gt; deve essere dello stesso tipo dell&#8217;elemento che si vuole trovare. Ad esempio, se l&#8217;array contiene elementi di tipo &#8220;Int16&#8221;, \u00e8 necessario assegnare l&#8217;elemento da cercare ad una variabile dello stesso tipo, o oppure, se \u00e8 una costante, convertirla in tale tipo usando CType.<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Esempio\"><\/a>Esempio<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim a as new DBArray()\r\na.Add(\"Italia\")\r\na.Add(\"Inghilterra\")\r\n....\r\n\r\nIf a.Scan(\"Spagna\")=0\r\n   a.Add(\"Spagna\")\r\nEnd If<\/pre>\n<p><a name=\"QWSession\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>QWSession<\/h2>\n<p>La classe QWSession consente di accedere ad informazioni relative alla sessione utente.<\/p>\n<h4 align=\"left\"><a name=\"QWSession_Costruttore\"><\/a>Costruttore<\/h4>\n<p>L&#8217;oggetto non ha costruttore, ma deve essere recuperato utilizzando il metodo <strong>form.GetSession()<\/strong> o la propriet\u00e0 <strong>DB.QWSession<\/strong>.<\/p>\n<h4 align=\"left\"><a name=\"QWSession_Proprieta\"><\/a>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">DataBase<\/span>: <\/strong>oggetto QWDataBase associato alla sessione.<\/li>\n<li><strong><span style=\"color: #993300;\">DocumentDirectoryPath<\/span>: <\/strong>percorso in cui sono archiviati i files fisici della gestione documentale.<\/li>\n<li><strong><span style=\"color: #993300;\">LinkedDocumentDirectoryPath<\/span>: <\/strong>percorso in cui sono archiviati i file collegati<\/li>\n<li><strong><span style=\"color: #993300;\">TempDirectoryPath<\/span>: <\/strong>percorso in cui \u00e8 possibile archiviare temporaneamente i file. Questa cartella viene periodicamente svuotata dal sistema.<\/li>\n<li><strong><span style=\"color: #993300;\">UserCode<\/span><\/strong>: codice dell&#8217;utente cui appartiene la sessione.<\/li>\n<li><strong><span style=\"color: #993300;\">UserMail<\/span><\/strong>: e-mail dell&#8217;utente cui appartiene la sessione.<\/li>\n<li><strong><span style=\"color: #993300;\">UserName<\/span><\/strong>: nome dell&#8217;utente cui appartiene la sessione.<\/li>\n<li><strong><span style=\"color: #993300;\">UserBUs<\/span><\/strong>: oggetto DBArray contenente i codici degli enti cui l&#8217;utente appartiene.<\/li>\n<li><strong><span style=\"color: #993300;\">Language<\/span><\/strong>: codice della lingua corrente dell&#8217;interfaccia.<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWSession_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">GetDocumentPath(&lt;codice documento&gt;)<\/span><\/strong>: restituisce il percorso completo del file corrispondente al documento il cui codice \u00e8 passato come argomento.<\/li>\n<li><strong><span style=\"color: #993300;\">GetDocumentPDFPath(&lt;codice documento&gt;)<\/span><\/strong>: restituisce il percorso completo della versione PDF del file (o del report)&nbsp; del documento il cui codice \u00e8 passato come argomento. Se non esiste, viene restituita una stringa vuota.<\/li>\n<li><strong><span style=\"color: #993300;\">GetDocumentCategoryPath(&lt;codice categoria&gt;,&lt;tipo directory&gt;)<\/span><\/strong>: restituisce il percorso dei file relativi alla categoria il cui codice \u00e8 specificato nel parametro &lt;codice categoria&gt;. Se il parametro &lt;tipo directory&gt; non \u00e8 specificato o vale zero viene restituito il percorso base; se vale 1 viene restituito il percorso dei file in attesa di pubblicazione; se vale &#8220;2&#8221; viene restituito il percorso dei file pubblicati; se vale &#8220;3&#8221; viene restituito il percorso dei file obsoleti.<\/li>\n<li><strong><span style=\"color: #993300;\">GetLocalTempFileName(&lt;estensione&gt;)<\/span><\/strong>: restituisce un percorso di file unico con l&#8217;estensione specificata nella cartella locale dell&#8217;applicazione (generalmente &#8220;c:\\program files (x86)\\QualiWare Web Server\\temp&#8221;). L&#8217;estensione deve comprendere il &#8220;.&#8221;.<\/li>\n<li><strong><span style=\"color: #993300;\">GetServerTempFileName(&lt;estensione&gt;)<\/span><\/strong>: restituisce un percorso di file unico con l&#8217;estensione specificata nella sottocartella &#8220;_files_temporanei&#8221; della cartella condivisa sul file server. L&#8217;estensione deve comprendere il &#8220;.&#8221;.<\/li>\n<li><strong><span style=\"color: #993300;\">AllowClientQuery(&lt;query&gt;)<\/span><\/strong>: abilita una query per essere eseguita in un evento Javascript attraverso la funzione <strong>$.QualiWare.executeQuery<\/strong>. Pu\u00f2 essere utilizzato nell&#8217;EventoCarica. Dal momento che la query stessa pu\u00f2 essere modificata dinamicamente nell&#8217;evento Javascript, ad esempio aggiungendo i filtri nella clausola WHERE, non \u00e8 necessario specificarla completamente nel parametro &lt;query&gt;, ma \u00e8 sufficiente inserire la parte costante, ad esempio la parte SELECT.<\/li>\n<\/ul>\n<p>NOTA: per quanto riguarda i metodi relativi al percorso del documento, con &#8220;codice&#8221; si intende il campo <code>_CODDOC<\/code> del documento in oggetto.<\/p>\n<p>&nbsp;<\/p>\n<p><a name=\"AssocArray\"><\/a><\/p>\n<h2>AssocArray<\/h2>\n<p>La classe AssocArray \u00e8 una implementazione di quello che \u00e8 comunemente chiamato &#8220;dizionario&#8221;, che consiste in un array monodimensionale dove l&#8217;indice non \u00e8 un numero ma una chiave alfanunumerica. Gli elementi dell&#8217;array possono essere di qualsiasi tipo (stringa, numero, oggetti).<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim A as new AssocArray()<\/pre>\n<h4 align=\"left\"><a name=\"QWDatabase_Proprieta\"><\/a>Propriet\u00e0<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">FirstKey<\/span><\/strong>: restituisce la prima chiave dell&#8217;array. N.B. le chiavi non sono in ordine alfabetico<\/li>\n<li><strong><span style=\"color: #993300;\">Size<\/span><\/strong>: restituisce la dimensione corrente dell&#8217;array.<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">Dir(&lt;percorso&gt;)<\/span><\/strong>: alimenta l&#8217;array con l&#8217;elenco dei file contenuti nel percorso specificato. E&#8217; possibile inserire anche percorsi con wildcard.<\/li>\n<li><strong><span style=\"color: #993300;\">isKey(&lt;chiave&gt;)<\/span><\/strong>: ritorna <em>true <\/em>se la chiave specificata \u00e8 presente<em>, false <\/em>altrimenti<em>.<\/em><\/li>\n<li><strong><span style=\"color: #993300;\">Item(&lt;chiave&gt;)<\/span><\/strong>: restituisce l&#8217;elemento corrispondente alla chiave specificata. Per recuperare un elemento \u00e8 comunque possibile omettere &#8220;Item&#8221; e indicizzare direttamente l&#8217;oggetto.<\/li>\n<li><strong><span style=\"color: #993300;\">Remove(&lt;chiave&gt;)<\/span><\/strong>: elimina l&#8217;elemento corrispondente alla chiave specificata.<\/li>\n<li><strong><span style=\"color: #993300;\">NextKey(&lt;chiave&gt;)<\/span><\/strong><span style=\"color: #000000;\">: restituisce la chiave successiva a quella specificata. Se non c&#8217;\u00e8, ritorna nothing.<\/span><\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Esempio\"><\/a>Esempio<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim a as new AssocArray()\r\na(\"Italia\")=\"0039\"\r\na(\"Francia\")=\"0033\"\r\n\r\nDim k as String=a.FirstKey\r\nDim dato as String\r\nwhile not k is nothing\r\n    dato=a(k)\r\n\r\n    k=a.NextKey(k)\r\nEnd While<\/pre>\n<p><a name=\"QWMail\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>QWMail<\/h2>\n<p>La classe QWMail consente la creazione e l&#8217;invio di messaggi e-mail.<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim qmail as new QWMail()\r\n\r\n' oppure, se si vuole che per ogni invio mail venga effettuata una registrazione su LOGDOC con IDDOC='**' e CODDOC='MAIL'\r\nDim qmail as new QWMail(&lt;sessione&gt;)\r\n<\/pre>\n<h4 align=\"left\"><a name=\"QWDatabase_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">MsgCreate()<\/span><\/strong>: crea un nuovo messaggio.<\/li>\n<li><strong><span style=\"color: #993300;\">MsgFrom(&lt;e-mail mittente&gt;)<\/span><\/strong>: definisce la e-mail del mittente<\/li>\n<li><strong><span style=\"color: #993300;\">MsgAddDest(&lt;e-mail&gt;,&lt;tipo&gt;)<\/span><\/strong>: aggiunge un destinatario. Il parametro tipo pu\u00f2 assumere i seguenti valori: 1-&gt;destinatario, 2-&gt;per conoscenza, 3-&gt;nascosto.<\/li>\n<li><strong><span style=\"color: #993300;\">MsgSubject(&lt;oggetto&gt;)<\/span><\/strong>: definisce l&#8217;oggetto del messaggio.<\/li>\n<li><strong><span style=\"color: #993300;\">MsgText(&lt;testo&gt;)<\/span><\/strong>: definisce il testo del messaggio, che pu\u00f2 essere in formato HTML.<\/li>\n<li><strong><span style=\"color: #993300;\">MsgAttachment(&lt;nome&gt;,&lt;percorso&gt;)<\/span><\/strong><span style=\"color: #000000;\">: aggiunge come allegato il file che si trova nel percorso specificato nel parametro &lt;percorso&gt;, dandogli il nome specificato nel parmetro &lt;nome&gt;<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">MsgShow(&lt;form&gt;)<\/span><\/strong><span style=\"color: #000000;\">: visualizza il messaggio. Nel parametro &lt;form&gt; deve essere specificato un riferimento al form che crea il messaggio.<\/span><\/li>\n<li><strong><span style=\"color: #993300;\">MsgSend(&lt;errore&gt;)<\/span><\/strong><span style=\"color: #000000;\">: invia il messaggio senza visualizzarlo. Ritorna&nbsp;<em>false <\/em>in caso di errore<em>,&nbsp;<\/em>con la descrizione dell&#8217;errore stesso nel parametro &lt;errore&gt;<\/span><\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Esempio\"><\/a>Esempio<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim qmail As New QWMail()\r\nqmail.MsgCreate()\r\nqmail.MsgFrom(\"noreply@qualiware.it\")\r\nqmail.MsgAddDest(\"jdoe@qualiware.it\", 1) \r\nqmail.MsgSubject(\"Oggetto della mail\")\r\nqmail.MsgText(\"Testo della mail\")\r\nqmail.MsgAttachment(\"allegato.PDF\", filepath)\r\nqmail.MsgShow(form)<\/pre>\n<p><a name=\"QWExcel\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>QWExcel<\/h2>\n<p>La classe QWExcel consente di creare, modificare e leggere file Excel.<\/p>\n<h4 align=\"left\"><a name=\"QWDatabase_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim QWExcel as new QWExcel()<\/pre>\n<h4 align=\"left\"><a name=\"QWDatabase_Metodi\"><\/a>Metodi<\/h4>\n<ul>\n<li><strong><span style=\"color: #993300;\">NewWorkbook(&lt;filename&gt;)<\/span><\/strong>: crea un nuovo file Excel nel percorso specificato<\/li>\n<li><strong><span style=\"color: #993300;\">Open(&lt;filename&gt;)<\/span><\/strong>: apre un file Excel dal percorso specificato<\/li>\n<li><strong><span style=\"color: #993300;\">SetActiveWorksheet(&lt;name&gt;)<\/span><\/strong>: rende attivo il foglio di lavoro dal nome specificato. Tutte le istruzioni di lettura e scrittura si riferiscono al foglio di lavoro attivo. Si noti che all&#8217;apertura di un file Excel non c&#8217;\u00e8 nessun foglio attivo di default.<\/li>\n<li><strong><span style=\"color: #993300;\">Save()<\/span><\/strong>: salva il foglio di lavoro aperto.<\/li>\n<li><strong><span style=\"color: #993300;\">ReadBoolean(&lt;row&gt;,&lt;column&gt;)<\/span><\/strong>: ritorna il valore boolean presente nella cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">ReadDate(&lt;row&gt;,&lt;column&gt;)<\/span><\/strong>: ritorna il valore datetime presente nella cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">ReadString(&lt;row&gt;,&lt;column&gt;)<\/span><\/strong>: ritorna il valore stringa presente nella cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">ReadInteger(&lt;row&gt;,&lt;column&gt;)<\/span><\/strong>: ritorna il valore intero presente nella cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">ReadFloat(&lt;row&gt;,&lt;column&gt;)<\/span><\/strong>: ritorna il valore numerico presente nella cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">WriteBoolean(&lt;row&gt;,&lt;column&gt;,&lt;bool&gt;)<\/span><\/strong>: assegna il valore booleano &lt;bool&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">WriteDate(&lt;row&gt;,&lt;column&gt;,&lt;datetime&gt;)<\/span><\/strong>: assegna il valore &lt;datetime&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">WriteString(&lt;row&gt;,&lt;column&gt;,&lt;string&gt;)<\/span><\/strong>: assegna il valore &lt;string&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">WriteInteger(&lt;row&gt;,&lt;column&gt;,&lt;int&gt;)<\/span><\/strong>: assegna il valore intero &lt;int&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">WriteFloat(&lt;row&gt;,&lt;column&gt;,&lt;float&gt;)<\/span><\/strong>: assegna il valore numerico &lt;float&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">SetCellBackColor(&lt;row&gt;,&lt;column&gt;,&lt;color&gt;)<\/span><\/strong>: assegna il colore di sfondo &lt;color&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<li><strong><span style=\"color: #993300;\">SetCellForeColor(&lt;row&gt;,&lt;column&gt;,&lt;color&gt;)<\/span><\/strong>: assegna il colore di primo piano &lt;color&gt; alla cella di cui vengono specificate le coordinate numeriche nei parametri &lt;row&gt; e &lt;column&gt;<\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"QWDatabase_Esempio\"><\/a>Esempio<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim x As QWExcel = New QWExcel\r\nx.Open(\"c:\\temp\\file.xlsx\")\r\nx.WriteString(1,1,\"Prova\")\r\nx.WriteDate(1,2,Today())\r\nx.Save()\r\n<\/pre>\n<p><a name=\"Zipper\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>Zipper<\/h2>\n<p>La classe Zipper consente di aprire creare file zip e di estrarne il contenuto.<\/p>\n<h4 align=\"left\"><a name=\"Zipper_Costruttore\"><\/a>Costruttore<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\" data-enlighter-linenumbers=\"false\">Dim zipper as new Zipper<\/pre>\n<h4 align=\"left\">Metodi<\/h4>\n<ul>\n<li><span style=\"color: #993300;\"><strong>GenerateZipFile(&lt;zipFilePath&gt;, &lt;files&gt;, &lt;optional filenames&gt;)<\/strong><span style=\"color: #000000;\">: genera un file zip nel percorso specificato dal parametro &lt;zipilePath&gt; con i file i cui percorsi sono contenuti nel parametro &lt;files&gt; che \u00e8 di tipo DBArray. Opzionalmente, \u00e8 possibile specificare i nomi dei file nel parametro di tipo DBArray &lt;filenames&gt;.<\/span><\/span><\/li>\n<li><strong><span style=\"color: #993300;\">ExtractZipFile(&lt;zipFilePath&gt;,&lt;targetPath&gt;)<\/span><\/strong>: estrae nella cartella il cui percorso \u00e8 specifiato nel parametro &lt;targetPath&gt; i file contenuti nel file il cui percorso \u00e8 specificato nel parametro &lt;zipFilePath&gt;<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>La piattaforma QualiWare consente di utilizzare tutte le funzioni e le classi dei linguaggi Visual Basic e C# messe a disposizione dalla piattaforma .NET 4.7.2 (vedere&nbsp;qui). Per rendere pi\u00f9 semplici le operazioni pi\u00f9 comuni, come quali la connessione ad un database, l&#8217;esecuzione di una query, l&#8217;aggiornamento di una tabella, o la gestione di array e&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[97],"tags":[268,264,265,269,266,272,270,271,267,282],"acf":[],"_links":{"self":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/27012"}],"collection":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/comments?post=27012"}],"version-history":[{"count":44,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/27012\/revisions"}],"predecessor-version":[{"id":38296,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/27012\/revisions\/38296"}],"wp:attachment":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/media?parent=27012"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/categories?post=27012"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/tags?post=27012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}