A mi en lo particular me gusta usar objetos para esto, pues cuando los pasas como parametro los pasas como REFERENCIA, no como valor, por lo que al volver del formulario hijo mantienen los valores almancenados en el. Ejemplo:
FORMULARIO PRINCIPAL:
====================================
LOCAL oParams
oParams = CREATE("EMPTY")
ADDPROPERTY(oParams,"result", .F.)
ADDPROPERTY(oParams"data", CREATE("EMPTY"))
ADDPROPERTY(oParams.data,"nombre","")
ADDPROPERTY(oParams.data,"apellido","")
DO FORM hijoModal WITH oParams && oParams pasa como referencia, no como valor
IF NOT oParams.result
RETURN
ENDIF
LOCAL cSQL
cSQL = "INSERT INTO tabla (nombre, apellido) VALUES (?oData.nombre, ?oData.apellido)"
PRIVATE oData
oData = oParams.data
SQLEXEC(nconn, cSQL)
FORMULARIO HIJO
==========================
INIT:
LPARAMETERS poParams
THISFORM.addProperty("Params", poParams) && Guardamos la referencia en el formulario para que no se pierda
GUARDAR:
WITH THISFORM.Params
.result = .T.
.data.nombre = THISFORM.txtNombre.Value
.data.apellido = THISFORM.txtApellido.Value
ENDWITH
THISFORM.Release()
Saludos
Victor Espina