LotusFans Forum | Lotus 爱好者论坛  

返回   LotusFans Forum | Lotus 爱好者论坛 > Lotus技术讨论区 > Lotus Designer 设计与开发


Lotus Designer 设计与开发 交流开发心得,共创莲花前景。

回复
 
主题工具 显示模式
旧 2006-09-29, 10:58 AM   #1
madeinchina
贡献会员
 
注册日期: 2005-06-15
帖子: 46
声望力: 0
madeinchina 是一个将要出名的人madeinchina 是一个将要出名的人
ODBC实现Domino和关系数据库的互操作

一、Lotus Domino与关系数据库的互操作
在Lotus Domino R5中提供了三个Lotus Notes扩展类:ODBCConnection(ODBC连接)、ODBCQuery(ODBC查询)以及ODBCResultSet(ODBC结果集)。应用这三个类并辅以Lotus Script语言就能实现与关系数据库的互操作问题。
具体解决方法如下:
第1步:在控制面板→32位ODBC数据源中建立用户数据源Test;
第2步:在Domino R5中新建一个数据库Try,并建立一个空白表单Con-nection,此表单没有任何内容,然后在表单上创建一个“操作”,起名为“Read”;
第3步:在“Read”操作的编程窗口中选择编程语言为Lotus Script;
第4步:在编程窗口的对象窗口中点击“Option”事件,并写入如下脚本:
Uselsx "�砽sxodbc" // 使用Lotus Script 扩展ODBC类
第5步:选中“Declare”事件,在其中写入:
Dim session As NotesSession
Dim db As NotesDataBase
Dim doc As NotesDocument
Dim qry As ODBCQuery
Dim result As ODBCResultSet
Dim con As ODBCConnection
第6步:选中“Click”事件,在其中写入:
Sub Click(Source As Button)
′ Set New Value
Set session=New NotesSession
Set con=New ODBCConnection
Set qry=New ODBCQuery
Set result=New ODBCResultSet
′ Get Current Database
Set db=session.CurrentDataBase
Set doc=New NotesDocument(db)
doc.form="connection"
Call con.Disconnect()
If con.ConnectTo("test") Then
Set qry.connection=con
qry.SQL="SELECT �� FROM Table1"
Set result.Query=qry
Call result.Execute()
columns=result.Columns
Do
Call result.NextRow()
For i=1 To result.Numcolumns
field=result.FieldName(i)
value=result.GetValue(field)
If Isdate(value) Then
If value=Datevalue("0:00:00") Then
value=" "
Else
value=Format(value,"mm-dd-yyyy")
End If
End If
Set item=doc.AppendItemValue(field,val-ue)
Next
Call doc.save(True,True)
Set db=session.CurrentDataBase
Set doc=New NotesDocument(db)
doc.form="test"
Loop Until result.IsEndOfData
Call con.Disconnect()
Else
Messagebox("Could not connect to server")
End If
End Sub
最后,保存表单并运行,用鼠标点击Read操作后,关系数据库中的内容就被取到Notes的文档型数据库中了。
二、程序存在的问题及解决
但是使用上面的代码在进行实际数据库内容转换的时候,我们发现Notes 通过ODBC数据源连接关系数据库时,无法识别中文字段名。如果关系数据库的字段是中文名字,那么ODBCResultSet将为空,解决的办法是将关系数据库中的所有字段都改为英文名字。
在实际数据库的转换过程中同时发现的问题还有:该程序执行完一次后不能把关系型数据库中的内容全部取出来。通过调试Lotus Script脚本并多次单步跟踪脚本的执行情况,发现每次都是执行到同一条数据库记录时,ODBCRe-sultSet就认为数据集已经到头了,下面的记录就都丢了。于是使用关系数据库软件打开数据库,并将其中的字段减少若干条后,就可以一次读取出全部记录。至于需要减少多少个字段才能一次读取出全部记录跟原先的关系型数据库的结构有关,需要具体情况具体实验。
三、Lotus Domino中的日期处理
上面程序中有如下一段程序:
If Isdate(value) Then
If value=Datevalue("0:00:00") Then
value=" "
Else
value=Format(value,"mm-dd-yyyy")
End If
Set item=doc.AppendItemValue(field,value)
End if
这一段代码的作用是:判断从关系库中读取出来的字段是否为日期型字段,如果是,那么判断此日期型字段的值,看它是否为空,如果为空则在写入Notes库的时候做处理,保证写入的是空日期类型,如果此字段的值不为空则直接写入Notes库;如果此字段不是日期型字段,则不做任何处理。
若是不做上述处理,那么通过ODBCResultSet类取出的日期型字段的值如果为空,则写入Notes库的时候不知什么原因会写入“1899年12月30日”这个日期。
在代码中,使用到了一个DateValue(string)函数,此函数的功能是将字符串参数转换成日期数据类型,如果字符串所表示的内容找不到合法的日期数据与之对应,那么此函数将保留字符串的值不变,而仅仅把其数据类型转换成日期型,即实现了强制类型转换函数的功能。而代码中的“0:00:00”字符串是个特殊字符串,在通过ODBC数据源读取关系数据库的记录时,如果关系库中的日期型字段值为空,那么取出的值就是“0:00:00”形式的日期。使用DateValue(“0:00:00”)语句就可以判断取出的日期型变量的值是否为空,如果为空则将变量Value的值赋成空字符串,然后再写入Notes库中,就可避免出现“1899年12月30日”这个日子了。
四、NotesItem
NotesItem是可以代表所有表单元素的对象,简单地说就是所有可放置在表单上的元素,在Lotus Script程序中都可以用NotesItem对象表示并对其进行操作。上面代码中的doc.AppendItemValue(fieldname,value)函数的作用就是根据Value的值为表单追加域(也就是关系库中的字段)。
其实细心的读者一定已经发现了,在上面关于空日期的处理代码中,为什么要先把Value的值赋成空,然后再写入库中呢?为什么不可以直接往库里写值呢?问题的关键就在NotesItem上。
NotesItem有很多属性,其中最重要的两个是Name和Text属性。Name属性存放表单元素的名称(即fieldname),而Text属性存放表单元素的值(value)。在程序执行到doc. AppendItemValue(fieldname,value)函数的时候,Notes将域名(fieldname)和相对应的值(value)写到NotesItem对象中。执行Call doc.Save()函数之后,所有内存中的NotesItem对象被存入相关联的表单中。
在研究如何处理空日期的过程中,最初的想法是直接将空字符串写入NotesItem中,但是在查看帮助并单步跟踪脚本的执行后发现上述方法行不通。原因在于NotesItem的Text属性是只读的,根本无法为其赋值,同时也没有相应的赋值函数,显然函数doc.AppendItemValue(fieldname,value)是专门给Text属性赋值的函数。
五、Notes中视图与表单的关联
在开发过程中,由于一次错误,我们意外地发现了Notes中视图与表单的关联技巧。Notes为每个表单都设置了名称与别名两个属性,这两个名字都能标识表单。在开发过程中,我们所开发的库有两个表单,分别命名为Form1和Form2,其各自的别名由于疏忽都设成了Docu-ment,而每个表单都有一个视图与之对应。在设计Form2的视图时,虽然指定视图中的列都与Form2中的域相关联,但是在运行的时候从视图中双击某条文档欲对其进行编辑时,切换到的表单却是Form1的,多方查找均不能解决这个问题,于是抱着试试看的心理改变了表单的别名,分别为Document1和Docu-ment2,结果问题解决。但是又出现了Form1的视图无法切换到表单的情况,于是又将Form1的别名改回Document,两个视图均能正确切换到自己的表单上了。
由此发现,Notes在建立视图与表单的关联的时候,首先看表单是否具有别名,如果有,则用别名进行关联,一旦对表单的别名进行了改变就得重新设计视图,如果不想重新做视图就不能改变表单的别名。当然同时也可以应用这一技巧实现从视图中切换到不同表单的功能。如果表单没有别名,则使用名称进行关联。
madeinchina 当前离线   回复时引用此帖
旧 2006-09-29, 11:09 AM   #2
ybylg
高级会员
 
ybylg 的头像
 
注册日期: 2006-07-13
帖子: 139
声望力: 6
ybylg 是一个将要出名的人ybylg 是一个将要出名的人
很好的~~
ybylg 当前离线   回复时引用此帖
旧 2006-09-29, 11:10 AM   #3
madeinchina
贡献会员
 
注册日期: 2005-06-15
帖子: 46
声望力: 0
madeinchina 是一个将要出名的人madeinchina 是一个将要出名的人
需要的朋友顶一下,
madeinchina 当前离线   回复时引用此帖
旧 2006-09-29, 11:27 AM   #4
空空空
版主
 
空空空 的头像
 
注册日期: 2006-02-20
帖子: 1,419
声望力: 13
空空空 有着人尽皆知的贡献和荣耀空空空 有着人尽皆知的贡献和荣耀空空空 有着人尽皆知的贡献和荣耀空空空 有着人尽皆知的贡献和荣耀空空空 有着人尽皆知的贡献和荣耀空空空 有着人尽皆知的贡献和荣耀空空空 有着人尽皆知的贡献和荣耀
不错的好帖,ODBC网上的例子不是很多,加精华!!
空空空 当前离线   回复时引用此帖
旧 2006-10-10, 10:44 AM   #5
LuckAma
贡献会员
 
注册日期: 2006-09-28
帖子: 45
声望力: 0
LuckAma 是一个将要出名的人LuckAma 是一个将要出名的人
正合我意,謝謝分享!
LuckAma 当前离线   回复时引用此帖
旧 2006-11-13, 03:41 PM   #6
liubo2461457
贡献会员
 
注册日期: 2006-07-19
帖子: 143
声望力: 6
liubo2461457 是一个将要出名的人liubo2461457 是一个将要出名的人
ding







liubo2461457 当前离线   回复时引用此帖
旧 2006-11-14, 09:05 AM   #7
中原老猫
初级会员
 
注册日期: 2006-11-13
帖子: 21
声望力: 0
中原老猫 是普普通通的会员
很好!有帮助。顶你一个!
中原老猫 当前离线   回复时引用此帖
旧 2006-12-14, 08:35 AM   #8
mohan
贡献会员
 
注册日期: 2006-12-01
帖子: 78
声望力: 5
mohan 是一个将要出名的人mohan 是一个将要出名的人
我最近正好需要这方面的资料,谢谢楼主的共享。
mohan 当前离线   回复时引用此帖
旧 2007-04-09, 01:54 PM   #9
shanghongbin
初级会员
 
注册日期: 2007-04-05
帖子: 1
声望力: 0
shanghongbin 是普普通通的会员
32位ODBC数据源中建立用户数据源Test????
不明白,说具体点行吗?
shanghongbin 当前离线   回复时引用此帖
旧 2007-04-12, 04:18 PM   #10
freebird
贡献会员
 
注册日期: 2007-04-11
帖子: 16
声望力: 0
freebird 是一个将要出名的人freebird 是一个将要出名的人
不错,已经明白,谢谢!!!
freebird 当前离线   回复时引用此帖
旧 2007-04-12, 04:18 PM   #11
freebird
贡献会员
 
注册日期: 2007-04-11
帖子: 16
声望力: 0
freebird 是一个将要出名的人freebird 是一个将要出名的人
不错,已经明白,谢谢!!!
freebird 当前离线   回复时引用此帖
旧 2007-04-29, 09:32 AM   #12
qqhrlw
贡献会员
 
注册日期: 2007-04-06
帖子: 11
声望力: 0
qqhrlw 是一个将要出名的人qqhrlw 是一个将要出名的人
好帖子!
qqhrlw 当前离线   回复时引用此帖
旧 2007-04-30, 09:54 PM   #13
zhfengzh
贡献会员
 
注册日期: 2007-03-12
帖子: 13
声望力: 0
zhfengzh 是一个将要出名的人zhfengzh 是一个将要出名的人
好帖子,希望对我有所帮助,感谢搂主。
zhfengzh 当前离线   回复时引用此帖
旧 2007-06-08, 10:29 PM   #14
77880099
贡献会员
 
注册日期: 2007-06-08
帖子: 22
声望力: 0
77880099 是一个将要出名的人77880099 是一个将要出名的人
也遇到类似问题了,现在去看看 多谢楼主
77880099 当前离线   回复时引用此帖
旧 2007-12-04, 01:30 PM   #15
yolanda708
初级会员
 
注册日期: 2007-12-03
帖子: 1
声望力: 0
yolanda708 是普普通通的会员
感谢!对我的帮助很大
yolanda708 当前离线   回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码

论坛跳转


所有时间均为北京时间。现在的时间是 03:56 PM


Powered by vBulletin® 版本 3.8.1
版权所有 ©2000 - 2010,Jelsoft Enterprises Ltd.
Copyright 2004 - 2008 LotusFans.comAd Management by RedTyger