create sql view lvMacrotest as sele * from macrotest where &?lcMacrotest>
&cVarname and &?cVarname and ?&cVarnameare formally different, because a inner resolution return different results:
where = 'ON' cWhere='where 4>5' cWhereReference = 'cWhere' * 1 &cWhere => where 4>5 &cWhereReference => cWhere * 2 &?cWhere => &EVAL(cWhere) => &where 4>5 => ON 4>5 or => &(where 4>5) => ERROR &?cWhereReference => &EVAL(cWhereReference) => &cWhere => where 4>5 * 3 ?&cWhere => ?where 4>5 => expectet ERROR ?&cWhereReference => ?cWhere => 'where 4>5' => error or => where 4>5Then, the only formal solution for current VFP is:
CLEAR cWhere = 'WHERE 5>C' cMacro = '1' SYS(3054,0) CREATE DATABASE testMacroParameters CREATE CURSOR byby (c i) INSERT INTO byby VALUES (3) INSERT INTO byby VALUES (6) CREATE SQL VIEW view1 as SELECT c,1 FROM byby &cWhere && no errors SELECT c,1 INTO CURSOR direct1 FROM byby &cWhere && no errors USE view1 IN 0 SELECT c,2 INTO CURSOR direct2 FROM byby ?&cWhere && no error VFP discard ? CREATE SQL VIEW view2 as SELECT c,2 FROM byby ?&cWhere && execute fire a error here SELECT c,3 INTO CURSOR direct3 FROM byby &?cWhere && COMPILE FIRE A ERROR HERE CREATE SQL VIEW view3 as SELECT c,3 FROM byby &?cWhere && VFP reduce &? to & USE view3 IN 0 && no errors cWhere1 = 'WHERE ' cWhere2 = '5>C' CREATE SQL VIEW view4 as SELECT c,3 FROM byby &?(cWhere1+cWhere2) && execute fire a error here CLOSE DATABASES CLOSE TABLES ALL DELETE DATABASE testFabio