CREATE CURSOR crsTest (pk i autoinc, grp i, bitfld i) FOR i=1 TO 5 FOR j= 1 TO 4 INSERT INTO crsTest (grp, bitfld) VALUES (i,j* 10^i) ENDFOR ENDFOR pnResult = 0 pnGroup = 0 SELECT grp, MAX(BitorSql(grp, bitfld)) AS BitField ; FROM crsTest ; GROUP BY grp RETURN FUNCTION BitorSql(tnGroup, tnVal) IF tnGroup <> pnGroup pnResult = 0 ENDIF pnResult = BITOR(pnResult, tnVal) RETURN pnResult>
>SELECT ..., BITOR(0,myfield) .. >>
>pnResult = 0 > >SELECT > >FUNCTION BITORSQL(tnVal) >pnResult =BITOR(pnResult , tnVal) >RETURN pnResult >>
>pnResult = 0 >pnLastUni = 0 > >SELECT i1,BITORSQL(i2,i1) FROM muh GROUP BY 1 > >FUNCTION BITORSQL(tnVal,tnUni) > IF tnUni#pnLastUni THEN > pnLastUni = tnUni > pnResult = 0 > ENDIF &&tnUni#pnLastUni > pnResult =BITOR(pnResult , tnVal) > RETURN pnResult >ENDFUNC &&BITORSQL(tnVal,tnUni) >>I get something, bot a closer look shows that the function will not be called for every record in the source
>pnResult = 0 >pnLastUni = 0 > >SELECT; > Cur1.i1,; > (SELECT MAX(BITORSQL(cur2.i2,cur2.i1)) AS i2 FROM muh AS cur2 WHERE cur2.i1=cur1.i1) AS i2; > FROM muh AS cur1; > GROUP BY 1 > > >FUNCTION BITORSQL(tnVal,tnUni) > IF tnUni#pnLastUni THEN > pnLastUni = tnUni > pnResult = 0 > ENDIF &&tnUni#pnLastUni > pnResult =BITOR(pnResult , tnVal) > RETURN pnResult >ENDFUNC &&BITORSQL(tnVal,tnUni) >>
>LOCAL; > lnResult,; > lnLastUni > >STORE 0 TO; > lnResult,; > lnLastUni > >SELECT; > Cur1.i1,; > (SELECT MAX(BITORSQL(cur2.i2,cur2.i1,@lnResult,@lnLastUni)) AS i2 FROM muh AS cur2 WHERE cur2.i1=Cur1.i1) AS i2,; > sum(i2); > FROM muh AS Cur1; > GROUP BY 1 > > >FUNCTION BITORSQL(tnVal,tnUni,tnResult,tnLastUni) > IF tnUni#tnLastUni THEN > tnLastUni = tnUni > tnResult = 0 > ENDIF &&tnUni#tnLastUni > tnResult =BITOR(tnResult , tnVal) > RETURN tnResult >ENDFUNC &&BITORSQL(tnVal,tnUni) >>
>>pnResult = 0 >> >>SELECT ..., BITORSQL(myfield) ... >> >>FUNCTION BITORSQL(tnVal) >>RETURN BITOR(pnResult , tnVal) >>>>