情況:
承自 DataGridView 的擴展控項 myDataGridView
當CellValidating...沒過...Coding為e.cancel=true;
則程式最先進入控項的ProcessDialogKey...
當Cdoing為base.CurrentCell = base.Rows[base.CurrentCell.RowIndex].Cells[nextColumn.Index];
便會出現錯誤訊息「因為程式無法認可或結束儲存格值的變更」
所以要改寫以下...(紅色+判斷)
protected override bool ProcessDialogKey(System.Windows.Forms.Keys keyData)
{
//MessageBox.Show(this.CurrentCell.RowIndex.ToString());
if (keyData == Keys.Tab || keyData == Keys.Enter)
{
if ((base.CurrentCell == null))
{
return true;
}
DataGridViewColumn nextColumn = null;
nextColumn = base.Columns.GetNextColumn(base.Columns[base.CurrentCell.ColumnIndex], DataGridViewElementStates.Visible, DataGridViewElementStates.ReadOnly);
if ((nextColumn != null))
{
if(this.CurrentCell.IsInEditMode)
//當驗證沒過時, Coding部份為e.cancel=true, 使用這個方式就不會出錯了!
return base.ProcessDialogKey(Keys.Tab);
else
base.CurrentCell = base.Rows[base.CurrentCell.RowIndex].Cells[nextColumn.Index];
}
else
{
nextColumn = base.Columns.GetFirstColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.ReadOnly);
if ((base.CurrentCell.RowIndex + 1) == base.Rows.Count)
{
base.CurrentCell = base.Rows[0].Cells[nextColumn.Index];
}
else
{
if (this.CurrentCell.IsInEditMode)
//當驗證沒過時, Coding部份為e.cancel=true, 使用這個方式就不會出錯了!
return base.ProcessDialogKey(Keys.Tab);
else
base.CurrentCell = base.Rows[base.CurrentCell.RowIndex + 1].Cells[nextColumn.Index];
}
}
//MessageBox.Show(this.CurrentCell.RowIndex.ToString());
return true;
}
return base.ProcessDialogKey(keyData);
}
參考:
[C#]DataGridView欄位驗證只能是數字且不能為空白
DataGridView.Rows.Clear() raise exception
You received exception message Exception.InvalidOperation "Operation did not succeed because the program cannot commit or quit a cell value change." . If this DataGridView cell is in edit mode, you have to end/submit edit and then continue.
DataGridView 控制項 (Windows Form)
2013年11月14日 星期四
2013年11月12日 星期二
[除錯] 沒有足夠權限以存取 temp 目錄
[錯誤訊息]
System.UnauthorizedAccessException: Access to the temp directory is denied.
沒有足夠權限以存取 temp 目錄 SERVER1\Administrator
參考:
UnauthorizedAccessException 類別
System.UnauthorizedAccessException: 拒絕存取路徑
檔案複製出現UnauthorizedAccessException錯誤
unauthorizedaccessexception 拒絕存取路徑
Error: Access to the temp directory is denied.
xmlserializer problem
ASP.NET Access to the temp directory is denied
其它參考:
疑難排解程式碼存取安全性之例外狀況
當您嘗試存取檔案快取根目錄時發生 UnauthorizedAccessException
System.UnauthorizedAccessException: Access to the temp directory is denied.
沒有足夠權限以存取 temp 目錄 SERVER1\Administrator
參考:
UnauthorizedAccessException 類別
System.UnauthorizedAccessException: 拒絕存取路徑
檔案複製出現UnauthorizedAccessException錯誤
unauthorizedaccessexception 拒絕存取路徑
Error: Access to the temp directory is denied.
xmlserializer problem
ASP.NET Access to the temp directory is denied
其它參考:
疑難排解程式碼存取安全性之例外狀況
當您嘗試存取檔案快取根目錄時發生 UnauthorizedAccessException
2013年10月7日 星期一
[SQL] SQL SERVER 如何區分大小寫?
String[] SqlQry = new String[1];
SqlQry[0] = "SELECT * FROM [A000幣別] WHERE 幣別編號 like @幣別編號 Collate Chinese_Taiwan_Stroke_CS_AS;";
DictionaryEntry[] SqlParas = new DictionaryEntry[1];
SqlParas[0].Key = "幣別編號";
SqlParas[0].Value = "%E%";
參考:
SQL SERVER 如何區分大小寫?
[SQL SERVER][Memo]如何設定Column區分大小寫
SqlQry[0] = "SELECT * FROM [A000幣別] WHERE 幣別編號 like @幣別編號 Collate Chinese_Taiwan_Stroke_CS_AS;";
DictionaryEntry[] SqlParas = new DictionaryEntry[1];
SqlParas[0].Key = "幣別編號";
SqlParas[0].Value = "%E%";
參考:
SQL SERVER 如何區分大小寫?
[SQL SERVER][Memo]如何設定Column區分大小寫
2013年9月28日 星期六
[學習] 在HashTable容器上做Object的存取...
說明:
當cmb事件觸發時, 根據cmb.SelectedValue做為HashTable的Key
並取出對應Key的Value值...
而Value為一個類別(cls_marking)...
C#:
[cls_marking.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ExportSys
{
class cls_marking
{
private bool _disposed = false;
private String _mk1;
private String _mk2;
private String _mk3;
private String _mk4;
private String _mk5;
private String _mk6;
private String _mk7;
private String _mk8;
private String _mk9;
//建構子
//public cls_marking(String g,String b);
public cls_marking(String mk1, String mk2,
String mk3, String mk4,
String mk5, String mk6,
String mk7, String mk8, String mk9)
{
this._mk1 = mk1;
this._mk2 = mk2;
this._mk3 = mk3;
this._mk4 = mk4;
this._mk5 = mk5;
this._mk6 = mk6;
this._mk7 = mk7;
this._mk8 = mk8;
this._mk9 = mk9;
this._disposed = false;
}
public override string ToString()
{
return _mk1 + " " + _mk2 + " " + _mk3 + " " + _mk4 + " " + _mk5 + " " + _mk6 + " " + _mk7 + " " + _mk8 + " " + _mk9;
}
public string mk1
{
get { return _mk1; }
set { _mk1 = value; }
}
public string mk2
{
get { return _mk2; }
set { _mk2 = value; }
}
public string mk3
{
get { return _mk3; }
set { _mk3 = value; }
}
public string mk4
{
get { return _mk4; }
set { _mk4 = value; }
}
public string mk5
{
get { return _mk5; }
set { _mk5 = value; }
}
public string mk6
{
get { return _mk6; }
set { _mk6 = value; }
}
public string mk7
{
get { return _mk7; }
set { _mk7 = value; }
}
public string mk8
{
get { return _mk8; }
set { _mk8 = value; }
}
public string mk9
{
get { return _mk9; }
set { _mk9 = value; }
}
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing)
{
if (_mk1 != null)
{
_mk1 = null;
_mk2 = null;
_mk3 = null;
_mk4 = null;
_mk5 = null;
_mk6 = null;
_mk7 = null;
_mk8 = null;
_mk9 = null;
}
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_mk1 = null;
_mk2 = null;
_mk3 = null;
_mk4 = null;
_mk5 = null;
_mk6 = null;
_mk7 = null;
_mk8 = null;
_mk9 = null;
_disposed = true;
}
}
}
}
缺點:
C# - 替代 Hashtable 沒有泛型的方案
雖然Hashtable在某些地方很好用,但在某些情況下,反而成了礙手礙腳的。
Hashtable裡面的物件都是存成object,倘若要不斷的使用物件,就要不斷的轉型…
一來折損不少效能,二來程式碼看起來就很不舒服
其實,解決方法有很多種,只是找不到有詳盡介紹 C# 所有Collections的好文章。
最根本的做法就是直接去實作Collections使用的介面,但是又整個很麻煩的感覺。
一直在想,都有List<>的泛型了,為啥沒有對應Hashtable的泛型咧~
今天終於給我咕到一個好用的Collections可以取代之!
參考:
DictionaryEntry 結構
C#集合--Dictionary
Hashtable 類別
C#中HashTable的用法
C#中如何操作HashTable类呢?
Hashtable中key, value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.
C#集合之Hashtable
C# 應用雜湊表(Hashtable)
什麼是 Dictionaries
Using The C# Hashtable Collection
C# Hashtable
C#: Storing Instance of Objects in (Hashtable)
How to Serialize a Dictionary or Hashtable in C#
使用泛型類別解決 ComboBox 的自訂資料繫結問題
集合與泛型對應
c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别
Array和ArrayList的异同点
當cmb事件觸發時, 根據cmb.SelectedValue做為HashTable的Key
並取出對應Key的Value值...
而Value為一個類別(cls_marking)...
C#:
[cls_marking.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ExportSys
{
class cls_marking
{
private bool _disposed = false;
private String _mk1;
private String _mk2;
private String _mk3;
private String _mk4;
private String _mk5;
private String _mk6;
private String _mk7;
private String _mk8;
private String _mk9;
//建構子
//public cls_marking(String g,String b);
public cls_marking(String mk1, String mk2,
String mk3, String mk4,
String mk5, String mk6,
String mk7, String mk8, String mk9)
{
this._mk1 = mk1;
this._mk2 = mk2;
this._mk3 = mk3;
this._mk4 = mk4;
this._mk5 = mk5;
this._mk6 = mk6;
this._mk7 = mk7;
this._mk8 = mk8;
this._mk9 = mk9;
this._disposed = false;
}
public override string ToString()
{
return _mk1 + " " + _mk2 + " " + _mk3 + " " + _mk4 + " " + _mk5 + " " + _mk6 + " " + _mk7 + " " + _mk8 + " " + _mk9;
}
public string mk1
{
get { return _mk1; }
set { _mk1 = value; }
}
public string mk2
{
get { return _mk2; }
set { _mk2 = value; }
}
public string mk3
{
get { return _mk3; }
set { _mk3 = value; }
}
public string mk4
{
get { return _mk4; }
set { _mk4 = value; }
}
public string mk5
{
get { return _mk5; }
set { _mk5 = value; }
}
public string mk6
{
get { return _mk6; }
set { _mk6 = value; }
}
public string mk7
{
get { return _mk7; }
set { _mk7 = value; }
}
public string mk8
{
get { return _mk8; }
set { _mk8 = value; }
}
public string mk9
{
get { return _mk9; }
set { _mk9 = value; }
}
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing)
{
if (_mk1 != null)
{
_mk1 = null;
_mk2 = null;
_mk3 = null;
_mk4 = null;
_mk5 = null;
_mk6 = null;
_mk7 = null;
_mk8 = null;
_mk9 = null;
}
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_mk1 = null;
_mk2 = null;
_mk3 = null;
_mk4 = null;
_mk5 = null;
_mk6 = null;
_mk7 = null;
_mk8 = null;
_mk9 = null;
_disposed = true;
}
}
}
}
[ExpOrder.cs]
private Hashtable htb_mark = new Hashtable();
private void cmdBing()
{
cmb_印字編號.DisplayMember = "Value";
cmb_印字編號.ValueMember = "Key";
ArrayList al = new ArrayList();
using (IDataReader reader = db.ExecuteReader(db.GetSqlStringCommand("SELECT MARK代碼 + '(' + 中文名稱 + ')' as 中文名稱,MARK代碼,MARK1,MARK2,MARK3,MARK4,MARK5,MARK6,MARK7,MARK8,MARK9 FROM [tbl資料表];")))
{
if (htb_mark.Count > 0) htb_mark.Clear();
while (reader.Read())
{
al.Add(new DictionaryEntry(reader.GetValue(1), reader.GetValue(0)));
cls_marking mark = new cls_marking(reader["MARK1"].ToString(), reader["MARK2"].ToString(),
reader["MARK3"].ToString(), reader["MARK4"].ToString(), reader["MARK5"].ToString(),
reader["MARK6"].ToString(), reader["MARK7"].ToString(), reader["MARK8"].ToString(),
reader["MARK9"].ToString());
htb_mark.Add(reader["MARK代碼"].ToString(), mark);
}
cmb_印字編號.DataSource = al;
}
}
private void cmb_印字編號_SelectedIndexChanged(object sender, EventArgs e)
{
this.txt_印字1.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk1.ToString();
this.txt_印字2.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk2.ToString();
this.txt_印字3.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk3.ToString();
this.txt_印字4.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk4.ToString();
this.txt_印字5.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk5.ToString();
this.txt_印字6.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk6.ToString();
this.txt_印字7.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk7.ToString();
this.txt_印字8.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk8.ToString();
this.txt_印字9.Text = ((cls_marking)htb_mark[cmb_印字編號.SelectedValue]).mk9.ToString();
}
private void btn_Test(object sender, EventArgs e)
{
//法一
foreach(DictionaryEntry item in htb_mark)
{
MessageBox.Show(item.Key + " = " + ((cls_marking)item.Value).mk1);
}
//法二
foreach(cls_marking item in htb_mark.Values)
{
MessageBox.Show(item.mk1.ToString());
}
//法三
//variable to hold the list of songs
string list = string.Empty;
//create an instance of the IDictionaryEnumerator Interface
IDictionaryEnumerator enumerator;
//make sure our Hashtable holds items
if (htb_mark.Count > 0)
{
//let the user know what we're doing
MessageBox.Show("The following songs are in your list:");
//now set out IDictionaryEnumerator value
enumerator = htb_mark.GetEnumerator();
//now use the MoveNext Method to iterate through our list
while (enumerator.MoveNext())
{
//keep adding song names until we reach the end
list += enumerator.Value.ToString() + "\r\n";
}
//now show the song names
MessageBox.Show(list);
}
}
缺點:
C# - 替代 Hashtable 沒有泛型的方案
雖然Hashtable在某些地方很好用,但在某些情況下,反而成了礙手礙腳的。
Hashtable裡面的物件都是存成object,倘若要不斷的使用物件,就要不斷的轉型…
一來折損不少效能,二來程式碼看起來就很不舒服
其實,解決方法有很多種,只是找不到有詳盡介紹 C# 所有Collections的好文章。
最根本的做法就是直接去實作Collections使用的介面,但是又整個很麻煩的感覺。
一直在想,都有List<>的泛型了,為啥沒有對應Hashtable的泛型咧~
今天終於給我咕到一個好用的Collections可以取代之!
參考:
DictionaryEntry 結構
C#集合--Dictionary
Hashtable 類別
C#中HashTable的用法
C#中如何操作HashTable类呢?
Hashtable中key, value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.
C#集合之Hashtable
C# 應用雜湊表(Hashtable)
什麼是 Dictionaries
Using The C# Hashtable Collection
C# Hashtable
C#: Storing Instance of Objects in (Hashtable)
How to Serialize a Dictionary or Hashtable in C#
使用泛型類別解決 ComboBox 的自訂資料繫結問題
集合與泛型對應
c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别
Array和ArrayList的异同点
2013年9月27日 星期五
[學習] 藉由 ArrayList 裝載 DataReader 數據,並做為 ComboBox 數據來源...
說明:
一般來講都是透過DataTable來做為ComboBox的數據來源…
來設置 DisplayMember 與 ValueMember
選用 DataSet 或 DataReader
DataReader和Dataset的性能比较
但似乎DataTable讀取效率較沒有DataReader快...
在WebForm, ComBoBox可直接DataReader當數據, WinForm 則否...
WinForm [error msg] 複雜 DataBinding 接受以 IList 或 IListSource 做為資料來源。
故可考慮下面方式...
當數據非常多筆(數千, 數萬)時, 此方法與DataTable的效率比較,尚待測試...
C#:[WinForm]
using System.Collections;
cmb_印字編號.DisplayMember = "Value";
cmb_印字編號.ValueMember = "Key";
ArrayList al = new ArrayList();
using (IDataReader reader = db.ExecuteReader(db.GetSqlStringCommand("SELECT MARK代碼 + '(' + 中文名稱 + ')' as 中文名稱,MARK代碼 FROM [tb資料表];")))
{
while (reader.Read())
{
al.Add(new DictionaryEntry(reader.GetValue(1), reader.GetValue(0)));
}
cmb_印字編號.DataSource = al;
}
備註:
关于.net winform ComboBox的DataSource,DisplayMember和ValueMember属性的设置顺序的问题。
ComboBox配置数据源需要注意的一个问题
.NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)
參考:
ArrayList 類別
winform下comboBox控件绑定数据并设置其value【整理】
winform中combox的运用
其它參考:List / IList / IListSource
IList 介面
IListSource 介面
How do i bind data source to a ComboBox?
how to bind a list to a combobox? (Winforms)
Populating a ComboBox using C#
C# - 使用 LIST 為 COMBOBOX 加入 ITEM
Complex DataBinding accepts as a data source either an IList or an IListSource.
WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)
C# IList, ArrayList与List的区别详解 & 简单用法举例(转)
Array和ArrayList的异同点
VB.NET的Array VS ArrayList
c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别
C#集合--Dictionary
How to return datareader from a web service?
一般來講都是透過DataTable來做為ComboBox的數據來源…
來設置 DisplayMember 與 ValueMember
選用 DataSet 或 DataReader
DataReader和Dataset的性能比较
但似乎DataTable讀取效率較沒有DataReader快...
在WebForm, ComBoBox可直接DataReader當數據, WinForm 則否...
WinForm [error msg] 複雜 DataBinding 接受以 IList 或 IListSource 做為資料來源。
故可考慮下面方式...
當數據非常多筆(數千, 數萬)時, 此方法與DataTable的效率比較,尚待測試...
C#:[WinForm]
using System.Collections;
cmb_印字編號.DisplayMember = "Value";
cmb_印字編號.ValueMember = "Key";
ArrayList al = new ArrayList();
using (IDataReader reader = db.ExecuteReader(db.GetSqlStringCommand("SELECT MARK代碼 + '(' + 中文名稱 + ')' as 中文名稱,MARK代碼 FROM [tb資料表];")))
{
while (reader.Read())
{
al.Add(new DictionaryEntry(reader.GetValue(1), reader.GetValue(0)));
}
cmb_印字編號.DataSource = al;
}
備註:
关于.net winform ComboBox的DataSource,DisplayMember和ValueMember属性的设置顺序的问题。
ComboBox配置数据源需要注意的一个问题
.NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)
參考:
ArrayList 類別
winform下comboBox控件绑定数据并设置其value【整理】
winform中combox的运用
其它參考:List / IList / IListSource
IList 介面
IListSource 介面
How do i bind data source to a ComboBox?
how to bind a list to a combobox? (Winforms)
Populating a ComboBox using C#
C# - 使用 LIST 為 COMBOBOX 加入 ITEM
Complex DataBinding accepts as a data source either an IList or an IListSource.
WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)
C# IList, ArrayList与List的区别详解 & 简单用法举例(转)
Array和ArrayList的异同点
VB.NET的Array VS ArrayList
c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别
C#集合--Dictionary
How to return datareader from a web service?
2013年9月22日 星期日
[除錯] Entlib 5.0 DAAB 因相依性問題,而無法解析組件。
當在使用DAAB (Data Access Application Block) 時, compile 出現Error :
無法解析所參考的組件 "Microsoft.Practices.EnterpriseLibrary.Data.SqlCe, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL",因為它在 "System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 上有相依性,而後者不在目前的目標 Framework ".NETFramework,Version=v4.0,Profile=Client" 中。請移除不在目標 Framework 中的組件參考,或考慮重新設定專案的目標。
解法:
修改專案[屬性][目標 Framework] 從.Net Framework 4 Client profile , 改成.Net Framework
環境:
VS2010 C#.Net
Entlib 5.0, DAAB
參考:
Enterprise Library 5.0, A dependency on System.Data.OracleClient
無法解析所參考的組件 "Microsoft.Practices.EnterpriseLibrary.Data.SqlCe, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL",因為它在 "System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 上有相依性,而後者不在目前的目標 Framework ".NETFramework,Version=v4.0,Profile=Client" 中。請移除不在目標 Framework 中的組件參考,或考慮重新設定專案的目標。
解法:
修改專案[屬性][目標 Framework] 從.Net Framework 4 Client profile , 改成.Net Framework
環境:
VS2010 C#.Net
Entlib 5.0, DAAB
參考:
Enterprise Library 5.0, A dependency on System.Data.OracleClient
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
[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
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)
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
訂閱:
文章 (Atom)