星期四, 11月 29, 2018

[VFP] Automation 應用 - 改變 Sheet 標籤背景顏色

透過錄製巨集發現原來設定 Excel Sheet 標籤和 Excel Cell 背景顏色在語法上有差異

Excel Sheet 標籤背景顏色主要有標準色彩和佈景主題色彩兩種設定方式

[VFP] Automation 應用 - 改變 Sheet 標籤背景顏色-11

// ColorIndex 設定
loExcel.ActiveSheet.Tab.ColorIndex = lnColorIndex

// 標準色彩
loExcel.ActiveSheet.Tab.Color = lnColor
loExcel.ActiveSheet.Tab.TintAndShade = 0

// 佈景主題色彩
loExcel.ActiveSheet.Tab.ThemeColor = lnThemeColor
loExcel.ActiveSheet.Tab.TintAndShade = lnValue
  • ColorIndex 顏色可以參考該篇筆記 - [VFP] Automation 應用 - 改變 Excel 儲存格顏色
  • Color 除了透過錄製巨集來觀察參數外,可以直接輸入 RGB 來設定
  • ThemeColor 設定通常搭配 TintAndShade,會先透過錄製巨集來觀察參數,再參考 MSDN 文章 - xlThemeColor 來找出參數對應值
[VFP] Automation 應用 - 改變 Sheet 標籤背景顏色-2
設定結果

[VFP] Automation 應用 - 改變 Sheet 標籤背景顏色-3

星期二, 11月 27, 2018

[VFP] 自訂報表

在弄連續報表紙支票套表列印時發現,預覽時紙張設定竟然都會跑掉,以往都是把報表檔案的 Expr 欄位清空就沒問題,自訂報表會依據印表機內自訂紙張來跑,沒想到踢到鐵板,Orz

測了一段時間後,突然有個印象中,VFP 大神有提過除了 Expr 外還會清空報表檔案內的 Tag、Tag2 這兩個欄位資訊,就在要進行測試時,同事也跑來提醒 Tag、Tag2 有沒有手動去清除,果然清除後,報表就正常啦

在 Win10 64bit + VFP 9.0 SP2 的環境下,打開報表檔案的 Tag、Tag2 欄位,都會當掉,是在 [命令] 內直接下 replace 語法來清空

[VFP] 自訂報表-2

報表檔案內的 Expr、Tag、Tag2 三個欄位都要清空

[VFP] 自訂報表-1

星期四, 11月 22, 2018

[VFP] C0000005 錯誤訊息

遇上 VFP 最讓人討厭的 C0000005 錯誤,好家在有迅速破案,不過在測試階段正常,上線後一段時間才跳出來,也是頗讓人討厭,Orz

[VFP] C0000005 錯誤訊息

原 VFP 寫法
SELECT 
    S.NOs , 
    D.* ;
FROM curSequence AS S 
    LEFT JOIN BonusAccDetail AS D With (Buffering = .T.) ON ALLTRIM(S.BonusTitle) == ALLTRIM(D.BonusTitle) AND 
                                                            Alltrim(D.CompNO) == lcCompNO AND 
                                                            Alltrim(D.EmpNO) == lcEmpNO AND 
                                                            ALLTRIM(AccWay) == lcAccWay ;
    INTO Cursor curEmployData
修正為,先把 BonusAccDetail 所需資料抓進暫存 Cursor,之後再去跟 curSequence cursor 合併
SELECT * FROM BonusAccDetail With (Buffering = .T.) ;
    WHERE Alltrim(CompNO) == lcCompNO AND 
          Alltrim(EmpNO) == lcEmpNO And 
          Alltrim(AccWay) == lcAccWay ;
    INTO Cursor curBonusAccDetailTemp

Select S.NOs , D.* ;
    FROM curSequence As S Left Join curBonusAccDetailTemp As D On Alltrim(S.BonusTitle) == Alltrim(D.BonusTitle) ;
    INTO Cursor curEmployData

Use In Select("curBonusAccDetailTemp")
透過上述修改就避開 C0000005 的錯誤出現

星期四, 11月 08, 2018

[SQL] 存入看不見的控制字元

使用者跑來告知,為什麼已輸入的資料,竟然系統搜尋功能竟然都找不到

把資料拿來測試也覺得很神奇,同樣的條件,竟然一個找的到,一個找不到

[SQL] 存入看不見的控制字元-1

把兩個搜尋條件轉成 varbinary 來觀察,就發現問題點

[SQL] 存入看不見的控制字元-2

0x41 是 ASCII A 沒有問題,查 0x0341 是一個 unicdoe 符號,詳見該資料,但問題是該欄位資料型態是 char,又不是 nchar 或 nvarchar,對於編碼議題不熟,感覺這又不是 root casue,只能請使用者刪除後重新 key 資料,結案。

原想把上述測試結果記錄在 OneNote 時,TSQL 語法複製進去,兇手就現形啦,A 前面有一個隱藏字元
[SQL] 存入看不見的控制字元-3
把該隱藏字元單獨複製進 SSMS 內轉 varbinary 來觀察,是 End of Text 符號,Orz

[SQL] 存入看不見的控制字元-4

[SQL] 存入看不見的控制字元-5

星期四, 11月 01, 2018

[EF] WinForm DataBinding

參考這篇 MSDN 文章 - 資料繫結與 WinForm 的練習筆記

[EF] WinForm DataBinding-5

IListSource 實作集合
  • 這個類別會啟用雙向資料繫結,以及排序。
  • 類別衍生自 ObservableCollection<T>並新增明確的 IListSource 實作。
  • IListSource getlist() 方法實作傳回 IBindingList 實作,它與 ObservableCollection 保持同步。
  • 產生 ToBindingList IBindingList 實作支援排序。
  • EntityFramework 組件中定義 ToBindingList 擴充方法。
// ObservableCollection<T> 所在 namespace
using System.Collections.ObjectModel;
// IListSource 所在 namespace
using System.ComponentModel;
// IList 所在 namespace
using System.Collections;
// EntityFramework 組件中定義 ToBindingList 擴充方法
using System.Data.Entity;

namespace WinFormswithEFSample
{
    public class ObservableListSource<T> : ObservableCollection<T>, IListSource
        where T : class
    {
        private IBindingList _bindingList;

        public bool ContainsListCollection
        {
            get { return false; }
        }

        public IList GetList()
        {
            return _bindingList ?? (_bindingList = this.ToBindingList());
        }
    }
}