Cursores en Windev

504 views
Skip to first unread message

David Silva

unread,
Nov 24, 2014, 12:58:25 AM11/24/14
to de-fox-...@googlegroups.com
Buenas noches.
   En Visual FoxPro crear un cursor para trabajar con datos es muy facil y muy util, ejemplo: create cursor agenda (nombre c(50), direccion c(100), telefono c(20)) con esto se consigue crear una tabla temporal (cursor) y trabjar en esa tabla insertando, editando o armando una tabla solo con los datos que nos interesan y no sobre la tabla original.
  La pregunta es la siguiente: como se hace esto en Windev?
Desde ya muchas gracias.

Orlando Guzman

unread,
Nov 24, 2014, 9:18:03 AM11/24/14
to de-fox-...@googlegroups.com

--
El blog de WinDev - WebDev - WinDev Mobile en español se encuentra en esta dirección :
blog.windevonline.com
www.windev.la Distribuidor WinDev - WebDev - WinDev Mobile en Colombia, Chile, Perú y Latinoamérica
---
Has recibido este mensaje porque estás suscrito al grupo "De Fox a Windev" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a de-fox-a-wind...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a de-fox-...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/de-fox-a-windev.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Jose Orlando Guzman Esquivel
Movil +573014429212


HernanCano

unread,
Nov 24, 2014, 11:08:19 AM11/24/14
to de-fox-...@googlegroups.com

Un colega nos reporta sus acercamientos sobre este tema.

Temp-file(temp-table)

Su conclusión es aplastante:

I did not find such a sophisticated mechanism in Windev.

En el mismo párrafo menciona algo que debes analizar si tienes escenarios similares:

 I considered setting up some sort of temporary database using HyperFile, strictly for temporary data structures.
 But I would still have to address the issues regarding uniqueness, scope and lifetime. 

El artículo indica que pueden usarse estructuras y arreglos dinámicos para estos efectos.

Ojalá Thierry y Daniel nos indiquen si ha habido cambios al respecto, o si hay mejores prácticas ahora.

HernanCano

unread,
Nov 24, 2014, 11:21:56 AM11/24/14
to de-fox-...@googlegroups.com
Evidentemente tienes a tu disposición el lenguage SQL como "create table" para crear los "temporales"

SQL statements

Y también puedes investigar sobre HExecuteSQLQuery (http://doc.windev.com/en-US/?3044084&name=hexecutesqlquery_function) y BuildBrowsingTable, pero seguro que la versatilidad de los comandos VFP no la encontrarás.

Sinceramente mi recomendación es que investigues este tema tú mismo y quizá puedas empezar por estas dos funciones .

Daniel Santiago Rodríguez Begambre

unread,
Nov 24, 2014, 9:04:17 PM11/24/14
to de-fox-...@googlegroups.com
Hola David

En WinDev no existe el comando create cursor pero es posible manejarlo de las siguientes formas:

1. Con las instrucciones HDescribeItem y HDescribeFile, al final te paso un programa que hice hace mucho para emular el create cursor, esta opción la he utilizado muy poco, prefiero la siguiente forma.

2. Creando una consulta desde un archivo que contenga los campos similares (puede ser un archivo solo con tipos de campos) y de ahí puedes crear un archivo en disco (HToFile) e instanciarlo con HDeclareExternal cuando lo necesites, como una tabla temporal


dsCursor is Data Source

IF HExecuteSQLQuery(dsCursor,hQueryDefault,"SELECT Nombre,Direccion,Telefono FROM Tercero WHERE (1=0)") THEN

// dsCursor se puede llenar, eliminar registros, actualizar, guardar en un archivo, etc

END



Procedimiento para crear un cursor por comandos HDescribexxx

// Summary: <specify the procedure action>
// Syntax:
//Create_Cursor (<dsCursor> is data source, <sEstructura> is string)
//
// Parameters:
// dsCursor (data source): Nombre del cursor
// sEstructura (string): Estructura del cursor
// Return Value:
//  None
//
// For instance:
// Indicate an example.
// TMP_Cursor is data source
// sEstructura is string
// sEstructura = "iPrueba I $Entero,cPrueba C(20) $Carácter,nPrueba N(12.3) $Número,mPrueba M $Memo,dPrueba D $Fecha,tPrueba T $Fecha;; Hora"  ;; se transforma a ,
// Create_Cursor(TMP_Cursor,sEstructura)
// // HChangeConnection(TMP_Cursor,"")
// // fDelete("TMP.*")
// // fDelete("TMP_Cursor.*")
// // Create_Cursor(TMP_Cursor,sEstructura)
// // HToFile(TMP_Cursor,"tmp.fic")
// // HDeleteFile(ctConexion,"TMP_Cursor.fic")
PROCEDURE Create_Cursor(dsCursor is Data Source,sEstructura is string)
fdFile is File Description
idItem is Item Description
sArc is string = dsCursor
sEst is string
sCam is string
sTip is string
sTam is string
sDec is string
sTit is string
HChangeConnection(dsCursor,"")
fDelete(sArc + ".fic")
fDelete(sArc + ".ndx")
fDelete(sArc + ".mmo")
fdFile..Name = dsCursor
fdFile..Type = hFileNormal
fdFile..FicCryptMethod = hCryptStandard
FOR EACH STRING sEst OF sEstructura SEPARATED BY ","
 sTit = Replace(NoSpace(ExtractString(sEst + "$",2,"$")),";;",",")
 sEst = NoSpace(ExtractString(sEst + "$",1,"$"))
 sCam = NoSpace(ExtractString(sEst,1," "))
 sTip = Upper(Replace(Replace(NoSpace(ExtractString(sEst,2," ")),"(",""),")",""))
 sTam = Middle(sTip,2)
 sDec = NoSpace(ExtractString(sTam + ".",2,"."))
 sTam = NoSpace(ExtractString(sTam + ".",1,"."))
 sTip = Left(sTip,1)
 idItem..Name = sCam
 idItem..ExtendedInfo = sTit
 SWITCH sTip
  CASE "C","S"
   idItem..Type = hItemText
   idItem..Size = sTam
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
  CASE "I","E"
   idItem..Type = hItemInteger8
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
  CASE "B","R"
   idItem..Type = hItemReal8
   IF sTam <> "" THEN idItem..DecimalPart = sTam
   BREAK SWITCH
  CASE "Y"
   idItem..Type = hItemCurrency
   BREAK SWITCH
  CASE "L"
   idItem..Type = hItemBoolean
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
  CASE "N"
   idItem..Type = hItemNumeric
   idItem..Size = sTam
   idItem..DecimalPart = sDec
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
  CASE "D"
   idItem..Type = hItemDate8
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
  CASE "T"
   idItem..Type = hItemDateTime
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
  CASE "M"
   idItem..Type = hItemTextMemo
   BREAK SWITCH
  CASE "G"
   idItem..Type = hItemBinaryMemo
   BREAK SWITCH
  OTHER CASE
   idItem..Type = hItemText
   idItem..Size = sTam
   idItem..KeyType = hDuplicatesKey
   BREAK SWITCH
 END
 HDescribeItem(fdFile,idItem)
END
HDescribeFile(fdFile)




Saludos

Daniel

Alfredo García

unread,
Nov 25, 2014, 9:38:59 AM11/25/14
to de-fox-...@googlegroups.com

Excelente aporte Daniel.

David Silva

unread,
Nov 27, 2014, 4:47:20 AM11/27/14
to de-fox-...@googlegroups.com
Gracias a todos por responder a mi consulta, voy a probar todas y cada una de ellas a ver que aprendo y luego pondre aqui mis conclusiones, gracias a todos.

felix

unread,
Jan 11, 2015, 12:20:34 PM1/11/15
to de-fox-...@googlegroups.com
Hola, a lo que han dicho los compañeros y si llego a tiempo añado que con la funcion hcreateview y con los data source creo que se pueden emular bastanta bien los cursores de fox. Los datasource los puedes utilizar directamente en los comandos sql.

Un saludo y feliz año
Reply all
Reply to author
Forward
0 new messages