Homologaciòn de código VB.Net a Vfp

273 views
Skip to first unread message

Edward Cifuentes

unread,
May 4, 2012, 4:21:09 PM5/4/12
to publice...@googlegroups.com
Se utiliza una libreria llamada SQLHelper para generar un cursor de datos

Public Class gestor_citas
    Public Shared Function listar_citas() As DataSet

        Return SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings(0), CommandType.Text, "select * from citas  ")

    End Function
    Public Shared Function validar_cita(ByVal pcodcita As String) As DataSet

        Return SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings(0), CommandType.Text, "select * from citas  Where codcita='" & pcodcita & "'")

    End Function

End Class

Pero quiero esta sea en Vfp

La idea es que al llamar la funcion listar_citas
me devuelva el cursor  dependiendo del sql escrito
y lo pueda utilizar en el formulario de foxpro para la manipulacion de los datos










Fox Learner

unread,
May 4, 2012, 4:58:58 PM5/4/12
to Comunidad de Visual Foxpro en Español
Mejor pusieras que hace el código y habrá quien lo haga sin requerir
VB.NET

Saludos!

extremo

unread,
May 4, 2012, 5:12:01 PM5/4/12
to Comunidad de Visual Foxpro en Español
No se para que usar una clase publica pero en fin... asi es el VB.Net

en VFP

PROCEDURE gestor_citas
sqlexec( AppSettings(0),"select * from citas Where codcita=?
pcodcita","listar_citas")
EndProc


NOTA: AppSettings aparentemente esuna funcion donde se encuentra la
conexion, por eso la puse en el manejador de conexion

Que facil se hace todo en VFP

Bendiciones

Victor Espina

unread,
May 4, 2012, 5:24:10 PM5/4/12
to publice...@googlegroups.com
Extremo, VB.NET no tiene variables publicas (hasta donde yo se al menos).  En el codigo que se muestra, SQLHelper no es una variable publica, sino una clase con un metodo "static", que vendria a ser "executeDataSet".

Ahora, dado que en VFP no existe esta figura, la unica forma de implementarlo seria mediante una variable PUBLICA.  Por otro lado, tener una clase que centralize el acceso a la fuente de datos es muchisimo mejor idea que simplemente llamar a SQLEXEC().... mas sencillo no, definitivamente, pero si mucho mas practico y recomendable.

Saludos

Victor Espina

extremo

unread,
May 4, 2012, 5:28:09 PM5/4/12
to Comunidad de Visual Foxpro en Español
ok Victor,

lo decia por la sentecia "Public Class " al español significa clase
publica jejeje. Lo bueno del VFP es que los cursores son publicos para
todo el proyecto, no asi los dataSet, que al parecer son exclusivos
del objeto en el cual fue creado... creo que es asi, no me manejo
mucho en vb.Net.

Bendiciones

Victor Espina

unread,
May 4, 2012, 5:36:44 PM5/4/12
to publice...@googlegroups.com
Como le comentaba a extremo, "executeDataset" es un metodo "static" de la clase sqlHelper, y por tanto puede ser invocado directamente sin necesidad de crear una instancia de la clase.

Dado que VFP no soporta este tipo de metodos, la unica forma de simular el codigo seria mediante una instancia publica.  Ahora, antes de entrar en SQLHelper, veamos primero ConfigurationManager:

DEFINE CLASS ConfigurationManager AS Custom
 AppSettings = NULL
 PROCEDURE Init
  THIS.AppSettings = CREATE("Collection")
 ENDPROC
ENDDEFINE

Tambien necesitaremos una clase para almacenar los parametros de conexion:

DEFINE CLASS appSettings AS Custom
 connString = ""
ENDDEFINE

Y una clase para la enumeracion CommandType:

DEFINE CLASS commandTypeEnum AS Custom
 Text = 0
 StoreProcedure = 1
ENDDEFINE

Finalmente, la clase SQLHelper. Dado que VFP no soporta datasets como los de .NET, lo que haremos sera que el metodo devuelva el alias de un cursor temporal donde almaceno el resultado, De esta forma mantenemos la misma sintaxis que el ejemplo en .NET y cumplicmos con la misma funcion pero al estilo VFP:

DEFINE CLASS SQLHelper AS Custom
 PROCEDURE executeDataSet(goAppSettings, pnCommandType, pcCommandText)
  LOCAL nConn,cAlias
  nConn = SQLSTRINGCONNECT(goAppSettings.connString)
  cAlias = SYS(2015)
  DO CASE
         CASE pnCommandType = CommandType.Text
                     SQLEXEC(nConn, pcCommandText, cAlias)

         CASE pnCommandType = CommandType.StoredProcedure
                     SQLEXEC (nConn,"EXEC " + pcCommandText, cAlias)
  ENDCASE
  SQLDISCONNECT(nConn)
  RETURN cAlias
 ENDPROC
ENDDEFINE

Ahora, al inicio de tu programa principal defines las variables publicas:

PUBLIC SQLHelper, CommandType, ConfigurationManager
CommandType = CREATE("CommandType")
ConfigurationManager = CREATE("ConfigurationManager")
SQLHelper = CREATE("SQLHelper")

Luego, anades una instancia de AppSettings al ConfigurationManager:

LOCAL oAppSettings
oAppSettings = CREATE("AppSettings")
oAppSettings.connString = "cadena de conexion"
ConfigurationManager.AppSettings.Add(oAppSettings)

Y listo: ahora puedes hacer:

PROCEDURE listar_citas
 RETURN SqlHelper.executeDataSet(ConfigurationManager.AppSettings(0), CommandType.Text, "SELECT * FROM citas")
ENDPROC

Toma en cuenta que esto es solo una prueba de concepto. A esto tendrias que meterle aun mucho codigo de validacion, en especial a ExecuteDataSet.

Saludos

Victor Espina

    Public Shared Function listar_citas() As DataSet

        Return SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings(0), CommandType.Text, "select * from citas  ")

    End Function

Victor Espina

unread,
May 4, 2012, 5:39:02 PM5/4/12
to publice...@googlegroups.com
Una clase no es lo mismo que una instancia.  Una clase PUBLIC es una clase que puede ser instanciada en todo el proyecto.  Seria equivalente al DEFINE CLASS de VFP.

En cuanto a los DataSet, es correcto: el alcance de un DataSet es el mismo del que tenga la variable que lo contiene.  En VFP es mas simple porque el alcance de un cursor es el DataSession donde fue creado y si no se usan DataSessions privados, pues el resultado es que los cursores son "publicos".

Saludos

Victor Espina

extremo

unread,
May 4, 2012, 5:44:06 PM5/4/12
to Comunidad de Visual Foxpro en Español
Victor

y no era mas facil asi:

PROCEDURE gestor_citas
sqlexec( AppSettings(0),"select * from citas Where codcita=?
pcodcita","listar_citas")
EndProc

tambien pudo haberse parametrizado de l asiguioente forma

PROCEDURE gestor_citas (Conn ,cSql ,cAlias)
sqlexec( nConn,cSql ,cAlias)
EndProc

o esa instrucion no servia segun el codigo vb.net?

Bendiciones
>     Public Shared Function *listar_citas*() As DataSet
>
>         Return
> SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings(0),
> CommandType.Text, "select * from citas  ")
>
>     End Function
>
>
>
>
>
>
>
> On Friday, May 4, 2012 3:21:09 PM UTC-5, Edward Cifuentes wrote:
>
> > Se utiliza una libreria llamada SQLHelper para generar un cursor de datos
>
> > Public Class gestor_citas
> >     Public Shared Function *listar_citas*() As DataSet
>
> >         Return
> > SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings(0),
> > CommandType.Text, "select * from citas  ")
>
> >     End Function
> >     Public Shared Function *validar_cita*(ByVal pcodcita As String) As
> > DataSet
>
> >         Return
> > SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings(0),
> > CommandType.Text, "select * from citas  Where codcita='" & pcodcita & "'")
>
> >     End Function
>
> > End Class
>
> > Pero quiero esta sea en Vfp
>
> > La idea es que al llamar la funcion *listar_citas *

Victor Espina

unread,
May 4, 2012, 5:54:57 PM5/4/12
to publice...@googlegroups.com
Bueno la idea era replicar en lo posible el codigo en VB.NET.  Ahora bien, si lo que interesaba replicar era solo el metodo listar_citas(), aun asi hay muchas mas ventajas en usar un proveedor de datos centralizado (como SQLHelper) en lugar de un SQLEXEC() directo.

Si, el SQLEXEC() es lo mas facil y rapido de hacer, pero carece de la capacidad de ampliacion y adaptacion que tiene una clase helper.  Manejar todo el acceso a datos en un punto central simplifica la correccion de errores y te permite crear adaptaciones que no rompen el codigo a traves del sistema.

Te pongo un ejemplo. Supon que tu sistema hace uso de SQLEXEC() en todo el codigo para acceder a los datos. Y digamos que, hasta ahora, tu sistema funciona en SQL Server.  Digamos que tienes un nuevo cliente que quiere manejar tu sistema, pero en Oracle.  En teoria, todo lo que tendrias que hacer (asumiendo que usas SQL standard, etc) es cambiar tu cadena de conexion y el sistema deberia funcionar correctamente, cierto?

Falso.

En SQL Server, las fechas vacias se repesentan como "cadenas vacias".  Si tu haces:

UPDATE tabla SET fecha = '' 

Cuando te traes esos datos a VFP, la columna fecha te llegara como {//::}.  En Oracle, sin embargo, ese mismo UPDATE te causaria un error porque Oracle interpreta la cadena vacia como un valor incorrecto para una fecha.  Puedes evitar el error a traves de un SET en la BD o en la conexion, pero esto lo que causara es que Oracle grabe el valor NULL en esos casos.  Como consecuencia, cuando te traigas esos datos a tu programa, empezaras a experimentar errores y comportamiento anomales debido a que tu programa espera fechas vacias y en su lugar esta recibiendo valoes NULL.

Ahora, si en lugar de usar SQLEXEC() directamente hubieras usado una clase helper, que tuviera digamos un metodo Execute(), podrias solucionar el problema incluyendo codigo en Execute() que analize el cursor resultante en busca de columnas fecha con valores NULL y los sustituya por {//::} antes de devolver el cursor.  Tu programa ni siquiera se enteraria de que el metodo Execute() cambio, pues recibe los mismos parametros que antes y devuelve el mismo resultado que antes... pero la ventaja es ENORME y obvia.

Saludos

Victor Espina

extremo

unread,
May 4, 2012, 5:59:30 PM5/4/12
to Comunidad de Visual Foxpro en Español
gracias por la clase

Bendiciones

Victor Espina

unread,
May 4, 2012, 6:04:01 PM5/4/12
to publice...@googlegroups.com
Ja Ja... ultimamente me han dicho esa misma frase varias veces... y mira que en mi tierna juventud di varias veces clases a los "freshmen" de la universidad y no entendian pero ni los buenos dias... demasiado frustrante!!   De hecho, mi hija menor opto por "fajarse" ella sola con matematicas porque las veces que intente explicarle tampoco me entendia pero nada!! :(

Parece que cuando escribo me salen mejor las cosas que cuando hablo :)

Saludos

Victor Espina

Edward Cifuentes

unread,
May 4, 2012, 6:14:53 PM5/4/12
to publice...@googlegroups.com
Victor sos un genio!  jajajaj
yo solo se que utilizaba esa libreria
por que la descargue  jajajaj
y la utilizo para programacion en capas en Visual Basic.Net
la idea es minimizar codigo a la hora de crear... creando funciones que retorne lo que uno necesita

Que tan recomendable es crear clases vcx de Fox Pro para minimizar programaciòn ???
o una metodologia para programar rapidamente en Fox Pro

Sharp User

unread,
May 4, 2012, 6:21:21 PM5/4/12
to publice...@googlegroups.com
Magistral explicación Sr. Víctor Espina.

Cierto lo que indica, dado que VFP no soporta datasets como los de .NET, ha sido un poco "espinoso" en mi aprendizaje del Zorro, pero una implementación alterna ha bastado para su ejecución.

Tan claro como el agua de manantial en tiempos prehispánicos...

Para mi gusto, aquí podemos "fajarnos solos", pero una orientación personalizada, nunca viene de más.

Éxitos!!

Buen tip

Victor Espina

unread,
May 4, 2012, 6:43:31 PM5/4/12
to publice...@googlegroups.com
"Que tan recomendable es crear clases VCX de FoxPro para minimizar programacion"

Es que hay alguna otra forma de programar que no sea mediante clases ?? :)   Yo di el salto a la programacion OOP por alla por el 95 y fue una entrega a fondo... y cuando empeze con .NET en el 2003 no hice mas que empeorar en mi "enfermedad"... ahora, para mi, todo es una clase... o simplemente no existe.

Saludos


Victor Espina

Sharp User

unread,
May 4, 2012, 6:47:09 PM5/4/12
to publice...@googlegroups.com
Eso es "hacerlo con Clase".

Coincido con ud. personalmente es más cómodo.

Fox Learner

unread,
May 4, 2012, 10:03:57 PM5/4/12
to Comunidad de Visual Foxpro en Español
Wow! Puros "Clasistas" jaja

La próxima meta es java muchachos jeje

Ojalá que java no muera "con clase" (por aquello de que morirá gracias
a Oracle Corp.) jeje

Saludos!

En mi caso, apenas estoy aprendiendo arreglos jaja y eso que ya tuve
muchas "clases" jeje

Ya se me esta pegando lo del viernes jeje

Hector R. De los Santos

unread,
May 7, 2012, 3:27:53 PM5/7/12
to publice...@googlegroups.com
Yo tengo una clase para manejar las consultas y eso.
Para usarla la tengo una clase de formularios y ahi le tengo agregada la clase para consultas SQL.

Hago algo asi:

Thisform.SqlQuery.EjecutaQuery(dbHand,lQuery,NameCur,Param,Param)






:: HDS Consultores TI
Servidores | Redes | Programacion | GNU/Linux | PostgreSQL
Web: http://hdsconsultores.net
Blog: http://codigohds.com
Linux User #:320363

Hector R. De los Santos

unread,
May 7, 2012, 3:31:13 PM5/7/12
to publice...@googlegroups.com
Como nota aclaratoria, utilizo esta clase no solo por facilidad sino que puedo manejar los errores o resultados de las consultas que realizo, asi no le muestro mensajes raros al usuario.



:: HDS Consultores TI
Servidores | Redes | Programacion | GNU/Linux | PostgreSQL
Web: http://hdsconsultores.net
Blog: http://codigohds.com
Linux User #:320363


Fox Learner

unread,
May 7, 2012, 4:59:39 PM5/7/12
to Comunidad de Visual Foxpro en Español

Victor Espina

unread,
May 7, 2012, 5:07:38 PM5/7/12
to publice...@googlegroups.com
Es que ya es viernes y no me di cuenta??  Guau!! La semana se paso volando!!! 

Que comicos son los tipos de M$!!

Victor Espina

On Monday, May 7, 2012 3:59:39 PM UTC-5, Fox Learner wrote:
http://msdn.microsoft.com/en-US/library/ek0t4bt5(v=vs.80).aspx

Jaja
Reply all
Reply to author
Forward
0 new messages