VFP中一对一的工作关系蓝颜知己是什么意思思

非常全的vf实例编程(计算机二级Foxpro在VFP中模拟动画)_酷我资料网
当前位置: >>
非常全的vf实例编程(计算机二级Foxpro在VFP中模拟动画)
计算机二级 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;=4 I=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&=5 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 函数的命令主要是: DECLARE - DLL CLEAR DLLS 1.DECLARE - DLL 它用于注册外部 Windows 32 位动态链接库 ( .DLL ) 中 的一个函数。 语法: DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName] .......[cParamType1 [@] ParamName1, cParamType2 [@] ParamName2, ...] 说明: cFunctionType 指定该函数返回值的类型,其类型代码如下: SHORT ????? 16 位整数 INTEGER ???? 32 位整数 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 释放所有利用 DECLARE - DLL 命令所装入的动态链接库。 ....一旦申明 WIN32API 函数成功,就可以和一般函数一样用 ?xxx()、 =xxx() 来调用。 ....下面以具体事例谈谈 win32api 在 Vfp 中的运用: 1.利用 win32api 函数获取指定磁盘的卷标: Stor 0 to C_var,C_cd,C_qf C_Var='c:\' DECLARE INTEGER GetVolumeInformation IN Win32API STRING @, STRING @, INTEGER,; INTEGER @, INTEGER @, INTEGER @, STRING @, INTEGER xx=GetVolumeInformation(C_Var,&&,20,@C_var,@C_cd,@C_qf,0,0) CLEAR DLLS &&释放所有利用 DECLARE - DLL 命令所装入的动态链接库。 xx&&0 获取指定磁盘的卷标成功,反之则未成功。 C_var=指定磁盘的卷标,是个十进制的数值,与我们在 DOS 下看到的 16 进 制不同。 C_cd=系统规定的文件名每一部分的长度,是个十进制的数值。 C_qf=文件名的大小写标志,是个十进制的数值。 怎么样很简单吧,我们可以把获取的磁盘卷标,用来加密我们的软件,这样 我们的 软件就具有防拷贝的功能了。将 DBF 表导入到 SQLSERVER 中的函数给大家一个自已写的将 DBF 表导入到 SQL SERVER 数据库中的函数 我一直在我的程序中用,方便不少 请多多指都教,有什么问题可以回帖或邮
连接句柄为 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 RETUVFP 远程视图使用面面观摘要:远程视图是 Visual Foxpro 5.0 中开发 Client/Server 应用系统的基础, 本文首先介绍了远程视图有关参数的放置技巧,然后介绍如何去设计、使用远程 视图,最后讨论了使用远程视图的四个实际问题。 一、绪论 VFP 是一种较好的客户/ 服务器应用系统开发工具,用 VFP 开发 C/S 系统 的关键是如何访问远程数据( 远程服务器中的 Table/View)。 可以使用 VFP 提供 的 SQL Pass-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 Pass-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/Expression 的使用,使用它可构造出与源表字段不同的字段,如:T. 船名+‘’+T. 中文 AS 船舶。实践证明 Function/Expression 中不能使用双引号,而只能使用单引 号。 *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), 进港日 期)=‘’ 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 discussed. KEYWORDS: Remote view, Remote Data, Connection, Lock, buffering 一个很好的 c-s 主程序 * *
《星级酒店管理》系统 主程序 * * 作者:刘雪均 * * 版权所有 (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,pUserGr oup,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,p UserGroup,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.HelpS\Hotel.CHM If !File('MYDLL.DLL') Messagebox('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 SendMessage 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 Class To MyLibs Additive &&使用自已的类库 On Error Do Err_Fix With Error( ),Message( ),Message(1), Program( ),Lineno( ) &&错误跟踪处理 If !File(&&ExePath.LXJ.INI&) &&判断配置文件存在否,不存在就创建。 =WriteIni('REGISTRY','Local_Id',Str(DiskSpace(Sys(5),1)),'&ExePath.LX J.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(G etSerial(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')),GE TENV(&COMPUTERNAME&),ReadIni('CONNECT','SERVER','&ExePath.LXJ.INI')) sConn=sConn+','+Iif(Empty(ReadIni('CONNECT','PORTNO','&ExePath.LXJ.IN I')),'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.I NI')),'',JmWd(ReadIni('CONNECT','PWD','&ExePath.LXJ.INI'))) sConn=sConn+';DATABASE='+Iif(Empty(ReadIni('CONNECT','DATABASE','&Exe Path.LXJ.INI')),'NoDatabase',ReadIni('CONNECT','DATABASE','&ExePath.L XJ.INI')) sConn=sConn+';NetWork=DBMSSOCN' nConn=Sqlstringconnect(sConn) Wait Clear Do While nConn&=0 Local YN YN=Messagebox('SQL Server 数据库连接失败,请选择 !'+Chr(13)+Chr(13)+&Y -&重试 , 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() Messagebox('系统时间小于注册时间, 程序不可运行! ',16,'Information',3000) Quit Endif If MyCursor.EndTime&DATE() Messagebox('系统使用期限已到,请重新注册!',16,'Information',3000) Do Form RegServer.SCX Endif If MyCursor.EndTime&=Date()+7 Messagebox('1、 使用期限快到, 程序将在 '+Alltrim(MyCursor.EndTime)+' 后 终止运行,切记!'+Chr(13)+Chr(13)+'2、请尽快同 刘雪均 联系 (E-MAIL:),谢谢!',64 ,'系统提示') Endif Else Messagebox('注册信息查询失败,请等会重试!',16,'Information',3000) =SQLDisConnect(0) Quit Endif Else Messagebox('后台数据库连接失败,请等会重试!',16,'Information',3000) =SQLDIsConnect(0) Quit Endif If Empty(pCompany) cTitle=&【 星 级 酒 店 管 理 系 统 】& Else cTitle=&【 &pCompany. --- 酒店管理系统 】& Endif m.LNHWND=FindWindow(0,cTitle) If m.LNHWND&&0 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 OFBLX&800 Or (Upper(ReadIni('SCREEN','SourceXY','&ExePath.LXJ.INI'))='YES' And OFBLX&&800) 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 nConn&=0 SQLDIsConnECT(0) nConn=Sqlstringconnect(sConn) Endif Try SQLEXEC(nConn,'') Catch nConn=-1 Finally If nConn&=0 nConn=Sqlstringconnect(sConn) Endif Endtry If nConn&0 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 Messagebox('后台数据库连接失败,时间同步无效!',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]&60000 Set Textmerge Delimiters To Set Textmerge On Set Textmerge To &ExePath.ERRORS\SQLERRLOG.TXT Noshow \&& && 错误记录 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.ERRORS\SQLERRLOG.txt') LCUSER=pUserId-'/'-pUserName If IsConn() SQLEXEC(nConn,'INSERT INTO SYSERROR (WORKSTATION,USERNAME,ERRORDATE,ERRORLOG) valueS (?SYS(0),?lcUSER,GETDATE(),?lcERRORLOG)') Endif Messagebox(SQLERROR[2],16,'SQL Error '+Transform(SQLERROR[1])) Else Messagebox(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.LX J.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 EndprocVFP 编程: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 号 │6 │全国劳动模范 │ │ 李 四 │广州市天河路 34 号 311 房 │6 │ │ │ 王 五 │广州市解放路 14 号 301 房 │888888 │学术委员会委员 │ │ ..... │ .. │..... │ .... │ ..... │ │ ..... │ .. │..... │ .... │ ..... │ │ ..... │ .. │..... │ .... │ ..... │ 程序如下: 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 RETURNPROC 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=& 职务&,; profess: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=&姓名&,address:H=&家庭地址&,zip:H=&邮编 &,telephone:H=&电话&; note:H=&备注&; IN WINDOW content NODELETE NOEDIT NOAPPEND COLOR SCHEME 10 IF LASTKEY()=27 con_var=0 ENDIF RETURNVFP 进行分布式查询Microsoft SQL Server 7.0 提供了执行基于 OLE DB providers 的查询的能力. 这是靠使用 OpenQuery 或 OpenRowset Transact-SQL 函数或使用包含一个已 连接名四部查询来执行的. 例如:sp_addlinkedserver ’mylinkedserver’, ’product_name’, ’myoledbpro vider’, ’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 示例依赖于示例文件 VFP98\data\Testdata.dbc 如果你的数据在不同的位置请修改你的代码 */ --==================================================== -- 使用 DBC 文件 , 读和更新 --==================================================== -- OPENROWSET DSN-less 示例 select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro D SourceDB=e:\VFP98\data\Testdata. SourceType=DBC’, ’select * from customer where country != &USA& order by country’) go select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro D SourceDB=e:\VFP98\data\Testdata. SourceType=DBC’, ’select * from customer where region=&WA&’) go Update openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro D SourceDB=e:\VFP98\data\Testdata. 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 D SourceDB=e:\VFP98\data\Testdata. SourceType=DBC’, ’select * from customer where region=&Seattle&’) go -- OPENROWSET DSN 示例 /* 注意:如果 SQL Server 是配置为使用本地帐号 DSN 示例可能失败.*/ select * from openrowset(’MSDASQL’, ’DSN=Visual FoxPro D SourceDB=e:\VFP98\data\Testdata. 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-less 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:\VFP98\data\Testdata.SourceType=DBC; Exclusive=No;BackgroundFetch=YCollate=M’ 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-less example select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro D SourceDB=e:\VFP98\ SourceType=DBF’, ’select * from customer where country != &USA& order by country’) go -- perform Update Update openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro D SourceDB=e:\VFP98\ SourceType=DBF’, ’select * from customer where region=&Seattle&’) set region = &WA& go -- verify update select * from openrowset(’MSDASQL’, ’Driver=Microsoft Visual FoxPro D SourceDB=e:\VFP98\ 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 T SourceDB=e:\VFP98\ SourceType=DBF’, ’select * from customer where country != &USA& order by country’) goVisualFoxpro 报表打印程序代码数据库报表程序是经常使用的,现在很多用户都使用报表设计器设计报表,且简 单方便;但笔者在工作中遇到要对成百个数据库打印的情况,这些数据库除了字 段名不相同外, 其他结构信息基本相同, 因此笔者就编制了如下的一个通用程序, 供同行参考。 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&=n1 a(k)=field(k) k=k+1 enddo &&将字段名赋给数组 w=1 do while w&=n1 b(w)=fsize(a(w)) &&获取字段的长度 if b(w)&6 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&=n1 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&=n1 if m=1 @r1+1,col1 say &O&+substr(a(m),1,6)+replicate(& &,(b(m)-len(a(m)))) else if m=n1 @r1+1,col1 say &O&+substr(a(m),1,6)+replicate(& &,(b(m)-len(substr(a(m),1,6))))+&O& else @r1+1,col1 say &O&+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&=n1 if m=1 @r1+2,col1 say &O&+substr(a(m),7) else if m=n1 @r1+2,col1 say &O&+substr(a(m),7)+replicate(& &,(b(m)-len(substr(a(m),7))))+&O& else @r1+2,col1 say &O&+substr(a(m),7) endif endif col1=col1+b(m) m=m+1 enddo m=1 &&显示字段名下面的一行表格线 col1=1 do while m&=n1 if m=1 @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&=n1 if type(a(m))=&C& if m=1 @row1,col1 say &O&+&a(m) else if m=n1 @row1,col1 say &O&+alltrim(&a(m))+replicate(& &,(b(m)-len(alltrim(&a(m)))))+&O& else @row1,col1 say &O&+&a(m) endif endif else if m=1 @row1,col1 say &O&+str(&a(m)) else if m=n1 @row1,col1 say &O&+alltrim(str(&a(m)))+replicate(& &,(b(m)-len(alltrim(str(&a(m))))))+&O& else @row1,col1 say &O&+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&=n1 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&=n1 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&=n1 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 二级 VFP 上机练习题 1 1、数据库和表的基本操作 建立一个计算机考试成绩管理数据库,文件名为 CJGL.DBC,并输入数据。该数据库中 有两个数据表:学生信息表(XS.DBF)和学生成绩表(CJ.DBF)。其数据形式如下: 学生信息表(XS.DBF) 考号 姓名 考号 笔试成绩 学生成绩表(CJ.DBF) 上机成绩 成绩合格否 06 13李萍 黄程 王军 周小丽 程成 张伟09 0486 45 91 74 79 57优 缺考 优 及格 不及格 及格.F. .F. .F. .F. .F. .F.要求:将数据库(CJGL.DBC)中的 XS.DBF(父表)和 CJ.DBF(子表)以“考号”建立一对一 的永久关系。 2、程序设计 建立程序文件 COM-SQL711.PRG, 要求将完成下列各小题任务的 VFP 数据表操作命令 或 VFP-SQL 命令写在该程序文件中。在程序首行用注释语句注明姓名和准考证号,并用注 释语句标注小题号。 (1)正确修改每个学生的“成绩合格否”字段,并填入学生成绩表 CJ.DBF 中。规定笔试 成绩&60 或上机成绩为“缺考”或“不及格”,则该字段值为.F.,否则为.T.; (2)在学生成绩表 CJ.DBF 中,查询并显示成绩合格学生的考号、姓名、笔试成绩和上机 成绩; (3)逻辑删除学生成绩表 CJ.DBF 中上机考试缺考的学生。 3、表单设计 按以下要求设计程序界面,表单文件名为 FORM711.SCX。设计如图所示的―个表单, 包括 4 个标签, 个文本框, 个命令按钮(各控件的大小、 3 1 颜色、 字体、 字号等属性由自定)。 其中: (1)表单顶部的标签用来显示学生自己的姓名和考号; (2)文本框 text1、text2 和 text3 的显示初值为 0: (3)该表单运行后,可以在文本框 text1、text2 中输入成绩(0~100),左键单击“计算” 命令按钮,则在文本框 text3 中显示平均成绩,要求保留一位小数;(4)双击表单任意空白 处,结束表单程序的运行。 二级 VFP 上机练习题 1 参考答案 2. (1) VFP 命令:USE CJ REPLACE ALL 成绩合格否 WITH .T. FOR 笔试成绩&=60 AND (上机成绩=“及格” OR 上机 成绩=“优”) SQL 命令:UPDATE CJ SET 成绩合格否=.T. WHERE 笔试成绩&=60 AND (上机成绩=“及格” OR 上机成绩=“优”) (2) VFP 命令:SELECT 1 USE XS INDEX ON 考号 TAG KH SELECT 2 USE CJ SET RELATION TO 考号 INTO XS LIST 考号,XS.姓名,笔试成绩,上机成绩 FOR 成绩合格否=.T. SQL 命令:SELECT XS.考号,姓名,笔试成绩,上机成绩 FROM XS,CJ WHERE XS.考 号=CJ.考号 AND 成绩合格否=.T. (3)VFP 命令:USE CJ DELETE FOR 上机成绩=“缺考” SQL 命令:DELETE FROM CJ WHERE 上机成绩=“缺考” 3.主要属性、事件代码: 1)text1 、text2 和 text3 的 value 属性值均为 0 2)“计算”按钮的 Click 事件代码: x1=thisform.text1.value x2=thisform.text2.value thisform.text3.value=round((x1+x2)/2,1) 3)Form1 的 DblClick 事件代码:thisform.release二级 VFP 上机练习题 2 1、数据库和表的基本操作 建立一个工资管理数据库,文件名为 GZGL.DBC,并输入数据。该数据库中有两个数 据表:职工数据表(ZGB.DBF)和工资数据表(GZB.DBF)。其数据形式如下: 职工数据表 ZGB.DBF 职工号 姓名 婚否 职称 职工号 基本工 资 020365 周尔 杰 020528 王怡 .T. 技术 员 010234 李莉 .F. 技术 员 020458 刘长 新 020636 郑然 .F. .T. 工程 师 工人 .00 143.0 98 70 8.00 302.0 156 160 6.00 223.0 115 120 2.00 283.0 144 140 .T. 工人 .00 213.5 115 工资数据表 GZB.DBF 津贴 奖金 公积 金 90 实发工 资要求:将数据库 GZGL.DBC 中的 ZGB.DBF(父表)和 GZB.DBF(子表)以“职工号”建立 一对一的永久关系。 2、程序设计 建立程序文件 COM-SQL712.PRG, 要求将完成下列各小题任务的 VFP 数据表操作命令 或 VFP-SQL 命令写在该程序文件中。在程序首行用注释语句注明学生姓名和准考证号,并 请用注释语句标注小题号。 (1)计算每个职工的“实发工资”字段,并填入工资数据表 GZB.DBF 中。其中: 实发工资=基本工资+津贴+奖金-公积金; (2)显示未婚职工的职工号、姓名、基本工资和实发工资; (3)计算工资表 GZB 中所有职工的平均奖金和实发工资总额。 3、表单设计 按以下要求设计程序界面,表单文件名为 FORM712.SCX。设计如图所示的一个表单, 包括 4 个标签、3 个文本框、1 个命令按钮(各控件的大小、颜色、字体、字号等属性由学生 自定)。其中: (1)表单项部的标签用来显示学生自己的姓名和考号; (2)文本框 text1、text2 和 text3 的显示初值为 0; (3)该表单运行后,可以在文本框 text1 中输入圆的半径(&0),光标移到文本框 text2、 text3 时,可以分别计算圆的面积和圆的周长,要求保留两位小数。 (4)左键单击“关闭”按钮,结束表单程序的运行。 4、表单设计 按以下要求设计程序界面,表单程序文件名为 MyForm.SCX。 建立一个默认尺寸的表单,包括两个按钮。其功能是: 按住“显示”按钮,在标签上显示“新年好”,松开“显示”按钮,则在标签中显示 “Happy New Year”; 按住“退出”按钮,则结束表单程序的运行。 松开“显示”按钮时 按住“显示”按钮时二级 VFP 上机练习题 2 参考答案 2. (1)VFP 命令:USE GZB REPLACE ALL 实发工资 WITH 基本工资+津贴+奖金-公积金 SQL 命令:UPDATE GZB SET 实发工资=基本工资+津贴+奖金-公积金 (2) VFP 命令:SELECT 1 USE ZGB INDEX ON 职工号 TAG ZGH SELECT 2 USE GZB SET RELATION TO 职工号 INTO ZGB LIST 职工号,ZGB.姓名,基本工资,实发工资 FOR NOT ZGB.婚否 CLOSE ALL SQL 命令:SELECT GZB.职工号,姓名,基本工资,实发工资 FROM ZGB,GZB WHERE ZGB.职工 号=GZB.职工号 AND NOT ZGB.婚否 (3)VFP 命令:USE GZB CALCULATE AVG(奖金),SUM(实发工资) TO A,B ?”平均奖金:”,A,” 实发工资总额:”,B SQL 命令:SELECT AVG(奖金) AS 平均奖金,SUM(实发工资) AS 实发工资总额 FROM GZB 3. 主要属性、事件代码: 1)text1 、text2 和 text3 的 value 属性值均为 0 2)text2 的 GotFocus 事件代码: x1=thisform.text1.value this.value=round(3.1,2) 3)text3 的 GotFocus 事件代码: x2=thisform.text1.value this.value=round(2*3.1) 4)“关闭”按钮的 Click 事件代码:thisform.release 4. [Command1.MouseDown Event] LPARAMETERS nButton, nShift, nXCoord, nYCoord ThisForm.Label1.caption=&新年好& [Command1.MouseUp Event] LPARAMETERS nButton, nShift, nXCoord, nYCoord ThisForm.Label1.caption=&Happy New Year& 二级 VFP 上机练习题 3 1、建立一个产品销售管理数据库,文件名为 db811.DBC,并输入数据 该数据库中有两个数据表:营销员数据表(YX.DBF)和产品销售记录表(XS.DBF)。其数 据形式如下: 营销员数据表(YX.DBF) 营销员 姓名 职务 工作日期 产品编号 产品销售记录表(XS.DBF) 营销员 数量 单价 销售 编号 23
张曙光 李解放 王新华 经理 主管 主管
589-5 589-5 589-0编号 78 23 300 98 100 134 56 76 9.45 9.45 0.34月份 2 3 4 3 2 3段德昌 办事员 赵跃望 办事员要求:将数据库中的 YX.DBF(父表)和 XS.DBF(子表)以“营销员编号”建立一对多的永 久关系。 2、建立程序文件 COM-SQL811.PRG,要求将完成下列各小题任务的 VFP 数据表操作命令 或 VFP-SQL 命令写在该程序文件中。在程序首行用注释语句注明考生姓名和准考证号,并 用注释语句标注小题号。 (1)查询单笔销售数量最大的营销员姓名和职务; (2))查询全部职务为“主管”的营销人员的产品销售明细,包括姓名、产品编号、销 售金额和月份; (3)按“销售月份”分组汇总销售金额。 3、表单设计。按以下要求设计程序界面,表单文件名为 FORM811.SCX 设计如图所示一个表单,包括 2 个标签,1 个文本框(各控件的主要属性参照图形尺寸 自定)。其中: (1)表单的标题还要显示考生自己的姓名和考号; (2)该程序的作用是输入月份值,显示对应季节的中文名字; (3)要求检查输入的数值是否在 1~12 区间,如果超出,要报错,等待下一次正确录 入,不退出程序; (4)双击表单任意空白处,结束表单程序的运行。 二级 VFP 上机练习题 3 参考答案 2. 1)SELECT TOP 1 XS.营销员编号,YX.姓名,职务 ;FROM YX INNER JOIN XS ON XS.营销员编号=YX.营销员编号 ; ORDER BY 数量 DESC 2)SELECT YX.姓名,产品编号,数量*单价 AS 销售金额,销售月份; FROM YX INNER JOIN XS ON XS.营销员编号=YX.营销员编号 ; WHERE XS.营销员编号= ANY (SELE YX.营销员编号 FROM YX WHERE 职务='主管') 3)select 数量*单价 AS 销售金额,销售月份 ; from xs group by 销售月份3. 界面设计,主要属性、事件代码: text1.valid n=val(thisform.text1.value) if n&0 or n&12 wait windows '月份错误!!!' return .f. endif thisform.label2.visible=.t. do case case n&=3 and n&=5 thisform.label2.caption='春' case n&=6 and n&=8 thisform.label2.caption='夏' case n&=9 and n&=11 thisform.label2.caption='秋' case n=12 or n=2 or n=1 thisform.label2.caption='冬' endcase form.dblclick thisform.release 二级 VFP 上机练习题 4 上机练习题 1、建立一商场消费数据库,文件名为:db812.DBC,并输入数据。 该数据库中包括两个表文件:顾客信息表(GK.DBF)和顾客消费数据表(XF.DBF)。其数 据形式如下: 顾客信息表(GK.DBF) 顾客编号 561 453 085211 姓名 王小凤 孙丽 吴远平 程志龙 李娟娟 性别 女 女 男 男 女 是否会员 .T. .F. .F. .T. .T. 顾客编号
85422 顾客消费数据表(XF.DBF) 购买商品 化妆品 西服 靴子 食品 食品 帽子 皮鞋 消费金额 588.00 .00 218.80 78.00 128.00 358.00 消费积分要求:将数据库中的 GK.DBF(父表)和 XF.DBF(子表)以“顾客编号”建立一对多的永久 关系。 2、建立程序文件 COM-SQL812.PRG,要求将完成下列各小题任务的 VFP 数据表操作命令 或 VFP-SQL 命令写在该程序文件中。在程序首行用注释语句注明考生姓名和准考证号,并 用注释语句标注小题号。 (1)计算消费积分,并填入 XF.DBF 表中。(其中会员的积分为消费金额,不是会员的 积分为消费金额的一半); (2)输入任一顾客的姓名并查询顾客的消费明细,包括购买商品、消费金额和消费积 分: (3)汇总每位顾客的消费积分,并按总积分从大到小的顺序显示。 3、表单设计。按以下要求设计程序界面,表单文件名为 FORM812.SCX 设计如图所示一个表单,包括 2 个标签,1 个文本框(各控件的主要属性参照图形尺寸 自定)。其中: (1)表单顶部的标签用采显示考生自己的姓名和考号; (2)文本框 textl、text2 和 text3 的显示初值为 0,text4 最初显示为空白; (3) 该表单运行后, 可以在文本框 textl、 text2、 text3 中分别输入三个数, 左键单击 “比 较”命令按钮,则在文本框 text4 中显示较大的一个数。 二级 VFP 上机练习题 4 参考答案 2. 1)SELE 1 USE GK INDEX ON 顾客编号 TAG BH SELE 2 USE XF SET RELATION TO 顾客编号 INTO GK REPLACE 消费积分 WITH 消费金额/2 FOR NOT 是否会员 REPLACE 消费积分 WITH 消费金额 FOR 是否会员 2)USE GK ACCEPT “输入顾客的姓名:” TO XM LOCATE FOR 姓名=XM BH=顾客编号 USE XF LIST 购买商品,消费金额,消费积分 FOR 顾客编号=BH 3)USE XF INDEX ON 顾客编号 TAG BH TOTAL ON 顾客编号 TO HZ USE HZ INDEX ON 消费积分 TAG JF DESC LIST 3.界面设计,主要属性、事件代码: “比较”命令按钮的“CLICK”事件: X=thisform.text1.value Y=THISFORM.text2.value Z=THISFORM.text3.value Max=x If max&y Max=y ENDIF If MAX&z Max=z ENDIF THISFORM.text4.value=allt(str(max)) 以上程序将一个数据库中的所有记录以行为单位打印出来,编制环境是 Visual Foxpro 6.0,如果一个数据库字段比较少,希望一行打印二个以上的记录,稍作修改即可。需要提 醒读者的是,由于考虑到篇幅,本程序只设计了包含数字型和字符型的 数据库,对有其它 类型的数据库,稍作修改就行了;如果用户希望一页的记录不是 20,只需要修改 if r1=20 这句中 r1 的值。笔者已经编制了这类程序,可以向读者提供。
更多搜索:
| 广告服务 | 招纳纳贤 | 诚邀合作 | 联系我们 | 意见反馈 | 服务条款 |
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 蓝颜知己是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信