2011年7月30日 星期六

#SQL 遠端連線 問題

同網域SQL就會自己查找SERVER名稱
所以目前是不需要遠端


SQL要連SERVER端
FoxPro好像是透過另一隻程式撈副本進個人PC
所以要知道個人副本存在哪個資料夾


或是說可以再安裝的時候設定該資料夾路徑,
這個就要再研究怎麼包裝安裝檔


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


'必須要考量一些安全性的問題


======================================================================
 http://kkbruce.blogspot.com/2008/08/aspnet-and-sql-server-2005-express.html


在連線到資料庫時,在SSMSE的「伺服器名稱」或ADO.NET的「Data Source」你會發現格式為:「主機名稱\資料庫服務名稱」,例如:「VMBruce\SQLExpress」,如果是在同一台電腦主機,則主機名稱可用「.」來代替,例:「.\SQLExpress」,如果是使用遠端連線則主機名稱則使用IP Address來代替,例:「192.168.254.103\SQLExpress」。


  • Windows驗證模式
    Windows驗證接受使用者在登入Windows時獲得驗證,然後再傳送安全性憑證給SSE。而使用者的帳號和密碼只保留在Windows中。當ASP.NET使用Windows驗證時,連接字串不會提供帳號及密碼,只提供使用Windows驗證的指示。適合本機連接使用。
  • SQL驗證模式
    SQL驗證使用儲存在SQL Server中的資料來做使用者驗證。在連接時需提供「使用者名稱」及「密碼」來進行驗證。適合遠端連線使用。
  • 混合模式
    可以自行選擇使用Windows驗證或SQL驗證。
  記得,驗證連接的工作不是使用者,最常使用驗證工作的是ASP.NET等應用程式,User <-- *.aspx --> ADO.NET --> Database,這樣的流程看的懂嗎?驗證的工作作用在ADO.NET那一段,它會與DataBbase驗證溝通以取得存取的權限,如果是本機連線可選擇Windows驗證模式,如果是遠端連線就選擇SQL驗證模式。

2011年7月28日 星期四

VB BackGroundWorker 跨執行緒 操作 Form 的控制項問題

太瓶頸了,換Form呼叫,會友執行緒問題,
透過backgroundwork也沒辦法解

panel 又會碰到 SQL 部分呼叫 母Form 執行緒的 控制項操作問題
除非說,一個一個寫委派去叫用

不太確定可不可行
===========================
有點怪,我的DoWork都沒事做
都到了Complete才做事

應該有些跨執行緒的東西
可以在執行DoWork中途叫用才對

還是必須要透過委派
http://www.dotblogs.com.tw/yc421206/archive/2009/02/13/7141.aspx

===================================
BackGroundWorker 跨執行緒 操作 Form 的控制項

因為背景執行
將會另外開一個執行續
與表單上的執行緒
是不同執行緒

當操作 背景執行的 DoWork 時
如果內容會操作到表單的控制項
等於是跨執行續的操作
會造成例外事件

把一般的呼叫實作放在 DoWork
當方法實作會操作到Form的操作項時
將該方法實作放在 RunWorkerCompleted
執行完背景執行的執行緒後

會回到 Form 表單執行續
才去操作 Form 的控制項

2011年7月26日 星期二

@CASE 2 <材料 價格差異表> ver.20110727


'應該可以嘗試加入折線圖
以五萬為單位
將長條圖以比例繪製



'加入驗收數量總數
轉檔後應該怎麼顯示

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

'加入該筆價格變動交易的數量顯示


'日期範圍
如果後面的錯誤
前面的日期格式會改掉
變成說直接送出前面的日期會是錯的

'將所有異常資料也顯示在轉檔中
並且註記異常資料

目前改變欄位 新增一個 Flag 去標記異常資料
然後轉檔的時候去將單價做標記
(要看有什麼方式可以將欄位顏色改變,在寫入值的時候)

、怎样用VB设置excel中CELL的颜色?
      oleWorkSheet.Cells(1,   1).Interior.ColorIndex   =   42 


====================================
'轉 Excel 檔,需不需要鎖住滑鼠鍵盤
(不然跑巨集會有例外)

'多料號輸入
限制輸入的字符( , ? % backspace - 數字 字母 )

可以使用 chkCust()
所以應該改掉這個公用Function的名稱

'日期 那邊 if else 怪怪的
 if
elseif
else   ----> 一定要 else....
end if

感覺程式碼中如果叫用到TextBox.Text 會連帶讓該TextBox得到Focus
讓我日期格式一直亂掉
==================================
感覺根本不用做
只需要判斷異常就好

大概知道說
單位量是為了去計算實際點收數量
單位量 * 收貨數 = 實際點收數量(基本單位)

所以跟單價應該是沒什麼關係
================================
單價如果單位量千倍,單價也就會1/1000

重算單價好了

ST 組
在做單價 * 單位量

單位量 * 收貨量(Amt) = 總收貨量(基本單位)
小記 / 總收貨量 = 新單價
================================
異常資料顯示
但不去做排除異常資料的動作

暫定 價格波動後 才開始異常資料紀錄

從 單位量 去著手
if 單位量 = 1
 檢查 packunit 是否等於 unit
  false : error
else
  packunit 是否等於 unit
  true :  是否 st
           true : 單位量可以不等於 1
           felse : error!
  false :  可以不等於 1

單價 * 單位數 = 計算後單價

所以要去抓stock 的 unit
來檢查
====================================
'單位量上面的處理(ex.  pc  -  Kpc 千倍)
先不去考量 訂購數量折扣上面的Business問題
主要就是呈現價格變化

後續再做維護

Stock 的 unit 確定每個料號都是唯一一種單位
chkacptdet 的 packunit 則有不同的
(所以單位去抓,Stock)
(檢查異常透過 chkacptdet)

pc - kpc 去看 PackQty 單位量
通常
pc 單位量 1
kpc 單位量 1000
ST 組 單位量 1000 (也有1的,不知道是不是異常)

特殊代碼

6公斤
6KG
10公斤
10KG
1000PCS
KPC



不管如何
都去乘上單位量來計算

'需要增加 異常狀態 驗收單資訊
弄一個 gridview 去呈現,異常驗收單 資訊
 (單位異常 : pc 單位量 1000, kpc 單位量 1)
需要想一下哪些情況是 異常

想法是
透過按鈕去查所有異常資料 (異常資料的SQL)
然後一般查詢,一定剔除異常資料 (改目前SQL,去排除異常資料)
=================================================
case 1 :
計算 使用數/基數 就會把KG換成G
(所以不需要特別處理單位)
(* or / 1000)

包裝選配箱子之類的,如果製程數量不足一箱,
應該無條件進位

2011年7月25日 星期一

demo case 1 & case 2

現在拿到更多資料後
發現了許多問題


'訂單上 CustOrderNo 與 OrderNo不一定相符
所以完全不能透過 這個方式找訂單
需要直接 mark + ordno 去對 OrderNo
並且核對 partcode 新料號 去找訂單


select *
from tblorderdet
where PartCode LIKE
(select SUBSTRING(max(partcode),1,7) from tblstock
where PartRule LIKE '%@[0040@]' ESCAPE '@' ) + '%'



'FoxPro 在 SQL Union 有使用次數上的限制
一次連線 最多 10個

'預估用量四捨五入會有0

'製令 的 ordno 有時候會有 R 字樣
表示修改次數
訂單號還是一樣(去掉R之後)

'Mark 一定 與訂單前三碼相同
(訂單號 AAC....客戶AAA -> 排製令是依照 AAC 去排)
 問題在於,製令有可能將同一系列的東西(不同訂單號)放在同一個製令下
變成沒有訂單號

但基本上,做的東西是一樣的
那怎麼知道有多少要給哪個客戶

也就是說我根本找不到訂單號

這個似乎是外包製令
不需要領料
所以不用處理

'透過舊料號撈到的新料號
不一定可以跟訂單上的PartCode相符合

撈到新訂單以後,去掉末6碼     前7碼 + ----XX
再去比對訂單Det上面的PartCode 前7碼


'比對部分人然有問題

select SUBSTRING(max(partcode),1,7)
from tblstock
where partrule like '%@[2476N@]' escape '@'




SELECT ord.CustID, orddet.CustSpec, ord.CustOrderNo, ord.OrderNo, orddet.PartCode, pdt.PdtKey, orddet.PdtVersion, MAX(ord.FormVersion), sto.PartRule,
                            1000 AS Qty
                            FROM tblOrderDet orddet JOIN tblOrder ord ON ord.OrderNo = orddet.OrderNo
                            JOIN tblBOMPdt pdt ON orddet.PartCode = pdt.PdtCode AND orddet.PdtVersion = pdt.PdtVersion
                            JOIN tblStock sto ON sto.PartCode = orddet.PartCode
                            WHERE ord.CustOrderNo = 'sch8075'
                            AND ord.Status = 2
                            AND orddet.PartCode LIKE '200476N%'
                            GROUP BY ord.custid, orddet.CustSpec, ord.CustOrderNo, ord.OrderNo, orddet.PartCode,
                            pdt.PdtKey, orddet.PdtVersion, sto.PartRule, Qty

=========================================
'foxpro檔案將從Server資料夾去撈到本機
然後從本機上處理資料
(可刪除資料夾,也可不刪除)

'希望做一隻update程式,能夠判斷目前程式版本
 並判斷是否需要更新

 需要做一些版本規劃
 版本編碼方式
紀錄每次版更內容

檢查版本時,也能夠依照版本更動的編碼去
決定是小幅update .exe
還是大改版 .setup

=====================================
'檔案不存在,與查無資料,應該分清楚
好像又不用,
如果說範圍搜尋的話,
範圍日期內可能會有許多個檔遺漏的話,
搜尋完以後還要顯示遺漏的檔案有點怪

或是說提示遺漏檔案有沒有必要,
因為mmac檔案好像是user去撈資料庫到個人PC上的
會不會說有檔案沒撈到
而USER不知道之類的發生

'要查一下怎樣建立更新檔,而不用每次都包那些必要條件的套件
 建立更新檔,似乎可以直接安裝部署 Extra.exe 執行檔
 然後記得去掉預設的必要條件,
 把路徑設成完整安裝檔案的路徑之下,(應該就像是檔案覆蓋吧)
 就OK了
 有沒有什麼問題要在測試看看

.exe檔,會包入所有套件
.msi檔,只會有主程式
所以應該是說,只需要發布主程式提供安裝就可以


'重建BDF,覺得MARK+ORDNO 不一定等於 CUSTORDERNO 的問題一定要解決
MARK = AAA
CUSTORDERNO 可能會是 AACXXXX

mmac檔案存在,有某筆資料
該筆資料無法再APEX找到
應該要顯示在異常資料的FORM
而不是單純顯示"此篩選無資料"

'目前沒什麼問題

再來等上線實測

=================================================
'case 1 , 使用數 基數 問題
 選配 箱子 應該無條件進位 : - FLOOR(-n)

FLOOR(-10.3)FLOOR(10.3)
-1110

 BOM表去小數點四捨五入  : ROUND(x)
http://webdesign.kerthis.com/sql/sql_function_round
 BOM表 不計 FILLER : part.partcod <> 'NFFILLER'


'Excel 轉檔 跑巨集 希望做到 滑鼠鍵盤的輸入鎖死之類
(或是說跑完巨集的東西才Show Excel App)

讓他跑完 在visible 就好
==================================================
昨天初步跑了一下

有一些問題

case 1
料號應該要抓取製程下的物料
(處理不同製程用到相同料號的問題,到底需要的量是哪一個製程的量)
似乎沒有抓到BOM表(應該是有,可能測試的資料問題,再跑跑看)

'該製程所生產的數量是多少 sn
選配跟BOM表都要把Qty改成sn

'mmac檔案 跨百年判斷
應該直接處理西元年
最後要下SQL再去改百年
不然會被搞死 (開始西洋年月,結束西洋年月,開始結束百年月日,mark)

'需不需要考量前後日期範圍 可以對調的問題
檢查後面應該要大於前面就可


case 2
日期格式處理
單位量上面的處理(ex.  pc  -  Kpc 千倍)

感覺case 1的單位換算也有問題
檢查一下
到底是*1000還是/1000

碰到單位要先檢查是不是千倍的單位,才去處理

不知道哪邊有問題,怎麼算出來的網子有小數點

計算 使用數/基數 就會把KG換成G
(所以不需要特別處理單位)
因為我多處理了單位問題,所以網子才出現小數點

包裝選配箱子之類的,如果製程數量不足一箱,
應該無條件進位
=======================================================
case 1
大概知道問題在哪裡了
我有去抓BOM表,但是抓出來的似乎只有到再製品,(包裝前)
應該撈出在製品後,再去看BOM表,查詢相關細項材料需求

似乎還要注意料號停用,版本問題,之前有沒注意我忘了一 一||
所以可能也要看一下選配料號的停用,版本問題

1.從製程 (oldPartCode)去撈出 XF(stock.newPartCode) 再製品後
撈出各製程 PartCode(ProcCode)

select * from tblstock
where PartRule LIKE '%@[0348BAAA@]' ESCAPE '@'

結合 stock 後 撈出該製成下的 成品

SELECT ord.CustID, orddet.CustSpec, ord.CustOrderNo, ord.OrderNo, orddet.PartCode, pdt.PdtKey, orddet.PdtVersion, CAST(orddet.Qty AS decimal(15,3)) AS Qty, MAX(ord.FormVersion)
                     FROM tblOrderDet orddet JOIN tblOrder ord ON ord.OrderNo = orddet.OrderNo
                     JOIN tblBOMPdt pdt ON orddet.PartCode = pdt.PdtCode AND orddet.PdtVersion = pdt.PdtVersion                      
JOIN tblStock sto on sto.partcode = orddet.partcode
WHERE ord.CustOrderNo = 'AAA0063'
                     AND ord.Status = 2
and sto.PartRule LIKE '%@[0348BAAA@]' ESCAPE '@'
                     GROUP BY ord.custid, orddet.CustSpec, ord.CustOrderNo, ord.OrderNo, orddet.PartCode,
                     pdt.PdtKey, orddet.PdtVersion, Qty



2.從在製品(成品000405BAAA0XX ->000405BAAA0XF)
BOMPdt (只有 XX成品, XF 再製品)

撈出非停用狀態的 XF
並且 已核准

select *
from tblbompdt
where pdtcode like '000423BDEW1XF'
and isnotvalid = 0
and aprvdate not like 'null'


再去看一次BOM表查 製程
BOMProc(查找該製程)(調和 : 原料,成形 : 7碼----XD,燒成 : 7碼----XC,脫卻 : 7碼----XH)
pdtkey,pdtversion 可以找到所有製程

去掉 XC,XH,XF(只找調和製程 , 再去找 XD (網子...等原料))

select * from tblBOMProc
where pdtkey = 7332
and pdtversion = 1
and ProcCode not LIKE '%X_'



BOMPdt,BOMPart(只有 XX成品, XF 再製品)

找出所有調和製程下的材料

select * from tblBOMPart
where prockey between 483 and 484
and pdtversion = 2
and pdtkey = 412

VB 多執行緒下,委派(1)


  感覺快出來了

但是現在問題是怎麼每次都是SQL跑完才去背景執行換圖
好怪
找不到原因......

又找到一個可能
可能會需要兩個執行緒
可能是說我應該在跑圖片之前先讓他去走SQL
透過SQL的結束去結束掉圖片


SQL要開一個執行緒的話很麻煩
太複雜了
不好用


應該是我一個Button下面做的事情太多,
沒有切得很好


如果要做可能會需要大改版


終結這篇
==========================================
猜測可能是因為切換圖片的For 太慢
導致回報進度(切換圖片)太慢

碼的卡到大魔王了...


先把圖片切好Bitmap()
把切好的圖片傳到 BackGroundWorker參數
然後呼叫背景執行就單純抽換圖片
要測看看

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

  '背景執行完成,或中途取消

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        If e.Cancelled Then

            TextBox2.Text = "cancel"

        Else

            TextBox2.Text = e.Result.ToString

        End If


        '==================================================

        '這邊似乎VB不能寫成三元運算

        '猜測是說,他會抓住 取消的 Expression 狀態 (e.cancel)

        '然後比對 true, false

        '但是取消時,backgroundworker 已經停止,所以在近一步去抓 false的 e.result

        '會告知說 已取消,所以抓不到東西

        'TextBox2.Text = IIf(e.Cancelled, "cancel", e.Result.ToString)

        '=========================================


        Button1.Text = "go"

        Button1.Enabled = True

    End Sub


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

BackgroundWorker

好像是說
應該在會跨執行緒呼叫UI Thread的控制項操作時
將該控制項的東西丟給RunWorkerASync(控制項操作)

這個要在測試看看

先跑跑範例的東西熟了在玩


'進度回報的部分
不是說死的只能做百分比回報


可以做像是資料筆數到了多少的回報


'查一下怎麼看目前存活的Thread數目
java的我忘了
沒道理VB沒
先跳過

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

感覺怪怪的,

像是說有建立新的thread
但是他卻依然沒辦法跑
感覺像是沒建立成功的樣子

要在測試看看

果然有點複雜就不一樣了..

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

可能說,跑GIF要放在UI Thread

然後背後執行的動作放到 背景 Thread 去執行
當背景動作結束,去調整UI Thread 控制項的屬性visible,
然後UI Thread就可以根據這個改變去停止無窮迴圈

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

'New Threading.WaitCallBack(Addressof 另一執行緒執行的方法), 方法參數

 Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf startJob), TextBox1.Text)


'New 委派型別(Addressof 委派方法), New Object(){參數}

     Me.Invoke(New updatetextboxHandler(AddressOf print), New Object() {Text})



 '委派方法宣告 (是一個型別)

    Delegate Sub updatetextboxHandler(ByVal text As String)

    '委派實際執行方法

    Private Sub print(ByVal text As String)

        'result顯示結果

        TextBox2.Text = text

    End Sub


================================
照著範例測試了一個會抓設定的目錄下
所有子目錄裡面檔案
去計算說該目錄底下有多少檔案數,以及所有檔案大小

form上面有一個timer,每50毫秒變換一次時間
所以UI Thread 總是在執行 Timer的東西
當我按下按鈕去計算檔案的時候,
變成會卡住先做我的動作,畫面整個鎖死

就透過多執行緒+委派(控制UI Thread 控制項操作)
按下按鈕,跑另外一個Thread 去計算
UI Thread 繼續跑Timer


雖然是這樣說
但是實際上執行感覺怪怪的
當我按鈕執行查詢目錄下子目錄夠深的計算
UI 畫面還是會鎖住

雖然說等她跑完,timer還是可以跑出正確時間(顯然計算期間他還是一直在跑timer)


靠可以了

因為我剛剛忘了把他丟到Thread Pool
讓他建立新執行緒等待被執行
所以剛剛等於還是在UI Thread上面跑才會這樣
========================

跨執行緒作業無效: 存取控制項 'textBox1' 時所使用的執行緒與建立控制項的執行緒不同


有意點點感覺
就差測試了
但是太累了
改天~

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

大概知道說要建立委派與叫用委派

相同的function or sub


才能執行委派

[原創]Callback與Delegate原理


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

winForm 在 multi threading 的情況下, 是否一定要 delegate method 才可讓 output 在控制上顯示



跨執行緒作業無效



利用Invoke一個方法,甚至帶入參數

這部分要在查一下

==========================================================
委派的用途及概念
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20100721085817I8Q

2011年7月22日 星期五

#VB ASP.NET 顯示執行中的動畫圖示


目前適用 panel 去做

但這樣如果動作之後會跳出新視窗
會蓋過母視窗
這樣就看不到Loading
不然就是每個Form都弄

在需要跳出新視窗之前
先讓他跑動畫(新視窗)
(母視窗的動畫依然在跑)
結束時一起結束


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

什麼東西適合用背景執行,

什麼東西是合用"委派"

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

目前先透過panel去做

等找到說可以自己寫panel去弄一個透明度再來改

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

透過背景執行的話,好像不能在背景執行緒下叫用Module裡的變數

問題在哪裡我還看不太出來,但是應該可以改

而且發現如果真的叫用另一個form
有一些msgbox出來(母form)
就會變成說按不到msgbox的確認鍵...

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

大概知道應該是說

我圖片背景執行以後的動作
應為控制權的關係
沒辦法及時跑回原執行緒
去做其他母Form的動作

1.轉換控制權
2.把接下來的動作丟到另一個背景執行

2.可行,(但是就沒有透明度)
    當執行某個動作以後,就是鎖住整個form,讓使用者一次只做一個動作

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

應該是可以,但是不知道為什麼

會卡住,然後好像也在做換圖的動作,

但是圖片卻沒顯示出來


要再查一下


測試時發現

如果呼叫動畫Form以後
在母Form的呼叫按鈕下,有其他動作
就會發生上面的問題
在想是因為控制權轉移到了動畫Form的問題
看能不能馬上轉回來

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

1.在原Form 寫好timer啟動,並且每秒去check是否應該關掉動畫Form


2.動畫Form 將切換圖片的部分放到背景執行,
(Control.CheckForIllegalCrossThreadCalls = False)
3.動畫Form 設定迴圈內,每秒sleep執行續

可能不同的Form也是不同執行續,
不知道是不是變成說呼叫動畫Form要用背景去呼叫

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

感覺會有thread問題

應該要弄成背景執行
好煩~不熟不太知道問題在哪裡

跨執行緒作業無效: 存取控制項 'Panel1' 時所使用的執行緒與建立控制項的執行緒不同。

因為背景執行,如果再背景執行會設定到呼叫背景執行續的前一執行續設值或是傳物件,
就會發生跨執行續的問題

從vs2005開始, 所有windows form控制項, 都多了一個[能否任意跨執行緒變更屬性]的靜態屬性
這是為了防止控制項在多執行緒情況下工作時, 同時有多個執行緒存取單一控制項, 導致程式發生死結
所以如果要跨執行緒存取控制項, 必須使用Control.Invoke的方法, 來變更控制項目前的屬性,
如果覺得這樣做太麻煩, 而且您自己確定, 不會發生死結

Control.CheckForIllegalCrossThreadCalls = False
就不會檢查了

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

VB.NET SLEEP寫法



目前可以載入圖片,

但是卻不是GIF動畫的格式
圖片不會動~

大致上想法~
1. gif 由許多圖檔組成
2. 先知道該gif有幾個圖檔
3. 然後透過Timer去切換每個圖檔,
4. 可能需要背景執行,
5. 設定結束條件,當忙碌結束就關掉這個Form



這樣圖片就動起來



取得Gif動畫圖檔內含的圖片


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


目前最簡單的想法是透過一個Form,上面放一個PictureBox,

該Box去連要顯示的Gif

當系統執行某些動作的時候,會呼叫該Form,來顯示Loding忙碌中的動畫

1. Form想做成有透明度的(壓過系統上其他Form,無法執行其他動作)

2. 可能會需要多執行緒來配合動畫顯示與背後真正執行忙碌的動作
    同時進行,這就不太會了

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

顯示執行中的動畫圖示




為控制項加上顯示載入動畫的機制



設定.NET透明表單


(Form)显示/播放Gif动画


PictureBox的設計應用-載入衛星雲圖