2011年12月29日 星期四

#VB ScrollBar 限制範圍

1.按下 Scroll 向下鍵
2.觸發設定 FirstDisplayedScrollingRowIndex
3.引發 OnScroll 事件





请问怎样用sendmessage函数向VSCROLL滚动条控件发送滚动的消息?





窗 口 的 自 动 滚 动

透過SendMessage控制功能表項





How To AutoScroll a DataGridView during Drag and Drop


How to detect if a scrollbar is or is not at the end of a richtextbox (vb.net)

========================================================
感覺是因為FirstDisPlayedRowIndex 改變
才引發 Scroll 事件
所以沒辦法單方面改 OnScroll
應該去限制 FirstDisPlayedRowIndex 的最大值
要查看看有沒有辦法

當到達底端,
設定移動變量 = 0
向上移動時,
在設定移動變量 = default

應該可以透過 Reflection 來做
Dim verticalOffset As Reflection.PropertyInfo
verticalOffset = Me.GetType().GetProperty("VerticalScrollingOffset", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance)
verticalOffset.SetValue(Me, 0, nothing)

抓到映射屬性,但是沒辦法 setValue 
發生
找不到屬性集方法。






                        '判斷是否索引屬性,若params.length = 0 表示該屬性非索引屬性
                        'Dim params = verticalOffset.GetIndexParameters
                        'For Each p As Reflection.ParameterInfo In params
                        '    MsgBox("   Parameter: " & p.Name)
                        'Next



============================================================
不知道為什麼 製令製造書的FirstDisPlayedRowIndex 總是呈現的資料比實際變數抓到的大 1
大致上可以限制了
但是畫面還是可以向下推移,
看能不能限制說當到了限制位置後,ScrollBar的向下或向上就失效


感覺跟FirstDisPlayedRowIndex 比較有關係
看能不能透過事件什麼的,限制FirstDisPlayedRowIndex 只能在設定的最大值以下


你怎麼能做出一個項目的DataGridView滾動一次使用鼠標輪?

這邊可以做到,但是變成說要去寫 MouseWheel事件
keyDown事件
還要去寫ScrollBar持續按下向下箭頭控件事件
都要做類似事情,才有可能不再向下
Cell在編輯狀態下 KeyDown 事件

或是要再查查看其他方法

或是透過WinProc來改寫 {UP},{Down}
1.去判斷是否已經到達最大值
2.持續送出{DOWN},將會無視=>不做任何動作
=========================================================================
碰到說DataGridView資料的垂直捲動軸,當往下拉到底,會拉超過GridView顯示的範圍
變成多出空白行


平行的捲動軸就沒有這個問題


這會造成我在新增資料烈的時候,
因為改變Cell數值造成重新資料鏈結
產生焦點Cell跑掉的問題


看能不能限制垂直捲動軸捲動到最後一筆資料列之後,就無法再向下
(預設可以=>多出空白)





目前透過設定FirstDisplayedScrollingRowIndex去找
應該要限制的Maximum


卡在怎麼抓到正確的原始Maximum


再向上移動的時候,去還原原始Maximum
當又遇到FirstDisplayedScrollingRowIndex時候
再去限制Maximum


再想想
===========================================================



感覺要自訂,去寫出每次變動的量,
然後判斷是不是value到了max
限制value只能到max~0
目前透過row重繪之後,
去判斷最後一筆資料出來了沒
出來了就把焦點限制在最後一筆資料顯示的頁面之上
FirstDisplayedScrollingRowIndex


看能不能之後鎖住Scroll不能再向下拉動只能向上




不然就看能不能委派自訂事件
附加在GridView Scroll事件之下
每次變動,檢查是不是超過max
並且指定只能<=MAX
=======================================================
可以在Gridview的Scroll事件之下
限制e.newValue的數值
去做到控制滾動軸位置的方式(畫面會閃爍)

卡在怎麼抓限制的數值,以及滾動的座標?

可能要計算 Scroll.Max 跟 Gridview.height 之間

@改變max似乎只是改變scrollbar的移動量
並不是絕對位置,而是相對位置


VB.NET DataGridView SCrollBar鎖定



在Scroll事件中如何计算窗口内的row值






Value的范围是从Minimum到Maximum+1-LargeChange, 
你可以根据这个来计算Maximum, 
因为你不需要Value=Maximum就可以完成你的操作。



2011年12月26日 星期一

#VB 透過LinQ將 column轉型(string=>Int32),並且遞增排序


How to convert the column in order by linq





        'String欄位 轉 Int32 遞增排序
        evensQuery = (From task In tblTaskShow.AsEnumerable _
        Select task).OrderBy(Function(task) Convert.ToInt32(task.Item("index")))

        If evensQuery.Any Then
            '最後一筆,即最大index
            _maxMainIndex = evensQuery.CopyToDataTable.Rows(evensQuery.CopyToDataTable.Rows.Count - 1).Item("index").ToString
        End If

2011年12月20日 星期二

#EXCEL 2003規格限制


Excel 的規格及限制



全部顯示
適用於
Microsoft Excel 2003
列和欄的最大數目
Microsoft Office Excel 工作表包含 65,536 列和 256 欄。您無法增加超出此列和欄上限的列或欄數目。

EXCEL儲存格的問題

Excel 2003 以前是 256 欄,2007 是 16,384 欄,在 Excel 2007 若存成 2003 以前格式,仍受 256 欄限制。


1. Excel 的物件模型放在 Excel.exe,這不必懷疑,但如果你是用 Excel XP 以上版本,你應該要引用的是 Primary Interop Assmblies,而不是直接去參考主程式 .
Office 2003 Primary Interop Assemblies 可以在 Microsoft Download Center 中找到 .
2. 如果你要在物件模型中的 "選擇性參數" 套用空值的話,不要用 null,改用Type.Missing.

2011年12月19日 星期一

#SQL 大量資料搜尋


20萬筆資料,Mysql資料庫就跑不動囉!!

#VB 欄位數值無法設定為 null,請改用 DBNull。

原本帶入Nothing發生
欄位數值無法設定為 null,請改用 DBNull。
應該是 null 跟 DBNull有某些地方的差別
才造成這個問題

小朱 DBNull.Value 別和 null 混為一談

null表示該 物件參照不存在
DBNull則表示 初始化的變數不存在的資料庫資料行

改帶入 DBNull.Value 就可以了

2011年12月18日 星期日

@CASE 13 < 訂單細項交期展示表 > ver-111219

牌製令,選配都會看
目前操作上只有篩選日期,客戶ID範圍
將直接進行資料撈取轉檔

希望能夠限制日期一定要輸入
甚至於只能在某個區間內,
超過將以固定區間計算,或提示

'應該可以改在一個檔案,不同Sheet


1. 3,4碼數字的,可以看出外徑
2. 大致上還是要看PartRule,先切空字串,再切 '*'(有的是用'x',有的是用'*'),
    分別取外徑與孔徑,去做排序,
    將相同外徑與相同孔徑放在同一區塊,
3. 要處理一些特殊產品,像是"9"開頭的產品,外購品,
    很多看不出尺寸,
    確認是不是都不上機台,

    是不是會委託蘇比克做
    會委託的應該是那些東西(9開頭?,未滿13碼的料號一定都是原料?)
    是不是看不出尺寸的都是
    或是說其他東西也會委託

    要怎麼處理要再問問看

4. 這應該是第二步
    納入機台資訊,考量各機台產能,
    將帶入的訂單細項,去依照一定方式分配
    分配之後不會影響各機台運作
    (好像是工業資源規劃,要再查查看)

    大致上想法是為了區別,哪個機台可以生產哪種規格產品

    要怎麼考慮跨機台生產,或通用生產產品的分類
    要再討論看看

=================================================
考慮訂單細項上 XX,HX,EX,XF
1. 是否結案(結案不看)
2. 是不是不需考量產品是否在Stock中停用
    (停用應該不會在訂單上,或是說應該不需要去考慮BOM表,或選配的問題
     只要抓實際要得訂購數量就好)
3. 需不需要考量單據版本異動,訂購數是否有異動
    目前都是抓最新可用訂單來看
4. 應該可以選擇
    不看結案,未作廢(未核准,核准),不一定確認(未確認0 or null,確認)
5. 加入選擇細項是否結案(0,1),
    訂單是否核准(0,2,不看作廢9),


====================================================
1. 照交貨日期排序塞入第一行資料
2. 排序PartRule,
3. 對照日期塞入數量

===================================================
'寫入EXCEL
 訂單日期 tbl
 訂單細項數量 tbl
排序後

1.依照訂單細項排序依次寫入
2.找第一筆細項,
3.找該細項 在 訂單日期tbl 上的位置, 計算出 寫入Excel 訂單號排序位置,
4.兩方交集cell,寫入該筆細項數量

方案一
整個使用上
搜尋後就會建立EXCEL檔案,
GridView讀取該建立檔案去顯示資料

方案二 (目前先走這個)
單純建立一個篩選表單
直接轉檔開啟Excel

不再透過GridView
所以也不能再Form上面對GridView操作


'目前卡在怎麼找出正確的索引位置
看能不能從SQL撈資料的時候,就建立一個流水號欄位
(也就是交易日期排序的索引)

'需要在細項上也做一個索引

'將相同單號,相同出貨日期放在同一欄下帶入數量
所以訂單日期也需要Distinct


適用於
Microsoft Excel 2003
列和欄的最大數目
Microsoft Office Excel 工作表包含 65,536 列和 256 欄。您無法增加超出此列和欄上限的列或欄數目。


'需要切成幾個檔案來轉EXCEL

===================================================
'************************************************
1.5,6,8都是特殊尺寸,會在單獨機台生產
   4是蘇比克生產 (自成一類)
   9是外購品 (自成一類)
2."-"是規格資訊,應該忽略 或是再問問
   "/" 要再問看看
3.超過三個數值,特殊產品,要問看怎麼分,或自成一類
   兩個數值,前為外徑,後為孔徑,或是自成一類
   要再問問
'************************************************


    '*******************
    'PartRule 尺寸排序演算法
    '1.新料號前兩碼,區分產品類別 (22種) (倒數第三層 40,82,90 最下層)
    '2.Split PartRule by " ", 取(1)區分尺寸資訊
    '3.Spilit PartRule by '*' or 'x' ,並計算有幾個乘數 (3, 2, 5, 其他 => 各自自成一類)
    '4.取外徑排序,再取孔徑排序 (不取字符,取數值比大小) (5或其他 則不排)
    '5.尺寸排序後再依照料號排序
    '*******************



[C#.NET][VB.NET] 字串分割 / String.Split



排序
1.除了9開頭料號,發現還有一些其他東西,也不是一般規格寫法
   EX: 4,8,6,9規格寫法都不太一樣 (5也有少部分)
2.大致上先用空白去切,再來區分乘法符號(有的*,有的x)
3.切出來的可能會有  "其他資訊 / 要的數值" 或是 "要的數值 / 其他資訊"
    這部分要再問問看 (會有 '/', 也會有 '-')
   有的還會附帶括號 (資訊)
   或是直接接上其他資訊 ( mm,布,高...等等 )
4.也會有不只外徑*厚度*孔徑的,乘了4,5個數值
5.應該先以新料號三四碼區分外徑大範圍分類,
   再去看外徑區間數值去分類
   在看孔徑

#VB EXCEL 文件匯入DataGridView


将Excel的数据导入DataGridView中[原创]


簡單的連線檔案,塞資料到Table,將GridView資料來源設定Table
要注意遺下 Conn的連線字串
把數字,文字混合的單元格 視為文本來導入 的連線字串寫法

 Public Sub EcxelToDataGridView(ByVal filePath As String, ByRef dgv As DataGridView)
        '//根据路径打开一个Excel文件并将数据填充到DataSet中
        Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " _
                                + filePath + ";Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'"
        '//导入时包含Excel中的第一行数据,并且将 数字和字符混合的单元格 视为文本 进行导入

        Dim conn As New OleDb.OleDbConnection(strConn)

        Dim strExcel As String = "select  * from   [Sheet1$]"
        Dim myCommand As New OleDb.OleDbDataAdapter(strExcel, strConn)

        Dim ds As New DataSet

        Try
            myCommand.Fill(ds, "table1")

            dgv.DataSource = ds.Tables(0)

        Catch ex As Exception

        End Try


    End Sub

2011年12月17日 星期六

#VB DataGridViewLinkColumn



在DataGridView列中表示链接  


========================================================
找不到怎麼把已經鏈結的column改成LinkColumn
除非說一個一個複製資料值
然後把原始的殺掉取代

有點麻煩

2011年12月16日 星期五

#VB 透過 System.Diagnostics.Process 執行外部程式

請教 System.Diagnostics.Process 執行外部程式問題 


.Net 中身分模擬的作法


#VB 透過位元計算來提升程式效能



位元運算在 C 語言相當常見,這種寫法的優勢在於運算非常的有效率,但缺點是可讀性不高和寫法上有些許限制,因此,如果程式有執行效能瓶頸,可透過位元算算來提高運算效能

雖然上述的數據相當誘人,不過,還是建議效能關鍵處再使用上述的方式,否則後續維護上是一個問題

===============================================================
var y : byte = x << 10;
 // Actual shift is 10 & (8-1) = 2

左移運算子<< 

x << 1 即 x*2
x << n 即 x乘以(2的n次方)

右移運算子>>


x>>1 即x/2
x>>n 即 x除以(2的n次方)

位运算之左移右移运算之详解


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

執行結果如下: 
before encoding:A
after encoding:F
decoding:A

0x7是C中整數的16進位寫法,其實就是10進位的7,將位元與1作XOR的作用其實就是位元反轉,0x7的最右邊三個位元為1,所以其實就是反轉 ch 的最後兩個字元,如下所示:
0100000165 (對應 ASCII的'A')
000001110x7
0100011070 (對應 ASCII中的'F')

=> 01000001 => 65  'A'
      01000110 => 70 'F'
xor:00000111=> 7 (加解密遮罩)

同樣的,這個簡單的XOR字元加密,要解密也只要再進行相同的位元反轉就可以了

要注意的是,雖然在說明時都只取8個位元來說明,但實際的位元在運算時,需依資料型態所佔的記憶體長度而定,例如在使用int型態的0作運算時,要考慮的 是32個位元,而不是只有8個位元,因為int佔有4個位元組。

在位元運算上,C還有左移(<<)與右移(>>)兩個運算子,左移運算子會將所有的位元往左移指定的位數,左邊被擠出去的位元會被丟棄,而右邊會補上0;右移運算則 是相反,會將所有 的位元往右移指定的位數,右邊被擠出去的位元會被丟棄,至於左邊位元補0或補1則不一定,視系統而定。 




二進制轉十進制:
例題一:00011101(二進制)轉十進制(八位元)
最左邊的數為0,得知此數是為正數
00011101=+(1*2^4+1*2^3+1*2^2+1*2^0)
=+(16+8+4+1)
=+29
例題二:11100011(二的補數)轉十進制(八位元)
最左邊的數為1,得知此數是為負數,且為二的補數
11100011(二的補數)-1=11100010(一的補數)
=-(1*2^4+1*2^3+1*2^2+1*2^0)
=-(16+8+4+1)
=-29

2的補數轉換方法及差異
方法:
由以上得知十進制轉二進制如果為正數則直接化為二進制而如果為負數,
化為Sign-and-Magnitude則必須再最左邊加 1 來表示負數,若轉為二的補數,
則須經由一的補數的最右邊加 1 表示,另外二進制轉十進制一開始由最左
邊的數先辨別正負,如果是Sign-and-Magnitude正數則直接將 1 的數化為十
進制,如果為負數則將 0 的數化為負數,若是負數且為二的補數則一開始必
須減 1 來轉為一的補數再將 0 的數化為負數
兩者的差異:
轉為二的補數如果是負數,則保留從最右邊數過來的0,遇到第一個 1 則
將遇到的 1 以下數字保留其他 1 變 0 , 0 變 1 ,就轉為二的補數了,這
樣就可不用去運算一的補數

2011年12月15日 星期四

#Crystal Report 提高Crystal Report的效率

目前也都是第一次載入較慢
除非說能夠預先載入之類的,再查看看


請求有什麼方法提高Crystal Report的效率?

1. 使用DATA OBJECT會比CRYSTAL REPORT直接連接SQL SERVER快
2. CRYSTAL REPORT的選擇資料功能會讀取所有資料一次使執行速度下降, 此外如果自定義了條件性累加值會出現錯誤, 因為CRYSTAL REPORT會用所有資料作判斷, 不會理會你的選擇條件。所以選擇資料的工作最好交給SQL負責。
3. 使用THEAD開啟REPORT VIEWER會比較快

2011年12月12日 星期一

@Tools 製令生產物料 BOM 表 完整性檢查

需要一個工具,可以自動撈取兩個月內製令資料(本月,下個月),
並且比對該料號的BOM表是否完整

@原本有一隻BOM表與舊系統對照
到時候就系統退掉就不再使用

應該以檢查ERP系統為主

================================================
'提供日期範圍搜尋,(以月分為單位)
預設兩個月內範圍

'限制一定要輸入日期範圍(前後都要)
前輸入,後預帶下個月 => 預設搜尋兩個月

'應該加入單查料號

要不要區分新舊料號
(目前先以舊料號搜尋)

目前想法是輸入料號,輸入製令日期檔案兩者互斥
類似TQRY輸入料號去查BOM表

'萬用字元輸入料號查詢
如果不區分所蒐尋的相關料號
會看不出問題料號在哪

'發現舊料號檢查的時候,應該區分舊料號

@可以從 isnotvalid判斷是否停用,寫入原因
@判斷NorErr如果撈不到資料,應該為外購品,只有包裝,無製程
    這部分目前沒抓異常,要再想看看怎麼抓獲需不需要抓

#VB 善用 AndAlso 及 OrElse 運算子

善用 AndAlso 及 OrElse 運算子

VB 的 Short-Circuit

使用 OrElse 運算子來結合多個判斷式時,它會由前至後逐一評估每個判斷式的結果,當判斷過程中有其中一個判斷式為 True 時,它就會略過後序的判斷式,直接傳回 True。

使用 AndAlso 運算子來結合多個判斷式時,它會由前至後逐一評估每個判斷式的結果,當判斷過程中有其中一個判斷式為 False 時,它就會略過後序的判斷式,直接傳回 False。

#VB 自訂TextBox,結合兩個CheckBox

想做一個TextBox可以輸入內容,
作為標題之類的

旁邊有兩個CheckBox
可以做為全選不全選的選擇

關聯到一個DataGridView or DataTable
某個Boolean欄位

做到一次全選,或取消全選的功能

手動勾選,則兩個皆取消打勾

2011年12月11日 星期日

@CASE 12 < 原物料結合庫存量計算 > ver-111212

'反映說展開單據細項會有錯誤訊息提示
測試起來沒問題,要再看看
(加入單據記錄初始化,清空每次篩選的紀錄,不知道會不會有影響)

'可能需要做提示那些數據背後可以拉到單據資料
一些突現方式

@目前變成0以後凸顯方式就會消失
@一些原本沒凸顯的欄位看能不能就無法展開細項

1.另外紀錄 數量變0的點選物料List, (單據別,物料)
2.點選0的單據,判斷是否存在該筆紀錄
3.存在則開啟背後細項

@非0到0的過度何時開始記錄

'使用者通常只會關心特殊項目的原物料狀況
應該怎麼顯示資料,很快就找到特殊物件


'訂單部分應該考慮
 每次版本變動時,採購數是否有異動
 撈取計算原物料,是不是應該以最新版-前一版來計算

是不是改單也會有書面通知
要再想想


'可能需要只計算庫存數
然後也透過點選模式去看哪個倉庫有多少庫存

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

'發現說訂單如果訂購,XF半成品, (應該不會走到選配)
可能會造成無法計算
要再改

'建議請購量,轉檔的時候,判斷是否負值
 則帶入0



'計算庫存數有嚴重邏輯錯誤
 目前應該維持原版,
等一些未結案的舊單據完結,在測試庫存資訊

沒有考慮到說,料號如果沒有任何請購單,採購單有該料號
用Join就會出錯
以現在的方式是去抓請購單或採購單上有該料號資料的東西

應該透過left 或是 right join
再用 if else 去判斷是否空值,給定初始值


'應該列出所有倉庫表單
讓使用者選擇納入計算的倉庫
(m1-sj, m3, mrm, prm% 預設)

再來就是有的料號在 tblstocksub 並沒有庫存數資料
把料號與庫存術 left join 合併


'網子都沒撈到,(m1-sj 大片頭倉)
m1-sj, m3, mrm, prm% =>為主


'看能不能在CR報表上做輸入操作修改數值
或是用GridView而不用CR報表Viewer

'異常資料希望透過抓取的地方來判斷該區段抓取異常資料的原因
並寫入異常資料原因
要改寫NorErr()

1.Stock停用,無XF半成品料號
2.不存在的舊料號 (Stock無資料)
3.XX產品,XP包裝之下,無XF料號
4.BOM表停用,非核准,BOM表不完全


'請購單,採購單可能需要每個單據分開看,
可以判斷或是選擇那些單據內容要列入計算,
要在確定
(請購採購單的收料日期會影響要請購的數量)


'************************
'目前採購單,請購單都是加總合併計算
'1.透過使用者點選某個Cell超連結
'2.帶入該料號,計算所有未結案採購單,請購單
'3.跳出計算後表單,可以選擇勾選那些表單應該列入計算
'   (需要想一夏怎麼紀錄之前勾選過列入計算的部分,不然就要改變作法)
'4.預計分配量應該也需要
'************************




怎麼把料號傳入
每次點選清空原始GridView,
重新鏈結新資料

再來就卡在怎麼記憶點選計算的採購請購單號
1.每次點選紀錄Item (Value),紀錄採購單號,請購單號 (Key)
2.判斷關閉前,是否勾選,不存在記錄變數內的,Add
3.關閉後,重新計算該列資料相關數值
4.判斷開啟前,存在紀錄變數內的,將表單打勾
5.初始化隨著主表單做

'等確定接手人在決定應該怎麼設計格式

'應該可以把第七碼的問題排除了
 讓系統不必走一些不必要的判斷

'判斷是否異常資料的部分應該可以出來用呼叫的

'建議請購量應該可以在介面上直接修改
需要思考遺下編輯模式

目前需要透過滑鼠連點兩下開啟編輯
離開焦點後,將資料寫入table
(或是改成CELL取得焦點就開啟編輯)

加入CellDataError判斷
限制輸入內容數字


'幹~發現說好像應該先從Stock的PartRule找出可能的XX
然後去Comb對照MARK - CustID , PdtCode - XX

可能要再修改 MCST部分....
========================================
'MCST MRP
 BackON部分可能需要做一隻檢查程式
看有沒有什麼料號是BOM表不存在的
( 單純走 BOM 表 )

並且在撈取的時候檢查 MARK+Part
 是不是 客戶規格 所要的商標( BOM製程 )

backon 走Bom表,不走選配,
怎麼判斷MARK+PART要再想想
(可能還是要透過選配去查)

'感覺應該透過製令去找,
而不是整個資料庫找(許多很久沒用以後也不知道用不用的到的應該排除)
只檢查已經排入製令準備上生產線的

目前只做兩個月內的製令檢查

@感覺如果他是要抓空白砂輪,
而找不到BOM表,就應該直接列為異常,
排除該料號的計算

所以目前先拿掉MCST MRP 的 BACKON的部分,
================================

'所有MRP系統

1.撈各個主倉庫存量,
2.計算已採購,尚未驗收的,在途數量
3.計算安全庫存量+需求量
4.提供建議採購數量

@採購單,請購單可能要分開看,列出兩種資訊

part,rule,在途數,庫存數,安全庫存,建議採購數(總庫存-需求>=安全庫存),PC

===========================
select*from tblwh where isrealwh = 1 查閱是否實體倉
  isnotvalid = 0 非停用

tblstocksub 查閱庫存量
1.locoID <> 'NA'  => 有實際儲位的,為主倉
(要稍微注意遺下,W00M,應該不是主倉的,庫存數卻有紀錄他的locoID,舊資料)
2.會有料號相同,倉庫相同,儲位不同的資料
  (目前先加總,不區分儲位,只看倉庫)
3.目前看起來主倉不會有BadQty的問題
4.庫存+在單-預計配用-安全存量=可用量
採購量-已交數 + 請購量 = 在單數量
5.預計分配量,看起來是訂單中,被訂購的原物料


'可能需要提示告知相關公式

在途數量應該要結合採購單,請購單 (批號)
1.有採購單,計算已驗收數,採購數-已交數=在途數量
2.有請購單,列出請購數量
3.需要確定是不是有採購單,請購單就結

status = 2,packqty*qty
tblpodet 採購   partcode, isclosed = 0 , exqty 已交數
tblprdet 請購  partcode, isclosed = 0, prqty 請購數

tblchkacptdet 已交  帶入採購單號計算該單號的細項已交數
(採購細項上的 exQty就是以交數)

tblorderdet  找 exsaleqty <> qty 的原物料, isclosed = 0


tblStock   MainSafeqty  撈安全庫存量

#SQL 迴圈寫法


[SQL]T-SQL迴圈的寫法

DECLARE @_i INT
DECLARE @_MAX INT
 SET @_i = 0
 SET @_MAX = 10 -- 要產生幾筆資料
 WHILE (@_i<@_MAX)
 BEGIN
 --要迴圈的語法
 INSERT INTO #TT VALUES('T') 
 
 --加1
 Set @_i=@_i+1
 END

2011年12月8日 星期四

#SQL 字串長度小於欄位長度,like,= 搜尋問題


欄位型態 nChar(5)  => 固定欄位長度
gap欄位長度 5
實際資料 長度 4

會發生說
查詢的時候,如果透過 like, 無法以4個長度的字串去搜尋


必須以下面兩種方式
1.
select * from mk_thickness
where gap like '1-11 '
2.
select * from mk_thickness
where gap = '1-11'

不然就是改型態為 nvarchar(5) =>會自動變動欄位長度
也就不會多出空白字元


nchar 和 nvarchar (Transact-SQL)

2011年12月7日 星期三

#SQL 去除Table中已存資料欄位中的前後空白字元

去除Table中已存資料欄位中的前後空白字元


由於後面有空白字元,譬如說原先的帳號:
"tonychou"則會變成"tonychou   "
其實只要下一個如下的SQL指令就搞定了:
UPDATE sbuser SET userid = TRIM(userid) WHERE userid LIKE '% %';

#VB 重複 加入/移除 自訂事件


     If Me.CurrentCell.ColumnIndex = Me.Columns("Type").Index Or _
                    Me.CurrentCell.ColumnIndex = Me.Columns("Sn").Index Or _
                    Me.CurrentCell.ColumnIndex = Me.Columns("Ordno").Index Or _
                    Me.CurrentCell.ColumnIndex = Me.Columns("Trndate").Index Or _
                    Me.CurrentCell.ColumnIndex = Me.Columns("Delidate").Index Then

                    '委派,將控制項加入 keyPress事件,該事件委派由 ChkNumeric 處理
                    AddHandler e.Control.KeyPress, AddressOf ChkNumeric
                Else
                    '其他欄位,則將該委派移除
                    RemoveHandler e.Control.KeyPress, AddressOf ChkNumeric
                End If


這邊發生說
當我在AddHandler的欄位多次來回的時候
將會不斷重複加入自訂事件

變成說道其他欄位
該事件雖然被 RemoveHandler一次
卻還存在其他數次加入過的事件


@所以應該避免重複加入已經加入的事件
移除也應該避免重複移除已經移除的事件

目前透過加入一個判斷的變數,
判斷目前事件加入狀態

2011年12月5日 星期一

#Tools 測試資料建立程式

需要一支可以依照Table欄位內容隨機建立資料,並且設定資料筆數
的測試資料建立程式

1.知道DataSchema
2.輸入內容限制,格式,長度,型別
3.建立的資料筆數

@需要帶入機率下的空白欄位資料 設定 10 %

@每次亂數取值後,下次取值之前要先初始化亂數變數

Randomize


因為時鐘的解析度有限,所以若使用無參數的建構函式在極短時間內連續建立不同的 Random 物件,就會建立亂數產生器,這些產生器會產生序列完全相同的亂數。

只要建立單一 Random 物件,而不要建立多個物件,就可以避免這個問題。

為了改善效能,請建立一個 Random 物件,以便在一段時間內產生許多亂數,而不要重複地建立新的Random 物件來產生一個亂數。



[VB.net][VB6][VBA]如何確保「亂數序列」的一致性或不一致性





@可能需要以參數方式帶入資料
    或是 需要限制 ' , ) , ( 的輸入

ProcessDataGridViewKey and ProcessDialogKey
去設定

TRNDATE, DELIDATE   00.00.00
限定數字

SN               1,234
限定數字

ORDNO,   1324
限定數字

PART, DESC, MAC, CLASS, MARK, AREA, REM, OVERTIME
不限定   ASCII 32 ~ 126
=================================================

程式內的防呆之道

'可能需要建立一個Logger
能夠自動紀錄一些使用者碰到的錯誤訊息
if (value > trWidth.Maximum) { 
     trWidth.Value = trWidth.Maximum; 
     log("MyApplication", 
           true, // A flag that indicates if an exception is allowed to fire, if necessary 
          "MyNameSpace.Class1.ABC(): Invalid argument! The input value ({0}) exceeds trWidth.Maximum({1}).", 
          value,  
          trWidth.Maximum); 
}

================================================
VS 單元測試



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

整合測試 vs 單位測試 => 黑箱,只看輸入輸出 vs 白箱,要遍及程式邏輯

2011年12月4日 星期日

#VB 自訂控制項,透過智能標籤達到不同需求

希望透過智能標籤的設定
可以改變自訂控制向的屬性
達到一個控制向可以分別實作不同內容的功能



[Server Control] [ASP.NET 控制項實作 Day21] 實作控制項智慧標籤

[C#.NET][VB.NET] 自訂控制項的智能標籤-ControlDesigner / User Control of Smart Tag-ControlDesigner


'比較麻煩的是Form大小與TextBox大小(受font影響)需要分開定


1.控制項實作類別
 <DesignerAttribute(GetType(ComBoDateTextBoxDesigner))> _

Public Class ComBoDateTextBox
    Inherits System.Windows.Forms.UserControl

   (指定設計實作服務類別)

2.控制項設計實作類別

Partial Class ComBoDateTextBoxDesigner
    Inherits System.Windows.Forms.Design.ControlDesigner
  (需要宣告智能標籤集合)
DesignerActionListCollection


3.智能標籤內容實作類別

Public Class CustomControlActionList
    Inherits System.ComponentModel.Design.DesignerActionList

定義智能標籤所有內容
(關連到控制項類別相關可操作屬性)


=============================================
'要考慮TextBox字型大小,
去改變TextBox長寬,以及控制項Form外觀大小

'目前執行以後,遮罩效果可以設定,卻看不到
感覺跟Mask背後處理的東西有關係
處理完以後才呈現資料到Text上
Text是我沒處理的

'控制項無法取得焦點輸入


@一切都是因為我設定了TextBox與Form Size一起變動的原因
   Form 跟 控制項大小在設計階段手動調整就好


'再來就是限制輸入內容控制
MaskedTextBox.Mask 屬性


=================================================
設計一個GridView有幾個自訂屬性,透過自訂屬性設定可以完成
1. 連線模式 (Odbc,OleDB,SqlClient)
2. 設定預設資料庫伺服器,資料庫
3. 資料表,資料行
(以上原本都有)
================================


2011年12月2日 星期五