2017年8月11日 星期五

C# x 指定檔案路徑 x 列印 x notifyIcon應用


C# x 指定檔案路徑 x 列印 x notifyIcon應用

Form裡面要有 :

Button *1
notifyicon *1
contextmenustrip *1
printdocument *1





/////////////////////以下 程式碼/////////////////////

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication30
{
    public partial class Form1 : Form
    {
        System.IO.StreamReader fileToPrint;
        System.Drawing.Font printFont;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            notifyIcon1.Text = "常駐程式";
        }

        private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
        {
            notifyIcon1.ShowBalloonTip(3000);
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.notifyIcon1.Visible = true;
                this.Hide();
            }
            else
            {
                this.notifyIcon1.Visible = false;
            }
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
        }

        private void OpenTMS_Click(object sender, EventArgs e)
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
        }

        private void ExitCMS_Click(object sender, EventArgs e)
        {
            this.Close();
            this.Dispose();
            System.GC.Collect();
            System.Environment.Exit(System.Environment.ExitCode);

        }

        private void button1_Click(object sender, EventArgs e)
        {

            fileToPrint = new System.IO.StreamReader(@"D:\test.txt");
            printFont = new System.Drawing.Font("Arial", 10);
            printDocument1.Print();
            fileToPrint.Close();
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            float yPos = 0f;
            int count = 0;
            float leftMargin = e.MarginBounds.Left;
            float topMargin = e.MarginBounds.Top;
            string line = null;
            float linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
            while (count < linesPerPage)
            {
                line = fileToPrint.ReadLine();
                if (line == null)
                {
                    break;
                }
                yPos = topMargin + count * printFont.GetHeight(e.Graphics);
                e.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, new StringFormat());
                count++;
            }
            if (line != null)
            {
                e.HasMorePages = true;
            }
        }
    }
}


/////////////////////以上 程式碼/////////////////////

執行畫面 : 
























參考資料 : https://dotblogs.com.tw/chou/archive/2009/02/25/7284.aspx
                    http://ms-net.blogspot.tw/2008/04/notifyicon-contextmenustrip.html





2017年8月2日 星期三

C# x dateTimePicker x datagridview x 儲存格結合


C# x dateTimePicker x datagridview x 儲存格結合

比原出處多了點東西 : 標題列不可以點、不會改掉其他儲存格

Form裡面要有 :

DataGridView * 1

/////////////////////以下 程式碼/////////////////////
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication33
{
    public partial class Form1 : Form
    {
        DateTimePicker oDateTimePicker = new DateTimePicker();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<MyData> oMyDataList = new List<MyData>();

            MyData obj1 = new MyData(1, DateTime.Now, "John");
            MyData obj2 = new MyData(2, DateTime.Now, "Sam");
            MyData obj3 = new MyData(3, DateTime.Now, "Ray");

            oMyDataList.Add(obj1);
            oMyDataList.Add(obj2);
            oMyDataList.Add(obj3);

            dataGridView1.DataSource = oMyDataList;
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1 && e.RowIndex>=0)
            {
                dataGridView1.Controls.Add(oDateTimePicker);
                oDateTimePicker.Format = DateTimePickerFormat.Short;
                Rectangle oRectangle = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                oDateTimePicker.Size = new Size(oRectangle.Width, oRectangle.Height);
                oDateTimePicker.Location = new Point(oRectangle.X, oRectangle.Y);
                oDateTimePicker.CloseUp += new EventHandler(oDateTimePicker_CloseUp);
                oDateTimePicker.TextChanged += new EventHandler(dateTimePicker_OnTextChange);
                oDateTimePicker.Visible = true;
            }
            else
            {
                oDateTimePicker.Visible = false;
            }
        }
        public void dateTimePicker_OnTextChange(object sender, EventArgs e)
        {
            dataGridView1.CurrentCell.Value = oDateTimePicker.Text.ToString();
        }
        public void oDateTimePicker_CloseUp(object sender, EventArgs e)
        {
            oDateTimePicker.Visible = false;
        }
    }
    class MyData
    {
        public int ID { get; set; }
        public DateTime Date { get; set; }
        public string Name { get; set; }
        public MyData(int id, DateTime dt, string name)
        {
            ID = id;
            Date = dt;
            Name = name;
        }
    }
}

/////////////////////以上 程式碼/////////////////////



執行畫面





























參考資料 : http://www.c-sharpcorner.com/UploadFile/0f68f2/embedding-calendar-datetimepicker-control-into-datagridvie586/

2017年7月27日 星期四

C# x 日期變化


//改變日期format

string startStr = start.ToString("yyyy-MM-dd HH:mm:ss");

DateTime dt = Convert.ToDateTime(startStr);//轉回DateTime

P.S format 大小寫意義不同: MM=month, mm=Minutes, HH=24hours, hh=12hours

//日期時間相加減

DateTime start = Convert.ToDateTime("2011-04-25 15:50:39");

DateTime end = Convert.ToDateTime("2011-05-02 15:50:39");

TimeSpan ts = end.subtract(start); //兩時間天數相減

double dayCount = ts.Days; //相距天數

//目前時間

DateTime dt = DateTime.Now;

//本周周一

DateTime startWeek = dt.AddDays(1 - Convert.ToInt32(dt.DayOfWeek.ToString("d")));

//本周周日

DateTime endWeek = startWeek.AddDays(6);

//本月月初

DateTime startMonth = dt.AddDays(1 - dt.Day);

//本月月末

DateTime endMonth = startMonth.AddMonths(1).AddDays(-1);



參考資料 : http://bluemuta38.pixnet.net/blog/post/61533149-%E5%90%84%E7%A8%AE%E6%97%A5%E6%9C%9F%E6%99%82%E9%96%93%E8%A8%88%E7%AE%97

2017年7月20日 星期四

TSQL x 建立資料表的建議


重點 :
  1. ID為GUID是T1資料表的Primary Key,指定為非叢集索引
  2. a1,a2不會重複的欄位設定為叢集索引


CREATE TABLE [dbo].[T1]
(
[ID_Key] uniqueidentifier DEFAULT NEWSEQUENTIALID() NOT NULL,
[a1] [nvarchar](10)   NOT NULL,
[a2] [nvarchar](10)   NOT NULL,
[a3] [nvarchar](10)   NULL,
[a4] [datetime]          NULL,
[a5] [datetime]          NULL,
[a6] [decimal](12, 4) NULL,
[a7] [nvarchar](10)   NULL,
[a8] [nvarchar](10)   NULL,
[a9] [decimal](12, 4) NULL,
CONSTRAINT [PK_T1] PRIMARY KEY NONCLUSTERED
(
     ID_Key ASC
))
CREATE CLUSTERED INDEX CL01 ON T1(a1,a2 asc)



參考資料 :
http://blog.darkthread.net/post-2016-01-29-guid-as-pk-on-db.aspx



2016年9月8日 星期四

TSQL x 具參數的『多重陳述資料表值』函數 x FUNCTION


繼上次『具參數內嵌資料表值』函數  FUNCTION 後,今天剛好用到『多重陳述資料表值函數』就順便紀錄、複習一下其他種SQL-SERVER的函數

1.純量值函數
2.內嵌資料表值函數
3.多重陳述資料表值函數



1. 純量值函數 SCALAR FUNCTION

CREATE FUNCTION 年資 (@開始工作時間,@現在or結束工作時間)
RETURNS MONEY
AS
BEGIN

     DECLARE @結果 AS MONEY

     SET @結果 = YEAR(@開始工作時間) - YEAR(@現在or結束工作時間)

     RETURN @結果

END
;

2.內嵌資料表值函數  INLINE TABLE-VALUED FUNCTION

CREATE FUNCTION 員工資料 (@INPUT_部門)
RETURNS TABLE
AS
RETURN
(
     SELECT 部門,員編,姓名,性別,職務
          FROM 員工基本檔
               WHERE 部門 = @INPUT部門
)
;

3.多重陳述資料表值函數 MULTISTATEMENT TABLE-VALUED FUNCTION

CREATE FUNCTION 誰是代理人 (@INPUT_部門,@INPUT_員工姓名)
RETURNS @回傳的TABLE TABLE
(
    姓名 varchar(10),
    電話 varchar(10)
)
AS
BEGIN
     DECLARE  @暫存欄位  varchar(10);

     SELECT @暫存欄位 = 代理人
          FROM 員工基本檔
               WHERE 部門=@INPUT_部門
                AND 員工姓名 = @INPUT_員工姓名

     INSERT @回傳的TABLE
         SELECT  姓名,電話
              FROM 員工基本檔
                   WHERE 員工姓名=@暫存欄位
RETURN
END
;











2016年8月31日 星期三

TSQL x 具參數的『內嵌資料表值』函數 x Function

因為公司ERP系統是跟外面買的(非自行開發),現在如果要報表產生程式中沒有廠商設定好到的欄位,該怎麼辦

我第一個想到的就是直接再報表裡面寫CommandText丟SQL進去撈資料,但報表的程式碼看起來非常大一串

後來前輩叫我用SQL-SERVER的Function,想說T-SQL不熟就來練練吧

具參數的"內嵌資料表值"函數 (INLINE TABLE-VALUED FUNCTION)



CREATE FUNCTION INVTEST (@A varchar(20),
                                                        @B varchar(20),
                                                        @C varchar(20))
RETURNS TABLE
AS
RETURN
SELECT X.column1 ,  
                Y.column1 ,  
                CAST(ISNULL(X.column2,0) AS numeric(10,2)) ,        
                CAST(ISNULL(Y.column2,0) AS numeric(10,2))      
FROM TABLE_NAME_1 X            
LEFT JOIN TABLE_NAME_3 Y      
ON ...          
AND ...
WHERE X.column5=@A        
      AND X.column6=@B
      AND X.column7=@C
UNION ALL                      
SELECT X.column ,  
                Y.column ,  
                CAST(ISNULL(X.column,0) AS numeric(10,2)) ,                
                CAST(ISNULL(Y.column,0) AS numeric(10,2))              
FROM TABLE_NAME_2 X            
LEFT JOIN TABLE_NAME_3 Y      
ON ...          
AND ...
AND ...
WHERE X.column5=@A        
      AND X.column6=@B
      AND X.column7=@C  

--CAST(ISNULL(X.column2,0) AS numeric(10,2)) ,
-- 處理如果X.column2是空值,就帶0,再將處理完的值轉成數值 : 整數位8碼,小數位2碼    
--UNION ALL上面跟下面的主要TABLE不一樣
--@A , @B , @C 要丟進去查詢的值
;

執行
SELECT * FROM dbo.INVTEST(A,B,C)


2016年8月25日 星期四

TSQL x 日期時間的顯示方法 x Time

以前使用Oracle,如果要篩選時間資料的話,只要下to_char('欄位名稱','yyyymmdd')
或是 to_date('欄位名稱','yyyymmdd') 就可以了

'yyyymmdd' 可以換成 'yyyy-mm-dd' 、'yyyy/mm/dd' 產生出不同的樣式出來
在T-SQL中,這種語法變成,CONVERT(CHAR(8),欄位名稱,112) 
CONVERT語法最後一個涵式是 "日期格式" (上述的 112)

112 : yyyymmdd   舉例 : 20160101
111 : yyyy/mm/dd  舉例 : 2016/01/01
102 : yyyy.mm.dd  舉例 : 2016.01.01
120 : yyyy-mm-dd  舉例 : 2016-01-01
如果要有符號   /.-  的話長度就要設定char(10)

若只有char會顯示時分秒 >> CONVERT(CHAR,欄位名稱,112)

所以 Oracle : to_date('日期欄位','yyyymmdd')  =  MSSQL : CONVERT(char(8),日期欄位,112)

其他格式或相關資料可以參考 MSDN 的 CAST 和 CONVERT (Transact-SQL)