2008年5月11日 星期日

工作管理系統(一)

最近將之前的news管理系統與其它幾個上班時會用到的小程式整合起來,統稱為<工作管理系統>,打算再多想幾個可能會有幫助的東西,順便多熟悉一下.NET。

目前的工作管理系統裡面有幾個功能部份:
1.打卡系統
2.news管理系統
3.成員設定
4.列印出勤月報表

一、打卡系統
打卡系統比較多是在於判斷不同工作階段時的邏輯分析,將上班前、上班中、下班後,與不同成員、不同日期,是否當日已打過卡等情況作各種判斷,同時會記錄一些打卡時的資訊與判斷,不過目前這版還不適用於三班制的工作,而只限於一般朝九晚五用,接下來打算改良成三班制適用的,一些紀錄如下。

在打卡介面上顯示一個跑馬時間,讓使用者可見到當下的最新時間


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles obj_time.Tick
  obj_時間.Text = Date.Now.ToString
End Sub '時間跑馬燈


幾個時間取得與轉換,像是"0970505"與"12:13:57",另外日期的yyy應該取一個right(3),只是.net的right與left不存在了,以至於用Substring來截取,所以yyy就懶得用了。

d_str_datetoday = "0" + CStr(Date.Today.Year - 1911) + ("0" + Date.Today.Month.ToString).Substring(("0" + Date.Today.Month.ToString).Length - 2, 2) + ("0" + Date.Today.Day.ToString).Substring(("0" + Date.Today.Day.ToString).Length - 2, 2)
d_str_hhmmss = Date.Now.ToString.Substring(12, 8)

另外剛才又想到一種截取方試
特地來補充一下主要是運用string.remove(0,Length-),程式會短一點,就順便把yyy也作

("0" + CStr(Date.Today.Year - 1911)).Remove(0, CStr(Date.Today.Year - 1911).Length - 2) + ("0" + Date.Today.Month.ToString).Remove(0, Date.Today.Month.ToString.Length - 1) + ("0" + Date.Today.Day.ToString).Remove(0, Date.Today.Day.ToString.Length - 1)




取得本機的IP,不過只限於區網的IP,連外IP還沒研究

Dim ip As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
Dim i() As System.Net.IPAddress

  i = ip.AddressList
  obj_textbox.text= i(0).ToString   '這才是ip



二、管理系統
除了原本的新增、開啟、刪除外,新加了列印出來的功能,整段主要是先設計好WORD的表格,然後將搜尋出來的資料自動填入WORD裡,並作開啟WORD與列印的動作,目前在填表格上是用欄與列去填值,有另一種方式是不用表格與欄列去填,而是使用WORD的書籤功能,在WORD裡先設好書籤的位置,然後將值填入該位置處,目前還沒試過,以下為處理該段的主要程式碼:

  Private Sub sub_printOut(ByVal a As Integer)

    Dim wod_myword As New Microsoft.Office.Interop.Word.Application
    Dim wod_wdoc As Microsoft.Office.Interop.Word.Document
    Dim tab_t1 As Microsoft.Office.Interop.Word.Table

    wod_wdoc = wod_myword.Documents.Open("C:\NEWS管理.doc", , True)

    contSqlconn(1)
    cmd.CommandText = "select * from hn_news where (流水號='" + 流水號.Text + "')"
    dr = cmd.ExecuteReader
    dr.Read()
    If p_intControl = 1 And dr("回覆").ToString.Length = 0 Then

      tab_t1 = wod_wdoc.Tables.Item(1)
      tab_t1.Cell(1, 1).Range.Text = dr("狀態旗標").ToString
      tab_t1.Cell(1, 2).Range.Text = dr("流水號").ToString
      tab_t1.Cell(1, 4).Range.Text = dr("標題").ToString
      tab_t1.Cell(2, 2).Range.Text = dr("內容").ToString
      'tab_t1.Cell(4, 2).Range.Text = dr("回覆").ToString
      tab_t1.Cell(1, 5).Range.Text = dr("初始日期").ToString.Substring(1, 2) + "年" + dr("初始日期").ToString.Substring(3, 2) + "月" + dr("初始日期").ToString.Substring(5, 2) + "日"

    ElseIf p_intControl = 1 Then
      tab_t1 = wod_wdoc.Tables.Item(1)
      tab_t1.Cell(1, 1).Range.Text = dr("狀態旗標").ToString
      tab_t1.Cell(1, 2).Range.Text = dr("流水號").ToString
      tab_t1.Cell(1, 4).Range.Text = dr("標題").ToString
      tab_t1.Cell(2, 2).Range.Text = dr("內容").ToString
      tab_t1.Cell(4, 2).Range.Text = dr("回覆").ToString
      tab_t1.Cell(1, 5).Range.Text = dr("初始日期").ToString.Substring(1, 2) + "年" + dr("初始日期").ToString.Substring(3, 2) + "月" + dr("初始日期").ToString.Substring(5, 2) + "日"

    End If
    dr.Close()
    contSqlconn(-1)

    If a = 0 Then
      wod_myword.Visible = True '預覽列印
    ElseIf a = 1 Then
      wod_myword.PrintOut(Copies:=1) '直接列印
    End If
    
wod_wdoc=Nothing
    wod_myword=Nothing

    'wod_myword.Quit(SaveChanges:=False) '關閉開啟的WORD

  End Sub '列印sub


以下的NEWS管理的查詢與開啟,沒什麼可看的,純粹個人作個紀錄!!

  Private Sub 查詢_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 查詢.Click
    p_intControl = 0
    Call contSqlconn(1)
    Try
      cmd.CommandText = "select 流水號,標題,初始日期,狀態旗標 from hn_news where 初始日期 between '" + sdt + "' and '" + edt + "'"
      ds.Clear()
      da.SelectCommand = cmd
      da.Fill(ds, "tabl1")
      dgview_1.DataSource = ds
      dgview_1.DataMember = "tabl1"
      dgview_1.Columns("標題").Width = 350


    Catch ex As Exception
      MessageBox.Show(ex.ToString)
    Finally
      contSqlconn(-1)
    End Try

  End Sub '查詢_Click

  Private Sub 開啟_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開啟.Click

    p_intControl = 1
    Try
      Call contSqlconn(1)
      cmd.CommandText = "select 初始日期,標題,內容,回覆,狀態旗標 from hn_news where 流水號='" + dgview_cont + "'"
      dr = cmd.ExecuteReader
      dr.Read()
      p_strDtime = dr("初始日期").ToString
      tital = dr("標題").ToString
      main = dr("內容").ToString
      stat = dr("狀態旗標").ToString()
      resp = dr("回覆").ToString

    Catch ex As Exception
      MessageBox.Show(ex.ToString)
    Finally
      Call contSqlconn(-1)
      ' News內容.Tag() = Me
      News內容.Show()
      Me.Hide()
    End Try
  End Sub '開啟_Click


另外Select資料庫後得到的值比較特別有null與根本沒有值,兩者乍聽之下以為相同,其實判斷上是不同
null值判斷
a Is DBNull.Value

沒有select到值的判斷
a Is Nothing



三、成員設定的地方,也是多在判斷各種情況,像是使用者目前是要新增成員、修改成員資料、還是刪除成員,而同時要判定成員是否已經存在,以及一些介面上的防呆設計,程式上沒什麼要紀錄的!


四、列印出勤月表未完成

以上為最近的新紀錄,正在新增excel的列印與讀取外部ini檔的資料練習,同時,在news管理裡的查詢增加條件設定,最後紀錄一下連接資料庫的public Module

Module sqlContral
  Public cnn As New System.Data.SqlClient.SqlConnection
  Public cmd As New System.Data.SqlClient.SqlCommand
  Public da As New System.Data.SqlClient.SqlDataAdapter
  Public dt As New DataTable
  Public ds As New DataSet
  Public dr As System.Data.SqlClient.SqlDataReader


  Public Sub contSqlconn(ByVal i As Integer)
    If i = 1 Then      
      cnn.ConnectionString = "Data Source=\\5.10.20.133;Initial Catalog=hnsql;User Id=xxxxxx;Password=xxxxx"
      cnn.Open()
      cmd.Connection = cnn
    ElseIf i = -1 Then
      cmd.Dispose()
      cnn.Close()
    Else
      cmd.Dispose()
      cnn.Close()
    End If
  End Sub
End Module


程式碼欄位


沒有留言: