星期二, 11月 19, 2019

[VFP] Error accessing printer spooler

VFP 在指定列印標籤機時,拋出下圖錯誤訊息 - 離線列印時發生錯誤


把離線列印翻成英文去 Google,找到的都是確認印表機、標籤機狀態的討論,確定標籤機當下是正常,不應該需要確認狀態,後來在測試環境中指定標籤機,總算是拋出正確錯誤訊息,馬上就找到答案,Orz


之前指定標籤機是下列寫法,利用 laPrinters(li, 1) 來進行設定
APRINTERS(laPrinters)
IF VARTYPE(laPrinters) <> "U"
  FOR li = 1 TO ALEN(laPrinters, 1)
    IF ATC(TargetPrinter , laPrinters(li, 1)) <> 0  
      SET PRINTER TO NAME laPrinters(li, 1)
    ENDIF
  ENDFOR
ENDIF
因為有些因素,所以改寫為下述寫法,先把印表機名稱塞進一個變數,再利用該變數來指定印表機,然後就是一上線就掛的悲劇,QQ
APRINTERS(laPrinters)
IF VARTYPE(laPrinters) <> "U"
  FOR li = 1 TO ALEN(laPrinters, 1)

    lcPrintName = laPrinters(li, 1)
  
    IF ATC(TargetPrinter , lcPrintName) <> 0  
      SET PRINTER TO NAME lcPrintName
    ENDIF
  ENDFOR
ENDIF
必須利用括號 [name expression ()] 包住變數,才能正常指定
SET PRINTER TO NAME (lcPrintName)

星期五, 11月 01, 2019

[SQL] 無聯結述詞

修改一隻報表 AP 時,看一下該 TSQL 語法執行計畫,一打開就發現 Operator Warming - 無聯結述詞

[SQL] 無聯結述詞-1

[SQL] 無聯結述詞-2

該語法沒有效能問題,7 個 Table Logical Read 都沒有超過 10,且都用 Seek 抓出 1 筆資料運算而已,在測試環境上可以重現,就研究並筆記一下,整理網路文章提到重點
  • 統計資訊過期:確認統計資訊是正常的,但保險起見,這 7 個 Table 相關 Index,即使執行計畫裡沒有用上的,通通都 rebuild,WA 開頭統計資訊通通刪除,沒有幫助
  • 資料內容重複性過高:因為是廠內勾稽用判斷條件,基本上是不會有該情況
  • 返回過多不必要資料:只有回傳一筆資料,排除該情況
搞了一整天後,想說就不要理會,因為也沒轍,QQ

繼續改報表 AP 時發現,原來 TSQL 內有 2 個 Table 並不是報表所需內容,單純是順道 JOIN 一併抓出來,在 AP 內要做防呆判斷用,其中 1 個 Table 是產生 [無聯結述詞 operator] 關鍵,移除這 2 個 Table 並把防呆判斷另外寫,結案

就商業邏輯上來說,這 7 個 Table JOIN 在一起,在實務情況上是合理的,完全不知道產生原因,>.<