我有两个网格和两个表。我希望第二个网格显示与第一个网格的选定元素相关的元素。这可能有两种方法:在grid2上设置一个根据我在grid1中的选择而更改的filer,或者更改grid2的recordSource。我现在已经决定了选项2。(但如果你能告诉我一个更好的方法,我将非常感激(
这是我当前的代码
LOCAL ssid
LOCAL num
num = thisform.grid1.ActiveRow
SELECT ids FROM scenes WHERE RECNO()=num INTO ARRAY tmp1
ssid = tmp1[1]
SELECT scenelink.amount,mesh.namem FROM scenelink,mesh;
where scenelink.ids=ssid AND scenelink.idm=mesh.idm INTO CURSOR workffs
thisform.grid2.RecordSource=workffs
这不起作用,它说变量";workfs";找不到。我还尝试过使用VIEW:
CREATE SQL VIEW workffs as ;
SELECT scenelink.amount,mesh.namem FROM scenelink,mesh;
where scenelink.ids=ssid AND scenelink.idm=mesh.idm
thisform.grid2.RecordSource=workffs
在那里它询问我是否要覆盖";workfs";,然而,它仍然说找不到这样的变量
正如@Herb所指出的,Grid.RecordSource类型总是需要是String,所以你应该在别名周围加引号。
这可能有两种方法:在grid2上设置一个过滤器,根据我在grid1中的选择进行更改,或者更改grid2的recordSource。我现在已经决定了选项2。(但如果你能告诉我一个更好的方法,我将非常感激(
实际上有更好的方法:经典的方法是使用";"参数化SQL视图";,这样您就可以修改局部变量的内容,然后使用Requery("myView")
函数,这将防止臭名昭著的";网格重建";@Tamar描述的问题。另一种方法是使用Grid.RecordSourceType = 4
,然后将SQL语句作为字符串直接放入RecordSource
属性中。示例:
LOCAL oForm as Form
oForm = CREATEOBJECT('TestForm')
oForm.Show(1)
RETURN
DEFINE CLASS TestForm as Form
AutoCenter = .T.
DataSession = 2
PROCEDURE Load
CREATE CURSOR test (test I)
LOCAL i
FOR i = 1 TO 3
INSERT INTO test VALUES (i)
ENDFOR
GO TOP IN test
ENDPROC
ADD OBJECT cmdInsert as CommandButton WITH ;
Left = 10, Height = 24, Caption = "Insert"
PROCEDURE cmdInsert.Click
INSERT INTO test VALUES (RECCOUNT('test')+1)
ENDPROC
ADD OBJECT cmdRequery as CommandButton WITH ;
Left = 150, Height = 24, Caption = "Requery"
PROCEDURE cmdRequery.Click
WITH Thisform.grdTest as Grid
.RecordSource = .RecordSource
ENDWITH
ENDPROC
ADD OBJECT cmdRefresh as CommandButton WITH ;
Left = 290, Height = 24, Caption = "Refresh"
PROCEDURE cmdRefresh.Click
Thisform.grdTest.Refresh()
ENDPROC
ADD OBJECT grdTest as Grid WITH ;
Top = 30, ;
RecordSourceType = 4, ;
RecordSource = "Select * From test Into Cursor (SYS(2015))"
ENDDEFINE
您必须在光标或视图的名称周围使用引号。
thisform.grid2.RecordSource="workffs"
您的简单解决方案是引用workfs,正如@Herb所指出的,它需要是一个字符串。此外,正如@Stefan Wuebbe所指出的,您可以使用RecordSourcetype为4,并将SQL作为记录源。
无论哪种情况,都需要小心所谓的网格"重建"。如果您再次简单地选择光标,您将丢失网格的格式。但是,只要生成的结构与原始结构相同,就可以通过将记录源临时设置为零来解决问题。ie(基于您的代码(:
LOCAL ssid
LOCAL num
num = thisform.grid1.ActiveRow
SELECT ids FROM scenes WHERE RECNO()=num INTO ARRAY tmp1
ssid = tmp1[1]
thisform.grid2.RecordSource=''
SELECT scenelink.amount,mesh.namem FROM scenelink,mesh;
where scenelink.ids=m.ssid AND scenelink.idm=mesh.idm ;
INTO CURSOR workffs ;
nofilter
thisform.grid2.RecordSource='workffs'
或者使用SQL记录源:
LOCAL ssid
LOCAL num
num = thisform.grid1.ActiveRow
SELECT ids FROM scenes WHERE RECNO()=num INTO ARRAY tmp1
ssid = tmp1[1]
thisform.grid2.RecordSource=thisform.grid2.RecordSource
您可以下载FoxyClasses并检查网格示例。其中一个完全符合你的要求。我记得示例在VFP6中被编译了6次,您需要重新编译项目才能作为应用程序或exe运行。或者你可以简单地用";do form";。检查它的帮助文件(Foxyclasses在公共领域已经存在很长一段时间了,你可以使用它的类,根据你的意愿编写代码(。