If there aren't any error messages, I would assume it's updating a copy of that file somewhere. It sounds like your data path is not what you expect it to be. You can hardcode the data path in the init of the main.prg.

SET ORDER TO email
SEEK PADR(lcMembID,LEN(dataform.email),' ')
IF EOF()
SELECT * FROM title INTO CURSOR csrTitle
ctitle=oHTML.HTMLdropDown('csrTitle.title','csrTitle.title','salu','Select a Title',oSession.VALUE("salu"),.F.)

SELECT * FROM tblgnder INTO CURSOR csrgender

cgender=oHTML.HTMLdropDown('csrGender.sex','csrGender.sex','mlfl','Select a Gender',oSession.value('mlfl'),.F.)

SELECT * FROM tblparish INTO CURSOR csrparish
cparish=oHTML.HTMLdropDown('csrParish.parish','csrParish.parish','fld_parish','Select a Parish',oSession.value('fld_parish'),.F.)

More than likely it's your Update sql. Try to simplify it if possible or update one field or ..something to verify it's actually getting to that table.

If it were a user rights issue I always get an error message. If that were the case I'd be telling you to look at the rights for that table and compare them to the rights in the installed example tables. But it's not so I won't..

glad you got this. Using the SESSION object is optional and would save and store the email temporarily until the user confirms. So, in the example, whatever the user entered is retrieved with the regular oRequest.FORM(dataform.email) and stored
in the session temporarily with oSession.VALUE("email",oRequest.FORM(dataform.email))