How to list files and parse them

Hi, the following code is working with a fixed file name (M:\1401.log) but I would like to do the flow on all files in the folder (M:)

[{"id":"8318c004.83b59","type":"csv","z":"bb550778.477b88","name":"Split Fields","sep":";","hdrin":"","hdrout":false,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":650,"y":1440,"wires":[["1d090ba3.ec32d4"]]},{"id":"4f953002.8b7c9","type":"MSSQL","z":"bb550778.477b88","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES (\n  1401,\n  '{{{payload.DateTime}}}',\n  '{{{payload.JobName}}}',\n  0,\n  '{{{payload.Tempo}}}')\n","outField":"payload","returnType":"0","throwErrors":"0","x":1260,"y":1440,"wires":[["c51e442f.2dec48"]]},{"id":"1d090ba3.ec32d4","type":"function","z":"bb550778.477b88","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n  a: 1401,\n  DateTime: D,\n  JobName : Job,\n  Payl : Altro\n  \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":850,"y":1440,"wires":[["4282c280.9b645c"]]},{"id":"2ac0e854.36d828","type":"file in","z":"bb550778.477b88","name":"MY700 1401","filename":"M:\\1401.log","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":470,"y":1440,"wires":[["8318c004.83b59"]]},{"id":"472cccef.ef3564","type":"inject","z":"bb550778.477b88","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":320,"y":1440,"wires":[["2ac0e854.36d828"]]},{"id":"c51e442f.2dec48","type":"debug","z":"bb550778.477b88","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1430,"y":1440,"wires":[]},{"id":"4282c280.9b645c","type":"function","z":"bb550778.477b88","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n    \nmsg.payload = {\n  a: 1301, //macchina\n  DateTime: Data,\n  Job : Jobs,\n  Payl : Altro,\n  Tempo : Seconds,\n  Dot : Dots,\n  Feed : Feeds,\n  Strip : Strips,\n  ID : MID,\n  ModRev : MR,\n  JobName : JN,\n  NID : npcbID,\n  BID : batchID,\n  MB : MBN,\n  Cassette : CC,\n  Head : Heads\n/***\n  L0 : Lunghezza0,\n  L1 : Lunghezza1,\n  L2 : Lunghezza2,\n  L3 : Lunghezza3,\n  L4 : Lunghezza4,\n  L5 : Lunghezza5,\n  L6 : Lunghezza6,\n  L7 : Lunghezza7,\n  L8 : Lunghezza8,\n  L9 : Lunghezza9,\n  L10 : Lunghezza10,\n  L11 : Lunghezza11\n***/\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":1050,"y":1440,"wires":[["4f953002.8b7c9"]]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

You can get a list of files in a directory using the fs-ops nodes.

Then feed that through a split node to generate a stream of messages. Feed that into your existing flow to perform the whole directory.

Hi Steve,
Many thanks again.
I tried with fs-ops-dir but I can't use the msg.files output as the filename of the "file in" node.
This is the best I did:

[{"id":"b8b24107.4bd19","type":"function","z":"c303fd5a.ebb02","name":"File list","func":"//for (var i = 0; i < msg.files.length; i++) {\nmsg.origPayload = msg.files;\n\nfor (var i = 0; i < msg.files.length; i++) {\nmsg.payload = {\n  File: msg.files[i]\n}\n}\nreturn msg;\n\n","outputs":1,"noerr":0,"x":380,"y":1040,"wires":[["1ac98620.4f6f0a"]]},{"id":"1ac98620.4f6f0a","type":"debug","z":"c303fd5a.ebb02","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":550,"y":1100,"wires":[]},{"id":"6292b382.6fb88c","type":"debug","z":"c303fd5a.ebb02","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"files","targetType":"msg","x":380,"y":1100,"wires":[]},{"id":"11138cd3.7ff763","type":"fs-ops-dir","z":"c303fd5a.ebb02","name":"","path":"payload","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":220,"y":1040,"wires":[["6292b382.6fb88c","b8b24107.4bd19"]]},{"id":"68113237.b8580c","type":"inject","z":"c303fd5a.ebb02","name":"","topic":"","payload":"M:\\","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":90,"y":1040,"wires":[["11138cd3.7ff763"]]}]

Hi Simone, sure you can.

Try this....

Demo flow (note - check and adjust values in the inject and select YOUR sql server in the MSSQL node)

[{"id":"472cccef.ef3564","type":"inject","z":"984775e4.ae00c8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"path","v":"c:\\temp","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":120,"wires":[["cf866343.44c33"]]},{"id":"cf866343.44c33","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.csv","filterType":"str","dir":"files","dirType":"msg","x":180,"y":220,"wires":[["70421ae5.184d54"]]},{"id":"aa7223e3.b534d","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":220,"wires":[["21443ea7.a8e922"]]},{"id":"c320f285.44f34","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":220,"wires":[["aa7223e3.b534d"]]},{"id":"70421ae5.184d54","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":220,"wires":[["c320f285.44f34"]]},{"id":"f84b0b2e.6b5318","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n    \nmsg.payload = {\n  a: 1301, //macchina\n  DateTime: Data,\n  Job : Jobs,\n  Payl : Altro,\n  Tempo : Seconds,\n  Dot : Dots,\n  Feed : Feeds,\n  Strip : Strips,\n  ID : MID,\n  ModRev : MR,\n  JobName : JN,\n  NID : npcbID,\n  BID : batchID,\n  MB : MBN,\n  Cassette : CC,\n  Head : Heads\n/***\n  L0 : Lunghezza0,\n  L1 : Lunghezza1,\n  L2 : Lunghezza2,\n  L3 : Lunghezza3,\n  L4 : Lunghezza4,\n  L5 : Lunghezza5,\n  L6 : Lunghezza6,\n  L7 : Lunghezza7,\n  L8 : Lunghezza8,\n  L9 : Lunghezza9,\n  L10 : Lunghezza10,\n  L11 : Lunghezza11\n***/\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":320,"wires":[["4c133809.cbfcb8","c5984f0a.6348a"]]},{"id":"1bfa340a.3b3e0c","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n  a: 1401,\n  DateTime: D,\n  JobName : Job,\n  Payl : Altro\n  \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":320,"wires":[["f84b0b2e.6b5318"]]},{"id":"69db2515.6afcac","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"include_empty_strings":false,"include_null_values":false,"x":370,"y":320,"wires":[["1bfa340a.3b3e0c"]]},{"id":"21443ea7.a8e922","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":320,"wires":[["69db2515.6afcac"]]},{"id":"4c133809.cbfcb8","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":320,"wires":[]},{"id":"c5984f0a.6348a","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n    1401,  @dt, @jn,  0,  @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"","paramsOptType":"editor","params":[{"output":false,"name":"dt","type":"VarChar(20)","valueType":"msg","value":"payload.DateTime"},{"output":false,"name":"jn","type":"VarChar(20)","valueType":"msg","value":"payload.JobName"},{"output":false,"name":"tempo","type":"VarChar(20)","valueType":"msg","value":"payload.Tempo"}],"x":960,"y":280,"wires":[["83e1c0ae.3ad9f"]]},{"id":"83e1c0ae.3ad9f","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":280,"wires":[]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

Can i also suggest you use SQL parameters instead of mustache? it removes the chance of SQL injection.

We are very close to the solution but the output path is not right.
I'm using: msg.filename = "\10.0.0.4\C$\LOG_MY700\" + msg.payload;
but there is an error because becomes C:\10.0.0.4\C$\LOG_MY700\filexxxxx.log
C:\ instead of a network path \10.0.0.4....

17/11/2020, 19:50:48node: 93b631b3.6d1c1msg : Object

object

topic: ""

payload: "TRLOG_20201110.log"

files: array[97]

parts: object

_msgid: "2f88495e.6e2ce6"

file: "TRLOG_20201110.log"

filename: "\10.0.0.4\C$\LOG_MY700\TRLOG_20201110.log"

error: object

message: "Error: ENOENT: no such file or directory, open 'C:\10.0.0.4\C$\LOG_MY700\TRLOG_20201110.log'"

source: object

stack: "Error: ENOENT: no such file or directory, open 'C:\10.0.0.4\C$\LOG_MY700\TRLOG_20201110.log'"

No, dont do that. change the the function "make filename" back to how I posted it and instead set the path in the inject to \\10.0.0.4\C$\LOG_MY700

Original content of "make filename" function node...

msg.file = msg.payload;
msg.filename = msg.path + "\\" + msg.payload;
return msg;

Ps, please always enclose code or data in backticks like this
```
code / flow should be put between backticks to maintain formatting and prevent the forum from corrupting code
```

Erase and Rewind:

[{"id":"f6eee3e0.0ad3f","type":"inject","z":"395fc7e.7342338","name":"","topic":"","payload":"\\\\10.0.0.4\\C$\\LOG_MY700","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":210,"y":1040,"wires":[["ec378c9a.79824"]]},{"id":"ec378c9a.79824","type":"fs-ops-dir","z":"395fc7e.7342338","name":"","path":"payload","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":220,"y":1140,"wires":[["1aaa03d3.48e8ec"]]},{"id":"bf80254a.f30e98","type":"function","z":"395fc7e.7342338","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"x":780,"y":1140,"wires":[["46a592a.b62ec6c"]]},{"id":"4c1b9640.0c1098","type":"split","z":"395fc7e.7342338","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":610,"y":1140,"wires":[["bf80254a.f30e98"]]},{"id":"1aaa03d3.48e8ec","type":"change","z":"395fc7e.7342338","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":1140,"wires":[["4c1b9640.0c1098"]]},{"id":"ea9e8d78.73c9","type":"function","z":"395fc7e.7342338","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n    \nmsg.payload = {\n  a: 1301, //macchina\n  DateTime: Data,\n  Job : Jobs,\n  Payl : Altro,\n  Tempo : Seconds,\n  Dot : Dots,\n  Feed : Feeds,\n  Strip : Strips,\n  ID : MID,\n  ModRev : MR,\n  JobName : JN,\n  NID : npcbID,\n  BID : batchID,\n  MB : MBN,\n  Cassette : CC,\n  Head : Heads\n/***\n  L0 : Lunghezza0,\n  L1 : Lunghezza1,\n  L2 : Lunghezza2,\n  L3 : Lunghezza3,\n  L4 : Lunghezza4,\n  L5 : Lunghezza5,\n  L6 : Lunghezza6,\n  L7 : Lunghezza7,\n  L8 : Lunghezza8,\n  L9 : Lunghezza9,\n  L10 : Lunghezza10,\n  L11 : Lunghezza11\n***/\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":810,"y":1240,"wires":[["aa6c04b3.3521c8","deefece1.f4dcb"]]},{"id":"67debf30.6cb48","type":"function","z":"395fc7e.7342338","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n  a: 1401,\n  DateTime: D,\n  JobName : Job,\n  Payl : Altro\n  \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":610,"y":1240,"wires":[["ea9e8d78.73c9"]]},{"id":"f769e2f4.5bc25","type":"csv","z":"395fc7e.7342338","name":"Split Fields","sep":";","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":410,"y":1240,"wires":[["67debf30.6cb48"]]},{"id":"46a592a.b62ec6c","type":"file in","z":"395fc7e.7342338","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":230,"y":1240,"wires":[["f769e2f4.5bc25"]]},{"id":"aa6c04b3.3521c8","type":"debug","z":"395fc7e.7342338","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":1300,"wires":[]},{"id":"deefece1.f4dcb","type":"MSSQL","z":"395fc7e.7342338","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n    1401,  @dt, @jn,  0,  @tempo\n)\n","outField":"payload","returnType":"0","throwErrors":"0","x":1000,"y":1200,"wires":[["5d960652.ce12d8"]]},{"id":"5d960652.ce12d8","type":"debug","z":"395fc7e.7342338","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1170,"y":1200,"wires":[]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

I changed to my solution because the errors was:

Error: ENOENT: no such file or directory, open 'C:\Users\simone\Desktop\AVVIO per i4.0\undefined\TRLOG_20200604.log'

The path C:\Users\simone\Desktop\AVVIO per i4.0\ is NODERED batch path.
I have an error for each file (i.e. TRLOG_20200604.log).

You have spaces in the path so must be enclosed in quotes.

try this...

[{"id":"4cc7e76f.58c6a8","type":"inject","z":"984775e4.ae00c8","name":"","props":[{"p":"path","v":"\\\\10.0.0.4\\C$\\LOG_MY700","vt":"str"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":110,"y":420,"wires":[["4da07132.59016"]]},{"id":"4da07132.59016","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":180,"y":520,"wires":[["964df544.198fe8"]]},{"id":"485ab093.31f22","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = '\"' msg.path + \"\\\\\" + msg.payload + '\"'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":520,"wires":[["2d3b49a0.86dae6"]]},{"id":"7fc0b0f4.f526c","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":520,"wires":[["485ab093.31f22"]]},{"id":"964df544.198fe8","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":520,"wires":[["7fc0b0f4.f526c"]]},{"id":"2a03c787.f3e9d8","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n    \nmsg.payload = {\n  a: 1301, //macchina\n  DateTime: Data,\n  Job : Jobs,\n  Payl : Altro,\n  Tempo : Seconds,\n  Dot : Dots,\n  Feed : Feeds,\n  Strip : Strips,\n  ID : MID,\n  ModRev : MR,\n  JobName : JN,\n  NID : npcbID,\n  BID : batchID,\n  MB : MBN,\n  Cassette : CC,\n  Head : Heads\n/***\n  L0 : Lunghezza0,\n  L1 : Lunghezza1,\n  L2 : Lunghezza2,\n  L3 : Lunghezza3,\n  L4 : Lunghezza4,\n  L5 : Lunghezza5,\n  L6 : Lunghezza6,\n  L7 : Lunghezza7,\n  L8 : Lunghezza8,\n  L9 : Lunghezza9,\n  L10 : Lunghezza10,\n  L11 : Lunghezza11\n***/\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":620,"wires":[["31abdef8.f2bc62","89a8152a.e76ff8"]]},{"id":"8263b67c.d95168","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n  a: 1401,\n  DateTime: D,\n  JobName : Job,\n  Payl : Altro\n  \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":620,"wires":[["2a03c787.f3e9d8"]]},{"id":"60828592.64be6c","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":370,"y":620,"wires":[["8263b67c.d95168"]]},{"id":"2d3b49a0.86dae6","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":620,"wires":[["60828592.64be6c"]]},{"id":"31abdef8.f2bc62","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":930,"y":680,"wires":[]},{"id":"89a8152a.e76ff8","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n    1401,  @dt, @jn,  0,  @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"queryParams","paramsOptType":"msg","params":[],"x":960,"y":580,"wires":[["38db9102.77324e"]]},{"id":"38db9102.77324e","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":580,"wires":[]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

NOTE: I seen you changed the inject to inject into payload instead of path - this wont work because the change node will deleted it before the function can make file name.

Also, I see you have lost the parameters for the SQL - are you using MSSQL-PLUS? you will need this NOT the old unsupported MSSQL

Does you inject node look like this & allow you to enter path as a msg property?

image

Do you see this is MSSQL node?

What version node-red are you using?

image

This is my Inject node properties page:


and so, I have changed the fs-ops-dir in this way:
image

NodeRed is v1.0.3 and I prefer to not upgrade because I have a lot of flows...
I wouldn't want the headache to fix everything... :slight_smile:

SQL node is fine because it's working with the fixed file name.

ok, so instead of setting path in the inject, put a change node after the inject & set msg.path to \\10.0.0.4\C$\LOG_MY700

Also, you did not answer, are you using MSSQL-PLUS? Are you using parameters?

the problem with that is payload gets overwritten in the next node and msg.path is NOT set (meaning the function cannot do the path+file join)

PS, upgrading is very straightforward & fairly risk free.

Try this instead...

[{"id":"984775e4.ae00c8","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"472cccef.ef3564","type":"inject","z":"984775e4.ae00c8","name":"","props":[{"p":"topic","vt":"str"},{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":110,"y":120,"wires":[["2d35441d.b4dd1c"]]},{"id":"cf866343.44c33","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.csv","filterType":"str","dir":"files","dirType":"msg","x":180,"y":220,"wires":[["70421ae5.184d54"]]},{"id":"aa7223e3.b534d","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":220,"wires":[["21443ea7.a8e922"]]},{"id":"c320f285.44f34","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":220,"wires":[["aa7223e3.b534d"]]},{"id":"70421ae5.184d54","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":220,"wires":[["c320f285.44f34"]]},{"id":"f84b0b2e.6b5318","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n    \nmsg.payload = {\n  a: 1301, //macchina\n  DateTime: Data,\n  Job : Jobs,\n  Payl : Altro,\n  Tempo : Seconds,\n  Dot : Dots,\n  Feed : Feeds,\n  Strip : Strips,\n  ID : MID,\n  ModRev : MR,\n  JobName : JN,\n  NID : npcbID,\n  BID : batchID,\n  MB : MBN,\n  Cassette : CC,\n  Head : Heads\n/***\n  L0 : Lunghezza0,\n  L1 : Lunghezza1,\n  L2 : Lunghezza2,\n  L3 : Lunghezza3,\n  L4 : Lunghezza4,\n  L5 : Lunghezza5,\n  L6 : Lunghezza6,\n  L7 : Lunghezza7,\n  L8 : Lunghezza8,\n  L9 : Lunghezza9,\n  L10 : Lunghezza10,\n  L11 : Lunghezza11\n***/\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":320,"wires":[["4c133809.cbfcb8","c5984f0a.6348a"]]},{"id":"1bfa340a.3b3e0c","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n  a: 1401,\n  DateTime: D,\n  JobName : Job,\n  Payl : Altro\n  \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":320,"wires":[["f84b0b2e.6b5318"]]},{"id":"69db2515.6afcac","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"include_empty_strings":false,"include_null_values":false,"x":370,"y":320,"wires":[["1bfa340a.3b3e0c"]]},{"id":"21443ea7.a8e922","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":320,"wires":[["69db2515.6afcac"]]},{"id":"4c133809.cbfcb8","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":320,"wires":[]},{"id":"c5984f0a.6348a","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n    1401,  @dt, @jn,  0,  @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"","paramsOptType":"editor","params":[{"output":false,"name":"dt","type":"VarChar(20)","valueType":"msg","value":"payload.DateTime"},{"output":false,"name":"jn","type":"VarChar(20)","valueType":"msg","value":"payload.JobName"},{"output":false,"name":"tempo","type":"VarChar(20)","valueType":"msg","value":"payload.Tempo"}],"x":960,"y":280,"wires":[["83e1c0ae.3ad9f"]]},{"id":"83e1c0ae.3ad9f","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":280,"wires":[]},{"id":"4da07132.59016","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":180,"y":520,"wires":[["964df544.198fe8"]]},{"id":"485ab093.31f22","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = '\"' msg.path + \"\\\\\" + msg.payload + '\"'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":520,"wires":[["2d3b49a0.86dae6"]]},{"id":"7fc0b0f4.f526c","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":520,"wires":[["485ab093.31f22"]]},{"id":"964df544.198fe8","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":520,"wires":[["7fc0b0f4.f526c"]]},{"id":"2a03c787.f3e9d8","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n    \nmsg.payload = {\n  a: 1301, //macchina\n  DateTime: Data,\n  Job : Jobs,\n  Payl : Altro,\n  Tempo : Seconds,\n  Dot : Dots,\n  Feed : Feeds,\n  Strip : Strips,\n  ID : MID,\n  ModRev : MR,\n  JobName : JN,\n  NID : npcbID,\n  BID : batchID,\n  MB : MBN,\n  Cassette : CC,\n  Head : Heads\n/***\n  L0 : Lunghezza0,\n  L1 : Lunghezza1,\n  L2 : Lunghezza2,\n  L3 : Lunghezza3,\n  L4 : Lunghezza4,\n  L5 : Lunghezza5,\n  L6 : Lunghezza6,\n  L7 : Lunghezza7,\n  L8 : Lunghezza8,\n  L9 : Lunghezza9,\n  L10 : Lunghezza10,\n  L11 : Lunghezza11\n***/\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":620,"wires":[["31abdef8.f2bc62","89a8152a.e76ff8"]]},{"id":"8263b67c.d95168","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n  a: 1401,\n  DateTime: D,\n  JobName : Job,\n  Payl : Altro\n  \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":620,"wires":[["2a03c787.f3e9d8"]]},{"id":"60828592.64be6c","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":370,"y":620,"wires":[["8263b67c.d95168"]]},{"id":"2d3b49a0.86dae6","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":620,"wires":[["60828592.64be6c"]]},{"id":"31abdef8.f2bc62","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":930,"y":680,"wires":[]},{"id":"89a8152a.e76ff8","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n    1401,  @dt, @jn,  0,  @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"queryParams","paramsOptType":"msg","params":[],"x":960,"y":580,"wires":[["38db9102.77324e"]]},{"id":"38db9102.77324e","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":580,"wires":[]},{"id":"4a2189ee.0c0828","type":"http in","z":"984775e4.ae00c8","name":"","url":"/ep","method":"get","upload":false,"swaggerDoc":"","x":160,"y":760,"wires":[["ace9da.69e4f628","2c71d65.8f5502a"]]},{"id":"f82b2415.d2dda8","type":"http response","z":"984775e4.ae00c8","name":"","statusCode":"","headers":{},"x":550,"y":760,"wires":[]},{"id":"ace9da.69e4f628","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":290,"y":820,"wires":[]},{"id":"2c71d65.8f5502a","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = '\"' msg.path + \"\\\\\" + msg.payload + '\"'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":360,"y":760,"wires":[["f82b2415.d2dda8"]]},{"id":"2d35441d.b4dd1c","type":"change","z":"984775e4.ae00c8","name":"","rules":[{"t":"set","p":"path","pt":"msg","to":"\\\\10.0.0.4\\C$\\LOG_MY700","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":290,"y":120,"wires":[["cf866343.44c33"]]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

also, please verify if you are using mssql-plus - do you see the parameters?

My SQL is node-red-contrib-mssql-plus 0.3.3
Your last solution is working!
Steve-Mcl is super! Many thanks

that is quite old and there have been many improvements since then - including...

  • the addition of parameters (Using parameters would prevent a SQL injection attacks).
  • Fixed re-connection issue
  • Dependencies updated

Regarding the SQL injection - if one of your CSV entries contains 105; DROP DATABASE Scambio_NAV; you will end up in trouble.

Many thanks, when I'll can accept a stop of the system, I'll try to update everythings.
Is it possible to have two or more version of Nodered on the same machine?

Yes, but its not a quick answer & has been covered on the forum a few times.

If you want to go this route, then it might be better (if you can) to use a separate PC / PI

Otherwise, post a new thread in the forum.

Hi Steve, I'm using the flow for another process but in this case I need to calculate delta time between two consecutive payloads. To do this, I'm trying to use global variables to store previous data... but something is wrong.
I'm not sure to understood how to use global variables.

[{"id":"98a22fb9.cb5a","type":"file in","z":"b1118599.3545f8","name":"Apri LOG DVC","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":360,"y":300,"wires":[["a25570de.29aed"]]},{"id":"ab3cd84c.703898","type":"change","z":"b1118599.3545f8","name":"C:\\LOG_QUADRA\\Storico","rules":[{"t":"set","p":"path","pt":"msg","to":"\\\\10.0.0.4\\c$\\LOG_QUADRA\\","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":240,"wires":[["91d240da.015f8"]]},{"id":"91d240da.015f8","type":"fs-ops-dir","z":"b1118599.3545f8","name":"","path":"path","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":540,"y":240,"wires":[["2c369e2e.840132"]]},{"id":"2c369e2e.840132","type":"change","z":"b1118599.3545f8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":240,"wires":[["12df3723.658b69"]]},{"id":"7266539f.9340cc","type":"function","z":"b1118599.3545f8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"x":160,"y":300,"wires":[["98a22fb9.cb5a"]]},{"id":"12df3723.658b69","type":"split","z":"b1118599.3545f8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":910,"y":240,"wires":[["7266539f.9340cc"]]},{"id":"a25570de.29aed","type":"csv","z":"b1118599.3545f8","name":"Separa Campi","sep":";","hdrin":"","hdrout":false,"multi":"one","ret":"\\n","temp":"Giorno, Ora, Stato, Programma, Lotto, Scheda","skip":"0","strings":false,"x":560,"y":300,"wires":[["71d7613e.abfca"]]},{"id":"5194020f.43fdfc","type":"MSSQL","z":"b1118599.3545f8","mssqlCN":"e91a56e2.a1e9f8","name":"DVC to SQL","query":"insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n n_ord_prod, \n n_operazione, \n articolo, \n VarINT1,\n VarCHAR1,\n Tempo)\nVALUES (\n  1109,\n  '{{{payload.DateTime}}}',\n  '{{{payload.LottoRight5}}}',\n  '{{{payload.LottoLeft4}}}',\n  '{{{payload.Programma}}}',\n  '{{{payload.Scheda}}}',\n  '{{{payload.Stato}}}',\n  '{{{payload.Tempo}}}')","outField":"payload","returnType":"0","throwErrors":"0","x":1010,"y":300,"wires":[[]]},{"id":"71d7613e.abfca","type":"function","z":"b1118599.3545f8","name":"NEW transform DVC","func":"//copy of original payload for debug output\nmsg.origPayload = msg.payload;\n\n//make a copy of the row data... in some flows doesn't work ... WHY????\n//let row = {...msg.payload};\n\nif (msg.payload.Stato == \"START\"){\n    //Store Data and Lotto of the \"START\" Record to calculate delta time with the \"END\" record\n    global.set (msg.payload.Ora, publicVariables.Data_START);\n    global.set (msg.payload.Lotto, publicVariables.Lotto_START);\n    global.set (msg.payload.Scheda, publicVariables.Scheda_START);\n}\nelse {\n    \n//If any condition is false, the record is skipped\n    if (msg.payload.Stato == \"END\"){\n        //recall public variables\n        var publicVariables = global.get(\"publicVariables\");\n\n        //Check if START lotto end END Lotto are the same\n        if (msg.payload.Lotto == publicVariables.Lotto_START){\n            //calculate delta time using the global variable Data_START\n            var Calcola_Tempo = (msg.payload.Ora - publicVariables.Data_START);\n            //calculate Quantity  using the global variable Scheda_START\n            var Calcola_Qta = (msg.payload.Scheda - publicVariables.Scheda_START);\n\n            if (msg.payload.Lotto !== undefined){\n                var WO = msg.payload.Lotto.substr(5,6);\n                var OP = msg.payload.Lotto.substr(0,4);\n\n                if (msg.payload.Programma !== undefined){\n                    var Prog = 'AP11'+ msg.payload.Programma;\n    \n                    if (msg.payload.Scheda !== undefined){\n                        var Sch = msg.payload.Scheda;\n            \n                        //solo se tutti gli IF sono andati a buon fine\n                        //preparo il messaggio\n            \n                        var strG = msg.payload.Giorno;\n                        var strO = msg.payload.Ora;\n                        //split Data dd/mm/yyyy hh:mm:ss\n                        var D = strG.substr(6,4)+'/'+strG.substr(3,2)+'/'+strG.substr(0,2)+' '+strO;\n\n                        msg.payload = {\n                            a: 1109, //not sure what this is about?\n                            //DateTime: formatDT(row.Giorno, row.Ora), //Call a function to make the correct DATETIME string\n                            DateTime: D,\n                            //LottoRight5 : lottoParts[1],  //characters right of the '/' \n                            //LottoLeft4: lottoParts[0],  //characters left of the '/' \n                            LottoRight5 : WO,\n                            LottoLeft4 : OP,\n                            Stato: Status, //add Stato to the payload\n                            Programma: Prog, //add Programma to the payload\n                            Scheda: Sch, //add Scheda to the payload\n                            Tempo : Calcola_Tempo,\n                            Qta : Calcola_Qta\n                        }\n                    }\n        \n                }\n            }\n        }\n    }\n\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":780,"y":300,"wires":[["2915102.0f697f"]]},{"id":"b64b201.b7b0ae","type":"inject","z":"b1118599.3545f8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":160,"wires":[["69156b95.e64ca4"]]},{"id":"2915102.0f697f","type":"debug","z":"b1118599.3545f8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":360,"wires":[]},{"id":"69156b95.e64ca4","type":"function","z":"b1118599.3545f8","name":"Declare Global Variables","func":"var publicVariables = {\n    Data_START: \"00:00:00\",\n    Lotto_START: \"0\",\n    Scheda_START: \"0\"\n}\nglobal.set(\"publicVariables\", publicVariables);\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":180,"wires":[["ab3cd84c.703898"]]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

In your flow, everytime you press the inject button, you re-initilize the global variables. You should make that a separate flow.

You should also go read https://nodered.org/docs/user-guide/writing-functions#storing-data and then look at your last function node again (it might help to read this thread too)

Hi, in this case is not a problem to reinizialise the variable at each inject because I want to parse a log file made of records with
Start.....
Bla....
Bla....
End
again
I must calculate the execution time between Start and End so I want to store the Start Datetime and, when there is the End Record do (Date_End - Date_Start).
I'm not a programmer, and JS is not so friendly for me so I'm in trouble with the definition and how to set and get data....

To set a value:

flow.set("count", 123);

in your function code you have

    global.set (msg.payload.Ora, publicVariables.Data_START);
    global.set (msg.payload.Lotto, publicVariables.Lotto_START);
    global.set (msg.payload.Scheda, publicVariables.Scheda_START);

so it should be
global.set(publicVariables.Data_START, msg.payload.Ora);
or
global.set(name-of-context-variable, data-to-be-stored-in-context-variable)