{"id":24779,"date":"2017-05-07T23:36:37","date_gmt":"2017-05-07T21:36:37","guid":{"rendered":"http:\/\/help.qualiware.it\/qw-help\/?p=24779"},"modified":"2024-11-19T21:34:09","modified_gmt":"2024-11-19T20:34:09","slug":"qwntsec_task_cfgform","status":"publish","type":"post","link":"https:\/\/help.qualiware.it\/qw-help\/qwntsec_task_cfgform\/","title":{"rendered":"Configurazione script per task"},"content":{"rendered":"<p>Il task da eseguire viene definito attraverso uno script in linguaggio Visual Basic.NET (VB.NET).<\/p>\n<p>Nello script \u00e8 possibile utilizzare <strong>primitive<\/strong> specifiche per il trasferimento dati da altri database, che nelle release precedenti alla 2015.17.2c era necessario programmare attraverso il servizio <strong>QDaemon<\/strong> il quale era basato sulla piattaforma client\/server, facendo uso del linguaggio dBase.<\/p>\n<p>Le primitive consentono di specificare la definizione della mappatura dei campi della tabella da trasferire in una modalit\u00e0 del tutto simile a quella utilizzata nella precedente versione di QDaemon, rendendo anche pi\u00f9 semplice la migrazione di script esistenti alla piattaforma web.<\/p>\n<p>Tale definizione della mappatura viene effettuata attraverso l&#8217;oggetto <a href=\"https:\/\/help.qualiware.it\/qw-help\/classi-di-supporto\/#:~:text=hanno%20NUMBER1%3D2023-,QDaemonTableDef,-Classe%20utilizzata%20per\"><strong>QDaemonTableDef<\/strong><\/a>.<br \/>\nUna volta&nbsp;assegnato l&#8217;oggetto QDaemonTableDef, \u00e8 necessario richiamare l&#8217;apposita primitiva di importazione, che ha la seguente sintassi:<\/p>\n<p><em><strong>QDaemonImportTable(&lt;oggetto database&gt;,&lt;nome tabella&gt;,&lt;oggetto TableDef&gt;)<\/strong><\/em><strong> ,&nbsp;<\/strong>dove:<\/p>\n<ul>\n<li><strong> &lt;oggetto database&gt;<\/strong> \u00e8 l&#8217;oggetto contenente il database rappresentato dalla variabile DB,<\/li>\n<li><strong>&lt;nome tabella&gt;<\/strong> \u00e8 una stringa contenente un nome convenzionale assegnato alla tabella\/file da importare e pu\u00f2 essere assegnato arbitrariamente,<\/li>\n<li><strong>&lt;oggetto QDaemonTableDef&gt;<\/strong> e l&#8217;oggetto di tipo <em>QDaemonTableDef<\/em> contenente la definizione della tabella\/file da importare e la mappatura dei campi.<\/li>\n<\/ul>\n<p>La primitiva <em>QDaemonImportTable<\/em> registra gli eventi sulla tabella LOGDOC con CODDOC=&#8217;QDAEMON&#8217;. Per verificare l&#8217;esito delle importazioni ed eventuali errori si pu\u00f2 utilizzare la funzionalit\u00e0 <strong>Consultazione LOG QualiWare Server Daemon<\/strong> selezionando l&#8217;opzione &#8220;Qdaemon&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<h2>Note sui CodeBlock<\/h2>\n<p>I CodeBlock possono essere utilizzati sia nella definizione dei campi sia nella propriet\u00e0 AfterSave. Le sintassi da utilizzare sono per\u00f2 diverse.<br \/>\nNel primo caso, il CodeBlock pu\u00f2 essere scritto in due modi:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">.campi(\"INVOICE_MONTH\")=Function (oFlds,oFldsQ) val(oFlds(\"INVOICE_MONTH\").value)<\/pre>\n<p>oppure<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">.campi(\"INVOICE_MONTH\")=Function (oFlds,oFldsQ) \r\n                             return val(oFlds(\"INVOICE_MONTH\").value)\r\n                         End Function<\/pre>\n<p>La differenza fra le due sintassi consiste nel fatto che la prima pu\u00f2 essere usata se il calcolo consiste in una sola funzione, la quale pu\u00f2 essere specificata direttamente dopo la parola chiave &#8220;Function&#8221; senza necessit\u00e0 di specificare &#8220;Return&#8221;. La seconda invece deve essere utilizzata quando il calcolo richiede pi\u00f9 istruzioni, e dovr\u00e0 essere utilizzata la parola chiave &#8220;Return&#8221; per restituire il risultato.<br \/>\nSi noti che la specifica del parametro &#8220;oFldsQ&#8221; non \u00e8 obbligatoria.<\/p>\n<p>Nel caso della propriet\u00e0 AfterSave, il CodeBlock non deve ritornare un valore, e la sintassi da utilizzare in quel caso sar\u00e0 come la seguente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">tabella.AfterSave=Sub (oTbl)\r\n                     oTbl.replace(\"DESCREXT\",oTbl.rowset.fields(\"DESCRIZION\").value)\r\n                     oTbl.saverecord()\r\n                  End Sub\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Esempi<\/h2>\n<p>Di seguito sono riportati alcuni esempi di script di importazione.<\/p>\n<h3>Importazione da una query, con AfterSave<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">dim tabella as new QDaemonTableDef\r\ntabella.gest_sql=\"select 'Z'+CODICE as CODICE, DESCRIZION, UNMIS, TIPO, UNCAMP from ARTIC where CODICE like 'ZZZ%'\"\r\ntabella.q95_name=\"ARTIC\"\r\ntabella.keys=new dbarray(\"CODICE\")\r\n\r\nwith tabella\r\n .campi(\"CODICE\")=\"CODICE\"\r\n .campi(\"DESCRIZION\")=\"DESCRIZION\"\r\n .campi(\"UNMIS\")=\"UNMIS\"\r\n .campi(\"TIPO\")=\"TIPO\"\r\n .campi(\"UNCAMP\")=Function (oFlds) 1\r\nend with\r\n\r\ntabella.AfterSave=Sub (oTbl)\r\n                     oTbl.replace(\"DESCREXT\",\"AfterSave\")\r\n                     oTbl.saverecord()\r\n                  End Sub\r\n\r\nQDaemonImportTable(DB,\"ARTIC\",tabella)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Importazione da file CSV delimitato da virgola, senza intestazioni e con doppi apici<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">dim tabella as new QDaemonTableDef\r\n\r\ntabella.gest_name=\"\\\\server\\csv\\Turnover.txt\"\r\ntabella.Gest_Separator=\"Delimited(,)\"\r\ntabella.gest_ColumnNames=new dbarray(\"INVOICE_YEAR\",\"ITEM_GROUP\",\"PRODUCT_LINE\",\"INVOICE_MONTH\",\"COUNTRY_CODE\",\"CUSTOMER_CODE\",\"CUSTOMER_NAME\",\"ITEM_CODE\",\"ITEM_DESCRIPTION\",\"QUANTITY\",\"TURNOVER\",\"COST_OF_SALES\",\"MARGIN\",\"EXTERNAL_SALES_REP\",\"BUSINESS_UNIT_CODE\",\"BUSINESS_UNIT_NAME\") \r\ntabella.q95_name=\"P_TURNOVER\"\r\ntabella.gest_CharacterSet=\"ANSI\"\r\ntabella.keys=new dbarray(\"INVOICE_YEAR\",\"INVOICE_MONTH\",\"CUSTOMER_CODE\",\"ITEM_CODE\",\"PROV\")\r\n\r\nwith tabella\r\n .campi(\"INVOICE_YEAR\")= (Function (oFlds) val(oFlds(\"INVOICE_YEAR\").value)) \r\n .campi(\"ITEM_GROUP\")=\"ITEM_GROUP\"\r\n .campi(\"PRODUCT_LINE\")=\"PRODUCT_LINE\"\r\n .campi(\"INVOICE_MONTH\")=Function (oFlds,oFldsQ) val(oFlds(\"INVOICE_MONTH\").value) \r\n .campi(\"COUNTRY_CODE\")=\"COUNTRY_CODE\"\r\n .campi(\"CUSTOMER_CODE\")=Function (oFlds) \"C\"+substr2(oFlds(\"CUSTOMER_CODE\").value,4) \r\n .campi(\"CUSTOMER_NAME\")=\"CUSTOMER_NAME\"\r\n .campi(\"ITEM_CODE\")=\"ITEM_CODE\" ' Chiave\r\n .campi(\"ITEM_DESCRIPTION\")=\"ITEM_DESCRIPTION\"\r\n .campi(\"QUANTITY\")=Function (oFlds) val(oFlds(\"QUANTITY\").value)\r\n .campi(\"TURNOVER\")=Function (oFlds) val(oFlds(\"TURNOVER\").value)\r\n .campi(\"COST_OF_SALES\")=Function (oFlds) isnull(val(oFlds(\"COST_OF_SALES\").value),0)\r\n .campi(\"MARGIN\")=Function (oFlds) isnull(val(oFlds(\"MARGIN\").value),0)\r\n .campi(\"EXTERNAL_SALES_REP\")=\"EXTERNAL_SALES_REP\"\r\n .campi(\"PROV\")=Function () 0\r\nend with\r\n\r\nQDaemonImportTable(DB,\"P_TURNOVER\",tabella)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Importazione da file CSV, delimitato da Tab e&nbsp;con intestazioni<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">dim tabella as new QDaemonTableDef\r\ntabella.gest_name=\"\\\\server\\csv\\artic.csv\"\r\ntabella.Gest_Separator=\"TabDelimited\"\r\ntabella.q95_name=\"ARTIC\"\r\ntabella.keys=new dbarray(\"CODICE\")\r\n\r\nwith tabella\r\n .campi(\"CODICE\")=\"CODICE\"\r\n .campi(\"DESCRIZION\")=\"DESCRIZION\"\r\n .campi(\"UNMIS\")=\"UNMIS\"\r\n .campi(\"TIPO\")=Function (oFlds) val(oFlds(\"TIPO\").value)\r\n .campi(\"UNCAMP\")=Function (oFlds) val(oFlds(\"UNCAMP\").value)\r\nend with\r\n\r\nQDaemonImportTable(DB,\"ARTIC\",tabella)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Importazione da file CSV delimitato da Tab e senza intestazioni<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">dim tabella as new QDaemonTableDef\r\n\r\ntabella.gest_name=\"\\\\server\\csv\\Turnover.txt\"\r\ntabella.Gest_Separator=\"TabDelimited\"\r\ntabella.gest_ColumnNames=new dbarray(\"INVOICE_YEAR\",\"ITEM_GROUP\",\"PRODUCT_LINE\",\"INVOICE_MONTH\",\"COUNTRY_CODE\",\"CUSTOMER_CODE\",\"CUSTOMER_NAME\",\"ITEM_CODE\",\"ITEM_DESCRIPTION\",\"QUANTITY\",\"TURNOVER\",\"COST_OF_SALES\",\"MARGIN\",\"EXTERNAL_SALES_REP\",\"BUSINESS_UNIT_CODE\",\"BUSINESS_UNIT_NAME\")\r\ntabella.q95_name=\"P_TURNOVER\"\r\ntabella.keys=new dbarray(\"INVOICE_YEAR\",\"INVOICE_MONTH\",\"CUSTOMER_CODE\",\"ITEM_CODE\",\"PROV\")\r\n\r\nwith tabella\r\n .campi(\"INVOICE_YEAR\")= (Function (oFlds) val(oFlds(\"INVOICE_YEAR\").value)) ' Chiave\r\n .campi(\"ITEM_GROUP\")=\"ITEM_GROUP\"\r\n .campi(\"PRODUCT_LINE\")=\"PRODUCT_LINE\"\r\n .campi(\"INVOICE_MONTH\")=Function (oFlds,oFldsQ) val(oFlds(\"INVOICE_MONTH\").value) ' Chiave\r\n .campi(\"COUNTRY_CODE\")=\"COUNTRY_CODE\"\r\n .campi(\"CUSTOMER_CODE\")=Function (oFlds) \"C\"+substr2(oFlds(\"CUSTOMER_CODE\").value,4) ' Chiave\r\n .campi(\"CUSTOMER_NAME\")=\"CUSTOMER_NAME\"\r\n .campi(\"ITEM_CODE\")=\"ITEM_CODE\" ' Chiave\r\n .campi(\"ITEM_DESCRIPTION\")=\"ITEM_DESCRIPTION\"\r\n .campi(\"QUANTITY\")=Function (oFlds) val(oFlds(\"QUANTITY\").value)\r\n .campi(\"TURNOVER\")=Function (oFlds) val(oFlds(\"TURNOVER\").value)\r\n .campi(\"COST_OF_SALES\")=Function (oFlds) isnull(val(oFlds(\"COST_OF_SALES\").value),0)\r\n .campi(\"MARGIN\")=Function (oFlds) isnull(val(oFlds(\"MARGIN\").value),0)\r\n .campi(\"EXTERNAL_SALES_REP\")=\"EXTERNAL_SALES_REP\"\r\n .campi(\"PROV\")=Function () 0\r\nend with\r\n\r\nQDaemonImportTable(DB,\"P_TURNOVER\",tabella)<\/pre>\n<p>&nbsp;<\/p>\n<h3>Importazione di dati tramite WebService<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">' Il seguente frammento di codice fornisce un esempio di come sia possibile acquisire informazioni da un \r\n' un servizio esterno di rilevazione dati tramite la chiamata ad un WebService utilizzando una URL che restituisce una stringa XML.\r\n' Nella fattispecie, viene utilizzato il Web Service messo a disposizione dal sistema di monitoraggio dei \r\n' pannelli fotovoltaici SolarEdge )\r\n\r\n' L'output \u00e8 il seguente:\r\n' &lt;series&gt;\r\n'    &lt;timeUnit&gt;HOUR&lt;\/timeUnit&gt;\r\n'    &lt;unit&gt;Wh&lt;\/unit&gt;\r\n'    &lt;measuredBy&gt;INVERTER&lt;\/measuredBy&gt;\r\n'    &lt;values&gt;\r\n'      &lt;dateValue&gt;\r\n'         &lt;date&gt;2017-05-08 00:00:00&lt;\/date&gt;\r\n'         &lt;value&gt;0.0&lt;\/value&gt;\r\n'      &lt;\/dateValue&gt;\r\n' ....\r\n'    &lt;\/values&gt;\r\n' &lt;\/series&gt;\r\n\r\n' I dati vengono recuperati su base giornaliera (per il giorno corrente) e memorizzati nella tabella IOTLOG\r\nDim Q as new QWTable\r\nQ.Database=DB\r\nQ.sql=\"select * from IOTLOG\"\r\nQ.allowallrecords=false\r\nQ.active=true\r\n\r\nDim d as string=ltrim(dbase.str(Today.Year))+\"-\"+ltrim(dbase.str(Today.Month))+\"-\"+ltrim(dbase.str(Today.Day))\r\nDim url As String = \"https:\/\/monitoringapi.solaredge.com\/site\/349661\/energy.xml?timeUnit=HOUR&amp;endDate=\"+d+\"&amp;startDate=\"+d+\"&amp;api_key=KDZ46QJYX2HQPIVPJY7KX3R9HA7ULNRG\" \r\n\r\nDim webClient As New System.Net.WebClient\r\nDim result As String = webClient.DownloadString(Url)\r\n\r\n' Recupero della risposta\r\nDim response = System.XML.Linq.XElement.Parse(result)\r\n\r\nfor each el as System.XML.Linq.Xelement in response.LastNode.Nodes ' Il LastNode \u00e8 \"Values\", e ne estrae tutti i nodi\r\n ' Il quarto nodo \u00e8 quello dei Values\r\n Dim Data As String\r\n Dim Valore as String\r\n\r\n Data=Ctype(el.FirstNode,System.Xml.Linq.Xelement).Value\r\n dim da as System.datetime=System.Datetime.parse(data)\r\n Valore=Ctype(el.LastNode,System.Xml.Linq.Xelement).Value \r\n\r\n if Valore&lt;&gt;\"null\"\r\n    if not q.rowset.findkey(da,\"SOLAR\",\"SITE1\")\r\n    q.beginappend()\r\n    q.replace(\"DATA\",da)\r\n    q.replace(\"DEVICENAME\",\"SOLAR\")\r\n    q.replace(\"SENSORNAME\",\"SITE1\")\r\n End If\r\n\r\n q.replace(\"VALUE\",val(Valore))\r\n q.saverecord()\r\n End If \r\nnext\r\n\r\nQ.active=false<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Il task da eseguire viene definito attraverso uno script in linguaggio Visual Basic.NET (VB.NET). Nello script \u00e8 possibile utilizzare primitive specifiche per il trasferimento dati da altri database, che nelle release precedenti alla 2015.17.2c era necessario programmare attraverso il servizio QDaemon il quale era basato sulla piattaforma client\/server, facendo uso del linguaggio dBase. Le primitive&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":[60],"tags":[82],"acf":[],"_links":{"self":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/24779"}],"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=24779"}],"version-history":[{"count":12,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/24779\/revisions"}],"predecessor-version":[{"id":37702,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/24779\/revisions\/37702"}],"wp:attachment":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/media?parent=24779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/categories?post=24779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/tags?post=24779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}