記錄一下如何顯示 Attachment 的迴紋針圖示(Paper Clip Icon)
一般來說, 如果 Grid Row 有 Attachment
要點一下上方的 Click to search for Attachments 鈕, 才會顯示迴紋針
其實在 Grid Record is Fetched event 中增加下列程式
就可以在 Find 出資料時, 連帶將有 Attachment 的 Row 的迴紋針顯示出來
2012年9月27日 星期四
2012年9月11日 星期二
JDE BC 值無故改變
今天在查一個R程式沒有將資料顯示出來的問題
R程式的大略架構是:
Main Section 裡又有一個Sub-Section Join
Main Section 有抓到資料
也確定 Sub-Section Join 的 Business View 裡也有對應的資料
可是卻只印出 Main Section
Sub-Section Join 就是無法顯示
查了很久才找到問題所在
原來在 Main Section 中有一個 LNID 的 Business View Column(RV)
可是這個 RV 的 Display 被改成只顯示整數(Display Length=4, Display Decimals=0)
在 Main Section 顯示之前 BC Line Number 一直等於 1.01
等到 Main Section 顯示出來時
因為 Display 的設定, 將 BC Line Number 改變成 1
所以當 Main Section 將 BC 值拋入 Sub-Section Join 比對資料時
Sub-Section Join 中找不到任何 Line Number = 1 的資料
所以就無法顯示了
※原來 Business View Column 的改變, 會影響到背後的 BC 值
R程式的大略架構是:
Main Section 裡又有一個Sub-Section Join
Main Section 有抓到資料
也確定 Sub-Section Join 的 Business View 裡也有對應的資料
可是卻只印出 Main Section
Sub-Section Join 就是無法顯示
查了很久才找到問題所在
原來在 Main Section 中有一個 LNID 的 Business View Column(RV)
可是這個 RV 的 Display 被改成只顯示整數(Display Length=4, Display Decimals=0)
在 Main Section 顯示之前 BC Line Number 一直等於 1.01
等到 Main Section 顯示出來時
因為 Display 的設定, 將 BC Line Number 改變成 1
所以當 Main Section 將 BC 值拋入 Sub-Section Join 比對資料時
Sub-Section Join 中找不到任何 Line Number = 1 的資料
所以就無法顯示了
※原來 Business View Column 的改變, 會影響到背後的 BC 值
2012年7月23日 星期一
Reporting Service 的參數預設值不能改 ?
今天改了一支 Report (Reporting Service) 的參數預設值
部署上 SQL Server 後發現沒有任何改變 ?!
重新啟動 Reporting Service 服務也沒用
最後只好下 SQL 更新報表參數內容才解決
在 ReportServer DB 的 Catalog table 中儲存報表的相關資料
參數資料就在 Parameter 欄位中 (以 xml 方式存放)
如果有設定過預設值, 就會有下列這段資料
<defaultvalues>
<value>xxx</value>
</defaultvalues>
<values>
<value>xxx</value>
</values>
defaultvalues 就是預設值
values 應該是可用值
所以就把整段 xml 調整好, 再 Update 回去即可
部署上 SQL Server 後發現沒有任何改變 ?!
重新啟動 Reporting Service 服務也沒用
最後只好下 SQL 更新報表參數內容才解決
在 ReportServer DB 的 Catalog table 中儲存報表的相關資料
參數資料就在 Parameter 欄位中 (以 xml 方式存放)
如果有設定過預設值, 就會有下列這段資料
<defaultvalues>
<value>xxx</value>
</defaultvalues>
<values>
<value>xxx</value>
</values>
defaultvalues 就是預設值
values 應該是可用值
所以就把整段 xml 調整好, 再 Update 回去即可
UPDATE ReportServer.dbo.Catalog
SET Parameter = N'修改好的xml' /*不加 N (Unicode) 參數裡的中文會變亂碼*/
WHERE name = '報表名稱'
SET Parameter = N'修改好的xml' /*不加 N (Unicode) 參數裡的中文會變亂碼*/
WHERE name = '報表名稱'
2012年7月17日 星期二
ASP.NET 縮圖
記錄一下縮圖的語法:
使用者上傳檔案時,我會先將檔案rename為xxxxxx_temp.jpg
最後縮完圖後,再將新圖存成xxxxxx.jpg
順便再刪除中介圖片xxxxxx_temp.jpg
這個語法還有一個好處
就是最後完成的圖片會是 RGB 格式的圖片
即使原始圖片是 CMYK 格式也一樣 (不知不覺中就轉檔了)
參考自工頭大大的BLOG [軟體工頭的分享BLOG]
使用者上傳檔案時,我會先將檔案rename為xxxxxx_temp.jpg
最後縮完圖後,再將新圖存成xxxxxx.jpg
順便再刪除中介圖片xxxxxx_temp.jpg
Imports System.Drawing
Protected Sub ChangeSize(ByVal FilePath As String)
Dim imgSource As Image = Image.FromFile(FilePath)
Dim intFixLength As Integer = 750
Dim intChangedWidth As Integer = 0
Dim intChangedHeight As Integer = 0
' 設短邊為750px, 長邊等比例縮放
With imgSource
If .Width < .Height Then
intChangedWidth = intFixLength
intChangedHeight = .Height / .Width * intFixLength
Else
intChangedWidth = .Width / .Height * intFixLength
intChangedHeight = intFixLength
End If
End With
Dim bmpIntermediary As New Bitmap(intChangedWidth, intChangedHeight)
Dim gphPainter As Graphics = Graphics.FromImage(bmpIntermediary)
' 圖片繪製品質
gphPainter.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
' 圖片呈現品質
gphPainter.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
' 圖片插補模式
gphPainter.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
' 1:要繪製的圖片 2:起始x座標 3:起始y座標 4:寬度 5:高度
gphPainter.DrawImage(imgSource, 0, 0, intChangedWidth, intChangedHeight)
bmpIntermediary.Save(Replace(FilePath, "_temp.jpg", ".jpg"), Imaging.ImageFormat.Jpeg)
bmpIntermediary.Dispose()
gphPainter.Dispose()
imgSource.Dispose()
Dim fiSource As New FileInfo(FilePath)
If fiSource.Exists Then
fiSource.Delete()
End If
End Sub
Protected Sub ChangeSize(ByVal FilePath As String)
Dim imgSource As Image = Image.FromFile(FilePath)
Dim intFixLength As Integer = 750
Dim intChangedWidth As Integer = 0
Dim intChangedHeight As Integer = 0
' 設短邊為750px, 長邊等比例縮放
With imgSource
If .Width < .Height Then
intChangedWidth = intFixLength
intChangedHeight = .Height / .Width * intFixLength
Else
intChangedWidth = .Width / .Height * intFixLength
intChangedHeight = intFixLength
End If
End With
Dim bmpIntermediary As New Bitmap(intChangedWidth, intChangedHeight)
Dim gphPainter As Graphics = Graphics.FromImage(bmpIntermediary)
' 圖片繪製品質
gphPainter.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
' 圖片呈現品質
gphPainter.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
' 圖片插補模式
gphPainter.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
' 1:要繪製的圖片 2:起始x座標 3:起始y座標 4:寬度 5:高度
gphPainter.DrawImage(imgSource, 0, 0, intChangedWidth, intChangedHeight)
bmpIntermediary.Save(Replace(FilePath, "_temp.jpg", ".jpg"), Imaging.ImageFormat.Jpeg)
bmpIntermediary.Dispose()
gphPainter.Dispose()
imgSource.Dispose()
Dim fiSource As New FileInfo(FilePath)
If fiSource.Exists Then
fiSource.Delete()
End If
End Sub
這個語法還有一個好處
就是最後完成的圖片會是 RGB 格式的圖片
即使原始圖片是 CMYK 格式也一樣 (不知不覺中就轉檔了)
參考自工頭大大的BLOG [軟體工頭的分享BLOG]
2012年3月12日 星期一
VS2003 DataGrid 去除空白行
最近在查怎麼控制 DataGrid 裡不要出現空白列
(不允許新增列)
查了 DataGrid 上上下下的屬性, 方法
都一無所獲
後來才發現要透過 Bind 的 DataTable 控制
只要加這一行就搞定 !
(不允許新增列)
查了 DataGrid 上上下下的屬性, 方法
都一無所獲
後來才發現要透過 Bind 的 DataTable 控制
只要加這一行就搞定 !
dt.DefaultView.AllowNew = False
2012年3月11日 星期日
在 VS2003 的 DataGrid (WinForm) 中鑲入 ComboBox (下拉選單)
記錄一下 VS2003 的 DataGrid 中如何鑲入下拉選單
呈現出來的效果會是:
一開始 DataGrid 的欄位看起來是 DataGridTextBoxColumn (TextBox)
滑鼠點到該欄位時, 會自動變成下拉選單 (ComboBox)
當滑鼠點到其他欄位時, 欄位又會變回 DataGridTextBoxColumn
並將下拉選單中選定的文字顯示在 DataGridTextBoxColumn 上
要鑲入下拉選單的 DataGridTextBoxColumn 最好設為 ReadOnly
免得使用者不小心改掉欄位值
呈現出來的效果會是:
一開始 DataGrid 的欄位看起來是 DataGridTextBoxColumn (TextBox)
滑鼠點到該欄位時, 會自動變成下拉選單 (ComboBox)
當滑鼠點到其他欄位時, 欄位又會變回 DataGridTextBoxColumn
並將下拉選單中選定的文字顯示在 DataGridTextBoxColumn 上
Public Sub New()
MyBase.New()
InitializeComponent()
' 將 ComboBox 加入 DataGrid
BindComboBox()
End Sub
Private Sub BindComboBox()
Dim dt As New DataTable
Dim conn As New SqlClient.SqlConnection("連線字串")
Dim strSQL As String = "SQL敘述"
Dim cmd As New SqlClient.SqlCommand(strSQL, conn)
Dim adapter As New SqlClient.SqlDataAdapter(cmd)
conn.Open()
adapter.Fill(dt)
conn.Close()
' 要鑲入 ComboBox 的欄位必須是 DataGridTextBoxColumn
' GridColumnStyles(n) : n 代表要在第幾個 DataGridTextBoxColumn 鑲入, 0,1,2,...
Dim dgtbcCol As DataGridTextBoxColumn = DataGrid1.TableStyles(0).GridColumnStyles(2)
Dim cbCol As New ComboBox
' 將 ComboBox 的寬度設得和 DataGridTextBoxColumn 一樣寬
cbCol.width = 75
' 將 ComboBox onMouseOver 時的游標設為箭頭
cbCol.Cursor = Cursors.Arrow
' 將 ComboBox 的樣式設為下拉選單
cbCol.DropDownStyle = ComboBoxStyle.DropDownList
' 繫結 ComboBox 資料
cbCol.DataSource = dt
cbCol.ValueMember = "下拉值的欄位名稱"
cbCol.DisplayMember = "下拉文字的欄位名稱"
' 增加下拉選單值改變時的 Event
AddHandler cbCol.SelectionChangeCommited, AddressOf cbCol_SelectionChangeCommited
' 將 ComboBox 鑲入 DataGridTextBoxColumn 中
dgtbcCol.TextBox.Controls.Add(cbCol)
End Sub
Private Sub cbCol_SelectionChangeCommited(ByVal sender As Object, ByVal e As EventArgs)
' 將 ComboBox 選定的文字顯示在 DataGridTextBoxColumn 上
DataGrid1.Item(DataGrid1.CurrentCell) = Ctype(sender, ComboBox).Text
End Sub
MyBase.New()
InitializeComponent()
' 將 ComboBox 加入 DataGrid
BindComboBox()
End Sub
Private Sub BindComboBox()
Dim dt As New DataTable
Dim conn As New SqlClient.SqlConnection("連線字串")
Dim strSQL As String = "SQL敘述"
Dim cmd As New SqlClient.SqlCommand(strSQL, conn)
Dim adapter As New SqlClient.SqlDataAdapter(cmd)
conn.Open()
adapter.Fill(dt)
conn.Close()
' 要鑲入 ComboBox 的欄位必須是 DataGridTextBoxColumn
' GridColumnStyles(n) : n 代表要在第幾個 DataGridTextBoxColumn 鑲入, 0,1,2,...
Dim dgtbcCol As DataGridTextBoxColumn = DataGrid1.TableStyles(0).GridColumnStyles(2)
Dim cbCol As New ComboBox
' 將 ComboBox 的寬度設得和 DataGridTextBoxColumn 一樣寬
cbCol.width = 75
' 將 ComboBox onMouseOver 時的游標設為箭頭
cbCol.Cursor = Cursors.Arrow
' 將 ComboBox 的樣式設為下拉選單
cbCol.DropDownStyle = ComboBoxStyle.DropDownList
' 繫結 ComboBox 資料
cbCol.DataSource = dt
cbCol.ValueMember = "下拉值的欄位名稱"
cbCol.DisplayMember = "下拉文字的欄位名稱"
' 增加下拉選單值改變時的 Event
AddHandler cbCol.SelectionChangeCommited, AddressOf cbCol_SelectionChangeCommited
' 將 ComboBox 鑲入 DataGridTextBoxColumn 中
dgtbcCol.TextBox.Controls.Add(cbCol)
End Sub
Private Sub cbCol_SelectionChangeCommited(ByVal sender As Object, ByVal e As EventArgs)
' 將 ComboBox 選定的文字顯示在 DataGridTextBoxColumn 上
DataGrid1.Item(DataGrid1.CurrentCell) = Ctype(sender, ComboBox).Text
End Sub
要鑲入下拉選單的 DataGridTextBoxColumn 最好設為 ReadOnly
免得使用者不小心改掉欄位值
2012年2月24日 星期五
從偽裝 Excel 到真正 Excel
最近在弄個匯出 Excel 功能
一開始產生 csv 格式, 逗號隔開欄位, 結果 User 反映中文變亂碼
改用 Encoding.UTF8 後, User 又反映日文還是亂碼
就改為產生 html 格式的檔案, 存檔時將副檔名命名為 .xls (偽)
User 終於什麼都 OK 了, 但我卻發現 Excel 2007 開啟時會跳出
「您正在嘗試開啟 'xxxxx.xls',其檔案格式與副檔名所指定的格式不同」訊息
(偽 Excel 被識破了~~)
在懶得再次大改程式的前提下
想到了個小修改解決這一切
就是用 Excel 2003 把偽 Excel 開啟
再另存為真正的 Excel
這個做法的缺點是: 必須在 Server 上儲存實際檔案, 且 Server 上要有 Excel 2003 元件
為什麼不一開始就用 Excel 元件來產生檔案 ?
因為 User 要求一堆有的沒的格式
對我來說, 用 html 格式設定比較容易
一開始產生 csv 格式, 逗號隔開欄位, 結果 User 反映中文變亂碼
改用 Encoding.UTF8 後, User 又反映日文還是亂碼
就改為產生 html 格式的檔案, 存檔時將副檔名命名為 .xls (偽)
User 終於什麼都 OK 了, 但我卻發現 Excel 2007 開啟時會跳出
「您正在嘗試開啟 'xxxxx.xls',其檔案格式與副檔名所指定的格式不同」訊息
(偽 Excel 被識破了~~)
在懶得再次大改程式的前提下
想到了個小修改解決這一切
就是用 Excel 2003 把偽 Excel 開啟
再另存為真正的 Excel
Private Sub SaveAsXls(ByVal xlsFileName As String)
Dim xlsApp As New Excel.Application
Dim xlsNewFileName As String = Replace(xlsFileName, ".xls", "_1.xls")
xlsApp.Workbooks.Open(xlsFileName)
xlsApp.Workbooks(1).SaveAs(xlsNewFileName , Excel.XlFileFormat.xlExcel9795)
xlsApp.Workbooks(1).Saved = True
xlsApp.Quit()
xlsApp = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
' 刪除偽 Excel (不隨手亂丟垃圾的好習慣)
Dim fiOriginFile As New FileInfo(xlsFileName)
If fiOriginFile.Exists Then
fiOriginFile.Delete()
End If
End Sub
Dim xlsApp As New Excel.Application
Dim xlsNewFileName As String = Replace(xlsFileName, ".xls", "_1.xls")
xlsApp.Workbooks.Open(xlsFileName)
xlsApp.Workbooks(1).SaveAs(xlsNewFileName , Excel.XlFileFormat.xlExcel9795)
xlsApp.Workbooks(1).Saved = True
xlsApp.Quit()
xlsApp = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
' 刪除偽 Excel (不隨手亂丟垃圾的好習慣)
Dim fiOriginFile As New FileInfo(xlsFileName)
If fiOriginFile.Exists Then
fiOriginFile.Delete()
End If
End Sub
這個做法的缺點是: 必須在 Server 上儲存實際檔案, 且 Server 上要有 Excel 2003 元件
為什麼不一開始就用 Excel 元件來產生檔案 ?
因為 User 要求一堆有的沒的格式
對我來說, 用 html 格式設定比較容易
2012年2月15日 星期三
ASP submit 後中文變亂碼
最近寫了一支 ASP
submit form 之後
所有中文都變成亂碼
試了很久, 最後終於解決
只要在一開始加上一行
submit form 之後
所有中文都變成亂碼
試了很久, 最後終於解決
只要在一開始加上一行
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
2012年2月13日 星期一
Excel 讀取 html 格式的儲存格換行效果
最近用 .NET 產生一個 html 格式的檔案
然後命名為 .xls , 偽裝成 Excel 檔案使用
結果發現在 <td> </td> 中使用 <br>
沒有達到預想中在儲存格換行的效果
幸好找到這一篇 :
[HTML][CSS] 使用 HTML <table> 匯出 Excel 時的斷行 (<br/>) 處理
(From : yilin 的程式日記)
真是太感恩了~
然後命名為 .xls , 偽裝成 Excel 檔案使用
結果發現在 <td> </td> 中使用 <br>
沒有達到預想中在儲存格換行的效果
幸好找到這一篇 :
[HTML][CSS] 使用 HTML <table> 匯出 Excel 時的斷行 (<br/>) 處理
(From : yilin 的程式日記)
<br style="mso-data-placement: same-cell;" >
只要加上 css , 就可以符合我的需求了真是太感恩了~
2012年1月31日 星期二
迴圈搭配DataAdapter.Fill陷阱
今天在追蹤一個資料異常寫入的問題
發現原因出在迴圈搭配 DataAdapter.Fill 上
有問題的程式大致如下:
之前一直以為 DataAdapter.Fill 執行時
會先清空 DataTable 內容再重新寫入資料
沒想到實際動作是
保留 DataTable 內的資料, 再將新資料 append 進 DataTable
導致這次資料異常寫入
只要在 DataTable 使用完後 (Next 上方)
加一個 dt.Clear()
就可解決這個問題
算是學到了一個經驗
發現原因出在迴圈搭配 DataAdapter.Fill 上
有問題的程式大致如下:
Dim dt As New DataTable
Dim saDept() As New String {"A01", "A02"}
For i As Integer = 0 To saDept.Length - 1
Dim strSQL As String = "SELECT * FROM Employee WHERE Dept = '" & saDept(i) & "' "
Dim scCmd As New SqlClient.SqlCommand
Dim sdaAdapter As New SqlClient.SqlDataAdapter
scCmd.CommandText = strSQL
sdaAdapter.SelectCommand = scCmd
sdaAdapter.Fill(dt)
.
.
.
Next
Dim saDept() As New String {"A01", "A02"}
For i As Integer = 0 To saDept.Length - 1
Dim strSQL As String = "SELECT * FROM Employee WHERE Dept = '" & saDept(i) & "' "
Dim scCmd As New SqlClient.SqlCommand
Dim sdaAdapter As New SqlClient.SqlDataAdapter
scCmd.CommandText = strSQL
sdaAdapter.SelectCommand = scCmd
sdaAdapter.Fill(dt)
.
.
.
Next
之前一直以為 DataAdapter.Fill 執行時
會先清空 DataTable 內容再重新寫入資料
沒想到實際動作是
保留 DataTable 內的資料, 再將新資料 append 進 DataTable
導致這次資料異常寫入
只要在 DataTable 使用完後 (Next 上方)
加一個 dt.Clear()
就可解決這個問題
算是學到了一個經驗
訂閱:
文章 (Atom)