> CLOSE ALL >set talk off >set echo off >SELECT 1 >USE MSTR >LOCATE FOR NO=THISFORM.TEXT1.VALUE >SELECT 1 >USE MSTR >LOCATE FOR NO=THISFORM.TEXT1.VALUE >if !found() > =messagebox("ÑÞã ÇáãæÙÝ ÛíÑ ãæÌæÏ") > thisform.command1.visible=.f. > thisform.command2.visible=.f. > >else > thisform.command1.visible=.t. > thisform.command2.visible=.t. > M.DAT=DAT > > SELECT 2 > USE TAX1 > M.NETTOT=NETTOT > m.s=monthnam > LOCATE FOR NO=THISFORM.TEXT1.VALUE > IF FOUND() > set filter to no=THISFORM.TEXT1.VALUE .and. montno>=THISFORM.TEXT2.VALUE .AND. MONTNO<=THISFORM.TEXT3.VALUE >DO WHILE .T. .and. no=THISFORM.TEXT1.VALUE >SKIP >M.NETTOT=NETTOT >m.s=monthnam > IF EOF() > EXIT > ENDIF >ENDDO > >endif >report form coptax1 preview >endif >>thanks.
m.no=THISFORM.TEXT1.VALUE m.nMin=THISFORM.TEXT2.VALUE m.nMax=THISFORM.TEXT3.VALUE Select from tax1 where no=m.no and montno between m.nMin and m.nMax into cursor employees report form coptax1 previewIn your code you set the locate for MSTR twice. Only one is needed.
SELECT 0 USE MSTRor
USE MSTR IN 0 SELECT MSTRGenerally you should try to avoid using SET FILTER as it could be slow in a big table without full Rushmore optimization.
THISFORM.TEXT1.VALUE
, VFP has to traverse the hierarchy (each 'dot') to define the value if it is not cached, therefore wasting time. And from a security standpoint, if you refer directly to the user-entered value in a query, instead of a validated-memvar, you could open the program to malicious code being entered.DO WHILE .T. .and. no=THISFORM.TEXT1.VALUE
DO WHILE no=m.Text1Value
is enough