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