FoxPro 9.0,在表中的特定行开始循环



我在这里处理两个表。我在表1上执行扫描,然后在其中在表2上执行do-while循环。因此,对于表1中的每一行,只对表2中的一些行执行do-while循环。每次dowhile循环再次启动时,它似乎都是从表2的顶部开始迭代的。我如何使它每次都在表2中的一个特定的新位置迭代,这个位置恰好是上一个do-while循环停止的行。因此,本质上,每次dowhile循环启动时,我都需要它从表2中之前停止的行开始。

下面是一个现在似乎可以工作的伪代码(不确定它的效率有多高(:

CLEAR 
SELECT table1
SCAN 
SELECT table2
SCAN FOR table2.id = table1.id
IF table2.type = 1 THEN
?'type 1'
ELSE 
?'type 0'
ENDIF 
ENDSCAN  
ENDSCAN  

我还认为应该可以使用scanwhile作为内环,但我还没有成功。我所做的唯一区别是将的扫描替换为扫描while。根据我所读到的内容,扫描每次都会循环整个表2,而时扫描将在上一个循环结束的地方开始下一个循环,我认为这会更有效吗?

对于上下文,table1.id列看起来像:[1,2,3,4,5,…]其中table2.id列看起来像:[1,1,2,2,3,4,4,4,5,5,…]。本质上,我希望做这样的事情:无论id号在哪里匹配,我都需要对table2中的列执行操作。一旦我在id号与table1匹配的所有行上执行了它,我就会有一个特定的值,然后我会将该值插入table1中,然后继续相同的过程,直到table1中的每一行在id旁边的列中都有一个输入值。希望这有一定的意义,很抱歉所有的编写。

如果本地别名的记录指针不在,下面的测试代码指示Seek命令或Seek()函数的组合,以查找开始行,然后是Scan While循环,通常可能会击败其他可能性

引自Tamar Granor在Foxite.com论坛上的帖子http://www.foxite.com/archives/0000386598.htm

* Compare loop speeds for tables
#DEFINE PASSES 1000
LOCAL nStart, nEnd, nPass
* Open the table
OPEN DATABASE HOME(2) + "NorthwindNorthwind"
USE OrderDetails
SET TALK OFF 
* First, DO WHILE
nStart = SECONDS()
FOR nPass = 1 TO PASSES
GO TOP 
DO WHILE NOT EOF()
SKIP 
ENDDO
ENDFOR
nEnd = SECONDS()
?"DO WHILE--", PASSES, " passes:", nEnd-nStart
* Now, SCAN
nStart = SECONDS()
FOR nPass = 1 TO PASSES
SCAN 
ENDSCAN  
ENDFOR
nEnd = SECONDS()
?"SCAN--", PASSES, " passes:", nEnd-nStart

* Now test with order set
SET ORDER TO PRODUCTID   && PRODUCTID 
* First, DO WHILE
nStart = SECONDS()
FOR nPass = 1 TO PASSES
GO TOP 
DO WHILE NOT EOF()
SKIP 
ENDDO
ENDFOR
nEnd = SECONDS()
?"DO WHILE with order set--", PASSES, " passes:", nEnd-nStart
* Now, SCAN
nStart = SECONDS()
FOR nPass = 1 TO PASSES
SCAN 
ENDSCAN  
ENDFOR
nEnd = SECONDS()
?"SCAN with order set--", PASSES, " passes:", nEnd-nStart

* Now test processing a subset of the list
nProductID = 58
* First, DO WHILE
nStart = SECONDS()
FOR nPass = 1 TO PASSES
SEEK m.nProductID 
DO WHILE NOT EOF() AND ProductID = m.nProductID
SKIP 
ENDDO
ENDFOR
nEnd = SECONDS()
?"DO WHILE for subset--", PASSES, " passes:", nEnd-nStart
* Now, SCAN FOR
nStart = SECONDS()
FOR nPass = 1 TO PASSES
SCAN FOR ProductID = m.nProductID
ENDSCAN  
ENDFOR
nEnd = SECONDS()
?"SCAN FOR for subset--", PASSES, " passes:", nEnd-nStart
* Now, SCAN WHILE
nStart = SECONDS()
FOR nPass = 1 TO PASSES
SEEK m.nProductID
SCAN WHILE ProductID = m.nProductID
ENDSCAN  
ENDFOR
nEnd = SECONDS()
?"SCAN WHILE for subset--", PASSES, " passes:", nEnd-nStart

RETURN