Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

390 Zeilen
36KB

  1. Option Explicit
  2. ' -- ADODB constants ----------------------------------------------------------
  3. Const adCmdText = 1
  4. Const adParamInput = 1
  5. Const adInteger = 3
  6. Const adDate = 7
  7. Const adVarChar = 200
  8. Const adLongVarChar = 201
  9. ' -- Locate web.config ---------------------------------------------------------
  10. Dim scriptDir
  11. scriptDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\"))
  12. Dim webConfigPath
  13. webConfigPath = scriptDir & "..\public\web.config"
  14. ' -- Read a key from web.config <appSettings> ----------------------------------
  15. Function ReadWebConfig(key)
  16. Dim xml : Set xml = CreateObject("MSXML2.DOMDocument.6.0")
  17. xml.async = False
  18. xml.load webConfigPath
  19. If xml.parseError.errorCode <> 0 Then
  20. WScript.Echo "ERROR: Cannot parse web.config: " & xml.parseError.reason
  21. WScript.Quit 1
  22. End If
  23. Dim node : Set node = xml.selectSingleNode("//add[@key='" & key & "']")
  24. If node Is Nothing Then
  25. ReadWebConfig = ""
  26. Else
  27. ReadWebConfig = node.getAttribute("value")
  28. End If
  29. Set xml = Nothing
  30. End Function
  31. ' -- Escape single quotes for inline SQL (admin-controlled input only) ---------
  32. Function EscSQL(s)
  33. EscSQL = Replace(CStr(s), "'", "''")
  34. End Function
  35. ' -- Derive ACE OLE DB connection string from the ODBC ConnectionString --------
  36. Dim odbcStr : odbcStr = ReadWebConfig("ConnectionString")
  37. Dim dbqPath : dbqPath = ""
  38. Dim odbcParts, i
  39. odbcParts = Split(odbcStr, ";")
  40. For i = 0 To UBound(odbcParts)
  41. Dim p : p = Trim(odbcParts(i))
  42. If LCase(Left(p, 4)) = "dbq=" Then
  43. dbqPath = Trim(Mid(p, 5))
  44. Exit For
  45. End If
  46. Next
  47. If dbqPath = "" Then
  48. WScript.Echo "ERROR: Could not find Dbq= path in ConnectionString."
  49. WScript.Quit 1
  50. End If
  51. Dim accessConnStr : accessConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbqPath & ";"
  52. Dim psConnStr : psConnStr = ReadWebConfig("PrintStreamConnectionString")
  53. If psConnStr = "" Or InStr(psConnStr, "YOUR_SERVER") > 0 Then
  54. WScript.Echo "ERROR: PrintStreamConnectionString is not configured in web.config."
  55. WScript.Quit 1
  56. End If
  57. ' -- Open connections ----------------------------------------------------------
  58. Dim cnAccess : Set cnAccess = CreateObject("ADODB.Connection")
  59. On Error Resume Next
  60. cnAccess.Open accessConnStr
  61. If Err.Number <> 0 Then
  62. WScript.Echo "ERROR opening Access database: " & Err.Description
  63. WScript.Quit 1
  64. End If
  65. On Error GoTo 0
  66. Dim cnPS : Set cnPS = CreateObject("ADODB.Connection")
  67. On Error Resume Next
  68. cnPS.Open psConnStr
  69. If Err.Number <> 0 Then
  70. WScript.Echo "ERROR opening PrintStream database: " & Err.Description
  71. cnAccess.Close
  72. WScript.Quit 1
  73. End If
  74. On Error GoTo 0
  75. WScript.Echo "Connected to both databases."
  76. WScript.Echo ""
  77. ' -- PrintStream query template (CTEs + outer SELECT) --------------------------
  78. ' A WHERE clause filtering on e2.[DETAILS1] (JobName) is appended per token.
  79. Dim psSqlBase
  80. psSqlBase = _
  81. ";WITH OpenProcess AS (" & _
  82. "SELECT s.[JOB NUMBER] AS JOB_NUMBER, cc.[DEPT] AS Department," & _
  83. " s.[COMPLETED], s.[CLOSED OUT] AS CLOSED_OUT," & _
  84. " ISNULL(s.[FILETYPE],'') AS FILETYPE," & _
  85. " ISNULL(s.[STATUS],'') AS [STATUS]," & _
  86. " e.[DEBTOR], e.[DETAILS1], e.[DELIVERY DATE] AS DELIVERY_DATE," & _
  87. " s.[ACTIVITY NO]" & _
  88. " FROM dbo.SCHEDFIL AS s" & _
  89. " JOIN dbo.ESTIMATE AS e ON e.[DATAFLEX RECNUM ONE] = s.[ESTIMATE RECNUM]" & _
  90. " JOIN dbo.CostCenters AS cc ON cc.[Code] = s.[COST CENTRE]" & _
  91. " WHERE ISNULL(s.[COMPLETED],'') <> 'Y'" & _
  92. " AND ISNULL(s.[CLOSED OUT],'') <> 'Y'" & _
  93. " AND ISNULL(e.[CLOSED OUT],'') <> 'Y'" & _
  94. " AND e.[DELIVERY DATE] > DATEADD(DAY,-365,CAST(GETDATE() AS date))" & _
  95. " AND s.[FILETYPE] IN ('D','Q','X','I','W','R','T','P')" & _
  96. " AND (s.[STATUS] IN ('*','6','7','0','1','2','3','4','5',' ') OR s.[STATUS] IS NULL)" & _
  97. ")," & _
  98. "AggNotes AS (" & _
  99. "SELECT n.[RELATED TO]," & _
  100. " STUFF((" & _
  101. " SELECT ISNULL(n2.[NOTE], '')" & _
  102. " FROM dbo.NOTES AS n2" & _
  103. " WHERE n2.[RELATED TO] = n.[RELATED TO]" & _
  104. " AND n2.[MODULE] = 'MDP'" & _
  105. " ORDER BY TRY_CAST(n2.[LINE NO] AS INT)" & _
  106. " FOR XML PATH(''), TYPE" & _
  107. " ).value('.','NVARCHAR(MAX)'),1,0,'') AS FullNote" & _
  108. " FROM dbo.NOTES AS n" & _
  109. " WHERE n.[MODULE] = 'MDP'" & _
  110. " GROUP BY n.[RELATED TO]" & _
  111. ")" & _
  112. " SELECT DISTINCT" & _
  113. " op.JOB_NUMBER AS JobNumber," & _
  114. " d.[NAMES] AS CustomerName," & _
  115. " e2.[DETAILS1] AS JobName," & _
  116. " e2.[FINAL DELIVERY] AS FinalDelivery," & _
  117. " e2.[ORIG_Qty1] AS Quantity," & _
  118. " CONCAT(e2.[DETAILS2],e2.[DETAILS3],e2.[DETAILS4],e2.[DETAILS5]," & _
  119. " e2.[DETAILS6],e2.[DETAILS7],e2.[DETAILS8],e2.[DETAILS9],e2.[DETAILS10]) AS Notes," & _
  120. " an.FullNote" & _
  121. " FROM OpenProcess AS op" & _
  122. " LEFT JOIN dbo.DEBTOR AS d ON op.[DEBTOR] = d.[AC NO]" & _
  123. " LEFT JOIN dbo.ESTIMATE AS e2 ON op.JOB_NUMBER = e2.[JOB NUMBER]" & _
  124. " LEFT JOIN AggNotes AS an ON e2.[ORIG_QuoteNo] = an.[RELATED TO]"
  125. ' -- Helper: get a safe string from a potentially-null recordset field ---------
  126. Function SafeStr(val)
  127. If IsNull(val) Then SafeStr = "" Else SafeStr = CStr(val)
  128. End Function
  129. ' -- Process each PrintStream-enabled board ------------------------------------
  130. Dim rsBds : Set rsBds = cnAccess.Execute( _
  131. "SELECT [id],[printstream_job_name] FROM [boards] WHERE [import_from_printstream] = True")
  132. Dim totalBoards : totalBoards = 0
  133. Dim totalCreated : totalCreated = 0
  134. Dim totalUpdated : totalUpdated = 0
  135. Do While Not rsBds.EOF
  136. Dim boardId : boardId = CLng(rsBds("id"))
  137. Dim filterMemo : filterMemo = SafeStr(rsBds("printstream_job_name"))
  138. totalBoards = totalBoards + 1
  139. WScript.Echo "Board ID " & boardId & ":"
  140. ' -- Get first column and first swim lane ----------------------------------
  141. Dim firstColId : firstColId = 0
  142. Dim firstLaneId : firstLaneId = 0
  143. Dim rsCol : Set rsCol = cnAccess.Execute( _
  144. "SELECT TOP 1 [id] FROM [board_columns] WHERE [board_id]=" & boardId & " ORDER BY [position]")
  145. If Not rsCol.EOF Then firstColId = CLng(rsCol("id"))
  146. rsCol.Close : Set rsCol = Nothing
  147. Dim rsLane : Set rsLane = cnAccess.Execute( _
  148. "SELECT TOP 1 [id] FROM [swim_lanes] WHERE [board_id]=" & boardId & " ORDER BY [position]")
  149. If Not rsLane.EOF Then firstLaneId = CLng(rsLane("id"))
  150. rsLane.Close : Set rsLane = Nothing
  151. If firstColId = 0 Or firstLaneId = 0 Then
  152. WScript.Echo " No columns or swim lanes found - skipping."
  153. Else
  154. ' -- Parse filter tokens (one per line) --------------------------------
  155. Dim tokenDict : Set tokenDict = CreateObject("Scripting.Dictionary")
  156. tokenDict.CompareMode = 1 ' vbTextCompare
  157. Dim tokens : tokens = Split(CStr(filterMemo), Chr(10))
  158. Dim t
  159. For t = 0 To UBound(tokens)
  160. Dim tok : tok = Trim(Replace(CStr(tokens(t)), Chr(13), ""))
  161. If Len(tok) > 0 Then
  162. If Not tokenDict.Exists(tok) Then tokenDict.Add tok, True
  163. End If
  164. Next
  165. If tokenDict.Count = 0 Then
  166. WScript.Echo " No job name filter configured - skipping."
  167. Else
  168. ' -- Query PrintStream for each token, collect unique jobs ---------
  169. Dim jobDict : Set jobDict = CreateObject("Scripting.Dictionary")
  170. jobDict.CompareMode = 1 ' vbTextCompare - case-insensitive keys
  171. Dim tokenKeys : tokenKeys = tokenDict.Keys
  172. Dim tk
  173. For tk = 0 To UBound(tokenKeys)
  174. Dim filterSql
  175. filterSql = psSqlBase & " WHERE e2.[DETAILS1] LIKE '%" & EscSQL(tokenKeys(tk)) & "%'"
  176. Dim rsPS : Set rsPS = Nothing
  177. On Error Resume Next
  178. Set rsPS = cnPS.Execute(filterSql)
  179. If Err.Number <> 0 Then
  180. WScript.Echo " WARNING: PrintStream query failed for '" & tokenKeys(tk) & "': " & Err.Description
  181. Err.Clear
  182. Else
  183. Do While Not rsPS.EOF
  184. Dim jn : jn = SafeStr(rsPS("JobNumber"))
  185. If Len(jn) > 0 And Not jobDict.Exists(jn) Then
  186. Dim info : Set info = CreateObject("Scripting.Dictionary")
  187. info.Add "JobNumber", jn
  188. info.Add "CustomerName", SafeStr(rsPS("CustomerName"))
  189. info.Add "JobName", SafeStr(rsPS("JobName"))
  190. info.Add "Quantity", SafeStr(rsPS("Quantity"))
  191. info.Add "Notes", SafeStr(rsPS("Notes"))
  192. info.Add "FullNote", SafeStr(rsPS("FullNote"))
  193. ' Keep delivery date as a VBScript Date or Null
  194. Dim delivVal : delivVal = Null
  195. If Not IsNull(rsPS("FinalDelivery")) Then
  196. On Error Resume Next
  197. delivVal = CDate(rsPS("FinalDelivery"))
  198. If Err.Number <> 0 Then delivVal = Null : Err.Clear
  199. On Error GoTo 0
  200. End If
  201. info.Add "DeliveryDate", delivVal
  202. jobDict.Add jn, info
  203. End If
  204. rsPS.MoveNext
  205. Loop
  206. rsPS.Close
  207. End If
  208. On Error GoTo 0
  209. Set rsPS = Nothing
  210. Next
  211. WScript.Echo " Found " & jobDict.Count & " unique open job(s) matching filters."
  212. ' -- Insert new cards / update existing cards ----------------------
  213. Dim jobKeys : jobKeys = jobDict.Keys
  214. Dim k
  215. For k = 0 To UBound(jobKeys)
  216. Dim jobNum : jobNum = jobKeys(k)
  217. Dim ji : Set ji = jobDict(jobNum)
  218. Dim checkSql
  219. checkSql = "SELECT COUNT(*) FROM [cards] WHERE [board_id]=" & boardId & _
  220. " AND [job_number]='" & EscSQL(jobNum) & "'"
  221. Dim rsChk : Set rsChk = cnAccess.Execute(checkSql)
  222. Dim alreadyExists : alreadyExists = (CLng(rsChk(0)) > 0)
  223. rsChk.Close : Set rsChk = Nothing
  224. If Not alreadyExists Then
  225. ' Determine next position in the target cell
  226. Dim posSql
  227. posSql = "SELECT MAX([position]) FROM [cards] WHERE [column_id]=" & firstColId & _
  228. " AND [swim_lane_id]=" & firstLaneId
  229. Dim rsPos : Set rsPos = cnAccess.Execute(posSql)
  230. Dim nextPos : nextPos = 0
  231. If Not rsPos.EOF Then
  232. If Not IsNull(rsPos(0)) Then nextPos = CLng(rsPos(0)) + 1
  233. End If
  234. rsPos.Close : Set rsPos = Nothing
  235. Dim cmd : Set cmd = CreateObject("ADODB.Command")
  236. Set cmd.ActiveConnection = cnAccess
  237. cmd.CommandType = adCmdText
  238. cmd.CommandText = _
  239. "INSERT INTO [cards] " & _
  240. "([board_id],[column_id],[swim_lane_id],[job_number],[job_name]," & _
  241. "[customer_name],[delivery_date],[quantity],[notes],[full_note],[position]," & _
  242. "[created_at],[created_by],[updated_at],[updated_by]) " & _
  243. "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
  244. Dim now_ : now_ = Now()
  245. cmd.Parameters.Append cmd.CreateParameter("", adInteger, adParamInput, , boardId)
  246. cmd.Parameters.Append cmd.CreateParameter("", adInteger, adParamInput, , firstColId)
  247. cmd.Parameters.Append cmd.CreateParameter("", adInteger, adParamInput, , firstLaneId)
  248. cmd.Parameters.Append cmd.CreateParameter("", adVarChar, adParamInput, 255, ji("JobNumber"))
  249. cmd.Parameters.Append cmd.CreateParameter("", adVarChar, adParamInput, 255, ji("JobName"))
  250. cmd.Parameters.Append cmd.CreateParameter("", adVarChar, adParamInput, 255, ji("CustomerName"))
  251. ' Nullable delivery_date
  252. Dim delivParam : Set delivParam = cmd.CreateParameter("", adDate, adParamInput)
  253. If IsNull(ji("DeliveryDate")) Then
  254. delivParam.Value = Null
  255. Else
  256. delivParam.Value = ji("DeliveryDate")
  257. End If
  258. cmd.Parameters.Append delivParam
  259. cmd.Parameters.Append cmd.CreateParameter("", adVarChar, adParamInput, 50, ji("Quantity"))
  260. Dim notesVal : notesVal = CStr(ji("Notes"))
  261. Dim notesSize : notesSize = Len(notesVal)
  262. If notesSize < 1 Then notesSize = 1
  263. cmd.Parameters.Append cmd.CreateParameter("", adLongVarChar, adParamInput, notesSize, notesVal)
  264. Dim fullNoteVal : fullNoteVal = CStr(ji("FullNote"))
  265. Dim fullNoteSize : fullNoteSize = Len(fullNoteVal)
  266. If fullNoteSize < 1 Then fullNoteSize = 1
  267. cmd.Parameters.Append cmd.CreateParameter("", adLongVarChar, adParamInput, fullNoteSize, fullNoteVal)
  268. cmd.Parameters.Append cmd.CreateParameter("", adInteger, adParamInput, , nextPos)
  269. cmd.Parameters.Append cmd.CreateParameter("", adDate, adParamInput, , now_)
  270. cmd.Parameters.Append cmd.CreateParameter("", adVarChar, adParamInput, 255, "printstream-import")
  271. cmd.Parameters.Append cmd.CreateParameter("", adDate, adParamInput, , now_)
  272. cmd.Parameters.Append cmd.CreateParameter("", adVarChar, adParamInput, 255, "printstream-import")
  273. On Error Resume Next
  274. cmd.Execute
  275. If Err.Number <> 0 Then
  276. WScript.Echo " WARNING: Insert failed for job " & jobNum & ": " & Err.Description
  277. Err.Clear
  278. Else
  279. totalCreated = totalCreated + 1
  280. WScript.Echo " + " & jobNum & " - " & ji("JobName")
  281. End If
  282. On Error GoTo 0
  283. Set cmd = Nothing
  284. Else
  285. ' Refresh PrintStream fields on existing cards
  286. Dim updCmd : Set updCmd = CreateObject("ADODB.Command")
  287. Set updCmd.ActiveConnection = cnAccess
  288. updCmd.CommandType = adCmdText
  289. updCmd.CommandText = _
  290. "UPDATE [cards] SET " & _
  291. "[job_name]=?,[customer_name]=?,[delivery_date]=?,[quantity]=?," & _
  292. "[notes]=?,[full_note]=?,[updated_at]=?,[updated_by]=? " & _
  293. "WHERE [board_id]=? AND [job_number]=?"
  294. updCmd.Parameters.Append updCmd.CreateParameter("", adVarChar, adParamInput, 255, ji("JobName"))
  295. updCmd.Parameters.Append updCmd.CreateParameter("", adVarChar, adParamInput, 255, ji("CustomerName"))
  296. Dim delivUpdParam : Set delivUpdParam = updCmd.CreateParameter("", adDate, adParamInput)
  297. If IsNull(ji("DeliveryDate")) Then
  298. delivUpdParam.Value = Null
  299. Else
  300. delivUpdParam.Value = ji("DeliveryDate")
  301. End If
  302. updCmd.Parameters.Append delivUpdParam
  303. updCmd.Parameters.Append updCmd.CreateParameter("", adVarChar, adParamInput, 50, ji("Quantity"))
  304. Dim notesUpdVal : notesUpdVal = CStr(ji("Notes"))
  305. Dim notesUpdSize : notesUpdSize = Len(notesUpdVal)
  306. If notesUpdSize < 1 Then notesUpdSize = 1
  307. updCmd.Parameters.Append updCmd.CreateParameter("", adLongVarChar, adParamInput, notesUpdSize, notesUpdVal)
  308. Dim fullNoteUpdVal : fullNoteUpdVal = CStr(ji("FullNote"))
  309. Dim fullNoteUpdSize : fullNoteUpdSize = Len(fullNoteUpdVal)
  310. If fullNoteUpdSize < 1 Then fullNoteUpdSize = 1
  311. updCmd.Parameters.Append updCmd.CreateParameter("", adLongVarChar, adParamInput, fullNoteUpdSize, fullNoteUpdVal)
  312. updCmd.Parameters.Append updCmd.CreateParameter("", adDate, adParamInput, , Now())
  313. updCmd.Parameters.Append updCmd.CreateParameter("", adVarChar, adParamInput, 255, "printstream-import")
  314. updCmd.Parameters.Append updCmd.CreateParameter("", adInteger, adParamInput, , boardId)
  315. updCmd.Parameters.Append updCmd.CreateParameter("", adVarChar, adParamInput, 255, jobNum)
  316. On Error Resume Next
  317. updCmd.Execute
  318. If Err.Number <> 0 Then
  319. WScript.Echo " WARNING: Update failed for job " & jobNum & ": " & Err.Description
  320. Err.Clear
  321. Else
  322. totalUpdated = totalUpdated + 1
  323. End If
  324. On Error GoTo 0
  325. Set updCmd = Nothing
  326. End If
  327. Next
  328. Set jobDict = Nothing
  329. End If
  330. End If
  331. rsBds.MoveNext
  332. Loop
  333. rsBds.Close : Set rsBds = Nothing
  334. cnPS.Close : Set cnPS = Nothing
  335. cnAccess.Close : Set cnAccess = Nothing
  336. WScript.Echo ""
  337. WScript.Echo "Import complete."
  338. WScript.Echo " Boards processed : " & totalBoards
  339. WScript.Echo " Cards created : " & totalCreated
  340. WScript.Echo " Cards updated : " & totalUpdated

Powered by TurnKey Linux.