【网学网提醒】:网学会员为您提供Vfp+SQL操作参考,解决您在Vfp+SQL操作学习中工作中的难题,参考学习。
0.SQL语法
0.1复制表
select*into<新表名>from<原表名>
0.2清空表的所有行
TRUNCATETABLE<表名>
0.3在游标的当前行上使用DELETE
DELETEFROM<表名>WHERECURRENTOFcomplex_join_cursor
如:在名为complex_join_cursor的游标上所做的删除。它只影响当前从游标提取的单行。
0.4通过SQL语句访问另一数据库的数据表
select*from
...
如:SELECT*FROMsxserver.sx20050624.dbo.t_Emp
0.5在当前SQL服务器增加新的SQL服务器
sp_addlinkedserver
如:sp_addlinkedserversxserver
1.旧DBF如何导入使用SQL2000?
答:使用SQL的DTS功能
参见命令BULKINSERT
2.怎么建主索引(+)----必须用sql?
createtable表名(char(4),char(10))
createindex索引名ON表名(,)
3.VFP+SQL数据更新问题?
UPDATEB表
SET金额=A.金额
FROMB表LEFTJOINA表ON(B.地点=A.地点)
WHERE条件
4.查询表对象是否存在?
SELECTCOUNT(id)asCntIdFROMsysobjectsWHEREname='DbName'
如果返回CntId值>0,表示对象存在,
这个语句除了可以查表对象是否存在外,
还可能查询视图,索引,触发器,自定义函数是否存在
详细看SQL的联机帮助中对sysobjects系统表的说明
如:查询表对象t_Stock是否存在?
ifexists(select*fromdbo.sysobjectswhereid=object_id(N't_Stock')andobjectproperty(id,N'IsTable')=1)
print'ok'
GO
5.什么叫SPT?
直接向SQL发送命令的方式叫SPT
6.忘记了SQL登录密码怎么办?
注册表里将登录方式改为混合登录就可以了hkmachine\system\windowns\mssql\mssql中的logmode登录方式修改一下
7.SQL数据库的联接?
Sql_CommandStr=;
"DRIVER=SQLServer;"+;&;&;SQL的ODBC驱动
"SERVER=SQL实列名;"+;
"NETWORK=DBMSSOCN;"+;&;&;指定为TCP/IP连接方式
"ADDRESS=SQL服务器名或IP;"+;
"UID=SQL用户名;"+;
"PWD=SQL用户密码;"+;
"DATABASE=数据库;"+;
"WSID="+SYS(0)+";"+;&;&;连接用户
"APP="+_Screen.Caption&;&;连接说明
?SQLSTRINGCONNECT(Sql_CommandStr)&;&;成功返回>0的连接句柄
8.获取可用的SQL服务器?
****************************************
*获取可用的SQL服务器*
*1.02003.06.06*
*雅狐论坛yafox*
****************************************
SQLServerApp=CreateObject("SQLDMO.Application")
SQLServerName=SQLServerApp.ListAvailableSQLServers
SqlServerCount=SQLServerName.Count
IfSqlServerCount=0
?"没有找到可用的SQLServer服务器。"
Else
?"可连接的SQLServer服务器:"+alltrim(str(SqlServerCount))+"个"
Fori=1toSqlServerCount
?i,SqlServerName.Item(i)
Next
ENDIF
RELEASESQLServerApp
****************************************
9.什麽函数可以舍去字符与字符间的空格?
strtran('AB','','')
10.请教,在
程序中如何设定系统时间?
*用WINDOWSAPI功能:调用SetSystemTime\设置系统日期
*定义
DECLAREINTEGERGetSystemTimeINwin32apiSTRING@
DECLAREINTEGERSetSystemTimeINwin32apiSTRING@
*设置系统日期,时间为:1998,3,2,10:20:10:40
nYear=1998
nMonth=3
nDay=2
nHour=10
nSecond=20
nMinute=10
nMMinute=40
nWeekDay=0
nHour=iif(nHour>8,nHour-8,nHour+24-8)
cBuff=CHR(nYear%256)+CHR(nYear/256));
+Chr(nMonth%256)+Chr(nMonth/256));
+Chr(nWeekDay%256)+Chr(nWeekDay/256);
+Chr(nDay%256)+Chr(nDay/256));
+Chr(nHour%256)+Chr(nHour/256));
+Chr(nSecond%256)+Chr(nSecond/256);
+Chr(nMinute%256)+Chr(nMinute/256);
+CHr(nMMinute%256)+Chr(nMMinute/256);
SetSystemTime(@cBuff)
11.在这问一个关于VFP6.0的问题,如何知道Grid的表顶记录?表顶记录是指表格可见的第一条纪录
在表格grid1.mouseupevent中加入以下代码:
thisform.grid1.activatecell(1,1)
x=recn()
12.如何在GRID里控制回车事件?
在VFP里,GRID的默认控件都是TEXTBOX,形成了一个表格,但是在这个二维表里进行操作时,每次按回车都是往后一个单元格跳转,当到最后一列时,则继续跳到第一列,进而循环,使操作很不方便,特别是一些要按照DOS的操作习惯的,希望回车时,可以往下移动单元格,或在最后一列回车时回到第一列等操作。
下面说明如何在GRID里的一个列里按回车使记录连续往下跳转(或可以执行其他的操作),当跳转到最后一行时执行另一个操作。
1、对GRID所在的表单新增属性:
cur_recn记录当前记录号
cur_recc记录最大记录号
2、在表单初始化,或给GRID以数据源时,就先计算出该表的最大的记录数,如下:
thisform.cur_recc=recc()
为了一次得到当前GRID里的表的记录总数
3、在GRID的AfterRowColChange事件里写:
thisform.cur_recn=recn()
为了得到当前的GRID里的表的记录号
4、在GRID里的某列的TEXT1的KEYPRESS事件里:
ifnKeyCode=13&;&;当按键为回车时
ifthisform.cur_recn>=thisform.cur_recc
**--当当前记录大于等于最大记录时,即记录已到最后一个时
thisformmand1.setfocus
**--使表单上的一个命令按纽聚焦,也即可以跳出该GRID,
**--而正常的操作很难从GRID里跳出,在这里就可以使在记录到最后时焦点跳出来
else
thisform.cur_recn=recn()&;&;当记录还没到尾时,则...
nodefault&;&;不做任何响应
keyboard"{dnarrow}"&;&;模拟键盘下箭头,使记录指针下移一个
endif
endif
13.VFP中防止按退格键焦点移到上个控件
在KeyPress事件中,写下如下代码:
ifnKeyCode=127andthis.SelStart=0andthis.SelLength=0
NoDefault
endif
意思是说,当键盘按了退格键(BackSpace),并且鼠标在文本控件中的选择字符的长度为零,并且光标在控件的最左端时,然后不发生任何事件,也即将原有的默认事件给屏蔽了,那么也就不会使焦点移到上一个控件了!
14.VFP全面控制EXCEL
VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作。比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功能进行报表打印。这就需要我们在VFP中直接来控制Excel。下面就在开发VFP应用项目时对Excel的控制作一下介绍:
1.创建Excel对象
eole=CREATEOBJECT(′Excel.application′)
2.添加新工作簿
eole.Workbooks.add
3.设置第3个工作表为激活工作表
eole.Worksheets(″sheet3″).Activate
4.打开指定工作簿
eole.Workbooks.Open(″c:\temp\ll.xls″)
5.显示Excel窗口
eole.visible=.t.
6.更改Excel标题栏
eole.Caption=″VFP应用程序调用MicrosoftExcel″
7.给单元格赋值
eole.cells(1,4).value=XM(XM为数据库字段名)
8.设置指定列的宽度(单位:字符个数)
eole.ActiveSheet.Columns(1).ColumnWidth=5
9.设置指定行的高度(单位:磅)
eole.ActiveSheet.Rows(1).RowHeight=1/0.035
(设定行高为1厘米,1磅=0.035厘米)
10.在第18行之前插入分页符
eole.Worksheets(″Sheet1″).Rows(18).PageBreak=1
11.在第4列之前删除分页符
eole.ActiveSheet.Columns(4).PageBreak=0
12.指定边框线宽度(Borders参数如下)
ole.ActiveSheet.Range(″b3:d3″).Borders(2).Weight=3
13.设置四个边框线条的类型
eole.ActiveSheet.Range(″b3:d3″).Borders(2).LineStyle=1
(其中Borders参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle值:1与7-细实、2-细虚、4-点虚、9-双细实线)
14.设置页眉
eole.ActiveSheet.PageSetup.CenterHeader=″报表1″
15.设置页脚
eole.ActiveSheet.PageSetup.CenterFooter=″第&P页″
16.设置页眉到顶端边距为2厘米
eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
17.设置页脚到底边距为3厘米
eole.ActiveSheet.PageSetup.FooterMargin=3/0.035
18.设置顶边距为2厘米
eole.ActiveSheet.PageSetup.TopMargin=2/0.035
19.设置底边距为4厘米
eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
20.设置左边距为2厘米
veole.ActiveSheet.PageSetup.LeftMargin=2/0.035
21.设置右边距为2厘米
eole.ActiveSheet.PageSetup.RightMargin=2/0.035
22.设置页面水平居中
eole.ActiveSheet.PageSetup.Cent
erHorizontally=.t.
23.设置页面垂直居中
eole.ActiveSheet.PageSetup.CenterVertically=.t.
24.设置页面纸张大小(1-窄行851139-宽行1411)
eole.ActiveSheet.PageSetup.PaperSize=1
25.打印单元格网线
eole.ActiveSheet.PageSetup.PrintGridlines=.t.
26.拷贝整个工作表
eole.ActiveSheet.UsedRange.Copy
27.拷贝指定区域
eole.ActiveSheet.Range(″A1:E2″).Copy
28.粘贴
eole.WorkSheet(″Sheet2″).Range(″A1″).PasteSpecial
29.在第2行之前插入一行
eole.ActiveSheet.Rows(2).Insert
30.在第2列之前插入一列
eole.ActiveSheet.Columns(2).Insert
31.设置字体
eole.ActiveSheet.Cells(2,1).Font.Name=″黑体″
32.设置字体大小
eole.ActiveSheet.Cells(1,1).Font.Size=25
33.设置字体为斜体
eole.ActiveSheet.Cells(1,1).Font.Italic=.t.
34.设置整列字体为粗体
eole.ActiveSheet.Columns(1).Font.Bold=.t.
35.清除单元格公式
eole.ActiveSheet.Cells(1,4).ClearContents
36.打印预览工作表
eole.ActiveSheet.PrintPreview
37.打印输出工作表
eole.ActiveSheet.PrintOut
38.工作表另为
eole.ActiveWorkbook.SaveAs(″c:\temp\22.xls″)
39.放弃存盘
eole.ActiveWorkbook.saved=.t.
40.关闭工作簿
eole.Workbooks.close
41.退出Excel
eole.quit
15.VFP6.0中ActiveX控件TreeView使用实例
ActiveX控件早已为大多数程序开发人员作为一重要工具来使用。由于它与开发语言无关,任何支持ActiveX控件的软件平台上,都可以使用ActiveX控件。就像使用WINDOWS控件一样自如。然而,ActiveX控件在具体到某种开发工具中去使用时会遇到很多问题,这一点在许多刊物的文章都经常被提出讨论,但大多数都是针对Vc,Delphi,VB,PB等开发平台下的ActiveX控件。其实,在上述平台中使用ActiveX控件基本上能在其帮助功能中,开发人员依照其示例最终能找到ActiveX控件的属性,方法,事件的使用说明。甚至有些开发工具已将部分ActiveX控件作为其常用表单控件,使开发人员使用起来感到非常方便。
可是在VFP开发平台下,去使用ActiveX控件就不如上述开发工具那样的幸运,因为VFP对其根本就未涉及到相关语法说明和示例,使VFP开发者感到尴尬与茫然。又因,很少有介绍这方面文章。因此,笔者就以正在开发“楼盘销售软件”为例介绍一下TreeView控件在VFP中的具体使用,以供与笔者同感的VFP同仁参考。
一、首先介绍TreeView控件
TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位
图组成。TreeView一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。
Node对象是TreeView控件中的一项,它包含图像和文本。Nodes集合包含一个或多个Node对象。语法:treeview.Nodes,treeview.Nodes.Item(index)。可以使用标准的集合方法(例如Add和Remove方法)操作Node对象。可以按其索引或存储在Key属性中的唯一键来访问集合中的每个元素。为选择指定的Node对象,必须通过它的Index属性或Key属性的值去引用它。
在Treeview控件的Nodes集合中添加一个Node对象:object.Add(relative,relationship,key,text,image,selectedimage)Nodes集合是一个基于1的集合。在添加Node对象时,它被指派一个索引号,该索引号被存储在Node对象的Index属性中。这个最新成员的Index属性值就是Node集合的Count属性的值。因为Add方法返回对新建立的Node对象的引用,所以使用这个引用来设置新Node的属性十分方便。下面介绍一下节点几个属性:
relative是可选的。它表示已存在的Node对象的索引号或键值。而新节点与已存在的节点间的关系,可在下一个参数relationship中找到。
relationship是可选的。它表示指定的Node对象的相对位置,如设置值中所述。relationship的设置值是:
tvwFirst为常数,0为值。它表示首的节点。该Node和在relative中被命名的节点位于同一层,并位于所有同层节点之前。
TvwLast为常数,1为值。它表示最后的节点。该Node和在relative中被命名的节点位于同一层,并位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后
TvwNext为常数,2为缺省值。它表示下一个节点。该Node位于在relative中被命名的节点之后。
TvwPrevious为常数,3为值。它表示前一个节点。该Node位于在relative中被命名的节点之前。
TvwChild为常数,4为缺省值。它表示子节点。该Node成为在relative中被命名的节点的子节点。
注意如果在relative中没有被命名的Node对象,则新节点被放在节点顶层的最后位置。
key是可选的。它表示节点中唯一的字符串,可用于用Item方法检索Node。
text是必需的。它表示在Node中出现的字符串,即节点的名称。
index是整数或字符串,它唯一地标识Nodes集合的一个成员。整数是Index属性的值,字符串是Key属性的值。
FullPath属性,这个属性返回在TreeView控件中引用的Node对象的完整限定路径。当赋予该属性为字符串变量时,该字符串被设为具有指定索引的FullPath节点。
Inde
ntation属性返回或设置控件中对象的缩进宽度。
LabelEdit属性返回或设置一个值,它确定是否可以编辑在TreeView控件中的Node对象的标签。
二、源程序示例
在该程序中TreeView控件能够实现项目、楼宇、单元、楼层这样四层逐级包含的关系。用户只要简单地单击每层节点“+”/“-”就能很直观地观察到一个项目中包含几幢楼,一幢楼包含几个单元,一个单元又有多少楼层。通过与页框PAGEFRAME中每一页的表格GRID联合使用,只要双击每层节点就可在相应的表中增加记录并在GRID中显示相应的详细信息。值得说明的是该程序可以实现多个项目的显示,项目节点与项目节点之间是平行同级的关系,仅仅是第二个项目首节点排在第一个之后。而楼宇节点是项目节点的子节点,单元节点是楼宇节点的子节点,楼层节点是单元节点的子节点。
源程序1实现TreeView控件初始化工作,即表单中的Olecontrol1.init事件填写源程序1中所有代码。源程序2实现与页框配合,显示节点相应的详细内容,即表单中的Olecontrol1.NodeClick事件填写源程序2中所有代码。
源程序1代码如下:
LOCALM.L_XMCOUNT,I,J,K,L,M.L_NODES,M.L_LYCOUNT,M.L_DYCOUNT,M.L_LCCOUNT
THIS.NODES.CLEAR&;&;清除所有节点
THIS.LABELEDIT=1&;&;节点标签可以编辑
THIS.Indentation=10&;&;缩进宽度为10个象素
SELECTSF_XMXX
setdeleon
M.L_XMCOUNT=RECCOUNT()
FORI=1TOM.L_XMCOUNT
SELECTSF_XMXX
GOI
if!delete()
M.L_NODES=THIS.NODES.ADD(,,'XM'+XM_BH,XM_MC)&;&;向节点集合加入第一个节点KEY=XM,TEXT=项目名称
M.L_NODES.EXPANDED=.T.&;&;所有节点可以折叠
M.L_NODES.FORECOLOR=RGB(0,0,255)&;&;设置所有节点的前景颜色
M.P_XMBH=XM_BH
=REQUERY('VIEW_XMLY')
M.L_LYCOUNT=RECCOUNT('VIEW_XMLY')
IFM.L_LYCOUNT>0
FORJ=1TOM.L_LYCOUNT
SELECTVIEW_XMLY
GOJ
if!delete()
&;&;向'项目'父节点加入子节点'楼宇'KEY=LY,TEXT=楼宇实际编号
THIS.NODES.ADD('XM'+SF_XMXX.XM_BH,4,'LY'+VIEW_XMLY.LY_BH,VIEW_XMLY.LY_SJBH)
M.P_LYBH=VIEW_XMLY.LY_BH
=REQUERY('VIEW_XMDY')
M.L_DYCOUNT=RECCOUNT('VIEW_XMDY')
IFM.L_DYCOUNT>0
FORK=1TOM.L_DYCOUNT
SELECTVIEW_XMDY
GOK
if!delete()
&;&;向'楼宇'父节点加入子节点'单元'KEY=DY,TEXT=单元实际编号
THIS.NODES.ADD('LY'+VIEW_XMLY.LY_BH,4,'DY'+VIEW_XMDY.DY_BH,ALLTRIM(STR(VIEW_XMDY.DY_SJBH))+'单元')
M.P_DYBH=VIEW_XMDY.DY_BH
=REQUERY('VIEW_XMLC')
M.L_LCCOUNT=RECCOUNT('VIEW_XMLC')
IFM.L_LCCOUNT>0
FORL=1TOM.L_LCCOUNT
SELECTVIEW_XMLC
GOL
if!delete()
&;&;向'单元'父节点加入子节点'楼层'KEY=LC,TEXT=楼
层实际编号
THIS.NODES.ADD('DY'+VIEW_XMDY.DY_BH,4,'LC'+VIEW_XMLC.LC_BH,ALLTRIM(STR(VIEW_XMLC.LC_SJCH))+'层')
endif
ENDFOR
ENDIF
endif
ENDFOR
ENDIF
endif
ENDFOR
ENDIF
endif
ENDFOR
源程序2如下:
***ActiveX控件事件***
LPARAMETERSnode
***ActiveXContro1lEvent***
LOCALM.L_NODES,M.L_SELECTED,L_INDEX
M.L_SELECTED=THISform.Olecontrol1.SELECTEDITEM.INDEX
M.L_NODES=THISFORM.OLECONTROL1.NODES(M.L_SELECTED)
THISFORM.PAGEFRAME1.PAGE1.CAPTION='项目信息'
THISFORM.PAGEFRAME1.PAGE2.CAPTION='楼宇信息'
THISFORM.PAGEFRAME1.PAGE3.ENABLED=.F.
THISFORM.PAGEFRAME1.PAGE3.CAPTION='单元信息'
THISFORM.PAGEFRAME1.PAGE4.ENABLED=.F.
THISFORM.PAGEFRAME1.PAGE4.CAPTION='楼层信息'
DOCASE
CASEM.L_NODES.KEY='XM'
THISFORM.PAGEFRAME1.ACTIVEPAGE=1
CASEM.L_NODES.KEY='LY'
THISFORM.PAGEFRAME1.ACTIVEPAGE=2
CASEM.L_NODES.KEY='DY'
THISFORM.PAGEFRAME1.PAGE3.ENABLED=.T.
THISFORM.PAGEFRAME1.ACTIVEPAGE=3
CASEM.L_NODES.KEY='LC'
THISFORM.PAGEFRAME1.PAGE4.ENABLED=.T.
THISFORM.PAGEFRAME1.ACTIVEPAGE=4
ENDCASE
ifM.L_NODES.KEY<>'XM'
DOCASE
CASEM.L_NODES.KEY='LY'
M.P_XMBH=substr(M.L_NODES.KEY,3,2)
M.P_LYBH=RIGHT(M.L_NODES.KEY,LEN(M.L_NODES.KEY)-2)
=REQUERY('VIEW_XMDY')
IFRECCOUNT('VIEW_XMDY')=0
SELESF_LYXX
SETORDERTOLYBH
SEEKM.P_LYBH
IFFOUND()
DYZS=SF_LYXX.LY_DYZS
ENDIF
FORI=1TODYZS
SELECTVIEW_XMDY
APPENDBLANK
THISFORM.PAGEFRAME1.PAGE3.GRID1.afterROWCOLCHANGE
ENDFOR
GOTOP
THISFORM.PAGEFRAME1.PAGE3.GRID1.refresh
ENDIF
THISFORM.PAGEFRAME1.PAGE2.CAPTION=ALLTRIM(M.L_NODES.TEXT)
THISFORM.PAGEFRAME1.PAGE3.ENABLED=.T.
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(LEFT(this.nodes(M.L_SELECTED).FULLPATH,AT('\',this.nodes(M.L_SELECTED).FULLPATH)))
=REQUERY('VIEW_XMLY')
seleview_xmly
CASEM.L_NODES.KEY='DY'
M.P_XMBH=substr(M.L_NODES.KEY,3,2)
M.P_lyBH=substr(M.L_NODES.KEY,3,4)
M.P_DYBH=RIGHT(M.L_NODES.KEY,LEN(M.L_NODES.KEY)-2)
=REQUERY('VIEW_XMLC')
IFRECCOUNT('VIEW_XMLC')=0
SELESF_DYXX
SETORDERTODYBH
SEEKM.P_DYBH
IFFOUND()
LCZS=SF_DYXX.DY_LCS
ENDIF
FORI=1TOLCZS
SELECTVIEW_XMLC
APPENDBLANK
THISFORM.PAGEFRAME1.PAGE4.GRID1.afterROWCOLCHANGE
ENDFOR
GOTOP
ENDIF
THISFORM.PAGEFRAME1.PAGE3.CAPTION=ALLTRIM(M.L_NODES.TEXT)
THISFORM.PAGEFRAME1.PAGE4.ENABLED=.T.
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(LEFT(this.nodes(M.L_SELECTED).FULLPATH,AT('\',this.nodes(M.L_SELECTED).FULLPATH)))
=REQUERY('VIEW_XMdy')
seleview_xmdy
CASEM.L_NODES.K
EY='LC'
M.P_XMBH=substr(M.L_NODES.KEY,3,2)
M.P_lyBH=substr(M.L_NODES.KEY,3,4)
M.P_dyBH=substr(M.L_NODES.KEY,3,6)
M.P_LCBH=RIGHT(M.L_NODES.KEY,LEN(M.L_NODES.KEY)-2)
THISFORM.PAGEFRAME1.PAGE4.CAPTION=ALLTRIM(M.L_NODES.TEXT)
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(LEFT(this.nodes(M.L_SELECTED).FULLPATH,AT('\',this.nodes(M.L_SELECTED).FULLPATH)))
=REQUERY('VIEW_XMlc')
seleview_xmlc
ENDCASE
ELSE
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(this.nodes(M.L_SELECTED).TEXT)
L_INDEX=M.L_SELECTED
M.P_XMBH=RIGHT(this.NODES(M.L_SELECTED).KEY,LEN(this.NODES(M.L_SELECTED).KEY)-2)
=REQUERY('VIEW_XMLY')
IFRECCOUNT('VIEW_XMLY')=0
SELESF_XMXX
SETORDERTOXMBH
SEEKM.P_XMBH
IFFOUND()
ZLS=SF_XMXX.XM_ZLS
ENDIF
FORI=1TOZLS
SELECTVIEW_XMLY
APPENDBLANK
THISFORM.PAGEFRAME1.PAGE2.GRID1.AFTERROWCOLCHANGE
ENDFOR
GOTOP
ENDIF
ENDIF
THISFORM.REFRESH