如何利用RPGLE擷取系統時間和各時區時間?



1. 如何將系統時間轉換成數值型態日期和時間?
    為了顯示(介面)、計算或儲存(到Table),常常需要將系統時間轉換為數值型態的變數,可以參考以下的RPG程式:
Convert system time to decimal variables.
* Return the variable values of RTNDATE & RTNTIME.
* ----------------------------------------------------------------
C                   TIME                    SYSTIME          14 0
C*                  the SYSTIME will be HHmmssMMddyyyy.               
C                   MOVE      SYSTIME       TMPDATE           8  
C                   MOVEL     *BLANKS       SAVDATE           8  
C                   EVAL      SAVDTE = %SUBST(TMPDATE:5:4)+       
C                                      %SUBST(TMPDATE:1:4)        
C                   MOVE      SAVDATE       RTNDATE           8 0
C                   TIME                    RTNTIME           6 0
2. 如何擷取自己時區的時間和日期?
    可以根據系統時間來計算時區。比較好的方式是將系統時間先轉換成GMT時間(格林威治時間)再轉換成你要的國家(或時區)的時間,以方便各時區的人使用此程式,範例程式如下:
* To retrieve date & time (decimal) of specific Nation/Time zone.
* Input Parameter: INPGAPD (the gap days between GMT and Nation/Time).
* Output Parameter: RTNDATE, RTNTIME (decimal, date & time).
* -----------------------------------------------------------------
D SYSTIME         S               Z 
D GMTTIME         S               Z 
D NATTIME         S               Z 
D                 DS                  
D TMPYER                  1      4  0 
D TMPMTH                  6      7  0 
D TMPDAY                  9     10  0 
D TMPHOU                 12     13  0 
D TMPMIN                 15     16  0 
D TMPSEC                 18     19  0 
D TMPTIME                 1     26  
* ----------------------------------------------------------------
C*    DIFGAPD : the gap days between System and GMT      
C*    INPGAPD : the gap days between GMT and Nation/Time 
C                                                                    
C                   TIME                    SYSTIME                    
C*    SYSTIME format like '2018-01-29-10.39.34.144000'
C
C     SYSTIME       SUBDUR    DIFGAPD:*H    GMTTIME                    
C     GMTTIME       ADDDUR    INPGAPD:*H    NATTIME                    
C*                                                                     
C                   MOVEL     NATTIME       TMPTIME                    
C                   EVAL      RTNDATE=TMPYER*10000+TMPMTH*100+TMPDAY   
C                   EVAL      RTNTIME=TMPHOU*10000+TMPMIN*100+TMPSEC   
* ----------------------------------------------------------------

Read More »

日期時間和字串如何轉換? 如果沒有時間,DateTimePicker如何顯示空白?

日期時間和字串如何轉換? 如果沒有時間,DateTimePicker如何顯示空白?

- 將DateTimePicker的值(日期時間)轉為字串 :
  string myDate = myDateTimePicker.Value.ToString("yyyyMMdd");
  string myDateTime = myDateTimePicker.Value.ToString("yyyyMMddHHmmss");

- 將系統時間轉字串
  string myDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

- 將字串轉為DateTimePicker的值(日期時間):
  myDateTimePicker.Value = DateTime.Parse(myDateTimeString);

- DateTimePicker如何顯示特定的日期格式:
  myDateTimePicker.CustomFormat = "yyyy-MM-dd HH:mm:ss";
  myDateTimePicker.Value = DateTime.Parse(myDateTimeString);

 - 如果沒有時間,DateTimePicker如何顯示空白?
  myDateTimePicker.CustomFormat = " ";
  myDateTimePicker.Format = DateTimePickerFormat.Custom;

- 一個範例程式:

//the myDateTimeString is a string.
//the myDateTimePicker is a DateTimePicker control

if (myDateTimeString.Length == 14)
{
    //if myDateTimeString is not blank; ex, myDateTimeString = "20190125153050"
    myDateTimeString = myDateTimeString.Substring(0, 4) + "-" + myDateTimeString.Substring(4, 2) + "-" + myDateTimeString.Substring(6, 2) 
   + " " + 
   myDateTimeString.Substring(8, 2) + ":" + myDateTimeString.Substring(10, 2) + ":" + myDateTimeString.Substring(12, 2);
    myDateTimePicker.CustomFormat = "yyyy-MM-dd HH:mm:ss";
    myDateTimePicker.Value = DateTime.Parse(myDateTimeString);
}
else
{
    //if myDateTimeString is empty, make the column show blank.
    myDateTimePicker.CustomFormat = " ";
    myDateTimePicker.Format = DateTimePickerFormat.Custom;
}

Read More »

為什麼要(如何去)修改DataSet/DataTable的資料列狀態(RowState)?

- Dataset裡面的每一筆紀錄就是DataRow,每筆 DataRow 物件都有其 RowState 屬性(RowState有五種屬性,分別是Unchanged、Added、Modified、Deleted、Detached)。

- 當我們用DbDataAdapter.Update這個方法來更新Dataset的的紀錄時,它會根據Rowstate的值來做INSERT、UPDATE 或 DELETE。

但是在程式執行過程中,如果這個Dataset和(1)Datagridview或Textbox等控件做Binding時或(2)新增一個欄位時,它的RowState也會被改變。

所以為了DbDataAdapter.Update能正確更新使用者修改的紀錄,執行綁訂或新增欄位後需要將Dataset所有的紀錄的RowState恢復為UnChanged,以下程式可以達成此需求:

A. 針對單一Table :
internal static bool changeRowStateToUnchanged4Table(DataTable myTable)
{
    bool verify = false;            
    try
    {
        foreach (DataRow dr in myTable.Rows)
        {
            if (dr.RowState != DataRowState.Unchanged)
                dr.AcceptChanges();
        }               
        verify = true;
    }
    catch (Exception)
    {
        verify = false;
    }
    return verify;
}
B 針對所有的Table:
internal static bool changeRowStateToUnchanged4Dataset(DataSet myDataset)
{
    bool verify = false;
    try
    {
        foreach (DataTable table in myDataset.Tables)
        {
            foreach (DataRow dr in table.Rows)
            {
                if (dr.RowState != DataRowState.Unchanged)
                    dr.AcceptChanges();
            }
        }
        verify = true;
    }
    catch (Exception)
    {
        verify = false;
    }
    return verify;
}

- 參考資料 : 資料列狀態和資料列版本

Read More »

DataGridView 的事件CellDoubleClick和 CellContentDoubleClick的差別在哪裡?

CellDoubleClick : 使用者按兩下儲存格中的任何位置時發生。
CellContentDoubleClick : 發生於使用者按兩下儲存格的內容時。

差別在於如果儲存格沒有值 (Null或Empty) 時,CellContentDoubleClick這事件是不會被觸發的;相反的,不管儲存格有沒有值,CellDoubleClick事件都會被觸發。

//the Event of CellDoubleClick
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{ 
 //do something…
}
//the Event of CellContentDoubleClick
private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{ 
 //do something…
}
- 參考資料 :
1. Data​Grid​View.​Cell​Double​Click  Event
2. Data​Grid​View.​Cell​Content​Double​Click  Event


Read More »

Datagridview如何新增一個序號欄位(透過Dataset)?

1. 填入(通常從資料庫)Dataset的值後,先新增mySeq欄到此Dataset :
if (!myDataset.Tables["myTable"].Columns.Contains("mySeq"))
    myDataset.Tables["myTable"].Columns.Add("mySeq", typeof(int));

2. Datagridview指定DataSource DataMember :
dataGridView1.DataSource = myDataset;
dataGridView1.DataMember = "myTable";

3. DatagridviewRowPostPaint Event 新增以下 :
private voiddataGridView1_RowPostPaint(object sender,DataGridViewRowPostPaintEventArgs e)
{
    if((dataGridView1.Rows[e.RowIndex].Cells["mySeq"].Value).ToString() == "")
        dataGridView1.Rows[e.RowIndex].Cells["mySeq"].Value = e.RowIndex + 1;
    else
        return;
}

Read More »

如何限制Textbox只能輸入數字?

如何限制Textbox只能輸入數字? 
在KeyPress Event加入以下程式即可。
//限制Textbox只能輸入數字  
private void integerTextBox_KeyPress( object sender, KeyPressEventArgs e)
{
    Char keyChar = e.KeyChar;
    if ((keyChar < 48 || keyChar > 57) && keyChar != 8)
            e.Handled = true;
}

Read More »
>