Estructura de cursores (Cursors Structure)

411 views
Skip to first unread message

Fox Reloaded

unread,
Mar 27, 2013, 1:25:54 PM3/27/13
to publice...@googlegroups.com
Hola a todos amigos foxeros®

Mi pregunta y yendo al grano de una vez, es la siguiente:

Que funciones me sirven para modificar un cursor creado con la sentencia SQLEXEC() o en pocas palabras creo un cursor (Local myCursor as cursor) que funciones me servirian en este caso cuando el cursor es solo una referencia vacia a un objeto y necesito agregar tantos campos como sea posible y poder eliminar y cambiar propiedades de los cursores en tiempo de diseño.

Gracias de antemano.

Un abrazo xD

William Silupu

unread,
Mar 27, 2013, 2:34:55 PM3/27/13
to publice...@googlegroups.com

Amigos,

 

Solicito sus apoyo para hallar un query para mayorizar (sumarizar por nivel de cuentas) tengo una rutina(s) pero no utlizan sentencias SQL ,  quedo a la espera de su apoyo

 

Gracias

 

Willy

Miguel Antúnez

unread,
Mar 27, 2013, 3:15:03 PM3/27/13
to publice...@googlegroups.com
Todo depende de la estructura de tus archivos, para aclarar el panorama.
Saludos.
--
Miguel Angel Antúnez Camones
mant...@gmail.com

ZeRoberto

unread,
Mar 27, 2013, 3:18:10 PM3/27/13
to publice...@googlegroups.com
Haber Fresita xD

SQLEXEC(Handle, "SELECT *, 0 CampoNumero, '' CampoTexto FROM tablaservidor", "dbResult")


Saludos

William Silupu

unread,
Mar 27, 2013, 3:41:49 PM3/27/13
to publice...@googlegroups.com

 

Gracias por tu respuesta el archivo de salida seria la acumulacion por nivel de cuentas segun los movimientos

 

Copio la estructura del plan de cuentas ,

Cuenta          Descripcion               Nivel
1                  Activo Corriente        1
10                Caja Bancos               2
101              Caja                            3
10101          Caja sede 1                 5      
104              Bancos Cta Cte.         3
10401          Bancos                        4
1040101      Cta. Corriente MN     7

La tabla de movimientos es :

Cuenta , debe_haber , importe, periodo, ejercicio

10101      D                   500         10            12   

Miguel Antúnez

unread,
Mar 27, 2013, 3:53:50 PM3/27/13
to publice...@googlegroups.com
si son DBF´s
Por la estructura que tienes, tendrías que hacer select por niveles:
select left(movimiento.cuenta,8) as cuenta ,sum(importe)  from movimiento inner join cuentas on left(movimiento.cuenta,8)=left(cuentas.cuenta,8) group by cuenta ---nivel 7
select left(movimiento.cuenta,6) as cuenta ,sum(importe)  from movimiento inner join cuentas on left(movimiento.cuenta,6)=left(cuentas.cuenta,6) group by cuenta ---nivel 6
.
.
.
.
.
.
.

así sucesivamente, si lo quieres en un solo resultado puedes juntarlos con "Union All"

Saludos

William Silupu

unread,
Mar 27, 2013, 4:18:16 PM3/27/13
to publice...@googlegroups.com

Gracias voy a probar

 

Willy

Antonio.xt

unread,
Mar 27, 2013, 5:30:46 PM3/27/13
to publice...@googlegroups.com

Roberto, creo que Fox Reloaded no es FoxLearner, es otro usuario.

Carlos Miguel FARIAS

unread,
Mar 27, 2013, 6:17:26 PM3/27/13
to publice...@googlegroups.com
Dos soluciones que se me ocurren al vuelo.
Primero, al momento de componer el string que paso por sql pass thru, agregar columnas en la forma...
<valor constante> AS "columna adicional", donde valor constante sería 0 para campos numéricos y spaces(ancho) o equivalente en el SGBD de origen, para los campos string (caracteres) para que queden del ancho requerido.
Otra alternativa.
Crear el cursor con los datos requeridos y luego hacer un
INSERT INTO cursor_creado (lista de campos destino de los datos del select);
   SELECT datos del select FROM cursor obtenido en SPT

La pregunta fue coherente y concreta, no hagamos bulling, paz que estamos en semana santa (y otra vez, jueves y viernes santo, cayeron en los dos ultimos días hábiles de la semana)
Saludos: Miguel, La Pampa (RA)

ZeRoberto

unread,
Mar 28, 2013, 4:45:35 PM3/28/13
to publice...@googlegroups.com
Pido disculpas entonces, pensé que era otro correo de  Fresa Sin Crema xD

Saludos


Fox Reloaded

unread,
Apr 1, 2013, 12:48:52 PM4/1/13
to Comunidad de Visual Foxpro en Español
Ok no hay problema, no se quien es Fresita Sin Crema ni que les haya hecho pero se ve que los dejo traumados, esto se nota en el karma que les dejo al responder mails ggg...

Bueno la idea de Hector es buena, solo que lo que quiero hacer con la funcion es crear manualmente el cursor, con un objeto. Dejen a ver si me puedo explicar mejor, aunque sus ideas no son malas, todo lo contrario me sirven para idear lo que quiero hacer, la cosa es sencilla (pero puede ser tan compleja depende de que lado se vea), todo se trata de hacer una funcion, en la cual cuando se haga un select me devuelva un objeto cursor igual o "mejor" que el que podria entregar la funcion SQLEXEC(), ya que este por defecto tiene algunas particularidades que en realidad no me sirven para nada dentro de mi programa, el chiste es que dentro de esta funcion se ejecute el SQLEXEC() pero que el programador solo pase el fuente del query como parametro, ya la funcion se encargaria de crear el nuevo cursor y devolverlo como un objeto ya depurado y libre de esas cositas extras que no me sirven en el programa.

Porque la idea de Hector es buena? Bien porque la idea de crear un cursor con la clausula INTO CURSOR XXXX me devuelve un cursor igual al de la consulta original, solo que si hay valores null dentro del mismo, este los reflejaria tambien, entonces crear un cursor nuevo leyendo uno ya creado, pero depurado de valores null y otros valores innecesarios y que este mismo nos sirva como cursor por si se quieren agregar mas datos a un grid y ese tipo de cosas.

He estado leyendo del manual de ayuda (Que me parece muy bueno) y he encontrado mucha informacion al respecto, cosa que es buena, pero acudo a su experiencia porque eso no se ve reflejado en el manual y de pronto me puedan brindar algunos tips en base a su experiencia para hacer algo que sea bueno y que a la vez sea como un estilo "profesional" o bien "estructurado" por asi decirlo.

No hablando mas paja, espero respuestas comentarios.

Un abrazo y gracias de antemano.



2013/3/28 ZeRoberto <zero...@gmail.com>



--
Thank you for everything... :)


----  Christian Torres ----
* * * * Venezuela * * * *

Carlos Miguel FARIAS

unread,
Apr 1, 2013, 4:47:41 PM4/1/13
to Grupo Fox
Dices de eliminar los campos con valores null? y que pones en su lugar?
Si de origen tenemos columnas con contenido null, eso es algo significativo.
Es importante tener en cuenta que significa que algo contenga null, antes de alegremente descartarlo.
Es un error garrafal reemplazar campos numéricos, que tienen contenido null, poniendo por ejemplo 0 en su lugar.
Y si toda una columna tiene contenido null, en todo caso se anula y listo.

Saludos: Miguel, La Pampa (RA)

Fernando D. Bozzo

unread,
Apr 1, 2013, 7:29:36 PM4/1/13
to publice...@googlegroups.com
Hola Fox Reloaded:

Es un poco difícil entender lo que querés hacer o necesitás, porque intentás explicarlo con "implementaciones" varias, pero la idea principal no llega. Para poder explicarlo mejor tendrías que hacer de cuenta que se lo estás contando a alguien que no entiende mucho de informática, sobre todo de "campos", "replace" y demás términos técnicos. Cuanto más puedas abstraerte de la jerga técnica y llevarlo más a lenguaje "de la calle" mejor va a ser, e incluso pensarlo de esa forma te puede ayudar a verlo desde otra perspectiva.

Ahora, me quedo con algo de lo que creo haber entendido: Si te interesa deshacerte de los campos NULL podés usar la función NVL() para cada campo a normalizar. El resto no me quedó muy claro. Lo siento :)




GCA-Soft - Carlos A. Gallardo

unread,
Apr 2, 2013, 1:14:18 AM4/2/13
to publice...@googlegroups.com

Fox Reloaded:

Creo entender de lo que dices, es que necesitas una función que tome el cursor generado por la función SQLEXEC() y te lo convierta en un cursor con el formato más comúnmente usado en los cursores de VFP, por ejemplo donde un campo fecha tenga una fecha vacía y no un NULL.

A continuación te paso una función que hace exactamente eso:

 

*---------------------------------------------------------------------------*

* NAME: CursorFormatVFP                                                     *

*---------------------------------------------------------------------------*

*   Convierte campos cursor a formato mas utilizado en Cursores VFP         *

*   Si Campos son Null son convertido a Default VFP                         *

*   Si Campos son DataTime son convertidos a Date                            *

*   Si Campos Date tienen fecha 01/01/1900 son convertidos a Fecha Vacia    *

*---------------------------------------------------------------------------*

* PARAMETERS:                                                               *

*   tcCursor: Nombre Cursor a Procesar                                      *

*---------------------------------------------------------------------------*

Lparameters  tcCursor as string 

 

local  lcString as string        ,;

             niCount as integer        ,;

             lnTotal as integer        ,;

             lcField as string         ,;

             lnDecs as string          ,;

             lcType as string         

 

*-- Creo un array con los campos del  Cursor Pasado

lnTotal = afields(laFields, tcCursor)

select (tcCursor)

 

*-- String que contiene la instruccion SQL con la cual actualizo el cursor

lcString = "select "

 

for niCount = 1 to lnTotal

       lcField = lower(laFields[niCount, 1])

       lcType = upper(laFields[niCount, 2])

       lnDecs = laFields[niCount, 4]

 

       do case     

             case inlist(lcType, "C", "V", "M", "Q")

                    lcString = lcString + "nvl(" + lcField + ", '') as " + lcField + ", "                     

            

             case inlist(lcType, "B", "I", "N", "F", "Y")

                    lcString = lcString + "nvl(" + lcField + ", " + str(0, (lnDecs + 2), lnDecs) + ") as " + lcField + ", "                        

            

             case lcType == "L"

                    lcString = lcString + "nvl(" + lcField + ", .f.) as " + lcField + ", "                           

            

             case lcType == "T"

                    lcString =   lcString + "iif(year(" + lcField + ") = 1900, {}, nvl(cast(" + lcField ;

                                       + " as D), {})) as " + lcField + ", "        

            

             otherwise                                          

                    lcString = lcString + lcField + ", "         

                   

       endcase                               

next

 

*-- Quitarle la coma del final al string

if right(lcString, 2) = ", "

       lcString = left(lcString, len(lcString) - 2)

endif

 

*-- Completo la instruccion SQL para actualizar el cursor

lcString = lcString + " from " + tcCursor + " into cursor " + tcCursor + " readwrite"

 

*-- Actualizo el cursor

&lcString

 

return

 

 


Carlos A. Gallardo
GCA-Soft  -  Tecnología Informática
Villa María - Córdoba - Argentina

 

 

Fox Reloaded

unread,
Apr 5, 2013, 9:08:03 AM4/5/13
to Comunidad de Visual Foxpro en Español
Muchisimas gracias, eso era exactamente lo que estaba buscando xD

Ahora me voy a poner a trabajar en eso, ya teniendo la base para lo que quiero hacer...

Un abrazo a todos y gracias por su ayuda... :D


Reply all
Reply to author
Forward
0 new messages