Page 1 of 1

WIN_OLECREATEOBJECT() DUDAS

PostPosted: Sat May 07, 2022 2:22 pm
by rterraz
Estimados amigos
Tengo un sistema de facturación que usa Factura Electronica a AFIP
Para establecer la comunicación con el WebService antes usabamos WIN_OLECREATEOBJECT('MSXML2.XMLHTTP') y lo cambiamos a WIN_OLECREATEOBJECT('Microsoft.XMLHTTP'),porque parece que este es mas rápido...esto es correcto ?
Esta función anda en cualquier versión de Windows ?
El principal problema que nos está preocupando es que al consultar al WS hay veces que ( creemos que por saturación del servidor) el sistema se queda esperando la respuesta del WS durante un tiempo prolongado impidiendo al usuario seguir con su proceso de facturación, es posible incluir un Timeout() que cuando esto ocurra cancele la consulta y libere el sistema , o una vez iniciada la misma la única manera de salir es esperar la respuesta del WS ?
Si alguien tiene alguna solución o sugerencia para evitar este problema agradeceria mucho me la hicieran saber.

un abrazo a todos

Re: WIN_OLECREATEOBJECT() DUDAS

PostPosted: Sat May 07, 2022 3:10 pm
by cnavarro
El motivo de existir ( e incluso coexistir varios "protocolos" ) a los que hacer referencia, es sencilla: tema de compatibilidad con versiones anteriores. Internamente lo que ha hecho Microsoft ha sido cambiar el espacio de nombres que utiliza en su biblioteca/librerías en las nuevas versiones.
Sin entrar en detalles: las nuevas versiones son: "MSXML2.XMLHTTP.6.0", por lo que se supone que es la recomendada a utilizar, pero si estás utilizando ordenadores con SO más antiguos, la que utilizas seguramente sea la adecuada.
En cualquier caso, te recomiendo que utilices un pequeño fragmento de código que te permita valorar si está funcionando o no, por ejemplo algo como esto en el que incluyo otros que no has mencionado:
Code: Select all  Expand view

   local aOle    := { "MSXML2.ServerXMLHTTP.6.0", "MSXML2.XMLHTTP", ;  // "MSXML2.XMLHTTP.6.0" // "MSXML2.XMLHTTP.3.0"
                            "WINHTTP.WinHttpRequest.5.1", "Microsoft.XMLHTTP" }
   local oOle
   TRY
       oOle := CreateObject( aOle[ 1 ] )
   CATCH
       oOle := CreateObject( aOle[ 4 ] )
   END
 

Evidentemente es un ejemplo muy simple que habría que "complicar" estableciendo "salidas" para poder ejecutar cualquiera de los que incluyas en tu array.
En cuanto a lo que comentas del timeout, existe y es fácil de implementar
Code: Select all  Expand view

            oOle:WaitForResponse( 1000 )  // 10000
 

Aunque algo así seguramente sea más adecuado
Code: Select all  Expand view

   local n  := 0
.../...

    while ( oOle:ReadyState != 4 .or. n < 10 )
        oOle:waitForResponse( 1000 )
        n++
    end
 

y después seguramente valorar el resultado obtenido en
Code: Select all  Expand view

   ? oOle:Status != 200
 

Espero te sirva de ayuda

Re: WIN_OLECREATEOBJECT() DUDAS

PostPosted: Sat May 07, 2022 4:23 pm
by rterraz
Hola Cristobal
Muchas gracias por tu ayuda, me ha sido muy esclarecedora...
Ya lo implementé, ahora tengo que esperar que el servidor AFIP se sature para poder ver si funciona el timeout() :D :D
No se como simular el retardo en en server !!!
Abrazo

Re: WIN_OLECREATEOBJECT() DUDAS

PostPosted: Sun May 08, 2022 8:56 am
by cnavarro
Existe el metodo
Code: Select all  Expand view

oOle:setTimeouts( resolveTimeout, connectTimeout, sendTimeout, receiveTimeout)
 

Pero no he tenido ocasión de probarlo.