敬业的IT人 >> 编程开发 >> 软件工程 >> NOTES中动态表格的实现

NOTES中动态表格的实现

敬业的IT人 互联网 佚名 2008-1-4 14:37:20

LOTUS NOTES 为用户提供了强大的文档式数据库,在开发中利用NOTES 提供的各种对象,“表单”;“视图”能很好的组织,查找数据。但是开发中需要生成数据的动态表格,如VB中的DBGRID。笔者在开发中用SQL SERVER为后端数据库,或者动态的搜索NOTES数据库中的值生成动态表格。

下面的例子为出勤统计,员工请假后将在SQL SERVER数据库中登记,每月进行统计。
方法如下:

一.建立与数据源的连接的准备

    我的后端数据库为SQL SERVER,首先在ODBC中添加“系统DSN”按步骤把要添加的数据源添加到“系统DSN”中,如图中的“gwgl”,设置好以后准备在NOTES中进行连接。

二.NOTES 中与ODBC的连接

    在NOTES 中共提供了三个对象用于操作数据库,

1.ODBCConnection用于连接到ODBC 数据源

2.ODBCQuery用于定义一个SQL 语句

3.ODBCREsultSet在结果集合上执行操作

    用ODBCConnection对象的connectTo成员函数进行连接。详细语句请看例子。

三.NOTES 中对SQL数据库的操作

    在NOTES对数据库进行操作主要使用ODBCQUERY和ODBCRESULTSET。其中使用ODBCQUERY 的sql 属性 能灵活的对数据库进行有效的管理。

    此例的要求是这样的,在对公司的请销假的管理中,客户要求每月生成“考勤表”,而用户在请假和销假时都只是标出假期的开始和结束时间,生成一个全月每一天的记录难以实现。后端用sql 数据库,每当用户请假时插入一条记录,如已有此人的记录则更新记录。

    在每月的月末再把其他未请假的职工生成默认的记录。

    在访问ODBC类前必须在(Golbal)对象中输入以下语句:

uselsx “*lsxodbc”

    在NOTES中创建请销假表单,并创建一个“操作”,名为“登记”,当用户完成请假流程后此操作将出现。以下编码首先读取请假人的姓名和请假的时间,判断是否由此记录,如有则更新记录,如没有则插入记录。其编码为:

Sub Click(Source As Button)Dim workspace As New NotesUIWorkspaceDim uidoc As NotesUIdocument.Set uidoc = workspace.Currentdocument.Dim con As New ODBCConnectionDim qry As New ODBCQueryDim result As New ODBCResultSetDim firstName As StringDim lastName As StringDim msg As String '声明数据库对象Set qry.Connection = conSet result.Query = qrycon.silentmode=TrueDim ts As IntegerIf con.ConnectTo("gwgl","sa","") Thenyf=uidoc.fieldgettext("dn")…..nf=uidoc.fieldgettext("nf")'取得NOTES 表单中域的值Dim odate As Variantsta1=Cint(Right(uidoc.fieldgettext("xj_sta1"),2))end1=Cint(Right(uidoc.fieldgettext("xj_end1"),2)'取得假期的开始和结束时间schstr="select qxj_xm from qxj where qxj_xm='" & xm &"' and year='" & nf & "'and month='" & yf & "'" qry.sql=schstrresult.executeIf result.IsResultSetAvailable Then‘判断是否存在该数据Dim n As IntegerConst qz="qxj_"For i=sta1 To end1ym=qz & ischstr="update qxj set " & ym &"='"& lx & "' where qxj_xm=" & "'" & xm & "'"n=n+1Messagebox schstrqry.sql=schstrresult.executeNextschstr="update qxj set " & lx &"='" & n& "' where qxj_xm=" & "'" & xm & "'"qry.sql=schstrresult.executep=ts-nschstr="update qxj set qxj_sc='" & p& "' where qxj_xm=" & "'" & xm & "'"qry.sql=schstrresult.executeElse '存在该数据进行插入操作Dim intstr As Stringintstr="insert qxj (qxj_xm,year,month,qxj_sc)values('" & xm & "','" & nf & "','" & yf & "','" & ts & "')"qry.sql=intstrresult.executeConst qz1="qxj_"For i=sta1 To end1ym=qz1 & ischstr="update qxj set " & ym &"='" & lx& "' where qxj_xm=" & "'" & xm & "'and year='" & nf& "' and month='" & yf & "'"n=n+1qry.sql=schstrresult.executeschstr="update qxj set " & lx &"='" & n& "' where qxj_xm=" & "'" & xm & "'and year='" & nf& "' and month='" & yf & "'"qry.sql=schstrresult.executep=ts-nschstr="update qxj set qxj_sc='" & p & "' where qxj_xm=" & "'" & xm & "'and year='" & nf & "'and month='" & yf & "'" qry.sql=schstrresult.executeNextEnd IfEnd IfEnd Sub
进入讨论组讨论。
    以上程序完成了数据的写入工作,下面利用SQL语句读出数据,并且把数据输入表格中,使数据合理的换行,按表格的形式输出。
首先按要求绘制表格,如下图的出勤统计表,在需要进行统计的指定表格中加入域,在读取数据时应用ODBCResultSet 的Getvalue方法取得数据库中相应字段的值,并在每次取到数据后在数据后加上chr(10)使数据自动换行,在利用NOTES的NotesUIdocument.nbsp对象的fieldsettext方法为相应的域付值。请注意调整表单中表的宽度,使数据有足够的空间。如下图(略)所示员工的姓名应足够容纳三个字方可。

    在统计表单中,加入“统计”操作,并下列代码输入(代码中有重复的地方已省略)
Sub Click(Source As Button)Dim workspace As New NotesUIWorkspaceDim uidoc As NotesUIdocument.Set uidoc = workspace.Currentdocument.Dim con As New ODBCConnectionDim qry As New ODBCQueryDim result As New ODBCResultSetDim firstName As StringDim lastName As StringDim msg As StringSet qry.Connection = conSet result.Query = qrycon.silentmode=Truenf=uidoc.fieldgettext("nf")yf=uidoc.fieldgettext("yf")If con.ConnectTo("gwgl","sa","")Then '连接到数据库qry.SQL = "SELECT * FROM qxj where year='"& nf & "'and month='" & yf & "'"'按下图表中用户输入的年份和月份取得的数据result.ExecuteIf result.IsResultSetAvailable ThenDoresult.NextRowqxj_xm = result.Getvalue("qxj_xm")st=st & Chr(10) & qxj_xmCall uidoc.fieldsettext("xm_1",st)tq = result.Getvalue("探亲")t= t & Chr(10) & tqCall uidoc.fieldsettext("tq",t)b = result.Getvalue("病")bing= bing & Chr(10) & bCall uidoc.fieldsettext("bing",bing)……………..Loop Until result.IsEndOfDataCall uidoc.saveresult.Close(DB_CLOSE)ElseMessagebox “对不起,不能连接到数据库!!"Exit SubEnd Ifcon.DisconnectElseMessagebox "不能连接到数据源!!"'网络不通或其他原因不能'连接到数据库给出提示Exit SubEnd IfEnd Sub
baidu: 进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com