2010年7月29日 星期四

VB.net AccessUpdate多個欄位的語法出錯問題

更新一個欄位,變數不加上[],不會出問題
sql = "Update [1request] Set Warrantsn='" & MyC & "' where DocNo='" & Glo_Oid & "'"
'MsgBox(sql)
cmd = New OleDbCommand(sql, conn) '誇號裡的第一個是SQL的字串,第二個是資料庫的聯結=OleDbConnection


若有多個參數需要更新,記得每個欄位要加上[]
sql = "Update [2request_Record] Set [aleFound]='" & Sv(2) & "', [id]='" & Sv(3) & "', [mac]='" & Sv(4) & "', [msisdn]='" & Sv(5) & "', [user]='" & Sv(6) & "', [Palesn]='" & Sv(7) & "' where [Record_Seq]='" & Sv(1) & "'"

2010年7月28日 星期三

StarDict 字典檔之使用、規格及初步處理

請於StarDict網站下載字典檔 ,以下為繁體字典檔下載位置
http://www.huzheng.org/stardict-iso/stardict-dic/zh_TW/
假設我們要下載的檔案路徑如下
http://www.huzheng.org/stardict-iso/stardict-dic/zh_TW/stardict-oxford-big5-2.4.2.tar.bz2

stardict-oxford-big5-2.4.2.tar.bz2
附檔名 .bz2 可直接用WinRAR解壓縮,請注意解壓縮時,winrar對於有簡體的文字時,壓縮會產生錯誤,請先改回正體字

解壓縮後會產生三個檔案,如下
1. oxford-big5.ifo
2. oxford-big5.idx (字典索引檔)
3. oxford-big5.dict.dz (字典內容檔)

序號1不用管,只處理2. 3.即可。
3.oxford-big5.dict.dz,請再用7Zip這個免費軟體,解壓縮
會解出oxford-big5.dict這個檔案,接下來才可以用程式處理。

Stradict檔案格式如下

oxford-big5.idx
-------------------------------------------------------------------------------
檔案內容的排列格式如下,每個單字均依照以下格式編排。
utf8 charset

word_str + '\0' + word_data_offset(4bytes =>32bit) + word_data_size(4bytes =>32bit)

單字 + '\0' + 單字所在的資料起始位置 (4bytes =>32bit) + 單字所含的資料量 (4bytes =>32bit)

請注意,在讀取word_data_offset及 word_data_size必須注意Big Endian與Little Endian的轉換(兩個互為顛倒),取出值才會正確。
例如: ABCD ->DCBA

http://jyhshin.pixnet.net/blog/post/26587992
http://tw.myblog.yahoo.com/jw!oK9tZceCFQNXvuvgM5.r4fgC0css/article?mid=2052&prev=2053&next=2051
http://junxian-huang.blogspot.com/2008/10/big-endian-vs-little-endian.html

2的1次方=1
2的8次方=256
2的16次方=65536
2的32次方=16777216

位元往右移1,等於32

若用vb的BinaryReader的ReadByte方法,第一個讀取的位元
pos= Br.ReadByte() * 16777216 + Br.ReadByte() * 65536 + Br.ReadByte() * 256 + Br.ReadByte()

vb每執行ReadByte方法,讀取位置會自動往下一個Byte

oxford-big5.dict
-------------------------------------------------------------------------------
由oxford-big5.idx 取得相關的資料後,可以先存自定結構或類別中。
再逐byte去取得相關的內容

2010年7月26日 星期一

壓縮 CSS 和 JavaScript 檔


CSS、JavaScript 在多檔合併後,應該進一步壓縮。
壓縮的動作會移除註解、空白處以及縮短變數名稱。許多工具都提供不同程度的壓縮功能。不過某些壓縮率較高的工具,可以在壓縮 CSS 和 JavaScript 檔案時,帶來更好的效果。
minifyYUI compressorshrinksafeClosure Compiler。這些工具功能複雜,其實用簡單的工具也能達到相同目的,不過還是有值得推薦的地方。

舉例來說,有些工具提供了線上壓縮功能(例如 ShrinksafeYUI Compressor)。).

摘要自 http://msdn.microsoft.com/zh-tw/scriptjunkie/ff743754.aspx
改善網頁下載時間的最佳做法

Cody Lindley | 2010 年 6 月 11 日

鄭子璉網站 [Office 2010]Microsoft Office Document Imaging (MODI) 替代方案

資料來源
http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!4905.entry

[Office 2010]Microsoft Office Document Imaging (MODI) 替代方案
MODI: Microsoft Office Document Imaging 包含幾個部分:

1. 虛擬印表機:Microsoft Office Document Image Writer
2. Microsoft Office Document Imaging Viewer (MSPView.exe)
3. Microsoft Office Document Scanning (MSPScan.exe)
4. 內嵌其中的 OCR 功能
5. 可程式化的 COM 元件

Office 2010 已移除了 MODI,若先前有安裝 MODI 時,在安裝 Office 2010 也會被自動移除。而從微軟在 Office 2007 的策略來看,微軟已經打定主意使用 XPS 取代 MODI ,但 XPS 檔案較大,且需要使用 IE 才能瀏覽,所以我一直不喜歡用,我通常的選擇是先用 MODI ,其次是 pdf 。

替代方案:

上述 3/4 的部分,在 Office 2010 是設計使用 OneNote 2010 內建的來取代,但是 OneNote 裡面的 OCR 辨識率低,很多人用不爽

上述 1 的部分,可以安裝 Microsoft Office Live Meeting (2010 四月號) ,會自動建立一個虛擬印表機:Microsoft Office Live Meeting 2007 Document Writer ,此功能同 1,此軟體為線上會議使用,平常可瀏覽、參加微軟線上研討會,公司若有安裝 Server ,也可以用作公司線上會議使用 。 (註:Download the Microsoft Office Live Meeting 2007 client 請在此下載,中文版網頁短路了,沒有連結)

上述 2 的部分,謠傳微軟將在近期提供 MODI Viewer 的軟體給使用者下載,解決目前無法瀏覽 MODI 文件的問題。

上述 5 的部分目前沒看到替代方案,早先由於 MODI 的功能強大,很多開發者到微軟網站下載 MODI SDK 線上手冊,來開發對應功能,例如先用 VBNET 將圖檔存成 tif 格式後,再用 MODI 載入,用其中的 OCR 功能識別文字等



拆成這麼散,所以當然不方便使用,所以微軟建議若有需要此功能,暫時可在安裝完 Office 2010 後,再用自訂安裝 Office 2007 將 MODI 裝起來,我目前是這樣裝啦,不過很不方便,所以我一般虛擬文件應該會改投向 pdf 了。

我目前是用 Bullzip 的 PDF Printer,這套是免費的,官網有中文可下載,可另存為多種圖檔格式,無廣告,且產生的 pdf 檔案較小,在 6.x 版以前,中文路徑或檔名可能發生錯誤,在 7.x 以後已沒遇過此問題

MODI 看起來是微軟在 Office 元件中,繼 OWC 後下一個被砍的好用功能,說實在的,不知道微軟上層腦袋在想啥,OWC / MODI 都是很好用的東西,居然都被停止支援,弄得使用者怨聲載道,這也是一種神奇。

2010年7月25日 星期日

ASP.net getjson 處理回傳的Json 格式

function GetArticle(Sid,controlName,Ds ) { //標記文章
Selid=Sid; //將文章ID記錄下來
NowPos =controlName; //990714紀錄在表格中的位置
$("#Tagzone").html("");

$("#Subj").val("");
$("#Ac").val("");
$.blockUI({ message: '

處理中,請耐心稍後喔…



' });

//$.getJSON("QueryArticle.ashx?Qid=" + Sid, function(Vdata) {
//990714 改善GET的Cache問題
$.getJSON("QueryArticle.ashx?Qid=" + Sid + "&d=" + Ds +"&q="+new Date().getTime(), function(Vdata) {
//處理 TAG 陣列
var tn="";
tn=Vdata.TagV;

XXX=Vdata.SugV
$("#Subj").html(XXX );


XXX=Vdata.MsgV
//將原本是段落字元的部分,轉換為

XXX =XXX.replace(/
/g,"\n")
XXX =XXX.replace(/(^\s*)|(\s*$)/g, "");

$("#Ac").val(XXX );




});

ASP.net 產生Json 格式(注意段落字元)

引用資料庫與法(略)
dv = ads.Select(New DataSourceSelectArguments)

If dv.Count <> 0 Then
'JOSN的基本格式如下() 多筆資料的寫法
'{ 'dataset' : [ {'id' :'1' , 'name' : 'ABC'}
', {'id' : '2', 'name' : 'CDE'}
', {'id' : '3', 'name' : 'EFD'}]}

'990507 因簡易版,只有1筆資料 故採此架構
'{ "A": "xxxxxxx.",
' "B": "yyyyyyyyyyyy",
' "C": [1, 2]
'}
sb.Append("{ ")
sb.Append("""TagV"" : """ & dv.Item(0).Item("tag") & """ , ") '寫入第一個參數,tag
sb.Append("""SugV"" : """ & dv.Item(0).Item("subject") & """, ")
sb.Append("""MsgV"" : """ & ReplaceComma(dv.Item(0).Item("Message")) & """} ") '寫入第2個參數,Message

'看不見的段落字元 很恐怖!! 會導致 JSON出現錯誤! 990622
sb.Replace(vbCrLf, "
")
sb.Replace(vbCr, "
")
sb.Replace(vbLf, "
")
context.Response.Write(sb.ToString)

2010年7月22日 星期四

EXCEL VBA 呼叫WORD VBA輸出文檔(依照文章數量切割檔案)

'主文件
'-----------------------------------------------------------
'載入資料庫 所需引用相關變數
Dim Conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SqlString As String
Dim i As Integer

Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\xxxx.MDB"


Dim StartTime As Date
StartTime = Now


SqlString = " Select * from [a] order by BuildTime desc"

Dim OriV As String
Dim Nowid As Integer


'*******************************************************************
'
' 變數資料處理完成,傳送資料到WORD應用程式。
'
'*******************************************************************
Dim Myword As New Word.Application
Dim Newdoc As Word.Document

Myword.Caption = ""
'Myword.Visible = True

Set Newdoc = Myword.Documents.Open(ThisWorkbook.Path & "\模板.doc", , True) '設定成「唯讀」以免資料被寫入。
Dim objSelection
Set objSelection = Myword.Selection

Dim Spage As String '要寫入目前的頁數
Dim SelContent As String '寫入的內容 暫存用
Dim SeparatePage As Integer 一個檔案要多少頁
Dim SeparatePageFileCount As Integer 分頁的檔案編號
SeparatePage = 50 1頁要多少筆資料
SeparatePageFileCount = 0
Const PerItem As Integer = 8

'停用 文法檢查 避免資料輸出太多時的檢查
'Newdoc.GrammarChecked = False

Dim Fn As String

'Myword.Selection.HomeKey

objSelection.TypeParagraph
objSelection.TypeParagraph

'NewDoc.FormFields("pName").Range.Text = Range("E2")
i = 0
While Not rs.EOF

DoEvents '避免當機
i = i + 1

'為利分段處理 將 I 列入 統計
If i >= 1 Then

'************************************************************************************************************************
'
' 每 800筆,製作一個檔案 因為 每 8 筆一頁
'
'************************************************************************************************************************
If ((i) Mod (SeparatePage * PerItem)) = 1 And (i <> 1) Then '每頁*幾筆?

'最後插入目錄
objSelection.HomeKey Unit:=wdStory, Extend:=wdMove '移到最前方

'產生目錄(這個部分 從WORD 錄製巨集後,複製過來時要修改一些參數,例如 With Newdoc、 objSelection.Range )
With Newdoc
.TablesOfContents.Add Range:=objSelection.Range, RightAlignPageNumbers:= _
True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _
LowerHeadingLevel:=2, IncludePageNumbers:=True, AddedStyles:="", _
UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _
True
.TablesOfContents(1).TabLeader = wdTabLeaderDots
.TablesOfContents.Format = wdIndexIndent
End With



Debug.Print i & " " & rs("DiscussID")

'先存上一個檔案,再開啟一個新檔案
SeparatePageFileCount = SeparatePageFileCount + 1
Fn = Year(Date) - 1911 & "-" & Month(Date) & "-" & Day(Date) & " [ 筆數 " & (i - SeparatePage * PerItem) & "-" & (i - 1) & " ]文章" & Right("0" & SeparatePageFileCount, 2) & ".doc"
Newdoc.SaveAs ThisWorkbook.Path & "\" & Fn

Newdoc.Close
Set Newdoc = Nothing

Set Newdoc = Myword.Documents.Open(ThisWorkbook.Path & "\文章.doc", , True) '設定成「唯讀」以免資料被寫入。
Set objSelection = Myword.Selection
objSelection.TypeParagraph
objSelection.TypeParagraph



End If

If (i Mod PerItem) = 1 Then
Spage = -Int(-i / PerItem)
objSelection.TypeText ("頁碼: " & Spage) '無條件進位!
objSelection.Style = Newdoc.Styles("標題 1")
objSelection.TypeParagraph
End If





'If Year(UPdateTime) >= 2010 And Month(UPdateTime) >= 7 Then
' objSelection.TypeText ("編號: " & rs("DiscussID") & " " & " 已OK ")
' objSelection.Style = Newdoc.Styles("標題 2")
' objSelection.TypeParagraph
'Else

SelContent = "編號: " & rs("DiscussID") & " " & rs("Subject")
SelContent = Replace(SelContent, vbCrLf, "")
SelContent = Replace(SelContent, vbCr, "")
SelContent = Replace(SelContent, vbLf, "")


objSelection.TypeText (SelContent)
objSelection.Style = Newdoc.Styles("標題 2")
objSelection.TypeParagraph

'處理字串
SelContent = Replace(rs("Message"), ",", ",")
SelContent = Replace(SelContent, ";", ";")

SelContent = Replace(SelContent, vbCrLf, "
")
SelContent = Replace(SelContent, vbCr, "
")
SelContent = Replace(SelContent, vbLf, "
")

SelContent = Replace(SelContent, "

", vbCrLf)
SelContent = Replace(SelContent, "
", vbCrLf)

objSelection.TypeText (SelContent)
'End If

'objSelection.Style = ActiveDocument.Styles("標題 3")

objSelection.TypeParagraph
objSelection.TypeParagraph
objSelection.TypeParagraph
objSelection.TypeParagraph

'Debug.Print i & " " & rs("DiscussID")
rs.MoveNext

'If i > 50 Then
' GoTo lab:
'End If


End If

Wend


lab:


'最後插入目錄
objSelection.HomeKey Unit:=wdStory, Extend:=wdMove '移到最前方

'產生目錄(這個部分 從WORD 錄製巨集後,複製過來時要修改一些參數,例如 With Newdoc、 objSelection.Range )
With Newdoc
.TablesOfContents.Add Range:=objSelection.Range, RightAlignPageNumbers:= _
True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _
LowerHeadingLevel:=2, IncludePageNumbers:=True, AddedStyles:="", _
UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _
True
.TablesOfContents(1).TabLeader = wdTabLeaderDots
.TablesOfContents.Format = wdIndexIndent
End With





'修改滑鼠游標
'Me.MousePointer = vbNormal
SeparatePageFileCount = SeparatePageFileCount + 1
Fn = Year(Date) - 1911 & "-" & Month(Date) & "-" & Day(Date) & " [ 筆數 " & (i - SeparatePage * PerItem) & "-" & (i - 1) & " ]文章" & Right("0" & SeparatePageFileCount, 2) & ".doc"


Newdoc.SaveAs ThisWorkbook.Path & "\" & Fn

'清除與WORD物件的連結。
Newdoc.Close
Myword.Quit

Set Newdoc = Nothing
Set Myword = Nothing

MsgBox "請在程式所在目錄之下尋找剛才所建立的WORD檔案!" & vbCrLf & "檔名:" & Fn

MsgBox "完成! 耗時 " & DateDiff("s", StartTime, Now) & "秒"



注意,在處理多個檔案時,Newdoc.Close、Myword.Quit會減少記憶體的耗用!很重要,以免當機。
WORD VBA的參考資料

http://www.feiesoft.com/vba/word/
http://msdn.microsoft.com/en-us/library/aa172318%28office.11%29.aspx

vb 無條件進位法

vb6 無條件進位法

b = -Int(-a)

注意一下
使用Int 和 Fix函數 都會去掉數字的小數點部份,回傳整數
當 數字為<0時,Int函數 會傳回小於或等於數字的第一個負整數,而 Fix函數 則會傳回大於或等於 數字的第一個負整數。
例如:
Int 將 -1.3 轉成 -2
Fix 將 -7.3 轉成 -7

2010年7月14日 星期三

JQuery getJson與timespan

$.blockUI({ message: '

處理中,請耐心稍後喔…



' });

// 改善GET的Cache問題
$.getJSON("QueryArticle.ashx?Qid=" + Sid +"&T="+new Date().getTime(), function(Vdata) {
//處理 TAG 陣列
var tn="";
tn=Vdata.TagV;
//自動產生 Tag標記
var Slt='';
var cnt=0;

for( var i = 0; i < tagCnt; i++ ) {
if( tn.indexOf("x" + (i+1) + "x" ) !=-1 ) {
//alert((i+1) + ' _ ' + tn + ' ' + tn.indexOf("x" + i + "x" ) );
//Slt=Slt + "" + tagN[i+1] + '' ;
Slt=Slt + "" + (i+1) +'.' + tagN[i+1] + ' ' ;

} else {
//Slt=Slt + "" + tagN[i+1] + '' ;
Slt=Slt + "" + (i+1) +'.' + tagN[i+1] + ' ' ;

}
//每行排列三個控制項 cnt+=1 ;
if (cnt==4) {

Slt=Slt + "
"
cnt=0;
}

}

追蹤者