Grupo tengo el siguiente inconveniente

Para ejecutar un Procedimiento almacenado de SqlServer hago esto y funciona
bien:

Lparameters cAccion,nSucursal
Local loCmd,lnRealizo,llHuboError
lnRealizo=0
lnSeg=0
loCmd = Createobject("ADODB.Command")
loCmd.ActiveConnection=Thisform.ConexionActual
loCmd.CommandText="ProcesaReplica"
loCmd.CommandType=4 && adCmdStoredProc
loCmd.CommandTimeOut=0
loCmd.Parameters.Refresh
loCmd.Parameters.Item("@cAccion")=cAccion
loCmd.Parameters.Item("@nIdSucursal")=nSucursal
loCmd.Parameters.Item("@cSistema")=_Screen.Modulo
loCmd.Parameters.Item("@cPc")=Getwordnum(Sys(0),1)

Try
    loCmd.Execute(,,128) &&adExecuteNoRecords
    lnSeg=Seconds()
    lnRealizo=loCmd.Parameters("@nRealizo").Value
    Thisform.CondError=loCmd.Parameters("@nCondError").Value
Catch To loError
    lnSeg=(Seconds()-lnSeg)/10000
    llHuboError=.T.
    TEXT TO lcReferencia TEXTMERGE NOSHOW PRETEXT 3
    <Referencia>
        <Procedimiento><<loCmd.CommandText>></Procedimiento>
        <Parametros>
            <cAccion><<cAccion>></cAccion>
            <nIdSucursal><<TRANSFORM(nSucursal)>></nIdSucursal>
        </Parametros>
    </Referencia>
    ENDTEXT
    Do RegistraLog With
Datetime(),_Screen.UsrName,_Screen.AppName,3,loError.Procedure,loError.Lineno,'',;
        IIF(' OLE
'$loError.Message,'OLE','VFP'),loError.ErrorNo,loError.Message+Chr(13)+Chr(10)+lcReferencia
    Thisform.CondError=1
ENDTRY
IF !llHuboError AND Thisform.CondError>0
    llHuboError=.t.
    TEXT TO lcReferencia TEXTMERGE NOSHOW PRETEXT 3
    <Referencia>
        <Procedimiento><<loCmd.CommandText>></Procedimiento>
        <Parametros>
            <cAccion><<cAccion>></cAccion>
            <nIdSucursal><<TRANSFORM(nSucursal)>></nIdSucursal>
        </Parametros>
    </Referencia>
    ENDTEXT
    Do RegistraLog With
Datetime(),_Screen.UsrName,_Screen.AppName,IIF(Thisform.CondError=1,2,3),PROGRAM(),LINENO(1),'',;
        'APP',-1,'Error detectado dentro del procedimiento
almacenado.'+Chr(13)+Chr(10)+lcReferencia
ENDIF
loCmd=.Null.
Return (!llHuboError)

Pero lo estoy ejecutando en modo sincronico y desearia poder ejecutarlo en
modo asincronico, ya que en procesos muy largos la pantalla queda colgada y
no se refresca... Si fuera asincronico, tendria el control de los eventos
de la pantalla.

Encontre que para eso al momento de ejecutar habria que pasarle la opcion
adAsyncExecute al execute, es decir a como esta ahora seria algo asi....

loCmd.Execute(,,128+16) &&adExecuteNoRecords+adAsyncExecute

Pero si hago eso necesito saber cuando termina el proceso...

En VB lo hacen asi

Dim Cmd As ADODB.Command
Dim rs As ADODB.Recordset

Set Cmd = New ADODB.Command
Cmd.ActiveConnection = cn
Cmd.CommandType = adCmdText
Cmd.CommandText = "SELECT * FROM Usuarios"
Abort = False

Set rs = Cmd.Execute( , , adAsyncExecute)
Do While CBool(Cmd.State And adStateExecuting)
    DoEvents
    If Abort Then
        Cmd.Cancel
    End If
Loop

y encontre que en VFP se puede implementar algo asi...

https://msdn.microsoft.com/en-US/library/9e3x7620%28v=vs.80%29.aspx

Alguno puede aportar algo...

Saludos y gracias,

Pancho
Córdoba
Argentina

Responder a