2011年10月27日 星期四

#Crystal Report 多執行緒叫用同一rpt報表檔案載入問題


測試 CR報表
目前卡在 開啟瀏覽報表 會提示要求輸入登入資料庫帳密 (之前沒有)
報表 DataSource 是一個 DataTable,應該是不會要求登入資料庫才對啊

@大概知道是因為他找不到登入資料庫的 DataSet
所以在報表上面重新設定好之前訂好的DataSet就可以了

'有點棘手
試著改成直接列印
預覽則直接放在Form上面

所以要拿掉分頁控制

===========================================================
再來就是多執行緒一次多開,會有 "引動過程的目標傳回例外狀況。"
multithreading - 'System.Reflection.TargetInvocationException'


 //若是已經取消背景作業,就不去更新表單資訊,
            //否則會引發 [引動過程目標例外狀況]。

@應該跟我關閉報表畫面後
thread 會被強制關閉之類的問題有關吧

看有沒有辦法說能在關閉報表之後
對thread做安全的關閉動作


@大概發現說
如果用的是全域Form去跑
不管事show,    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog  => 猜測是讀取同一個form,前一個thread還沒結束,下一個thread又呼叫這個form
怎樣都會發生

如果宣告 Form去跑
show 會發生    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog 還是會發生.....
@DisconnectedContext MDA警告?RuntimeCallableWrapper 
關閉報表表單以後,通常會出現這個警告訊息'

應該是跟 報表相關變數資源鏈結沒有適時關閉有關係

目前將呼叫的Thread 設為 STA 單一執行緒
似乎就不會再出現這個問題
要在測試看看


.NET Threading Model(STA and MTA)


STA(single threaded apartments)。apartment只是一个逻辑上的概念,它可以包含一个或多个线程。一个AppDomain可以包括一个或多个apartment。STA是指该apartment中只能包含一个thread。
MTA(multi threaded apartments)。指该apartment中可以包含多个thread。
STA and MTA 之间最大的区别就是MTA 可以在同一个apartment 中使用所有的共享资源并发执行多个线程。 而多个STA虽然可以共享数据,但是不能并发执行线程,存在性能问题。



@多執行緒開啟報表表單
會發生 引動過程目標例外狀況

因為 CrystalDecisions.CrystalReports.Engine.ReportDocument 可能再引用外部程式的時候
會動到某塊記憶體吧

當載入資料以後其他執行緒也跟著補上
又透過同個com元件對該記憶體做事情
而產生例外
@目前透過 將 ReportDocument 宣告為全域變數
以 SyncLock 該報表文件變數

   '載入報表資源動作

   End SyncLock

讓每個 Thread 依序執行載入報表動作


'目前差再說,怎麼把報表載入後的資料在show表單後,才去下次的載入

[.Net] 鎖住物件或Method

在VB.net是在Method宣告的前一行加上:<MethodImpl(MethodImplOptions.Synchronized)> _

2011年10月26日 星期三

#VB BindingSource應用


上一筆、下一筆、第一筆、最末筆《BindingSource的應用 (1)》


之前碰上說 DGV已經指定DataSource = Table
要新山修改資料
就變成只能去改Table
而無法透過 DGV

好像如果中間透過 BindingSource 就可以解決這個問題

2011年10月25日 星期二

@Tools 銷貨單檢查 - 批號異常

銷貨單檢查 - 批號異常
檢查銷貨單上,銷貨回報批號日期
於該月份大於銷貨單銷貨日期的批號資料


==================================

'加入 生產日報表
去核對lotno, 料號
撈出實際日期

'讓使用者選取是否只看不同月份的異常資料(同月份不會影響帳務)


====================================
'結合生產日報表,查詢日期異常資料

select a.saledate as 銷貨日期, c.pdtansdate as 回報日期, c.saleno as 銷貨單號,
 c.orderno as 訂貨單號, c.partcode as 訂貨料號, c.batchno as 批號,
c.lotno, c.stockqty as 出貨良品數, c.impdate as 建檔時間
from tblsale a
join
(select  g.pdtansdate, b.saleno, b.orderno, b.partcode, b.batchno,
 b.lotno, b.stockqty, b.impdate
from tbllotexpsale b
join (select d.pdtansno, d.lotno, d.partcode, f.pdtansdate from tblLotImpPdtAns d
join (select e.pdtansno, e.pdtansdate from tblPdtAns e where e.status = 2 ) f
on d.pdtansno = f.pdtansno ) as g
on b.partcode = g.partcode and b.lotno = g.lotno
) as c
on c.saleno = a.saleno
where a.status = 2 and c.saleno = 'SA20080811004' and a.saledate < c.pdtansdate




'生產日報表,核對包裝回報單號,撈出正確回報日期
select d.pdtansno, d.lotno, d.partcode, f.pdtansdate from tblLotImpPdtAns d
join (select e.pdtansno, e.pdtansdate from tblPdtAns e where e.status = 2 ) f
on d.pdtansno = f.pdtansno
where d.lotno = 'PC200800000000002' and partcode = '000216BNOL0XX'
order by partcode




'銷貨日期 < 出貨回報日期 異常資料
'LotNo PD開頭, 長度13
select a.saledate as 銷貨日期, c.lotdate as 批號回報日期, c.saleno as 銷貨單號,
 c.orderno as 訂貨單號, c.partcode as 訂貨料號, c.batchno as 批號,
c.lotno, c.stockqty as 出貨良品數, c.impdate as 建檔時間
from tblsale a
join
(select substring(b.lotno,3,8) as lotdate, b.saleno, b.orderno, b.partcode, b.batchno,
 b.lotno, b.stockqty, b.impdate
from tbllotexpsale b where b.saleno = 'SA20111003001' and len(b.lotno) = 13
and b.lotno like 'PD%' ) as c
on c.saleno = a.saleno
where a.status = 2 and a.saledate < c.lotdate



'出庫明細, 找批號
select b.* from tbllotexpsale b where b.saleno = 'SA20111005001'



'銷貨單號
select * from tblsale where saledate between '20111001' and '20111030' and status = 2

2011年10月23日 星期日

#VB ContextSwitchDeadLock 長時間運算,造成停止回應

請問執行大量運算所造成的程式(沒有回應)該如何解決? 
http://www.programmer-club.com.tw/ShowSameTitleN/csharp/10583.html

http://www.dotblogs.com.tw/dennismao/archive/2010/01/11/12957.aspx

偵測到 ContextSwitchDeadlock
Message: CLR 在過去 60 秒一直無法從 COM 內容 0x2aadd8 轉換為 COM 內容 0x2aaf48。擁有該目的內容/Apartment 的執行緒,很可能正在進行非提取等候或正在處理非常長的執行作業,而未提取 Windows 訊息。這種情況通常會對效能產生負面影響,甚至可能導致應用程式停止回應,或導致記憶體使用量持續隨時間而累積。若要避免這個問題,所有單一執行緒的 Apartment (STA) 執行緒都應該使用提取等候基本方法 (例如 CoWaitForMultipleHandles),並且在長時間的執行作業中定期提取訊息。

2011年10月20日 星期四

#VB DataGridView 多層表頭

目前照這樣可以做~
但只能呈現在GRidView上
轉檔還是照 Table 欄位走
(只是重繪GridView表頭變成多維)


==========================================
可以的話需要呈現不一樣的DataGridView 畫面
要多找一點控件描繪的資料

C#中DataGridView多層表頭的制作



VS2005的DataGridView 多维合并标题 功能拓展
===========================================

''' <summary>
''' 获得底层字段集合 - > function 說明
''' </summary>
''' <param name="alList">底层字段集合</param> -> 參數說明
''' <param name="node">字段节点</param>
''' <param name="checked">向上搜索与否</param>
''' <remarks></remarks>

建立自訂韓式的相關說明
以 ''' 開頭 
< 標籤 > 做說明 < /標籤 >
在使用上,寫入該函示,會像內建說明一樣,
點選就顯示你寫入的說明


  <Description("设置或获得合并表头树的深度")> _
  Public Property ColumnDeep() As Integer

建立自訂屬性的相關說明
以<Description("做說明")>_ (注意要有 "_")
宣告屬性


2011年10月19日 星期三

VB EXCEL 透過複製貼上,如何自動決定提示訊息框動作

excel 剪貼簿含有大量資料

 '關閉剪貼簿大量資料訊息提示
 xlApp1.Application.CutCopyMode = false

相當於"否",將會自動清除剪貼簿資料
(從複製的那個檔案 xlApp1 做設定)

'剪貼簿資料與選定範圍的大小形狀不同,仍要貼上嗎


Range("A1:I35").Select
改為 Range("A1").Select
excel自動依表格大小貼上! 

#VB 檔案鎖定

希望透過Server建立一個檔案
當使用者權限可以編輯

檢查該檔案是否被鎖定
是    則只有瀏覽權限
否    則建立鎖定 鎖定該檔案

跳出或系統崩潰
解除鎖定 (類似開啟檔案,中斷則解除鎖定)


大致上要注意宣告的開檔 變數
要宣告成表單的痊癒變數

該變數將會在表單結束時才回收
就可以做到持續鎖定的方式(檔案Open)

'發現說關閉表單並沒有釋放FileStream.Open
關閉表單做用 try-catch 做釋放動作
======================================================

FileInfo 類別



FileAttributes 列舉型別

Offline檔案是離線的。檔案資料不是直接可供使用的。 
Supported by the .NET Compact FrameworkReadOnly檔案是唯讀的。 
Temporary檔案是暫時的。檔案系統嘗試將所有資料保留於記憶體以備快速存取,而非將資料清除回存於大量儲存裝置。當不再需要時,暫存檔應該由應用程式刪除。 

======================================

FileStream.Lock 方法


好像可以
但是變成要開啟兩次以後才能LOCK


感覺像是我宣告鎖定檔案的方式
沒辦法持續到該表單結束以前才 UnLock


可能需要改寫
透過嘗試寫入的方式
而不適單純開啟檔案的模式
======================================
File.Open 檔案鎖定問題


档案锁定法 (for VB)




使用法:LockFile "档案名称" (Sub)

Private Sub LockFile (FileName As String)
Dim Temp As Integer
Temp = FreeFile
Open FileName For Binary As Temp
Lock Temp
End Sub

2011年10月18日 星期二

VB ListBox 移除 Item, 多重選取模式

@ ListBox1.SelectionMode = ListSelectionMode.Multiple

@ListBox 載入 資料 設定 DataSource 以後
    要移除 Item 必須透過 DataSource 才可以


之後改變作法直接讀取每個 Row 寫入 ListBox

所以可以直接操作 ListBox 做移除

@每次移除一筆資料以後,該 ListBox 的清單索引值將改變
   所以不能透過選取索引數值來做   一次性的多筆刪除


   For Each Index As Integer In ListBox1.SelectedIndices
                ListBox2.Items.Add(ListBox1.Items(Index))
                ListBox1.Items.RemoveAt(Index)
    Next

    需要透過抓取每個資料值來做刪除

@將選取的多筆資料數值以陣列抓住
,並且逐筆移出 該 List
  
         Dim items(ListBox1.SelectedIndices.Count - 1) As String

            ListBox1.SelectedItems.CopyTo(items, 0)

            For Each item As Object In items
                ListBox2.Items.Add(item)
                ListBox1.Items.Remove(item)
            Next

#VB Spark 多重欄位排序的 DataGrid


Spark 多重欄位排序的 DataGrid


需要做一個可以選擇多欄位做排序動作的 GridView
EX.MAC排序後
  排序後資料也能依照Date做日期排序

2011年10月16日 星期日

@Tools 透過原物料,探訪找出MCST製令有用到該原物料的舊料號


先這樣

===============================
    Dim tblMCSTGoods As New DataTable
    '\stru\HFGOODS.DBF   1 2 3

@有三個檔案,有重複資料,
合併,去重複

    Dim tblMCSTComp As New DataTable
    '\stru\COMPOUND.DBF    1 a
@COMPOUND比較多,但看起來還是有多少
目前還是以COMPOUND著手

    Dim tblMCSTGoodsm As New DataTable
    '\stru\GOODSM.DBF


========================================================
'或許改成範圍搜尋
某個MCST檔案範圍
不去作全部的比對

@感覺目前抓的產品內容HFGOOD.DBF是做出來的
應該事先走別的部分,透過舊料號抓到某些代號以後才去走 HFGOOD
這要再問看看
目前先走HFGOOD

@透過 taigoods.dbf 去撈出 HFGOOD 要走的產品料號

@再來應該是缺少商標,
該怎麼知道八馬應該帶入哪個商標
透過舊料號的末三碼
去找 customer 資料夾
去找該檔案下的商標編碼 Labes

'都是走製成料號去抓
先比對製成料號下,所抓的調和編碼是不是一樣


@看起來 ERP 調和內容 M 開頭
都已經拿掉地區編碼
所以舊料號應該可以放心拿掉最後一碼(為字母時)

'ERP所有製令料號
select a.pdtcode, b.partrule, a.pdtkey, a.pdtversion from tblbompdt a
join tblstock b on a.pdtcode = b.partcode
where a.pdtcode like '%XF' and not a.aprvdate is null and a.isnotvalid = 0
order by a.pdtcode



======================================================
'有太多不一致了
要再想一想

'見鬼,ERP找的到調和
SQL找不到 (尚未核准)

幹~可能要走第七碼

以MCST檔案為主, 切兩個 View
@調和內容單純對調和內容

只需要走調和內容比對
@Good只需抓使用數比對


檔案在 Server端
直接存取
Server.MapPath("路徑") 去做 CnS

上傳Excel檔案時發生錯誤,訊息為不是一個有效的路徑
http://www.blueshop.com.tw/board/show.asp?subcde=BRD200710091155432EO


OleDbConnection cn = new OleDbConnection ();
//設定連線字串
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("../Upload_Excel/") + FileName + ";Extended Properties=" + "Excel 8.0;";

這好像是 .NET才寫的
winForm不能用
還是下載來操作吧


=======================================
抓產品名, 去對MCST所有產品


'舊料號 比對 找新料號 XF
select * from tblstock
where partrule like '15]' and partcode like '%XF'

'找到該產品應該走的 Proc  (PdtKey, PdtVersion)

select * from tblbomPdt
where pdtcode like '000215B----XF'
==============================================
@抓 MCST 所有 產品檔案 去跟BOMProc 調和名稱對
然後一一比對 調和使用數


'該調和使用數 (ProcNum/CardNum)

select * from tblBomProc
where proccode like 'BS033'

@
procNum = Botmgw1 + Botmgw2 + Botmgw3
XD = Glassn1~3, Fibern, Qn1, Qn2

==============================================
MCST調和檔案 (Compound)
不包含該調和使用數 (使用數紀錄在產品檔案中)

@所以抓MCST所有調和 去跟 BOM表 調和名稱對
然後一一比對內容

'該調和製程內容 (PartCode, PartNum / CardNum )
'並且換成舊料號(PartRule)
'找最新PdtVersion


select a.partcode, b.partrule, a.partnum, a.cardnum, max(a.pdtversion)from tblbompart a
join tblStock b on a.partcode = b.partcode
where a.proccode like 'BO007-7'
group by a.partcode, b.partrule, a.partnum, a.cardnum



@
ProcCode = Dispense
Partcode = Mgn1~4, Mfn1~4, Nln, Npn,
@Mgn M開頭原料,最後一碼為字母者,去掉最後一碼  (舊碼 地區編碼)
@M料號 在 Mgn之間應該是不會重複(不同地區編碼,也不會出現)
PartNum = Mgw1~4, MfW1~4, Nlw, Npw,
CardNum = Ttw * 1000
--------------------------------------------------------------------------
反過來,透過ERP調和製程,去比對MCST

'所有調和製程


select distinct(a.proccode), b.partrule from tblbompart a
join tblstock b on a.proccode = b.partcode
where len(proccode) <> 13





=============================================
因為核對舊系統與新系統物料有點麻煩的關係
需要寫一個可以找出某段期間內的製令下
透過篩選的原物料號,
就可以排除其他不相干製令

在核對新舊系統資料上,可以少一些功夫

然後透過製令製造書的假檔案
做出要讓舊系統列印的資料
在跟MCST印出的資料作比對

==============================================

或是說 直接透過舊DBF資料,比對ERP BOM表資料

找出調和內容不一致的料號

\\Win2ksv01\tai-dos\make 之下
HFGOODS 物料 有哪些製成,
COMPOUND 調和內容 有哪些原物料

ao002紅  -> ao002R
ao003新  -> 沒有

可以做~需不需要做~要問看看老大

2011年10月14日 星期五

#Crystal Report 分頁~利用群組欄位


[Crystalreport] 分頁~利用群組欄位





在每個群組之後做分頁之類的變數重新設定


在 "群組尾" 的地方,
選擇 "區段專家"
"分頁"
可以設定每次換群組就重新計算分頁

所以sum應該也可以


在VB2005的Crystal Report 中, [摘要型別] 清單中,找不到 [總和]。
可能是您選是字串型態欄位
而不是數值欄位 

所以要使用 摘要~去計算 總和
要先確定該欄位型別是數字(dataset 設定)
如果非數字型態
就沒辦法做出數字型態的計算


@需要注意說,新增分頁,可以選擇在群組變換之前或是之後
目前測試新增之前,累計總和出不來,判斷上可能有其他設定方式
改新增之後新增分頁
但是都會多出最後一個空白頁
寫個判斷去拿掉最後一夜應該就可以

'再新增分頁之後 , 加入判斷 ,並打勾


if OnLastRecord then
 formula=False
 else
 formula=true
 end if



===============================================
crystal repoorts 9 分頁統計
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060907132032A05

以前在Crystal Report 8有做過分頁小計
大致上的方法為
1.在Page Header Section放置一個Formula Field,內容為負責reset
2.Detail Section負責Sum
3.Page Footer Section負責顯示

2011年10月13日 星期四

@CASE 8 < 網子拆解,產出月統計表 > ver-111013

目前先做雛形
只管染色前領料
裁切後回報

@回報領的網子是已經染過的
所以回報跟領料單號對不上

目前會變成說,領料與回報沒有絕對的關係
(如果領的是以切網子,與回報就能做關聯)

先單純紀錄月報表

@分 領取網子原料 表格
以及 領取以切網子 表格  (以裁切,再次裁切)

'忘記 日期 yyyy/MM/dd 怎麼轉excel 顯示了
1.用string.Format("{0:0000/00/00}",val(value)) 將資料抓住 ( 轉數字,用string格式抓字串)
2.設定datagridview顯示格式
3.設定excel顯示格式

@注意一定要用 "/" 做分隔
=========================================
需要透過拆解回報領料單,去統計月分內(回報單日其)

拆解領料單領了多少東西
拆解回報單生產了多少東西

可能需要了解遺下網子與裁切過後的料號之間的關聯
了解某批網子生產了哪些東西,數量

目前看不出來源反與網子之間有什麼關聯
但是拆解領料與回報單可以隊的上
所以可以兩邊核對做出月報表

@回報單上會記錄領料單號

@有拆解領料單,不一定有回報單 (領料單上沒打回報單號)
    回報單一定有拆解領料單
( 領料單的資訊不準確,以回報單為主)

@好像會有領料 領"已經裁切"過的網子,再來裁切成更小的尺寸
 OY4312522  -> OY4302565

@看不出領料,回報之間OA被什麼染色

@看起來是當天領料當天回報
所以領料回報可以做成一筆資料,在同天發生

@因為拆解領料有網子,有樹酯
為了分攤計算成本
每種尺寸用的樹酯趴數,會有所不同
ex. 領 OA250,OA389,用 NL2530--
兩個計算上,用的NL趴數不同
樹酯成本分攤在兩個上面也就不同

要問問看領料的時候,是依據什麼公式來計算要領多少,才能生產要的數字


@分類上,基本上依照第三,第四碼去分,但是可能要再顯示尺寸

@看能不能直接開檔案,然後把回報數值填入該天,讓他自己跑公式
但是怎麼分類就要搞清楚

@"檢"的部分,也是直接鍵入ERP
問看看有沒有什麼方式去挑出來不計算成本


@也要看,染色前的領料產出
ex. OA250 -> OA250-C

@大片頭固定每天生產一定量個網子
染網也是每天固定幾隻
因人力會有所增減
負責生產運送

淡水這邊建ERP資料(拆解,回報 )
所以要問淡水這邊
==============================================

'找拆解領料,領了哪些東西, (O%,N%,W%, not %-c)
select a.striprepno, a.striprepdate, b.striprcvno, b.partcode, b.striprcvqty, b.striprcvbadqty
 from tblstriprep a
join tblstriprcvdet b on a.striprcvno = b.striprcvno
where not a.apvddate is null and a.status = 2 and a.striprepdate like '201110%' and
 (b.partcode like 'O%' or b.partcode like 'N%' or b.partcode like 'W%') and b.partcode not like '%-c'
order by b.striprcvno



'找拆解回報,產出哪些東西, (O%,W%,R%, not %-c)
select c.striprepno, d.striprcvno, d.striprepdate, c.partcode, c.striprepqty, c.striprepbadqty
from tblstriprepdet c join tblstriprep d on c.striprepno = d.striprepno
where not d.apvddate is null and d.status = 2 and d.striprepdate like '201110%' and
 (c.partcode like 'O%' or c.partcode like 'W%' or c.partcode like 'R%') and c.partcode not like '%-c'
order by c.striprepno



'直接抓第三,第四碼,來判斷是屬於哪個OA

==================================================
拆解領料單 tblStripRcv, tblStripRcvDet
拆解回報單 tblStripRep, tblStripRepDet

透過回報單日期,
1.去找拆解領料單,領了多少物料
2.回報單,回報產出多少物料

@網子裁切不走BOM表,所以應該無法透過BOM表去了解OA 產出那些OY
    或是有什麼規則,要再問問看
@也有一些規則, ex OA310  -> 產出 OA310-C
@OA 為網子原料, 尚未裁切,尚未染色,  總共 5 碼
    OY 為已切網子, 已經裁切  總共 9 碼

@OY XX abc de
    Y  應該就是顏色,染色後的顏色:
         未染色 A, 黃 Y, 黑 B, S SKILL
    XX 就是網子原料的粗細(強度)
跟著網子原料,不會改變
=========================
看要裁切成什麼尺寸,去做組合
    abc應該就是尺寸,
    de 就是孔徑

@OA網子原料,規格似乎可以看出該原料可以做成的網子第三第四碼
ex. OA376,   原反 550#    可以做出 OX"55"abcde
      OA389,   原反 400#    OB"40",OY40
      OA310,  31 (310)
    * OA250, 25 (250) , OS25  250 (S size)
     *OA135, OB4017835,OY5511522 (交織 1350)
     OA350, 35 (350)
      OA376, 55 (550)
     OA378, 58 (580), 1378(580)
      OA389, 40 (400)
     *OA138, 18 (1358)
      OA396, 43 (430)
==============================================
處理表 (染色前領料)
OA376,  OY 1376 -> FR2530 -> NL2530-- (黃)
OA389,  OB 1389 -> FR2530 -> NL2530SB(黑)
OA138,         1358
OA310,         310
OA420,         420

@每種網子有不同尺寸,目前ERP上似乎看不出尺寸差別
尺寸影響到 一些公式計算 :
1.使用長度
(不確定是不是受尺寸影響)
2.時數
3.效率

@填充劑(領料,染色)
 N開頭, 8碼
NL2530--   黃色 (FR-2530)  -> OY
NL2300--
NL2530SB 染黑 (FR-2530)  -> OB
NL2530SK SKILL用 (FR-2530)  -> OS
NL2200AK
樹旨液

NP3648-- 樹酯粉
2 F=填充劑  L=樹脂液  P=樹脂粉


@WZ開頭 不織布
不足部分以 X 補足 12 碼

@不織布原料 W 開頭
  共6碼
目前只有 WAS400

@ 不織布以切 R開頭
 共8碼











2011年10月12日 星期三

#VB ControlBox 關閉,資料儲存動作

希望透過ControlBox的關閉按鈕
能夠偵測那些子表單還沒關閉
並進一步詢問做儲存動作

======================================================

請問如何隱蔵右上角的"X"



Public Class Form1

  ' 覆寫 WndProc 進行視窗訊息處理
  Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_SYSCOMMAND = &H112
    Const SC_CLOSE = &HF060 ' 關閉
    ' Const SC_MIN = &HF020 ' 最小化
    ' Const SC_MAX = &HF030 ' 最大化
    If m.Msg = WM_SYSCOMMAND Then
      If m.WParam = SC_CLOSE Then
        ' =============== 你要做的事情 ==================
        MessageBox.Show("關閉")
        ' =============== 你要做的事情 ==================
        Return
      End If
    End If
    MyBase.WndProc(m)
  End Sub

End Class

#VB DataGridView 自訂排序


DataGridView 列自定义排序
http://topic.csdn.net/u/20070525/09/cb563777-ad04-48b0-a2b1-b4b07ebd9039.html

'可能需要複寫自動排序邏輯(MAC欄位)
1. "-" 之前
2. "-" 之後

1.先比長度
2.在比字串


[.NET][Winform] 利用集合排序,重現 DataGridView 資料繫結後的排序





Sort DataGridView cells in programmatic way



@當GridView被鍵結到 DataTable 以後
無法透過 GridView.Sort 去自訂排序


要從 DataTable 著手

Linq: Sorting a DataTable


http://msmvps.com/blogs/deborahk/archive/2009/07/23/linq-sorting-a-datatable.aspx

可以比較,但是目前好像沒辦法做兩次比較
看了一些也只是簡單的升降密排序

目前作法是分 "-",前後兩個字串
是否能轉數字,不能就下沉

前後段數字比較

需要先透過view去排序 Table
最後再把View 轉回 Table 指定給 原始Table



需要透過某種方式去判斷自訂排序的升降密
原本的可以透過 DGV.SortOrder 去取得目前的排序方式
自訂就不行
當您使用自訂排序為控制項排序時,這個屬性的值並沒有什麼意義。
透過自訂一個狀態變數來記憶目前自訂排序的方式

無法轉換數字做比較的,
以原始字串比較方式排序


2011年10月11日 星期二

DataGridView上直接編輯之幾個好用的指令


DataGridView上直接編輯之幾個好用的指令

VB LINQ 排序欄位 容許空值


LINQ: OrderBy with nullable columns in TypedDataSets


        evensQuery = (From task In tblTaskShow.AsEnumerable _
          Select task Order By IIf(IsDBNull(task("TRNDATE")), "", task("TRNDATE")), task("MAC"))

在 Order By 之後判斷是否空值,以空字串取代
IIf(IsDBNull(task("TRNDATE")), "", task("TRNDATE"))

VB DataGridView MultiSelect drag problem


DataGridView MultiSelect drag problem




透過 Me.DoDragDrop(Me.SelectedRows 要抓的資料, DragDropEffects.All) 寫在 mouse Down
Drop 時候,透過 


   Dim test As DataGridViewSelectedRowCollection = e.Data.GetData(GetType(DataGridViewSelectedRowCollection))
將該資料取出 Loop寫入放置位置


然後注意遺下該 資料 在 table的原始位置就可以了


在每次托放作業結束以後
將dgv1,dgv2重新與 DataSource鏈結一次
來更新 dgv 與 table 之間索引值得關係 ( DataBoundItem )

VB 抓DataGridView 綁定資料的 Table 索引值



@發現說如果開放排序功能
托放作業將會受到影響
(view的排序與實際 table 排序不同)

DataGridView排序後,如何抓取綁定資料的正確索引值
http://www.baddog.idv.tw/notebook.php?mo=notebook&fn=view&id=5

DataRowView drv = dataGridView.SelectedRows[0].DataBoundItem as DataRowView;
int index = dataTable.Rows.IndexOf(drv.Row);

所以必須要在mouse down 的時候,抓drv 與 tableRow之間的關係
找到真正的 index

在每次托放作業結束以後
將dgv1,dgv2重新與 DataSource鏈結一次
來更新 dgv 與 table 之間索引值得關係 ( DataBoundItem )

VB DataGridView排序狀態移除問題



DataGridView排序狀態移除問題


只有當未設定 DataSource 屬性時,這個方法才有效。當您將 DataGridView 控制項繫結至外部資料來源時,您必須使用該資料來源所提供的排序作業。當您藉由實作虛擬模式來提供您自己的資料來源時,也必須自行處理排序作業。


不要透過DataGridView來取消排序。要用 DataSource 來取消,因為有Binding到DataSet。

不想排序時,把 DataTable.DefaultView.Sort 清空即可,即:
 DataTable.DefaultView.Sort = string.Empty;

2011年10月10日 星期一

@Tools 檢查BOM表是否完全

需要一隻程式
去找那些東西BOM表示還沒完全建好 (isnotvalid = 0 , acptdate not null)


看需不需要全線管理
要做到什麼程度
要再想想看

2011年10月6日 星期四

VB String.Format 字串表示法

String.Format 好用的字串表示方法

#VB DragDrop 控件內容淡色繪製呈現拖拉圖示效果


再來就是應該要能夠繪製多個選取資料
而不是單一個row

重點應該是放在怎麼選擇擷取範圍大小
1. 當多選時,中間可能跳過空白
2. 描繪的基底圖層,是畫面上可視範圍的GridView內容
3. 被選取托放的 row, 被景色深藍
4. 應該空下未被選取的 row, 然後繼續描繪之後有被選取的 row
  *************
  *************
   空白
  *************

可能需要一個一個row判斷

發現說目前的托放動作
有可能畫面上不會出現選取的資料
選取資料在畫面之外

如果照目前走,會碰到說
基底圖層並沒有包含任何選取 row

弄一個空白圖只有一個row表示

有點複雜
除非說我自己控制繪圖

目前先在滑鼠點選的row進行基底圖層的抽取
家個判斷該 row是不是屬於 選取row
不是的話就用個空白的 基底圖層代替

目前又卡在說form跟隨滑鼠跑,但是放開以後,
滑鼠還是在form之上
變成說mouse up事件無法發生在原本表單之上
無法執行關閉 form 的動作

除非說form是完全穿透的狀態
所有事件都會直接穿透

目前設定讓 form 稍微位移,
不至於讓鼠標壓在 圖層form 上

發現目前如果再非合法托放區放開滑鼠
將會造成圖層form停留
無法引發form的關閉

目前想法是
透過一個全域form
只是配合 圖層改變 去呼叫或隱藏 form

用hide跟show會造成表單閃爍
在想看其他方式能不能解決

先這樣

========================================================
再來要讓 form 跟隨滑鼠


            Dim f As Form = PictureBox2.FindForm
            f.Location = New Point(MousePosition.X - (f.Width / 2), MousePosition.Y - (f.Height / 2))

@要注意遺下mouse_up的時候要釋放關閉form
要先將pictureBox從該表單拿掉
        PictureBox2.Dock = DockStyle.None
        PictureBox2.Parent = Nothing
在座關閉動作



VB.NET 调整图片透明度 半透明图片
http://hi.baidu.com/nazi_1911/blog/item/22a73d3eeabc2e1abaa167ba.html

感覺目前做法不太好
應該根本上只是抓圖片
然後對圖片座透明處理
然後再讓他跟隨滑鼠

而不是弄出一個form



@感覺可以做出透明圖片
但是實際上並不能真正穿透
似乎還是要透過form去做到穿透

幹~多此一舉
還是要form
================================================
一直碰壁

可否將DataGridView內容另存為圖檔(含背景顏色)http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080602121510OF2

試著先將girdview存為圖片
然後再切割該圖片內容
































'目前測試可以擷取到所要的範圍

Dim ht As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y) 

If ht.RowIndex >= 0 Then 
 Try 
 Dim g As Graphics = Me.DataGridView1.CreateGraphics 
 Dim ibitMap As New Bitmap( _ Me.DataGridView1.ClientSize.Width, _                        Me.DataGridView1.ClientSize.Height, g) 
 Dim DataGridViewRectangle As New _ Rectangle(Me.DataGridView1.ClientRectangle.X, _ Me.DataGridView1.ClientRectangle.Y, _ Me.DataGridView1.ClientSize.Width, _ Me.DataGridView1.ClientSize.Height) 
 Me.DataGridView1.DrawToBitmap(ibitMap, DataGridViewRectangle)
Dim g2 As Graphics = PictureBox2.CreateGraphics()

'擷取範圍 
 Dim rec As Rectangle = New Rectangle(ht.ColumnX, ht.RowY, Me.DataGridView1.ClientSize.Width - 4, DataGridView1.Rows(ht.RowIndex).Height)
 '顯示位置 
 Dim recShow As Rectangle = New Rectangle(0, 0, Me.DataGridView1.ClientSize.Width - 4, DataGridView1.Rows(ht.RowIndex).Height)
g2.DrawImage(ibitMap, recShow, rec, GraphicsUnit.Pixel) 

 Catch ex As Exception
 MessageBox.Show(ex.Message) 
 End Try
 End If



@目前希望將繪圖繪製在pictureBox上
然後開一個新的form
將圖片放在該form
透過form的透明化
來達到需求

但是會需要PictureBox需要不斷重新繪製
不然只要剛呼叫Form.show
就會造成剛剛繪製完成的PictureBox


目前作法是
把 BitMap, 顯示Rectangle, 切割Rectangle 宣告為全域變數
將 PictureBox.Paint 事件加入判斷
當 BitMap 非 Nothing
引發自我重繪
    e.Graphics.DrawImage(ibitMap, recShow, rec, GraphicsUnit.Pixel)



Bitmap.clone 引發記憶體不足問題






=======================================

VB無所不能之四:制作透明和半透明窗體
http://merry05.blog.hexun.com.tw/48876475_d.html

透過建立一個 半透明 form
將繪圖繪製在 form 上
然後讓 form 跟隨滑鼠
直到停止托放

=========================================


VB.net的繪圖 [Part I]





VB.net 繪圖

'圖片擷取
Dim g As Graphics = e.Graphics
Dim im As Image = Image.FromFile("c:\vb教本\picture\Stone.bmp")
Dim 截圖方塊 As Rectangle = New Rectangle(87, 37, 84,104)
Dim 顯示位置 As Rectangle = New Rectangle(0, 0, 84,

104)g.DrawImage(im, 顯示位置, 截圖方塊, GraphicsUnit.Pixel)

Bitmap.MakeTransparent 方法 ()


為這個 Bitmap 將預設的透明色彩變為透明。



'有機會改改托放作業的顯示方式
希望做到panel淡色描繪的玻璃樣式

RegionData 類別

描繪區塊內容


HOW TO:使用區域的裁剪


看起來這些好像是把文字繪製在控件上面

有點不符需求

Winform中DataGridView单元格内容字体突出显示
http://hi.baidu.com/xiangboren/blog/item/1bbf9fd422ebc50ca08bb7b5.html


HOW TO:使用 Windows Form DataGridView 控制項中的影像資料行



為何不使用 Contro.DrawToBitmap 方法
http://blog.xuite.net/alwaysfuturevision/liminzhang/8534715


看能不能抓到點選 row 的 location
從該row去描繪

或是說透過panel
描繪一個方塊
複製點選區塊


======================================================================


.NET中DragDrop的光标






Control.GiveFeedback 事件



目前可以描繪控制向外框
但是侷限在controls
要找辦法描繪 GridViewRow
然後描繪整個row,而不只是外框

#VB DBF透過 Oledb 建立 欄位 Numeric 型態,無法設定長度問題


'發現說View上面型別會影響寫入dbf的型別
所以說 view to TXT 的時候,一定有方式記錄型別

1.view讀取之前設定型別
2.轉dbf寫入型別

@使用excel轉DBF可能會有資料長度問題
看有沒好的方式

透過OleDB去寫入資料
不過可能就要走訪View,一個cell一個cell撈

先清空table,在寫入view的資料

最好是紀錄異動資料去寫入


為甚麼在.net的SQLSTRING無法成功,因為一個COMMAND只能用一個SQLSTRING,所以您的多個INSERT語法無法成功執行。


好像沒辦法多筆新增
現在跑回圈一筆一筆新增~很慢
要找辦法

過程中
connection.open 與 close 做一次就好
大幅提高效能

@numric 每次長度都被改調

NUMERIC是固定為8個位元倍精準度資料,不可以有資料長度存在
只有字串才可以定義資料長度

http://vbqa.pixnet.net/blog/post/54257824

double, numeric, float 全部都會變預設Numeric 20 0
目前找不到透過oledb轉型的方式

太極守了

=============================================
不然就不用Create
用複製檔案的方式

建立一個範例檔案,做為以後新刪修的tmp