IF EMPTY(THISFORM.SHIFT.VALUE) .OR. EMPTY(THISFORM.LEVEL.VALUE) .OR. EMPTY(THISFORM.SECTION.VALUE) .OR. EMPTY(THISFORM.MONTH.VALUE).or.EMPTY(THISFORM.tsyear1.VALUE) * First, as mentioned, the indentation: everything after IF and before ENDIF * should be indented. = MESSAGEBOX('Please Check... Some options are blank', 32, PRODUCT) THISFORM.SHIFT.SETFOCUS RETURN .T. ENDIF SHCODE = THISFORM.SHIFT.VALUE DIS = THISFORM.TSYEAR1.VALUE SHNAME = THISFORM.SHIFT.DISPLAYVALUE LECODE = THISFORM.LEVEL.VALUE LENAME = THISFORM.LEVEL.DISPLAYVALUE SE = THISFORM.SECTION.VALUE MONAME = THISFORM.MONTH.VALUE SELECT 19 * Instead of select 19, give the name (alias) of the table, * to make your program more readable. * I do not know what table is #19! * And probably, you will forget this yourself, soon. * SET FILTER TO SET FILTER TO SHIFT=THISFORM.SHIFT.VALUE .AND. LEVEL=THISFORM.LEVEL.VALUE .AND. SECTION=THISFORM.SECTION.VALUE .AND. MONTH=THISFORM.MONTH.VALUE .AND. YEAR=DIS * It is not necessary to use SET FILTER TO before setting a filter. * Only use SET FILTER TO at the end, to reset your filter expression * to no filter. SET ORDER TO code * GOTO TOP COUNT TO C * GOTO TOP is not required in this case. * COUNT will go to the top anyway. IF C=0 SET FILTER TO SET ORDER TO refno GOTO BOTTOM LREFNO = REFNO+1 SET FILTER TO SHIFT=THISFORM.SHIFT.VALUE .AND. LEVEL=THISFORM.LEVEL.VALUE .AND. SECTION=THISFORM.SECTION.VALUE .AND. MONTH=THISFORM.MONTH.VALUE .AND. YEAR=DIS SET ORDER TO code GOTO TOP ENDIF IF C>0 GOTO TOP LREFNO = REFNO ENDIF SELECT 6 SET FILTER TO SET FILTER TO SCODE=SHCODE .AND. LCODE=LECODE .AND. SEC=SE .AND. ADMTD=1 SET ORDER TO code * Here, I will show how to use SCAN: * GOTO TOP * DO WHILE .NOT. EOF() SCAN * The SCAN replaces the two statements I commented. TCODE = CODE TROLL = ROLL IF SEX=1 TNAME = ALLTRIM(DESCR)+" S/o "+ALLTRIM(FNAME) ENDIF IF SEX=2 TNAME = ALLTRIM(DESCR)+" D/o "+ALLTRIM(FNAME) ENDIF SELECT 19 SET FILTER TO SET FILTER TO SHIFT=THISFORM.SHIFT.VALUE .AND. LEVEL=THISFORM.LEVEL.VALUE .AND. SECTION=THISFORM.SECTION.VALUE .AND. MONTH=THISFORM.MONTH.VALUE .AND. YEAR=DIS SET ORDER TO code GOTO TOP SEEK TCODE IF FOUND() REPLACE NAME WITH TNAME REPLACE ROLL WITH TROLL ENDIF IF .NOT. FOUND() APPEND BLANK REPLACE SHIFT WITH THISFORM.SHIFT.VALUE REPLACE LEVEL WITH THISFORM.LEVEL.VALUE REPLACE SECTION WITH THISFORM.SECTION.VALUE REPLACE MONTH WITH THISFORM.MONTH.VALUE REPLACE CODE WITH TCODE REPLACE NAME WITH TNAME *REPLACE ADDM WITH 0 *REPLACE MONT WITH 0 *REPLACE TUTI WITH 0 *REPLACE EXAM WITH 0 *REPLACE COMP WITH 0 *REPLACE LABO WITH 0 *REPLACE OTHE WITH 0 * You can use a single comand here: BLANK FIELDS ADDM, MONT, TUTI, ... REPLACE ROLL WITH TROLL REPLACE REFNO WITH LREFNO REPLACE YEAR WITH DIS ENDIF SELECT 6 SKIP ENDDO SHCODE = THISFORM.SHIFT.VALUE SHNAME = THISFORM.SHIFT.DISPLAYVALUE LECODE = THISFORM.LEVEL.VALUE LENAME = THISFORM.LEVEL.DISPLAYVALUE SE = THISFORM.SECTION.VALUE MONAME = THISFORM.MONTH.VALUE * Change the separate IF commands to a DO CASE. Better yet, put this * into a UDF, since you may need it in several places. *IF THISFORM.MONTH.VALUE="January" *MOCODE = 1 *ENDIF *IF THISFORM.MONTH.VALUE="February" *MOCODE = 2 *ENDIF do case case ThisForm.Month.Value = "January" moCode = 1 case ThisForm.Monty.Value = "February" moCode = 2 endcase * Also, name your objects so that you know whether you are using textboxes, etc. * If Month is a TextBox, name it TxtMonth, etc. IF THISFORM.MONTH.VALUE="March" MOCODE = 3 ENDIF IF THISFORM.MONTH.VALUE="April" MOCODE = 4 ENDIF IF THISFORM.MONTH.VALUE="May" MOCODE = 5 ENDIF IF THISFORM.MONTH.VALUE="June" MOCODE = 6 ENDIF IF THISFORM.MONTH.VALUE="July" MOCODE = 7 ENDIF IF THISFORM.MONTH.VALUE="August" MOCODE = 8 ENDIF IF THISFORM.MONTH.VALUE="September" MOCODE = 9 ENDIF IF THISFORM.MONTH.VALUE="October" MOCODE = 10 ENDIF IF THISFORM.MONTH.VALUE="November" MOCODE = 11 ENDIF IF THISFORM.MONTH.VALUE="December" MOCODE = 12 ENDIF SELECT 19 SET FILTER TO SET FILTER TO SHIFT=SHCODE .AND. LEVEL=LECODE .AND. SECTION=SE .AND. MONTH=MONAME .AND. YEAR=DIS SET ORDER TO roll * GOTO TOP * DO WHILE .NOT. EOF() * REPLACE TOTAL WITH ADDM+MONT+TUTI+EXAM+COMP+LABO+OTHE * SKIP * ENDDO * This could be done with a SCAN: SCAN replace total with ... ENDSCAN * But this is not required for a REPLACE. Just use: REPLACE ALL TOTAL WITH ... * THISFORM.RELEASE DO FORM feesnewI suggest you do the suggested corrections, your code, and then perhaps I have a few more suggestions.