vf实例编程(计算机二级Foxpro在VFP中模拟动画)(材料)_计算机二级vf编程题
vf实例编程(计算机二级Foxpro在VFP中模拟动画)(材料)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“计算机二级vf编程题”。
计算机二级Foxpro:在VFP中模拟动画
在当今众多的编程语言中,VFP的简单、方便和实用使我一直情有独衷。它不仅提供了对中、小型数据库完善的管理和操作机制,在应用程序界面的设计上也 提供了丰富的手段。比如说,VFP的表单设计器提供了图象控制,允许我们直接在表单中添加.BMP图片。稍显不足的是它不支持其他格式的图象,更不用说是 动画了。
由于图象控制和其他控制一样,具有自己一整套的属性,在设计时可以动态地改变它,因此我在实践中摸索到一种变通的方法,在VFP的表 单中加入模拟的“动画”。其设计思想是准备几帧连贯的.BMP图象(可用相关的绘图软件自行制作),利用计时器的计时功能,在规定的时间间隔内动态地改变 所显示的.BMP图象。下面我就通过一个演示实例来加以说明:首先,我准备了四幅连贯的红旗飘图象,分别取名为:1.bmp,2.bmp,3.bmp和 4.bmp。如下所示(略),然后使用表单设计器设计表单如下:
演示表单
其中包括三个控制:Image(图象),Timer(计时器)和Command(命令按钮)。设置属性如下:
Image.Picture=“1.bmp”Ttimer.Enabled=.t.Timer.Interval=200Command.Caption=“退出演示”
在表单的Activate事件中添加如下代码:
Public II=1在计时器的Timer事件中添加代码如下:If I $#@62;=
4I=1Else
I=I+1EndifPic=Str(I,1)+“.bmp”Thisform.Image.Picture= Pic
在命令按钮的Click事件中添加代码如下:
Thisform.Release
最后,保存并运行表单,我们会看到窗口中一幅鲜艳的红旗在迎风招展。单击“退出演示”命令按钮,模拟动画的演示就结束了。
VF编写简易计算器
(1)建立应用程序用户界面。
选择“新建”表单,进入表单设计器,增加一个文本框控件Textl、一个标签控件Label1和一个命令按钮组CommandGroup1,并将命令按钮组的ButtonCount属性改为16。
(2)设置对象属性如下表所示:
CommandGroup1中各按钮的属性设置
对象 属性 属性值 说明
Command1~Command10 Caption 依次改为:1、2、3、4、5、6、7、8、9、0
FontBold.T.Command11~Command10 Caption 依次改为:.、=、+、-、*、/
FontBold.T.(3)编写程序代码。
①编写CommandGroup1的Click事件代码:
IF THISFORM.Tag=.T.THISFORM.Text1.Value=ALLT(RIGHT(STR(THIS.Value),1))
THISFORM.Tag=〃 〃
ELSE
a=THISFORM.Text1.Value
THISFORM.Text1.Value=a+ALLT(RIGHT(STR(THIS.Value),1))
ENDIF
②编写“.”按钮Command11的Click事件代码:
a=THISFORM.Text1.Value
THISFORM.Text1.Value=a+〃.〃
③编写“=”按钮Command12的Click事件代码:
a=THISFORM.Text1.Value
THISFORM.Text1.Value=ALLT(STR(&a))
THISFORM.Tag=.T.④编写“+”按钮Command13的Click事件代码:
a=THISFORM.Text1.Value
THISFORM.Text1.Value=a+〃+〃
THISFORM.Tag=〃 〃
⑤编写“-”按钮Command14的Click事件代码:
a=THISFORM.Text1.Value
THISFORM.Text1.Value=a+〃-〃
THISFORM.Tag=〃 〃
⑥编写“*”按钮Command15的Click事件代码:
a=THISFORM.Text1.Value
THISFORM.Text1.Value=a+〃*〃
THISFORM.Tag=〃 〃
⑦编写“/”按钮Command16的Click事件代码:
a=THISFORM.Text1.Value
THISFORM.Text1.Value=a+〃+〃
THISFORM.Tag=〃 〃
vf编程计算3!+4!+5!
set talk off
s=0
p=1*2
n=3
do while n
p=p*n
s=s+p
n=n+1
enddo
?s
结果为150
VFP中常用WIN32API函数调用事例
我们在VFP编程时,为了弥补VFP本身功能的不足,常常会用到WIN32API函数来对VFP的功能行扩展,例如取得系统信息、对注册表进行操作 等,但是由于WIN32API函数是C++的数据结构形式,在调用时与VFP的数据格式有所不同,因此在调用时往往会产生问题,而目前的一些资料所介绍的 大都是VB、DELPHI等语言如何调用,对VFP如何调用介绍的比较少,更缺少具体的调用事例,下面我分几次介绍在VFP如何调用WIN32API函 数,并就一些常用的WIN32API函数作一介绍,由于 本人水平有限,所介绍的内容,仅供您参考,也欢迎您在我的[请您留言]中共同探讨:
一、VFP中调用WIN32API函数的格式
VFP中调用WIN32API函数的命令主要是:
DECLAREDLL 它用于注册外部 Windows 32 位动态链接库(.DLL)中的一个函数。
语法: DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName]
.......[cParamType1 [@] ParamName1, cParamType2 [@] ParamName2,...]
说明:
cFunctionType 指定该函数返回值的类型,其类型代码如下:
SHORT16 位整数
INTEGER32 位整数
SINGLE 32 位浮点数
DOUBLE 64 位浮点数
STRING 字符串
FunctionName 指定要注册使用的32位函数名。注意 FunctionName 区分大小写。
如果该函数名与Visual FoxPro的保留字相同,应使用AS参数另起别名。
IN LibraryName 指定该函数所在的外部动态链接库文件名,如果LibraryName为:
WIN32API时,VFP将依次查找KERNEL32.DLL、GDI32.DLL、USER32.DLL、MPR.DLL及ADVAPI32.DLL等动态链接库文件名。
AS AliasName 当API函数的名称与Visual FoxPro的保留字相同时,另取 AliasName别名,另取的别名是不区分大小写的。
cParameterType1 [@] ParamName1, cParameterType2 [@] ParamName2,...指定传递给被调用的32位.DLL函数的参数类型及参数名称。其类 型代码如FunctionType,如果要以传址方法传递参数则应在参数名前加上@。
2.CLEAR DLLS 释放所有利用DECLAREDLL命令所装入的动态链接库。
xx0 获取指定磁盘的卷标成功,反之则未成功。
C_var=指定磁盘的卷标,是个十进制的数值,与我们在DOS下看到的16进制不同。
C_cd=系统规定的文件名每一部分的长度,是个十进制的数值。
C_qf=文件名的大小写标志,是个十进制的数值。
怎么样很简单吧,我们可以把获取的磁盘卷标,用来加密我们的软件,这样 我们的 软件就具有防拷贝的功能了。
将DBF表导入到SQLSERVER中的函数
给大家一个自已写的将DBF表导入到SQL SERVER数据库中的函数
我一直在我的程序中用,方便不少
请多多指都教,有什么问题可以回帖或邮trywell@sohu.com
连接句柄为CON,可以调用本函数之前执行如下语句CON=SQLSTRINGCONNECT(“DRIVER=SQL SERVER;SERVER=(LOCAL);UID=SA;PWD=;DATABASE=你的数据库名”)
***dbftosql()
PROCEDURE DBFTOSQL PARA MDBF LOCAL I,MFIELD,MTYPE,MCOLUMN,MSQLTYPE,MLEN,MSQL1,MSQL2 MFIELD='' MTYPE='' MCOLUMN='' MSQLTYPE='' MLEN='' MSQL1='' MSQL2='' IF!USED(MDBF)USE &MDBF ENDI SELE &MDBF I=1 DO WHILE!EMPTY(FIELD(I))MFIELD=FIELD(I)MTYPE=TYPE(MFIELD)DO CASE CASE UPPER(TYPE(MFIELD))='C' MSQLTYPE='CHAR' CASE UPPER(TYPE(MFIELD))='Y' MSQLTYPE='MONEY' CASE UPPER(TYPE(MFIELD))='D' MSQLTYPE='DATETIME' CASE UPPER(TYPE(MFIELD))='T' MSQLTYPE='DATETIME'
CASE UPPER(TYPE(MFIELD))='B' MSQLTYPE='FLOAT' CASE UPPER(TYPE(MFIELD))='F' MSQLTYPE='FLOAT' CASE UPPER(TYPE(MFIELD))='G' MSQLTYPE='IMAGE' CASE UPPER(TYPE(MFIELD))='I' MSQLTYPE='INT' CASE UPPER(TYPE(MFIELD))='L' MSQLTYPE='BIT' CASE UPPER(TYPE(MFIELD))='M' MSQLTYPE='TEXT' CASE UPPER(TYPE(MFIELD))='N' MSQLTYPE='FLOAT' ENDCASE IF 'C'$MTYPE MLEN='('+ALLT(STR(LEN(&MFIELD)))+')' ELSE MLEN='' ENDI IF EMPTY(MCOLUMN)MCOLUMN=FIELD(I)+SPACE(1)+ALLT(MSQLTYPE)+MLEN ELSE MCOLUMN=MCOLUMN+','+FIELD(I)+SPACE(1)+ALLT(MSQLTYPE)+MLEN ENDI IF EMPTY(MSQL1)MSQL1=FIELD(I)ELSE MSQL1=MSQL1+','+FIELD(I)ENDI IF EMPTY(MSQL2)MSQL2='?'+FIELD(I)ELSE MSQL2=MSQL2+',?'+FIELD(I)ENDI I=I+1 ENDD MSQL='CREATE TABLE '+MDBF+SPACE(1)+'('+MCOLUMN+')' IF SQLEXEC(CON,MSQL)=1 ENDI IF RECCOUNT()>0 GO TOP DO WHILE!EOF()I=1
DO WHILE!EMPTY(FIELD(I))
XX=FIELD(I)
IF XX=.NULL.REPL &XX WITH ''
ENDI
I=I+1
ENDD
MSQL='INSERT INTO '+MDBF+SPACE(1)+'('+MSQL1+')'+SPACE(1)+'VALUES('+MSQL2+')'
IF SQLEXEC(CON,MSQL)=1
ENDI
SKIP
ENDD
ENDI
USE IN &MDBF
RETU VFP远程视图使用面面观
摘要:远程视图是Visual Foxpro 5.0 中开发Client/Server 应用系统的基础,本文首先介绍了远程视图有关参数的放置技巧,然后介绍如何去设计、使用远程视图,最后讨论了使用远程视图的四个实际问题。
一、绪论
VFP 是一种较好的客户/ 服务器应用系统开发工具,用VFP 开发C/S 系统的关键是如何访问远程数据(远程服务器中的Table/View)。可以使用VFP 提供的SQL Pa-Through 函数访问远程数据,但最常用的方法是使用远程视图(Remote View)去访问远程数据。本文结合本人的使用经验对远程视图的使用技巧加以介绍。
二、远程视图的环境设置
在设计远程视图时,需要对远程视图的有关环境信息进行设置。使用Tools 菜单中的Options....选项来设置Remote Data 选项。其选项设置说明如下:
*Share Connection: 指出今后设计的远程视图是否使用共享连接。使用共享连接可大大减少数据库服务器中客户访问许可数,但会影响客户机的访问速度。
*SQL Updates/Criteria: 指出对后台数据进行update 操作的条件。
它有四种可能:
①Key Field only ②Key and Updatable Fields
③Key and Modified Fields ④Key and Time Stamp。
一般选择③较合适。
*SQL Updates/Method: 指出对后台数据的更新方法。
它有两种选择:①SQL Delete then Insert ②SQL update。
一般选择②比较合适。
*Connection Defaults: 主要用于SQL Pa-Through 函数访问远程数据,对于远程视图则不需要放置。
三、远程视图的设计
有两种方法设计远程视图,一是使用View Designer;二是使用SQL 语句。用View Designer 可设计较为简单的视图,而使用SQL 的Create Remote View 语句则可进行复杂视图的设计。如果试图去用View Designer 观察或修改(用Create 创建的视图)则极有可能被破坏它(例如:若创建视图的Select 语句中含有exists 子句, 则一定会被破坏!)
1.用Create 命令设计
例如:假定连接名为WYFconnect,两个远程表为SealList 和ShipList.Create 命令可如下:
CREATE SQL VIEW ViewTest REMOTE CONNECTION WYFconnect AS SELECT SealList.* FROM SealList, ShipList WHERE SealList IS NOT NULL AND SealList AND 箱号NOT IN(SELECT 箱号FROM ShipList WHERE ShipList.箱号IS NOT NULL AND ShipList.船名=SealList.船名
使用该方法可以在程序中动态地构造满足不同条件的远程视图(View Designer 不能构造带参数的远程视图)。例如:设m.ShipName 为一可变内存变量,其创建语句为:
CREATE SQL VIEW ViewTest REMOTE CONNECTION WYFconnect AS SELECT * FROM SealList WHERE 船名=m.ShipName.2.用View Designer 设计
启动View Designer 选择连接名后出现设计图, 在其上部可以加入远程服务器中的表或视图,在其下部进行参数/ 条件设置:
*Select Criteria: 设置远程数据值上的记录必须满足的条件,类似于下SQL Select 语句中的Where 子句。在这里可以构造复杂条件,但条件中使用的函数和语法规则必须是后台数据库支持的,例如:不能使用DTOC(日期)=‘90/01/01’,而必须使用Convert(char(10), 日期)=‘90/01/01’, 因为后台数据库不支持DTOC()函数。
*Fields: 选择结果集中的字段,在这里要强调的是Function/Expreion 的使用,使用它可构造出与源表字段不同的字段,如:T.船名+‘’+T.中文AS 船舶。实践证明Function/Expreion 中不能使用双引号,而只能使用单引号。
*Order by 和Group by: 对结果分组、分类。要求符合后台数据库所支持的SQL 语法。
*Update Criteria: 设置视图的有关替换参数, 具体如下:
①要选中Send SQL Update
②SQL where 一般选择Key and Modify Fields
③Update Using 一般选择SQL Update
④务请选择关键字段和可更改字段(在钥匙符号下面和铅笔符号下面加“√”),否则将无法正确完成Insert/update 功能。
四、远程视图的使用
1.缓冲与锁定设置
对于远程视图,建议使用缓冲机制来提高远程视图的工作效率和使用的方便性。首先在Option 菜单中设置Data 组件,需设置下列参数:
①选择Open Exclusive 以让库共享打开,库中的远程视图则可共享使用;
②Locking And Buffering 设置:选中Automatic File locking 和Multiple Record Locks,并将Buffering 设置成Fields Buffering,加锁方式设置为“记录级乐观锁定”。在具体设计Form 时,对数据环境中的每一个远程视图光标可重新根据需要来设置锁定和缓冲机制。如果不重新设置,它取Form 的缺省设置。
2.数据的写入与前台刷新
对于采用了Buffering 技术的远程视图,当修改/ 删除/ 增加了记录时,需用TableUpdate(.T.,.T.)函数来确保数据写到后台数据库中;若要取消对缓冲区中视图数据的修改,需用TableRevert(.T.)函数。例如:
Select View1
Append Blank
Begin Transaction
if TableUpdate(.T.,.T.)
EndTranseaction
else
RollBack
=TableRevert(·T ·)
endif
如果该远程视图与别的表/ 远程视图发生级联修改/ 删除/ 增加关系,则需使用事务机制,以确保数据的完整性。
如果对应视图的后台表/ 视图数据发生变化时,使用下述方法让前台客户机中的数据与实际后台数据一致:
①Select 〈远程视图名〉
USE〈远程视图名〉&& 再次打开即可
②Select 〈远程视图名〉
=Requery()&& 刷新缓冲区值
五、远程视图使用中碰到的若干问题
1.如何在一个远程视图中多次使用同一远程数据源?
依靠别名。例如:Select A.船名,A.航次,B.姓名as 操作员,C.姓名as 仓库员from Shipname A, worker B, worker C where A.操作员代码=B.Code and A.仓库员代码=C.Code
2.设计远程视图时Select 语句的语法应符合VFP 或后台数据库?
后台数据库支持的SQL 语法。例如:Create SQL View AAA Remote Conection BB As Select A.* From Shipname A Where Convert(Char(10), 进港日期)=‘1998/05/30’
3.远程视图能否使用Pack 和Recall 语句?
不能使用pack 语句,例如:
use View1;
delete for 〈条件〉 && 加删除标志
pack && 错误,必须使用TableUpdate()函数
对于Recall 命令,如果已执行了TableUpdate(),则执行无效;若未发Tableupdate(), 则可用Recall 来取消删除标记。
4.本地视图的数据源有远程视图,如何刷新本地视图?
例如:有两个远程视图Rview1 Rview2, 创建本地视图的命令为:Create SQL view As Select A.* B.* from Rview1 A,R view2 B where A.箱号=B.箱号
刷新view 之前必须先刷新Rview1 和Rview2:
=requery(“Rview1”)
=Requery(“Rview2”)
=Refresh(“view”)
六、小结
远程视图是VFP 访问远程数据服务器中数据的有利武器,有了前面的介绍,就可得心应手地设计C/S 应用系统了。
参考文献
[1 ]E.sander 等著visual FoxPro3.0 实用指南机械工业出版社1996
The Skills of Using Remote View in Visual Foxpro 5.0
Wuyefu and Yuanxiaoling
Dept.Computer, Wuhan Transaction University , WuHan430063
ABSTRACT: In the paper, it is introduced how to choice option parameters and to use remote view in Visual Foxpro 5.0.In the end, the solution to some problems is also discued.KEYWORDS: Remote view, Remote Data, Connection, Lock, buffering
一个很好的c-s主程序
* * 2003/11/21 《星级酒店管理》系统 主程序 * * 作者:刘雪均
* * 版权所有(C)2003 宝明城大酒店 * * 广东深圳市公明镇长春花园 * * 深圳, 广东 518106 * * 中国
* * 说明: 版权所有,严禁非法复制,违者必穷 Clear Clear All Clear Dlls Clear Macros Close All Set Talk Off Set Safe Off Set Escape Off Set Debug Off Set Exact Off Set Sysmenu Save Set Sysmenu To Set Sysmenu Off Set NullDisplay To '' Set Null Off Set Dohistory Off Set Notify Cursor Off Release Windows Close Databases Set Date To YMD Set Hour To 24 Set Seconds Off Set Century On Set Deleted On Set Resource On Set Help On On Shutdown Quit Set Clock Off With _Screen.WindowState=2.ZOOMBOX=.F..Movable=.F..MinButton=.F..MaxButton=.F..Closable=.F..Icon=“Ball.ICO”.Caption='《星级酒店管理》系统--均维软件工作室'.LockScreen=.T..AddObject('ScreenImg','Image').ScreenImg.Stretch=2.ScreenImg.Visible=.T..ScreenImg.Height=Sysmetric(2)-50.ScreenImg.Width=Sysmetric(1).ScreenImg.Picture='DeskTopr.jpg'.LockScreen=.F.Endwith =Capslock(.T.)=Numlock(.T.)Public TempFile,ExePath,CurWinDir,CurPic,pCompany,ReportFile,pTeamId,pUserGroup,pUserId,pUserName,sConn,gcUpdateId,;m.Date_From,m.Date_To,nConn,OFBLX,OFBLY,Times Store 0 To nConn,OFBLX,OFBLY,Times Store Date()To m.Date_From,m.Date_To Store '' To TempFile,ExePath,CurWinDir,CurPic,pCompany,ReportFile,sConn,pTeamId,pUserGroup,pUserId,pUserName TempFile='T'+Right(Sys(2015),7)CurWinDir=Getenv('WinDir')ExePath=Left(Sys(16,1),Rat(“”,Sys(16,1)))Set Default To(ExePath)Set Resource To &ExePath.FoxUser.Dbf Set Path To &ExePath.;&ExePath.HelpS If!Directory(“&ExePath.Temp”)Md &ExePath.Temp Endif Tmpfiles=“&ExePath.Temp” &&设定当前VFP使用的临时文件目录
=DelTmpFile()&&删除当前用户系统目录和VFP目录的过时的临时文件 *!* SET HELP TO &ExePath.HelpSHotel.CHM If!File('MYDLL.DLL')Meagebox('MYDLL.DLL丢失,程序不能正常运行!',48,'系统提示')Quit Endif Declare String getserial In “MyDll.dll” Integer &&获得硬盘厂商物理永久性的ID Declare String num2txt_c In “MyDll.dll” As RMBZH Double &&小写金额转换成大写金额
Declare String topy In “MyDll.dll” String &&汉字转拼音首字母 Declare Integer changeres In “MyDll.dll” Integer, Integer &&分变率设定 Declare Integer WinExec In “kernel32” String,Integer Declare Integer FindWindow In Win32api String, String Declare Long BringWindowToTop In Win32API Long Declare Long ShowWindow In Win32API Long, Long Declare Integer SendMeage In user32 Integer,Integer,Integer,Integer Declare Integer ShellExecute In SHELL32.Dll Integer, String, String, String, String, Integer Declare Integer GetPrivateProfileString In Win32API As GetPrivStr String, String, String, String @, Integer, String Declare Integer WritePrivateProfileString In Win32API As WritePrivStr String, String, String, String Declare SHORT SetLocalTime In win32api String SystemTime *!* Declare integer ShowWindowAsync in user32 integer hwnd, integer nCmdShow *!* htaskbar = FindWindow(“Shell_TrayWnd”,0)*!* ShowWindowAsync(htaskbar,0)&&0为隐藏任务栏,1为显示任务栏 Set Cla To MyLibs Additive &&使用自已的类库
On Error Do Err_Fix With Error(),Meage(),Meage(1), Program(),Lineno()&&错误跟踪处理
If!File(“&ExePath.LXJ.INI”)&&判断配置文件存在否,不存在就创建。=WriteIni('REGISTRY','Local_Id',Str(DiskSpace(Sys(5),1)),'&ExePath.LXJ.INI')=WriteIni('REGISTRY','Reg_Date',Ttoc(Datetime()),'&ExePath.LXJ.INI')=WriteIni('REGISTRY',' ','======================','&ExePath.LXJ.INI')=WriteIni('AUTHOR','Contact','刘 雪 均','&ExePath.LXJ.INI')=WriteIni('AUTHOR','Title','电脑工程师','&ExePath.LXJ.INI')=WriteIni('AUTHOR','Telephone','***','&ExePath.LXJ.INI')=WriteIni('AUTHOR',' ','======================','&ExePath.LXJ.INI')=WriteIni('SCREEN','RandomLoad','Yes','&ExePath.LXJ.INI')=WriteIni('SCREEN','SourceXY','Yes','&ExePath.LXJ.INI')=WriteIni('SCREEN','Picture ','Picture.JPG','&ExePath.LXJ.INI')=WriteIni('SCREEN','StatusBar ','On','&ExePath.LXJ.INI')=WriteIni('SCREEN','','======================','&ExePath.LXJ.INI')=WriteIni('CONNECT','DRIVER','SQL SERVER','&ExePath.LXJ.INI')=WriteIni('CONNECT','SERVER',GETENV(“COMPUTERNAME”),'&ExePath.LXJ.INI')=WriteIni('CONNECT','PORTNO','1433','&ExePath.LXJ.INI')=WriteIni('CONNECT','UID','SA','&ExePath.LXJ.INI')=WriteIni('CONNECT','PWD','DBA','&ExePath.LXJ.INI')=WriteIni('CONNECT','DATABASE','HOTEL','&ExePath.LXJ.INI')=WriteIni('CONNECT',' ','======================','&ExePath.LXJ.INI')=WriteIni('USER','LastUser','Guest','&ExePath.LXJ.INI')=WriteIni('USER',' ','======================','&ExePath.LXJ.INI')=WriteIni('UPDATE','NewExe','&ExePath.Main.EXE','&ExePath.LXJ.INI')&&工作站自动升级的共享目录
=WriteIni('UPDATE','NewInfo','欢迎使用本系统!','&ExePath.LXJ.INI')&&提示的信息
=WriteIni('UPDATE',' ','======================','&ExePath.LXJ.INI')=WriteIni('OCXDLLREG',GETENV(“COMPUTERNAME”),'NO','&ExePath.LXJ.INI')Endif If Upper(ReadIni('SCREEN','StatusBar','&ExePath.LXJ.INI'))='ON' Set Status Bar On _vfp.StatusBar=' 欢 迎 您 使 用 本 系 统...' Else Set Status Bar Off Endif =OleRegister()&&根据INI文件判断是否注册OCX,DLL文件 =SetShortCut('酒店管理')&&在屏幕上创建快捷方式 *!*工作站是否注册判断 If ReadIni('REGISTRY','Local_Id','&ExePath.LXJ.INI')!=WorkJm(Iif(Empty(GetSerial(0)),Str(Diskspace(Sys(5),1)),Allt(GetSerial(0))),'HTL')Do Form RegWork.SCX &&调用本工作站使用注册表单 Endif Wait Window “正在连接 SQL SERVER 数据库,请稍候......” At Srows()/2-10,(Scol()-45)/2 Nowait Noclear SQLSETPROP(0,“DispLogin” ,3)&&连接不成功时不显示ODBC登录对话窗口 SQLSETPROP(0,“ConnectTimeOut”,20)&&连接超时等待秒数设置,可取值0至600 SQLSETPROP(0,“IdleTimeout”,0)&&空闲超时间隔秒数,取0为无限期等待 SQLSETPROP(0,“QueryTimeOut”,20)&&超时错误之前等待的时间 SQLSETPROP(0,“Asynchronous”,.F.)&&指定结果集合是同步返回 SQLSETPROP(0,“DispWarnings”,.F.)&&不显示一个错误信息 *!*从配置文件中获得SQL SERVER的加密连接串 sConn='DRIVER=SQL SERVER' sConn=sConn+';SERVER='+Iif(Empty(ReadIni('CONNECT','SERVER','&ExePath.LXJ.INI')),GETENV(“COMPUTERNAME”),ReadIni('CONNECT','SERVER','&ExePath.LXJ.INI'))sConn=sConn+','+Iif(Empty(ReadIni('CONNECT','PORTNO','&ExePath.LXJ.INI')),'1433',ReadIni('CONNECT','PORTNO','&ExePath.LXJ.INI'))sConn=sConn+';UID='+ReadIni('CONNECT','UID','&ExePath.LXJ.INI')sConn=sConn+';PWD='+Iif(Empty(ReadIni('CONNECT','PWD','&ExePath.LXJ.INI')),'',JmWd(ReadIni('CONNECT','PWD','&ExePath.LXJ.INI')))sConn=sConn+';DATABASE='+Iif(Empty(ReadIni('CONNECT','DATABASE','&ExePath.LXJ.INI')),'NoDatabase',ReadIni('CONNECT','DATABASE','&ExePath.LXJ.INI'))sConn=sConn+';NetWork=DBMSSOCN' nConn=Sqlstringconnect(sConn)Wait Clear Do While nConn重试 , N->设定 , 取消->退出!“,67 ,'SQL Connect Info.')_Screen.Refresh Do Case Case YN=6 Wait Window ”正在连接 SQL SERVER 数据库,请稍候......“ At Srows()/2-10,(Scol()-45)/2 Nowait Noclear nConn=Sqlstringconnect(sConn)Wait Clear Case YN=7 Do Form SetServer.SCX &&SQL SERVER服务器连接配置 Otherwise Quit Endcase Enddo *!*下面是测试连接有效否,有效就检测服务器注册及过期情况等 If IsConn()=GetServerTime()&&设定当前机器时间为服务器的时间
If SQLEXEC(nConn,'Select * From Registry','MyCursor')>0 Select MyCursor pCompany=Alltrim(MyCursor.Corp)If Alltrim(MyCursor.RegKey)!=Alltrim(ServerJm(Dtoc(Ttod(MyCursor.EndTime))-TOPY(pCompany)-Dtoc(Ttod(MyCursor.BeginTime)),'HTL'))Do Form RegServer.SCX &&调用注册SQL SERVER服务器使用权表单 Endif If MyCursor.BeginTime>Date()Meagebox('系统时间小于注册时间,程序不可运行!',16,'Information',3000)Quit Endif If MyCursor.EndTime
1、使用期限快到,程序将在 '+Alltrim(MyCursor.EndTime)+' 后终止运行,切记!'+Chr(13)+Chr(13)+'
2、请尽快同 刘雪均 联系(E-MAIL:CQTony@tom.com),谢谢!',64 ,'系统提示')Endif Else Meagebox('注册信息查询失败,请等会重试!',16,'Information',3000)=SQLDisConnect(0)Quit Endif Else Meagebox('后台数据库连接失败,请等会重试!',16,'Information',3000)=SQLDIsConnect(0)Quit Endif If Empty(pCompany)cTitle=”【 星 级 酒 店 管 理 系 统 】“ Else cTitle=”【 &pCompany.---酒店管理系统 】“ Endif m.LNHWND=FindWindow(0,cTitle)If m.LNHWND0 Wait Window ”重 复 提 示 : 程 序 已 经 运 行!“ At Srows()/2-3,(Scol()-34)/2 Timeout 2 BringWindowToTop(m.LNHWND)ShowWindow(m.LNHWND,3)Quit Endif *!*分变率处理,如果低于800*600就修改为800*600,否则就从配置文件进行相应处理,程序本身有自动适应功能。OFBLX=Sysmetric(1)OFBLY=Sysmetric(2)If OFBLX800)CHANGERES(800,600)OFBLX=800 OFBLY=600 _Screen.ScreenImg.Height=600-50 _Screen.ScreenImg.Width=800 Endif *!*下面是背景图自动随机调用或是调用用户设定的固定图片处理
If Upper(ReadIni('SCREEN','RandomLoad','&ExePath.LXJ.INI'))='YES' Set Default To &ExePath.PictureS FileNo=Adir(PicFile,”*.JPG“)If FileNo>0 FileNo=Int(Rand(Seconds())*FileNo)+1 CurPic =PicFile[FileNo,1] Else CurPic=ReadIni('SCREEN','Picture','&ExePath.LXJ.INI')Endif Release FileNo,PicFile,LNHWND Set Default To &ExePath.CurPic=ExePath+'PictureS'+CurPic Else CurPic=ReadIni('SCREEN','Picture','&ExePath.LXJ.INI')Endif If!File(CurPic)CurPic='DeskTopr.jpg' Endif _Screen.ScreenImg.Picture=CurPic _Screen.Caption=cTitle _Screen.Refresh Do Form Login.SCX &&运行登录用密码校验界面 Read Events =VFP_INIT()Return Function VFP_INIT With _Screen.ZOOMBOX=.T..MinButton=.T..MaxButton=.T..BorderStyle=2.Closable=.T..Movable=.T..Icon=”“.Caption=Chr(49653)+Chr(53673)+Chr(48889)Endwith Close Databases All Close Tables All Release Windows Set Sysmenu To Default Set Sysmenu On Set Deleted Off Set Procedure To Set Exclusive On Set Multilocks Off Set Library To Set Talk On Set Escap On Set Safe On Set Exact Off Close All Clear Dlls Clear All Clear On Key On Error On Escap Return Endfunc *!*判断连接是否存在或断线,如不通并重新连接 Function IsConn If nConn0 SQLEXEC(nConn,”Select GetDate()AS SysTime ,CONVERT(VARCHAR(10),GetDate(),111)AS SysDate “,'ServerDate')Return(.T.)Else Return(.F.)Endif Endfunc *!*设定当前系统的时间为服务器的时间 Function GetServerTime If IsConn()Select ServerDate SystemTime = WTOS(Year(ServerDate.SysTime))+;WTOS(Month(ServerDate.SysTime))+;WTOS(Dow(ServerDate.SysTime)-1)+;WTOS(Day(ServerDate.SysTime))+;WTOS(Hour(ServerDate.SysTime))+;WTOS(Minut(ServerDate.SysTime))+;WTOS(Sec(ServerDate.SysTime))+;WTOS(Sec(ServerDate.SysTime))= SETLOCALTIME(SystemTime)Else Meagebox('后台数据库连接失败,时间同步无效!',16,'Information',3000)Endif Endfunc Function WTOS Parameters WORDVAL Private IDNAME, RETSTR RETSTR = ”“ For IDNAME = 8 To 0 Step-8 RETSTR = Chr(Int(WORDVAL/(2^IDNAME)))+ RETSTR WORDVAL = Mod(WORDVAL,(2^IDNAME))Next Retu RETSTR Endfunc *!* SQL 错误登记显示自定义函数 Function ShowSqlError NERRLINE=Aerror(SQLERROR)If SqlError[5] 错误记录 For I=1 To NERRLINE 错误编号: 错误信息: ODBC 信息: ODBC 状态: ODBC 数据源错误编号: ODBC 连接句柄: Endfor Set Safety Off Set Textmerge To Local LCERRORLOG,LCUSER If!Directory(”&ExePath.Errors“)Md &ExePath.Errors Endif LCERRORLOG = Filetostr('&ExePath.ERRORSSQLERRLOG.txt')LCUSER=pUserId-'/'-pUserName If IsConn()SQLEXEC(nConn,'INSERT INTO SYSERROR(WORKSTATION,USERNAME,ERRORDATE,ERRORLOG)valueS(?SYS(0),?lcUSER,GETDATE(),?lcERRORLOG)')Endif Meagebox(SQLERROR[2],16,'SQL Error '+Transform(SQLERROR[1]))Else Meagebox(Right(SQLERROR[2],54),64,'SQL Error '+Transform(SQLERROR[1]))Endif Endfunc *!* 程序快捷方式自定义函数 Function SetShortCut Parameters MyProcName wshshell = Createobject(”Wscript.shell“)StrDesktop = wshshell.specialfolders(”Desktop“)oMyShortcut = wshshell.createshortcut(strdesktop + ”&MyProcName..lnk“)oMyShortcut.windowstyle = 4 &&Maximized 7=Minimized 4=Normal oMyShortcut.iconlocation = ”&ExePath.Loader.EXE“ oMyShortcut.targetpath = ”&ExePath.Loader.EXE“ oMyShortcut.workingdirectory = ExePath oMyShortcut.Save Release wshshell Endfunc *!* 动态SQL 查询条件中的特殊符号‘和“的处理函数 Function DelStr Parameters lsCurStr lsCurStr=Strtran(lsCurStr, ”'“, '')lsCurStr=Alltrim(Strtran(lsCurStr, '”', ''))Return(lsCurStr)Endfunc *!* 更新站点唯一ID获得函数,以当前用户的机器名+系统登录名+系统日期时间到毫秒+本程序的用户编号 Function GetUserId Local gcUpdateId Set Seconds On gcUpdateId=Strtran(Sys(0)+'|'+Right(Strtran(Ttoc(Datetime()),'/',''),15)+'|'+Alltrim(pUserId),' ','')If Len(gcUpdateID)>46 gcUpdateID=Right(gcUpdateID,46)Endif Set Seconds Off Return(gcUpdateId)Endfunc *!* 日期或字符串转换为日期型或者NULL,目的是为了适应后台SQL SERVER的格式,方便处理 Function DC2D Parameters lsCDStr Do Case Case Vartype(lsCDStr)='C' lsCDStr=Alltrim(lsCDStr)lsCDStr=Ctod(lsCDStr)If Empty(lsCDStr)Return(.Null.)Else Return(lsCDStr)Endif Case Vartype(lsCDStr)='D' If Empty(lsCDStr)Return(.Null.)Else Return(lsCDStr)Endif Otherwise Return(.Null.)Endcase Endfunc *!* 日期或字符串转换为字符或NULL,目的是为了适应前台的格式,方便处理SQL SERVER调的数据 Function DC2C Parameters lsDCStr Do Case Case Vartype(lsDCStr)='C' lsDCStr=Alltrim(lsDCStr)If Empty(lsDCStr)Return(.Null.)Else Return(lsDCStr)Endif Case Vartype(lsDCStr)='D' lsDCStr=Dtoc(lsDCStr)If Empty(lsDCStr)Return(.Null.)Else Return(lsDCStr)Endif Otherwise Return(.Null.)Endcase Endfunc *!* 删除当前系统用户临时目录过时的临时文件,因为系统有些临时文件是不会自动删除的Function DelTmpFile *!*Windows系统临时目录
gNo = Adir(gFile, GETENV(“TEMP”)+'*.TMP')For I=1 To gNo nHand=Fopen(GETENV(“TEMP”)+''+gFile(I,1),12)If nHand!=-1 And FDATE(GETENV(“TEMP”)+''+gFile(I,1))!=Date()=Fclose(nHand)Delete File GETENV(“TEMP”)+''+gFile(I,1)Endif Endfor *!*当前程序临时目录
gNo = Adir(gFile, '&ExePath.Temp*.*')For I=1 To gNo nHand=Fopen('&ExePath.Temp'+gFile(I,1),12)If nHand!=-1 And FDATE('&ExePath.Temp'+gFile(I,1))!=Date()=Fclose(nHand)Delete File '&ExePath.Temp'+gFile(I,1)Endif Endfor Release gFile,nHand,gNo Endfunc *!* 工作站第一次运行的时候注册本程序目录下的控件 Function OleRegister If ALLTRIM(Upper(ReadIni('OCXDLLREG',GETENV(“COMPUTERNAME”),'&ExePath.LXJ.INI')))!='YES' IF FILE(“&EXEPATH.MSCOMCTL.OCX”)WINEXEC(“REGSVR32 &EXEPATH.MSCOMCTL.OCX /S”,0)ENDIF IF FILE(“&EXEPATH.MSCOMCT2.OCX”)WINEXEC(“REGSVR32 &EXEPATH.MSCOMCT2.OCX /S”,0)ENDIF IF FILE(“&EXEPATH.MSMAPI32.OCX”)WINEXEC(“REGSVR32 &EXEPATH.MSMAPI32.OCX /S”,0)ENDIF IF FILE(“&EXEPATH.RICHTX32.OCX”)WINEXEC(“REGSVR32 &EXEPATH.RICHTX32.OCX /S”,0)ENDIF IF FILE(“&EXEPATH.MSWINSCK.OCX”)WINEXEC(“REGSVR32 &EXEPATH.MSWINSCK.OCX /S”,0)ENDIF IF FILE(“&EXEPATH.MSCOMM32.OCX”)WINEXEC(“REGSVR32 &EXEPATH.MSCOMM32.OCX /S”,0)ENDIF =WriteIni('OCXDLLREG',GETENV(“COMPUTERNAME”),'YES','&ExePath.LXJ.INI')Endif Endfunc *********因本程序所有的字符串加密目前采用MD5校验,故把原有的加密函数也贴出来贡献给大家参考。
*!* ***工作站安装加密 Function WorkJm Para YourId,JmStr YourId=JmStr-Upper(Alltrim(YourId))Local CurrentId CurrentId='' For IdName=1 To Len(YourId)Step 2 CurrentId=CurrentId+Subst(YourId,Len(YourId)-IdName,1)Endfor For IdName=0 To Len(YourId)Step 2 CurrentId=CurrentId+Subst(YourId,Len(YourId)-IdName,1)Endfor YourId=CurrentId CurrentId='' For IdName=1 To Len(YourId)CurrentId=CurrentId+Chr(Bitxor(Asc(Subst(YourId,IdName,1)),IdName))Endfor Return(CurrentId)Endfunc ***系统使用期限加密 Function ServerJm Para GetSd,JmStr GetSd=JmStr-Upper(Allt(GetSd))Local CurSd CurSd='' For IdName=0 To Len(GetSd)Step 2 CurSd=CurSd+Subst(GetSd,Len(GetSd)-IdName,1)Endfor For IdName=1 To Len(GetSd)Step 2 CurSd=CurSd+Subst(GetSd,Len(GetSd)-IdName,1)Endfor GetSd=CurSd CurSd='' For IdName=1 To Len(GetSd)CurSd=CurSd+Chr(Bitxor(Asc(Subst(GetSd,IdName,1)),IdName))Endfor Return(CurSd)Endfunc 有人找我关于程序中的读写INI的函数,其实以前早发过了,为了方便大家,就一起贴出来吧!API的定义在前面。Function ReadIni PARAMETERS lcHeader, lcCentry,lcFile Private lcBuffer lnBufferSize = 128 lcBuffer = Space(lnBufferSize)+Chr(0)=GETPRIVSTR(lcHeader, lcCentry, “”, @lcBuffer, Len(lcBuffer),lcFile)lcBuffer = Alltrim(Left(lcBuffer, lnBufferSize))Return Left(lcBuffer, Len(lcBuffer)-1)Endfunc Procedure WriteIni PARAMETERS lcHeader, lcCentry, LCvalue,lcFile =WRITEPRIVSTR(lcHeader, lcCentry, LCvalue, lcFile)Return Endproc
VFP编程:VFP报表数据分组 在设计报表时,有时所要报表的数据是成组出现的,需要以组为单位对报表进行处理。例如在教师花名册时,为阅读方便,需要按所在部门或职称进行分组。利用分组可以明显地分隔每组记录,使数据以组的形式显示。组的分隔是根据分组表达式进行的,这个表达式通常由一个以上的表字段生成,有时也可以相当复杂。可以添加一个或多个组、更改组的顺序、重复组标头或者更改、删除组带区。
分组之后,报表布局就有了组标头和组注脚带区,可以向其中添加控件。组标头带区中一般都包含组所用字段的“域控件”,可以添加线条、矩形、圆角矩形,也可以添加希望出现在组内第一条记录之前的任何标签。组注脚通常包含组总计和其他组总结性信息。
报表布局实际上并不排序数据,它只是按它们在数据源中存在的顺序处理数据。因此,如果数据源是表,记录的顺序不一定适合于分组。当设置索引的 表、视图或查询作为数据源时,可以把数据适当排序来分组显示记录。排序必须使用视图、索引或布局外的其他形式的数据操作来完成。
1.添加单个数据分组
一个单组报表可以基于输入表达式进行一级数据分组。例如,对教师表按字段排序后,可以把组设在“职称”字段上来打印所有记录,相同职称的记录在一起打印。
添加单个数据分组的步骤如下:
从快捷菜单或“报表”菜单中,选择“数据分组”。出现“数据分组”对话框。
(1)这里的属性设置包括打印标头和注脚文本来区别各组,在新的一页上打印每一组,当某组在新页上开始打印时,重置页号。
对话框选项意义如下:
①分组表达式。显示当前报表的分组表达式,如字段名,并允许输入新的字段名。如果想创建一个新的表达式,可选择对话按钮,显示“表达式生成器”对话框。
②组属性。此属性用以指定如何分页。
③每组从新的一列上开始。当组改变时,从新的一列上开始。
④每组从新的一页上开始。当组改变时,从新的一页上开始。
⑤每组的页号重新从1开始。当组改变时,组在新页上开始打印,并重置页号。
⑥每页都打印组标头。当组分布在多页上时,指定在所有页的页标头后打印组标头。
⑦小于右值时组从新的一页上开始。要打印组标头时,组标头距页底的最小距离。
⑧插入。在“分组表达式”框中插入一个空文本框,以便定义新的分组表达式。
⑨删除。从“分组表达式”框中删除选定的分组表达式。
(2)在第一个“分组表达式”框内键人分组表达式。或者选择对话按钮,在“表达式生成器”对话框中创建表达式。
(3)在“组属性”区域,选定想要的属性。
(4)选择“确定”按钮。
添加表达式后,可以在带区内放置任意需要的控件。通常,把分组所用的域控件从“细节”带区移动到“组标头”带区。
2.添加多个数据分组
有时需要对报表进行多个数据分组,如在打印教师花名册时在用“所在部门”分组的基础上,还想按职称分组,这也称为嵌套分组。嵌套分组有助于组织不同层次的数据和总计表达式。在报表内最多可以定义20级的数据分组。
添加多个数据分组步骤如下:
(1)从“报表”菜单中,选择“数据分组”。出现“数据分组”对话框。
(2)在第一个“分组表达式”框内键人分组表达式。或者选择对话按钮,在“表达式生成器”对话框中创建表达式。
(3)在“组属性”区域,选择所需的属性。
(4)选择“插入”并且对每个分组表达式重复2、3步。
(5)选择“确定”按钮。
注意:在选择一个分组层次时,要先估计一下分组值的可能更改的频度,然后定义最经常更改的组为第一层。例如,报表可能需要一个按省份的分组和一 个按城市的分组。城市字段的值比省份字段更易更改,因此,城市应该是两个组中的第一个,省份就是第二个。在这个多组报表内,表必须在一个关键值表达式上排 序或索引过,例如:省份+城市。
还可以对添加的单个或多个数据组进行更改分组设置,包括更改组带区、删除组带区、更改分组次序等操作。
VFP编程:VFP报表输出
设计报表的最终目的是要按照一定的格式输出符合要求的数据。报表文件的扩展名为.frx,该文件存储报表设计的详细说明。每个报表文件还带有扩展名为.frt的报表文件。报表文件不存储每个数据字段的值,只存储数据源的位置和格式信息。
报表文件按数据源中记录出现的顺序处理记录,如果直接使用表内的数据,数据就不会在布局内正确地按组排序。因此,在打印一个报表文件之前,应确认数据源中已对数据进行了正确排序。一般,建议报表的数据源使用视图或查询文件。
报表输出时,应该先进行页面设置,通过预览报表调整版面效果,最后再打印输出到纸介质上。
1.页面设置
规划报表时,通常会考虑页面的外观。例如页边距,纸张类型和所需的布局。在“页面设置”对话框中可以设置报表的左边距并为多列报表设置列宽和列间距,设置纸张大小和方向,步骤如下:
(1)从“文件”菜单中,选择“页面设置”,出现“页面设置”对话框。
(2)在“左页边距”框中输入一个边距数值。页面布局将按新的页边距显示。
(3)若要选择纸张大小,选择“打印设置”。
(4)在“打印设置”对话框中,从“大小”列表中选定纸张大小。
(5)若要选择纸张方向,从“方向”区选择一种方向,再选择“确定”。
(6)在“页面设置”对话框中,选择“确定”。
在更改了纸张的大小和方向设置时,需要注意该纸张大小是否可以设置所选的方向。例如,如果纸张定为信封,则方向必须设置为横向。
2.预览报表
通过预览报表,不用打印就能看到它的页面外观。例如,可以检查数据列的对齐和间隔,或者查看报表是否返回所需的数据。有两个选择:显示整个页面或者缩小到一部分页面。
“预览”窗口有它自己的工具栏,使用其中的按钮可以逐页地进行预览。步骤如下:
(1)从“显示”菜单中选择“预览”命令,或在“报表设计器”中单击鼠标右键并从弹出的快捷菜单中选择“预览”命令,也可以直接单击“常用”工具栏中的“打印预览”按钮。
(2)在打印预览工具栏中,选择“上一页”或“前一页”来切换页面。
(3)若要更改报表图象的大小,选择“缩放”列表。
(4)若要打印报表,选择“打印报表”按钮。
(5)若想要返回到设计状态,选择“关闭预览”按钮。
注意:如果得到如下提示“是否将所做更改保存到文件?”那么,在选定关闭“预览”窗口时一定还选取了关闭布局文件。此时可以选定“取消”按钮回到“预览”,或者选定“保存”按钮保存所做更改并关闭文件。如果选定了“否”,将不保存对布局所做的任何更改。
3.打印输出
使用报表设计器创建的报表布局文件只是一个外壳,它把要打印的数据组织成令人满意的格式。如果使用预览报表,在屏幕上获得最终符合设计要求的页面后,就要打印出来。步骤如下:
(1)从“文件”菜单中选择“打印”命令,或在报表设计器中单击鼠标右键并从弹出的快捷菜单中选择“打印”命令,也可以直接单击“常用”工具栏中的“运行”按钮,出现“打印”对话框。
(2)在“打印”对话框中,设置合适的打印机、打印范围、打印份数等项目,通过“属性”设置打印纸张的尺寸、打印精度等。
(3)选择“确定”按钮。Visual FoxPro就会把报表发送到打印机上。
如果未设置数据环境,则会显示“打开”对话框,并在其中列出一些表,从中可以选定要进行操作的一个表。
在命令窗口或程序中使用REPORT FORM(报表文件名>[PREVIEw]命令也可以打印或预览指定的报表。
VFP编程:VFP标签设计
标签是一种特殊的报表,它的创建、修改方法与报表基本相同。和创建报表一样,可以使 用标签向导创建标签,也可以直接使用标签设计器创建标签。无论使用哪种方法来创建标签,都必须指明使用的标签类型,它确定了标签设计器中的“细节”尺寸。标签设计器是报表设计 器的一部分,它们使用相同的工具菜单和工具栏,甚至有的界面名称都一样。主要的不同是标 签设计器基于所选标签的大小自动定义页面和列。
若要快速创建一个简单的标签布局,可以和报表设计器中那样在“报表”菜单中选择“快速 报表”命令。“快速报表”提示输入创建标签所需的字段和布局。这里只简要介绍一下如何用标签设计器创建标签。
在“文件”菜单中选择“新建”,在“新建’’对话框中选定“标签”并单击“新建文件’’按钮。显示“新建标签”对话框。标准标签纸张选项出现在“新建标签”对话框中.列表框中提供了几十种型号的标签,每种型号的后面列出了其高度、宽度和列数。标签向导提供了多种标签尺寸,分为英制和公制两种。
从“新建标签”对话框中,选择标签布局,然后选定“确定”按钮,出现标签设计器窗口。
标签设计器将出现刚选择的标签布局所定义的页面,默认情况下,标签设计器显示5个报表带区:页标头、列标头、细节、列注脚和页注脚,还可在标签上添加组标头、组注、脚标题、总结带区。
接着就可以像处理报表一样在标签设计器中给标签指定数据源并插入控件。
VFP中BROWSE语句的妙用
运用BROWSE语句进行查询时,常常会碰到这样的情况:由于字段太多或者太长,一屏往往放不下。如果要查超过一屏的部分,只能用回车键一个字段 一个字段地移,当后面的字段移入屏幕时,前面的字段就移出屏幕。但用户有时可能需要在屏幕上保持某些信息,例如姓名,当其它字段移入或移出屏幕时它们应该 始终出现在屏幕上。
BROWSE提供了LOCK选项完成这一功能。但这样一来,BROWSE窗口被分割成左右两部分,不好看。而且,只能一个字段一个字段地移,很不方便。
笔者设计了一种方法,能巧妙实现BROWSE语句的左右翻屏。
实现方法是定义二个功能键F5、F6,F6进行左移,F5进行右移,当功能键被触发时执行KEYBOARD CHR(23)语句,相当于按了CTRL+W键,退出当前BROWSE,然后再重新定义另一个BROWSE。
用上述方法完全退出BROWSE,避免了BROWSE的嵌套问题。否则,切换来切换去,嵌套一深,容易出问题。
上述方法操作方便,而且对用户是完全透明的。下面举一例子说明。人事档案数据库包括姓名、性别、出生日期、职务、职称、党派、籍贯、所属部门、家庭地址、邮编、联系电话、备注等数据项,查询时一屏显示不下,于是分两屏显示,第一屏为:
┌────┬──┬────┬────┬─────┬───┬────┬─────┐
│ 姓 名 │性别│出生日期│ 职 务 │ 职 称 │ 党派 │ 籍 贯 │ 所属部门 │
├────┼──┼────┼────┼─────┼───┼────┼─────┤
│ 张 三 │ 男 │70.01.28│ │ 工程师 │共产党│上海 │软件一室 │ │ 李 四 │ 女 │58.12.01│副所长 │高级工程师│ │广东广州│ │
│ 王 五 │ 男 │44.03.12│室主任 │副研究员 │民盟 │北京 │软件二室 │
│.....│..│......│....│.....│...│....│.......│ │.....│..│......│....│.....│...│....│.......│ │.....│..│......│....│.....│...│....│.......│ └────┴──┴────┴────┴─────┴───┴────┴─────┘
按F6键后切换为第二屏,第二屏为:
┌────┬───────────┬───┬───────┬─────────┐
│ 姓 名 │ 家庭地址 │邮 编 │ 联系电话 │ 备 注 │
├────┼───────────┼───┼───────┼─────────┤
│ 张 三 │广州市天河路34号 │510075│87769602-3806 │全国劳动模范 │ │ 李 四 │广州市天河路34号311房 │510075│87769602-3706 │ │ │ 王 五 │广州市解放路14号301房 │510043│88888888 │学术委员会委员 │
│.....│..│.....│....│.....│ │.....│..│.....│....│.....│ │.....│..│.....│....│.....│ 泤程序如下:
USE person @0,26 SAY “人员基本情况浏览” DEFINE WINDOW CONTENT FROM 2,0 TO 22,79 FOOTER “ Esc--退出,F5--左翻,F6--右翻 ” ACTIVATE WINDOW content ON KEY LABEL F5 DO pan WITH “F5” ON KEY LABEL F6 DO pan WITH “F6” con_var=1 DO WHILE.T.DO CASE CASE con_var=0 EXIT CASE con_var=1 DO right CASE con_var=2 DO left ENDCASE ENDDO NOTE 定义一个控制变量con_var,con_var为1时为预设状态,显示第一屏; NOTE 按F6键时con_var为2,显示第二屏; NOTE 按ESC键时con_var为0,退出。ON KEY LABEL F5 ON KEY LABEL F6 USE RELEASE WINDOW content RETURN
PROC pan PARA con KEYBOARD CHR(23)DO CASE CASE con=“F5” con_var=1 CASE con=“F6” con_var=2 ENDCASE RETURN PROC left BROW FIELDS name:H=“姓名”,sex:H=“性别”,birth:H=“出生日期”,leader:H=“职务”,;profe:H=“职称”,party:H=“党派”,native:h=“籍贯”,dept:h=“所属部门”;IN WINDOW content NODELETE NOAPPEND NOEDIT COLOR SCHEME 10 IF LASTKEY()=27 con_var=0 ENDIF RETURN PROC right BROW FIELDS name:H=“姓名”,addre:H=“家庭地址”,zip:H=“邮编”,telephone:H=“电话”;note:H=“备注”;IN WINDOW content NODELETE NOEDIT NOAPPEND COLOR SCHEME 10 IF LASTKEY()=27 con_var=0 ENDIF RETURN
VFP进行分布式查询
Microsoft SQL Server 7.0 提供了执行基于 OLE DB providers 的查询的能力.这是靠使用 OpenQuery 或 OpenRowset Transact-SQL 函数或使用包含一个已连接名四部查询来执行的.例如:
sp_addlinkedserver ’mylinkedserver’, ’product_name’, ’myoledbprovider’, ’data_source’,’location’, ’provider_string’, ’catalog’
Select * FROM OPENQUERY(mylinkedserver, ’select * from table1’)
可以用 Microsoft OLE DB provider for ODBC(MSDASQL)和 Visual FoxPro ODBC driver 来设置一个已连接服务器(linked server)来执行基于
FoxPro.dbc 和.dbf 文件的分布式查询.不支持用 Jet OLEDB Provider 和 FoxPro.以下 T-SQL 示例代码演示如何用 OpenQuery 和 OpenRowset 函数设置和使用分布式查询 FoxPro.它也演示了如何从 SQL Server 更新一个远程
FoxPro 表.你可以在一个 SQL Server 7.0 机器上安装了 Visual FoxPro ODBC driver 后, 在 SQL Query Analyzer 中测试这些代码.你需要改变数据源名和路径到适当的 FoxPro 文件:
/* OPENROWSET 和 OPENQUERY 示例.以 VFP 通过 ODBC OLE DB provider */
/* 这些 OPENROWSET 示例依赖于示例文件 VFP98dataTestdata.dbc
如果你的数据在不同的位置请修改你的代码 */
--======--使用 DBC 文件 , 读和更新
--======--OPENROWSET DSN-le 示例
select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro Driver;SourceDB=e:VFP98dataTestdata.dbc;SourceType=DBC’,’select * from customer where country!= “USA” order by country’)go select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro Driver;SourceDB=e:VFP98dataTestdata.dbc;SourceType=DBC’,’select * from customer where region=“WA”’)go Update openrowset(’MSDASQL’,’Driver=Microsoft Visual FoxPro Driver;SourceDB=e:VFP98dataTestdata.dbc;SourceType=DBC’,’select * from customer where region=“WA”’)set region = “Seattle” go
--check to verify which rows were updated
select * from openrowset(’MSDASQL’,’Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:VFP98dataTestdata.dbc;
SourceType=DBC’,’select * from customer where region=“Seattle”’)
go
--OPENROWSET DSN 示例
/* 注意:如果 SQL Server 是配置为使用本地帐号 DSN 示例可能失败.*/ select * from openrowset(’MSDASQL’, ’DSN=Visual FoxPro Database;
SourceDB=e:VFP98dataTestdata.dbc;SourceType=DBC’,’select * from customer where country!= “USA” order by country’)go
/* sp_addlinkedserver 示例 */
--sp_addlinkedserver example with DSN
/* 你需要生成一个 DSN 并使它指向 Testdata 数据库.修改你的代码以反映 DBC 位置 */
/* 注意:如果 SQL Server 是配置为使用本地帐号 DSN 示例可能失败.*/ sp_addlinkedserver ’VFP Testdata Database With DSN’, ’’,’MSDASQL’,’VFP System DSN’ go
sp_addlinkedsrvlogin ’VFP Testdata Database With DSN’, FALSE, NULL, NULL, NULL
go
Select *
FROM OPENQUERY([VFP Testdata Database With DSN], ’select * from customer where region = “Seattle” ’)
go
--Update using OpenQuery
Update OPENQUERY([VFP Testdata Database With DSN], ’select * from customer where region=“WA”’)
set region = “Seattle”
go
/* SP_addlinkedserver example with DSN-le connection */
/* This example also depends on the sample files Testdata.dbc
Modify your code accordingly for differences in location or DBC name */
sp_addlinkedserver ’VFP Testdata Database With No DSN’,’’,’MSDASQL’,NULL,NULL,’Driver={Microsoft Visual FoxPro Driver};UID=;PWD=;SourceDB=e:VFP98dataTestdata.dbc;SourceType=DBC;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;’
go
sp_addlinkedsrvlogin ’VFP Testdata Database With No DSN’, FALSE, NULL, NULL, NULL
go
Select *
FROM OPENQUERY([VFP Testdata Database With No DSN], ’select * from customer where country!= “USA” order by country’)go
--======
--使用 VFP 6.0 driver, read and update data from VFP sample dbf files
--======
--OPENROWSET DSN-le example
select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro Driver;SourceDB=e:VFP98data;SourceType=DBF’,’select * from customer where country!= “USA” order by country’)go
--perform Update
Update openrowset(’MSDASQL’,’Driver=Microsoft Visual FoxPro Driver;SourceDB=e:VFP98data;SourceType=DBF’,’select * from customer where region=“Seattle”’)set region = “WA” go
--verify update
select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro Driver;SourceDB=e:VFP98data;SourceType=DBF’,’select * from customer where region = “WA”’)go
--OPENROWSET DSN example
--DSN points to the folder where.dbf files are./* Note this Example may fail if SQL Server is configured to use a local account.*/
select * from openrowset(’MSDASQL’,’DSN=Visual FoxPro Tables;
SourceDB=e:VFP98data;
SourceType=DBF’,’select * from customer where country!= “USA” order by country’)
go VisualFoxpro报表打印程序代码
数据库报表程序是经常使用的,现在很多用户都使用报表设计器设计报表,且简单方便;但笔者在工作中遇到要对成百个数据库打印的情况,这些数据库除了字段名不相同外,其他结构信息基本相同,因此笔者就编制了如下的一个通用程序,供同行参考。set talk off hh1=printstatus()set print on do while.not.hh1 ?“打印机未准备好,请准备好打印机” hh1=printstatus()enddo set talk off set device to print clear a1=getfile(“dbf”)&&打开打开文件对话框 use “&a1” &&打开指定的文件
n1=fcount()&&获取打开的库中的字段数
dimension a(n1)&&定义一个存放字段名的数组 dimension b(n1)&&定义一个存放字段宽度的数组 k=1 do while k
if b(w)
b(w)=8 else
b(w)=b(w)+2 endif w=w+1 enddo do while not eof()r1=1 &&显示表头的第一行
m=1 col1=1 do while m
if m=1
@r1,col1 say “┌”+replicate(“-”,b(m))
else
if m=n1
@r1,col1 say “┬”+replicate(“-”,b(m))+“┐”
else
@r1,col1 say “┬”+replicate(“-”,b(m))
endif
endif
col1=col1+b(m)
m=m+1 enddo m=1 &&显示字段名行 col1=1 do while m
@r1+1,col1 say “∣”+substr(a(m),1,6)+replicate(“ ”,(b(m)-len(a(m))))else
if m=n1
@r1+1,col1 say “∣”+substr(a(m),1,6)+replicate(“ ”,(b(m)-len(substr(a(m),1,6))))+“∣”
else
@r1+1,col1 say “∣”+substr(a(m),1,6)+replicate(“ ”,(b(m)-len(substr(a(m),1,6))))
endif endif col1=col1+b(m)m=m+1 enddo m=1 &&由于字段多,一行不能完全显示整个行,因此分为两行显示字段名行 col1=1 do while m
@r1+2,col1 say “∣”+substr(a(m),7)
else
if m=n1
@r1+2,col1 say “∣”+substr(a(m),7)+replicate(“ ”,(b(m)-len(substr(a(m),7))))+“∣”
else
@r1+2,col1 say “∣”+substr(a(m),7)
endif endif col1=col1+b(m)m=m+1 enddo m=1 &&显示字段名下面的一行表格线 col1=1 do while m
@r1+3,col1 say “├”+replicate(“-”,b(m))else
if m=n1
@r1+3,col1 say “┼”+replicate(“-”,b(m))+“┤”
else
@r1+3,col1 say “┼”+replicate(“-”,b(m))
endif endif col1=col1+b(m)m=m+1 enddo row1=r1+4 do while.not.eof()&&每页显示20个记录
m=1 &&显示各记录的值
col1=1 do while m
if type(a(m))=“C”
if m=1
@row1,col1 say “∣”+&a(m)
else
if m=n1
@row1,col1 say “∣”+alltrim(&a(m))+replicate(“ ”,(b(m)-len(alltrim(&a(m)))))+“∣”
else
@row1,col1 say “∣”+&a(m)
endif
endif
else
if m=1
@row1,col1 say “∣”+str(&a(m))
else
if m=n1
@row1,col1 say “∣”+alltrim(str(&a(m)))+replicate(“ ”,(b(m)-len(alltrim(str(&a(m))))))+“∣”
else
@row1,col1 say “∣”+alltrim(str(&a(m)))
endif
endif
endif
col1=col1+b(m)
m=m+1 enddo SKIP if eof()
&&显示数据库结束的最后一行
m=1
col1=1
do while m
if m=1
@row1+1,col1 say “└”+replicate(“-”,b(m))
else
if m=n1
@row1+1,col1 say “┴”+replicate(“-”,b(m))+“┘”
else
@row1+1,col1 say “┴”+replicate(“-”,b(m))
endif
endif
col1=col1+b(m)
m=m+1
enddo
h=“.f.”
exit else
if r1=20 &&显示每一页的最后一行
m=1
col1=1
do while m
if m=1
@row1+1,col1 say “└”+replicate(“-”,b(m))
else
if m=n1
@row1+1,col1 say “┴”+replicate(“-”,b(m))+“┘”
else
@row1+1,col1 say “┴”+replicate(“-”,b(m))endif
endif
col1=col1+b(m)
m=m+1
enddo
r1=1
eject
exit
else
m=1 &&显示每个记录下面的一行表格线
col1=1
do while m
if m=1
@row1+1,col1 say “├”+replicate(“-”,b(m))
else
if m=n1
@row1+1,col1 say “┼”+replicate(“-”,b(m))+“┤”
else
@row1+1,col1 say “┼”+replicate(“-”,b(m))
endif
endif
col1=col1+b(m)
m=m+1
enddo
endif
ENDIF
row1=row1+2
r1=r1+1
enddo && 每页显示20个记录到此
enddo
set print off
set device to screen set talk on return
以上程序将一个数据库中的所有记录以行为单位打印出来,编制环境是Visual Foxpro 6.0,如果一个数据库字段比较少,希望一行打印二个以上的记录,稍作修改即可。需要提醒读者的是,由于考虑到篇幅,本程序只设计了包含数字型和字符型的 数据库,对有其它类型的数据库,稍作修改就行了;如果用户希望一页的记录不是20,只需要修改if r1=20这句中r1的值。笔者已经编制了这类程序,可以向读者提供。
VFP模拟试题1。VFP是一种 ________ 模型的数据库管理系统。 选择:A.层次_ B.网络_C.对象_ D.关系 答案: D 2。对于二维表的关键字来讲,不一定存在的是 ________ 。选择:A.主关......
VFP 第1章关于数据库的基础知识1 数据库(DB):是存储在计算机存储设备上的结构化的相关数据集合。即是存放数据的仓库。2 数据库管理系统(DBMS):实现各种数据管理功能的核心软......
2002年9月全国计算机等级考试二级笔试试题Visual FoxPro 数据库程序设计一、选择题(每题2分,共70分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选......
计算机等级考试二级VF考点分析:VF基础知识1.1 数据库基础知识考点1 计算机数据管理的发展1数据与数据处理数据是指存储在某一种媒体上能够识别的物理符号。数据处理的中心问......
二级VF前三章命令汇总、数据库操作命令 1.新建数据库CREATEDATABASE XO &&XO数据库名 2.打开数据库OPEN DATABASEXO&&XO数据库名 3.设置当前数据库SETDATABASE TO XO &&把XO......
