一、基本准备
1
、安装
SQL
个人版
+SP4
;
2
、安装
VFP9+SP1+
汉化。(看自己中意汉化否)
3
、会做一点单机版的项目。
二、准备实施
1
、启动
SQL
企业管理器,选择当前服务器,新建一数据库,命名
cj
,在该库下建一表,字段为
字段名
类型
宽度
编号
C 6
姓名
C 8
职务
C 10
股室
C 10
电话
C
11
将编号设为主键,保存,命名为
人员表;
2
、建一
ODBC
,指向人员表。
(
ODBC
所在位置:开始
-
设置
-
控制面板
-
管理工具
-
数据源
ODBC
)
添加。
选择
SQL
,完成。
输入想要的名称、描述,服务器要选对,下一步
输入用户
ID
和密码,下一下。
更改数据库,下一步。
完成。
测试一下数据源。
至此,准备工作已完成。
三、实施过程
1
、新建一项目,名自己定。
2
、
(
建立
ODBC
连接
)
新建一程序,用来连接服务器,并将服务器上的数据下载到客户端
。(因为用到的表比较小,可以整个下载下来,如果表比较大,最好是有选择地下载需要用到的记录)
程序思路如下:
先定义一个连接串
nhandle
,并使用用户名密码连接相应的数据库,测试连接是否成功。如果成功,则下载表到本地临时表(好象是视图?弄不明白,先当它是表),命名为
gh
,如果不成功,则提示连接失败,并提示再次连接否。
连接成功并下载好表后,设置表与服务器表的相应更新。(此设置可以为另一种形式,等做好这种形式后可试试另一种)
程序如下:
public nhandle &&&
定义连接串名
nhandle=sqlstringconnect("driver=sql server;server=192.168.9.10;uid=sa;pwd=aa;database=cj") &&&
我的连接类型是
SQL SERVER
,服务器是
192.168.9.10
,用户名是
sa,
密码是
aa,
数据库是
cj if nhandle>0 MESSAGEBOX('
连接成功!!!
') sqlexec(nhandle,"select
编号
,
姓名
,
职务
,
股室
,
电话
from
人员表
order by
编号
","gh") &&
将服务器中的‘人员表’表中的数据读到
gh
表中
sele gh cursorsetprop("tables","
人员表
","gh") &&
设置临时表的更新目标表
cursorsetprop("keyfieldlist",'
编号
',"gh") &&
设置临时表的关键字
cursorsetprop("updatablefieldlist","
编号
,
姓名
,
职务
,
股室
,
电话
","gh")&&
设置临时表的更新字段
cursorsetprop("updatenamelist","
编号
人员表
.
编号
,
姓名
人员表
.
姓名
,
职务
人员表
.
职务
,
股室
人员表
.
股室
,
电话
人员表
.
电话
","gh") &&&
用
gh
中的相应字段更新人员表
cursorsetprop("sendupdates",.t.,"gh")&&
设置为可更新
cursorsetprop("wheretype",2) cursorsetprop("buffering",5)&&
设置表缓冲
* do form
表单
1 else if messagebox("
数据库连接失败,是否继续连接?
",48+4,"
连接失败提示
")=6 &&
回答
"
是
" return else quit endif endif 3
、
(远程视图)
建一表单,用来操作下载到本地的临时表
gh
并更新服务器表。
A
、在表单中放一表格
grid1 B
、在表单的
init
里写上
SELECT gh thisform.grid1.RecordSource='gh' &&&
将表格的数据源设置为表
gh **********
如果想表格好看点,最好能定义一下表格各列的宽度
*thisform.grid1.column1.width=40 C
、在表单中放新增,删除,保存到服务器,清空服务器数据四个按钮
新增按钮:反正是临时表,直接在表格里新增,以图快。你可以用文本框,这样可以控制是否有重复记录,输入是否符合要求等。至于如何才能达到你的要求,就看你自己的了。
新增按钮的
click
过程代码:
SELECT gh APPEND BLANK thisform.grid1.SetFocus
删除按钮:在
C/S
里,删除只能打上删除号,不能
pack
,否则,死得很难看的。
Pack
要写在表单的退出中。因为不能使用
pack
,就用了
set filter to !dele().
这个东东在临时表中好象要移动一下记录指针才生效的。
删除按钮
click
代码:
sele gh bh=alltrim(
编号
) xm=alltrim(
姓名
) set filter to !dele() if messagebox(bh+xm+"
的数据删除,将不能恢复,真的要删除吗?
",48+4,"
信息提示
")=6 &&
回答
"
是
" sqlexec(nhandle,"delete from
人员表
where
编号
=?bh")&&&
删除服务器上相应的记录
DELETE &&&&
删除临时表中的相应记录,注意不能在这使用
pack ENDIF **************
以下是移动指针
if delete() if !eof() skip else if recn()>1 &&
没有这个函数,查不到
skip -1 endif endif endif thisform.grid1.setfocus
保存按钮:因为临时表直接绑到了表格中,在录入时就保存了,这里主要是指将临时表中的数据更新到服务器的表中,代码很简单。
保存按钮的
click
代码:
select gh TABLEUPDATE(.t.)
清空服务器相应数据表按钮:相当于本地表的
zap Click
代码如下:
select gh if messagebox("
你正在执行的操作是清空服务器的数据,真的要清空吗?
",48+4,"
信息提示
")=6 &&
回答
"
是
" sqlexec(nhandle,"truncate table
人员表
") &&
清空服务器数据表
ENDIF
至此,已基本完工。在程序中加上一句
Do form
表单
运行程序试一试?应该早就试了,我至此已运行很多次试了的。
4
、完善一些功能。
A
、表格的
afterrowcolchange:
我是不想每增加一个记录都去按一次新增按钮,于是就采用
allowaddnew
。
SELECT gh thisform.command2.Caption='
删除
'+ALLTRIM(
编号
)+ALLTRIM(
姓名
) IF !EMPTY(ALLTRIM(
编号
)) thisform.grid1.allowaddnew= .T. ELSE thisform.grid1.allowaddnew=.f. ENDIF B
、表单的
init:
为了让刚才的
allowaddnew
生效,我先判断
gh
是否有记录,如果没有就先加个空记录。然后定义一下表格各列的宽度。
SELECT gh if recc()=0 appe blan endif with thisform.grid1 .recordsource='gh' .columncount=5 .column1.controlsource='gh.
编号
' .column1.width=30 .column2.controlsource='gh.
姓名
' .column2.width=60 .column3.controlsource='gh.
职务
' .column3.width=60 .column4.controlsource='gh.
股室
' .column4.width=60 .column5.controlsource='gh.
电话
' .column5.width=90 ENDWITH