حالا میریم سروقت روتین Calc_For :
SUB CALC_FOR(X_VALUE AS VARIANT)
DIM counter AS LONG ' =0
DIM whr AS STRING
IF ISNULL(X_VALUE) THEN
whr="ISNULL(X)"
ELSE
whr="X=" & X_VALUE
END IF
WITH RECORDSETCLONE
.MOVEFIRST
.FINDFIRST whr
DO UNTIL .NOMATCH
counter=counter + 1
.EDIT
!NTH=counter
!XAZ=NZ(!X , "(NULL)") & CHRW(ASCW("A")-1 + counter)
.UPDATE
.FINDNEXT whr
LOOP
.CLOSE
END WITH
END SUB
این هم منطق ساده ای داره:
- اول شمارنده رو تعریف میکنیم : counter ،
- یک استرینگ whr برای ساخت شرط جستجو ،
- در recordsetclone فرم (نه رکوردست فرم!) از ابتدای اون (movefirst) شروع میکنیم
و دنبال اولین مورد میگردیم (findfirst)
- یک حلقه داریم که تا زمانی که نتیجه جدیدی پیدا نشه (nomatch) دنبال نتایج میگرده
- با هر موردی که پیدا میشه به شمارنده یکی اضافه میکنیم و در Nth میریزیم
همچنین در Xaz هم یک کپی از X که به آخرش یک حرف (از a و به بعد) چسبیده میریزیم