Consulta incluyendo un cursor local como parametro

348 views
Skip to first unread message

Oscar Bonet

unread,
Apr 14, 2018, 12:30:00 PM4/14/18
to Comunidad de Visual Foxpro en Español
saludos, tengo esta inquietud.

Deseo hacer esta consulta a SQL-Server pero no encuentro la manera, ilustro con el ejemplo siguiente:

TEXT TO cExp TEXTMERGE NOSHOW PRETEXT 15
   select a.nombre_cli, a.direccion, a.nombre_ciudad, b.id_cliente
    from CLIENTES A, tmp_despachos B
        where a.cod_cliente = b.id_cliente
ENDTEXT 
=expsql(cExp, "tmp_resultado", nCon)


según lo anterior:
expsql = es una función que consiste enviar una cadena como consulta a SQL-Server y trae el resultado en un cursor llamado tmp_resultado; nCon es el indicador de la conexión a sql-server.   .

La cuestión o inquietud es de aquí abajo.
CLIENTES  es una tabla en una base de datos en SQL server
pero tmp_despachos es un cursor de visual foxpro, que arrojó alguna consulta en algun evento y que contiene códigos de clientes que deseo reutilizar para saber los id_clientes de esa consulta.

como  puedo hacer para enviar ese cursor tmp_despachos  como parametro a la consulta en SQL-Server?
Espero haberme explicado.
Gracias.

mapner

unread,
Apr 14, 2018, 12:56:13 PM4/14/18
to Comunidad de Visual Foxpro en Español
No puedes mezclar cursores locales en consultas remotas. Soluciones: 1) un store procedure que realice y combine las dos consultas remotas 2) SQL Server entiendo que maneja XML, lo que te permitiría convertir tu cursor local a XML y enviarlo como parámetro de un SP 3) procesar tu 2da consulta de a registro enviando como parametro cada registro de tu cursor local, no lo recomiendo por la baja perfomance
Saludos

Víctor Hugo Espínola Domínguez

unread,
Apr 14, 2018, 1:27:50 PM4/14/18
to publice...@googlegroups.com
TEXT TO cExp TEXTMERGE NOSHOW PRETEXT 15
   select a.nombre_cli, a.direccion, a.nombre_ciudad, a.cod_cliente
    from CLIENTES A
        where a.cod_cliente in (<<Lista_ id_cliente>>)
ENDTEXT 

Donde  Lista_ id_cliente es una variable tipo varchar que contiene los id separados por coma, la calculas recorriendo el cursor tmp_despachos.

Saludos,
Víctor.
Lambaré - Paraguay.

dirsi...@cialta.com

unread,
Apr 14, 2018, 2:29:46 PM4/14/18
to publice...@googlegroups.com

No funciona así, porque la lista sería muy larga para almacenarse un campo texto.


Libre de virus. www.avg.com

mapner

unread,
Apr 14, 2018, 3:41:02 PM4/14/18
to Comunidad de Visual Foxpro en Español
Lo que propone Víctor sería atinado, lo que él dice es usar una variable de tipo carácter con la lista de IDs de Clientes del cursor local, esa variable habría que craerla con un proceso previo y si hablamos de una cantidad de Clientes manejable como algunos miles no tendría que haber problema, si en cambio hablamos de millones ahí cambia la cosa.
Ahí depende de la RAM que dispongas.
En la 2da solución que yo te proponía previamente la cual era convertir al cursor local en XML y enviarlo como parámetro a un SP, también tendrías lamlimitación de la RAM, o sea no hay manera que envíes un cursor local VFP a un motor SQL como stream directo.

mpulla

unread,
Apr 15, 2018, 12:11:34 AM4/15/18
to Comunidad de Visual Foxpro en Español
Hola Oscar

La recomendación 1 y 2 de Maper van bien, las he probado con unos cuantos miles con unos cuatro o cinco campos.

Mira es link ahi esta un ejemplo de la opcion 2

Me parece que Sql server 2016 y posterior soporta json nativo, me parece seria una mejor opción por ser mas liviano, utilizo json para actualizar e insertar datos en postgres, el perform es bueno, mando al rededor de 35000 registros con 5 campos, en estos momentos no tengo los tiempos pero realmente es rápido.


Saludos
Mauricio


Luis suescún

unread,
Apr 15, 2018, 3:03:18 PM4/15/18
to publice...@googlegroups.com
Y con el comando aqlserver bulkInsert?

Jorge L. Florez C.

unread,
Apr 16, 2018, 10:17:16 AM4/16/18
to publice...@googlegroups.com
Mi estimado.

Una solución podría ser convertir dicha consulta o cursor a un XML y luego pasarlo como parámetro al SP

Saludos
Jorge Florez
Lima - Perú

El 15 de abril de 2018, 14:02, Luis suescún <luis.sue...@gmail.com> escribió:
Y con el comando aqlserver bulkInsert?

Luis suescún

unread,
Apr 16, 2018, 11:07:39 AM4/16/18
to publice...@googlegroups.com
Mis respetos a todos.

que tal esta opción con el comando bulk insert

BULK INSERT mitabla FROM 'f:\orders\lineitem.tbl' WITH ( FIELDTERMINATOR =' |', ROWTERMINATOR =' |\n' );
o esta otra:

BULK INSERT mitabla FROM '\\share\invoices\inv-2016-07-25.csv' WITH (FORMAT = 'CSV');

Haciendo un PA que llene una tabla en la bd en el server, con los datos del aplicativo local y luego haciendo la consulta en el PA, ya desde SQL server.


Carlos Miguel FARIAS

unread,
Apr 16, 2018, 11:31:02 AM4/16/18
to Grupo Fox
Coincido con Mauricio, es más liviano JSON que XML, además JSON es manejado directamente JS si lo tienes que desplegar o usar en una página web.
Saludos: Miguel

mapner

unread,
Apr 16, 2018, 2:52:56 PM4/16/18
to Comunidad de Visual Foxpro en Español
El tema es que el amigo requiere combinar un consulta previa almacenada en un cursor local con otra nueva consulta en SQL Server, o sea, hay que enviar el primer cursor (o más bien sus datos) como parámetro, para eso no queda otra que "serializar" la información en un formato transferible y entendible por el motor receptor y para esto no hay muchas opciones, XML o JSON, ahí va da formato tiene sus ventajas y desventajas... XML es más "humanamente legible" y JSON es más conciso, luego a toneladas de librerías para ambos, VFP tiene soporte nativo para conversión a XML, para JSON se depende de librerías de terceros, que son buenas pero algo lentas para grandes volúmenes de datos

Saludos
Reply all
Reply to author
Forward
0 new messages