2013年8月27日 星期二

[SQL] 不足位數補上零 "0" & 編碼方式[NG-年度-流水號] & 編碼方式[CS年度月份流水號]

編碼方式:
NG-年度-流水號

範例一:
假設目前編號最大號 NG-13-037

SQL:找出最大值+1
SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%'  ORDER BY 報表編號 DESC;

insert into [瑕疵異狀表] (報表編號) SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%'  ORDER BY 報表編號 DESC;

結果:
NG-13-038

範例二:
假設今年為 2014 而最大號為 NG-13-038
若是要產生今年的第一筆 NG-14-001 
接續產生今年(2014)第二筆 NG-14-002 
第N筆 NG-14-N...

SQL:承一更改如下
select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else  left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] order by  substring(報表編號,4,2) desc,right(報表編號,3) desc; --where 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%'  ORDER BY 報表編號 DESC;

insert into [瑕疵異狀表] (報表編號) select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else  left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] order by  substring(報表編號,4,2) desc,right(報表編號,3) desc; --where 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%'  ORDER BY 報表編號 DESC;

結果:
NG-14-001

範例三:承二
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
藍色因條件在, 
調整日期 2013年, 則無法產生 NG-13-(n+1), 而是產出 NG-15-(n+1)
調整日期 2014年, 則正常產生 NG-14-001
調整日期 2016年, 則正常產生 NG-16-001

當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
綠色因條件在, 
調整日期 2013年, 則正常產生 NG-13-(n+1)
調整日期 2014年, 則無法產生 NG-14-001
調整日期 2016年, 則無法產生 NG-16-001

當資料有 NG-13-001 ~ n, NG-14-001 ~ n, NG-15-001 ~ n)
藍色因條件在, 
調整日期 2013年, 則無法產生 NG-13-(n+1), 而是產出 NG-15-(n+1)
調整日期 2014年, 則無法產生 NG-14-(n+1), 而是產出 NG-15-(n+1)
調整日期 2016年, 則正常產生 NG-16-001

當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
綠色因條件在, 
調整日期 2013年, 則正常產生 NG-13-(n+1)
調整日期 2014年, 則正常產生 NG-14-(n+1)
調整日期 2016年, 則無法產生 NG-16-001

SQL:承二更改如下
select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else   left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] where substring(報表編號,4,2) <= right(year(getdate()),2)  order by  substring(報表編號,4,2) desc,right(報表編號,3) desc;

insert into [瑕疵異狀表] (報表編號) select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else   left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] where substring(報表編號,4,2) <= right(year(getdate()),2)  order by  substring(報表編號,4,2) desc,right(報表編號,3) desc;

試試資料依然正確...
NG-13-001 ~ n, NG-15-001 ~ n, NG-17-001 ~ n (無14年及16年的資料)

﹝另一解﹞ CS150210 + 1 = CS150211
:::資料最大值 CS150210 故取出時後二位數+1 = CS150211
:::若該年份該月份無資料列,則CS該年該月001

select top 1 case when (select count(文號) from [DayCsycDB].[dbo].[公文基本資料表]
where 文號 like 'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'%') =0 then
'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'01'
else left(文號,6)+convert(nvarchar(2),(right(文號,2)+1)) end 文號
 from [DayCsycDB].[dbo].[公文基本資料表]
where 文號 like 'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'%'  ORDER BY Right(文號,2) DESC;

參考:
--select Right(100+month(GetDate()),2)
--select datepart(yyyy,getdate())
--select Right(year(GetDate()),2)
--select REPLICATE('0',4-LEN(substring('123',2,2)))+substring('123',2,2)
--select replicate('0',2)+convert(nvarchar(1),substring('123',3,1)+1)

--select  報表編號 from [瑕疵異狀表] where 報表編號 like '__-' + right(year(getdate()),2) + '-___' order by right(報表編號,3) desc;

--SELECT top 1 報表編號,count(報表編號) FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' group by  報表編號 order by 報表編號 desc;

--SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%'  ORDER BY 報表編號 DESC;

--select 'CS' + right(right(12303+101,2),2)

--SELECT CASE WHEN MAX(財產電腦單號) IS NULL 
THEN 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + '001' 
ELSE 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + replicate('0',3-len(substring(MAX(財產電腦單號),8,3)+1)) + convert(nvarchar(3),substring(MAX(財產電腦單號),8,3)+1)  END 
FROM C000財產基本資料表Tmp 
--WHERE substring(財產電腦單號,3,5) <= right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2)


--SELECT CASE WHEN MAX(財產電腦單號) IS NULL 
THEN 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + '001' 
ELSE 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + replicate('0',3-len(substring(MAX(財產電腦單號),8,3)+1)) + convert(nvarchar(3),substring(MAX(財產電腦單號),8,3)+1)  END 
FROM C000財產基本資料表 
WHERE substring(財產電腦單號,3,5) <= right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2)



[VB.NET] String Format 格式化, 自動補零, 不足位元補零...
Mssql的字符字段如何按位数补零
SQL 字串補0
PLSQL & T-SQL - 字串不足數補零
將不足的位數補零
MS SQL 位數不足補0範例
[Google 搜尋] mssql 位數 補零
SQL函數 查詢SQL資料欄位相符的字串
MSSql 中Charindex ,Substring的使用
CHARINDEX (Transact-SQL)

[MSSQL]取得兩位數的月份或日期
--月
Select Right(100+Month(GetDate()),2)
--日
Select Right(100+Day(GetDate()),2)

Return a value if no rows are found SQL
Return a default value if no rows found
How to Assign a Default Value if No Rows Returned from the Select Query
Getting SELECT to return a constant value even if zero rows match

2013年8月22日 星期四

[學習] 利用ProcessStartInfo來列印

參考:
ProcessStartInfo 類別
ProcessStartInfo.Arguments 屬性
Sending byte array to printer
使用 C# 批次列印 PDF 檔案
[C#]使用預設印表機列印pdf文件
Try below code
Warning[] warnings;
      string  mimeType;
      string encoding;
      string extension;
      string deviceInfo;
      string[] streamids;
      deviceInfo =
       "<DeviceInfo>" +
       " <OutputFormat>PDF</OutputFormat>" +
       " <PageSize>A4</PageSize>" +
       " <PageWidth>8.5in</PageWidth>" +
       " <PageHeight>11in</PageHeight>" +
       " <MarginTop>0.25in</MarginTop>" +
       " <MarginLeft>0.25in</MarginLeft>" +
       " <MarginRight>0.25in</MarginRight>" +
       " <MarginBottom>0.25in</MarginBottom>" +
       "</DeviceInfo>";
      byte[] bytes  = ReportViewer1.ServerReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);  

FileStream fs = new FileStream(@"c:\output.PDF", 
        FileMode.Create);
      fs.Write(bytes, 0, bytes.Length);
      fs.Close();


ProcessStartInfo startInfo = new ProcessStartInfo();
      startInfo.UseShellExecute = true;
      startInfo.Verb = "Print";
      startInfo.Arguments = "Printer Name";
      startInfo.CreateNoWindow = false;
      startInfo.WindowStyle = ProcessWindowStyle.Hidden;
      startInfo.FileName = @"C:\output.pdf";
      Process p = new Process();
      p.StartInfo = startInfo;
      p.Start();

其它參考:

[學習] 利用Adobe來列印PDF

參考:
Print Pdf in C#
Printing a PDF from a .NET Service [closed]
PDF: direct printing with .NET
Printing ReportViewer direct to printer programatically
VB.Net Printing of PDFs

其它參考:

2013年8月21日 星期三

[學習] RDLC原生導出Excel之功能, 發生「忽略資料表/矩陣資料格中的子報表」

問題:
Subreports within table/matrix cells are ignored.
忽略資料表/矩陣資料格中的子報表

ReportViewer導出EXCEL時:(PDF則不會...)


解決:(就是不要把子報表放入Table或Matrix裡)
I created a List, placed the main table from the primary report in the list.
Below the table, but inside the List I placed the subreport.
Because the subreport is not inside the table, it will render in Excel.
RDLC原本設計
紅框:List
綠框:Table
黃框:SubReport

RDLC解決設計
最外框:List
紅框:Table1
楬框:SubReport
黃框:Table2
需要注意Table1底線(Bottom)與SubReport頂線(Top)不可重疊
同上SupReport的底線(Bottom)與Table2的頂線(Top)不可重疊

解決後導出EXCEL的結果:
(若導出PDF, 則當sub-report沒資料時, tb1與tb2之間的sub-report會消失,
故會畫二條的黑線[tb1的bottomBorderLine+tb2的topBorderLine], 比原本圖示的黑線約2倍,
這是因為tb1與subReport的距離隔0.001+SubRerpot與tb2的距離隔0.001)
若有發生如上之問題, 則把距離隔弄小就不會了!


不管用LIST/矩形,呈現上還是有缺陷
報表最佳呈現解法:先將資料預先處理好,在丟進到報表

參考:(用LIST or 矩形...)
VS2008
RDLC 9.0.0.0
如何在ReportingService報表樣板檔中嵌入子報表,卻又能匯出成Excel?
Reporting Services子報表導出EXCEL問題
rdlc 报表 矩阵 详解 分组、总计、表头、显示方向、序号
rdlc导出Excel时 显示"忽略表/矩阵单元内的数据区域
报表显示时列名显示忽略表/矩阵单元内的数据区域
RDLC SubReports Exporting to Excel Are Ignored
匯出至 Microsoft Excel (報表產生器 3.0 和 SSRS)
Reporting Service Export to Excel Problem
Subreports within table/matrix cells are ignored.

May try for tools to convert PDF to excel format.

Drop the table control from rdlc and Put your main report data into matrix control and put your sub reports below to maix control. Run your report and export again.It will be solved.

To be able to export SRS reports using Sub-reports to Excel, it is advisable to use List controls instead of Data Table. Once you have made this little change, the export to excel is just perfect. Infact it will automatically even freeze the rows in the page header so that when you scroll through the data that was included in the report header stays static.

第三方Dll檔_Aspose.Cells for Reporting Services

2013年8月8日 星期四

[技巧] DataGridViewComboBoxCell 取得 Value 的值

程式碼:
                DataGridView1.AutoGenerateColumns = False
                Dim cmb As New DataGridViewComboBoxColumn()
                cmb.HeaderText = "供應商簡稱"
                cmb.Name = "供應商簡稱"
                cmb.DataPropertyName = "供應商別"
                cmb.DisplayMember = "供應商簡稱"
                cmb.ValueMember = "供應商編號"
                cmb.DataSource = dt供應商
                DataGridView1.Columns.Insert(4, cmb)

原因:
假設某個Cell的 DisplayValue 為 "男", Value 為 "1"
當我們取用 DataGridView1(x,y).Value 時,
則其值為 ValueMember "1"
當我們要取值為男時為如何?

解決:
DataGridView1(col, row).FormattedValue.ToString

參考:
Getting Selected Text of combobox in datagridview
How to get the TEXT of Datagridview Combobox selected item?
DataGridView 控制項 (Windows Form)
請問DataGridViewComboBoxColumn 要如何取到改變selecteditem 後的值或文字

ProcessCmdKey方法让DataGridView按Enter回车键转到下一列的格
(讓ComboBoxColumn在下拉選項時, 解決出現二種模式...)

2013年8月7日 星期三

[除錯] 因為它會產生對 SetCurrentCellAddressCore 函式的可重新進入呼叫

問題:
Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore

例子:
我在DataGridView的CellEnter事件
寫入以下的CODE:「DataGridView1.CurrentCell = DataGridView1(0,0)」
當進入(0,0)時, 因觸發CellEnter事件, 又將CurrentCell = (0,0), 又再次觸發事件
因此形成一個無窮迴圈
datagridview中CellValidating中出现无限循环

參考:
UI开发时, UI消息处理过程混乱的解决方法
Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function
RowLeave Event - Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function
DataGridView 控制項 (Windows Form)

[SQL] 簡體字存入資料庫之亂碼解決方式

環境:
WinXP(繁體)
SQL Server 2005(繁體)

目的:
讓簡體字存入資料庫而不變為亂碼[?]

解決:
1)
在 VB.Net 中使用 StrConv 函數進行繁簡字體轉換
將USER輸入的簡體字轉為繁體字存入資料庫
而在應用程式顯示資料時再由簡體字轉為繁體字

2)
MSSQL 簡體字存入亂碼解決方式
資料庫型態須定義為 ntext 或是 nchar , nvarchar
若定義成一般習慣前面未加 'n' 將只能放本國語系的文字
如果簡體字存入就會變成 '?'
而當 Insert 或是 UPDATE 資料時直接將簡體資料寫入也會變成 '?'
寫法必須改為 INSERT INTO table_name(test) VALUES(N'测试')
在寫入的資料前要加 N 他在存入資料庫時才會去呼掉到擴充字集..
如未加 N 他則是使用 big-5 字集...如果使用 .Net 裡面的 DataApdater 來
Update 資料也要注意 Parameters 裡面的關於每個參數的型態設定..
不然也會造成 '?' 的情形發生...................

參考:

[SQL] 取得資料表Table的欄位數量

select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'table_name' 
select count(*) from information_schema.columns where table_schema='資料庫名稱' and table_name='Table名稱';  

參考:
請問怎麼抓回table的欄位數??
請問我要如何計算一個 table 裡的欄位數量
請問怎麼抓回table的欄位數??
取得資料庫「資料表數」、「資料表名稱」,「資料表內欄位名稱」、「欄位數量」