Rutinas básicas de Archivos de Altas, Bajas, Cambios, Consultas, Impresión.

1,330 views
Skip to first unread message

TheNewInquirer

unread,
Mar 2, 2012, 12:03:04 PM3/2/12
to Comunidad de Visual Foxpro en Español
Me pregunto si en el foro o alguna página existen ejemplos de las
rutinas básicas de manejo de archivos (en este caso tablas) con Visual
Foxpro.

Quizás, si ponemos dichos ejemplos, muchos de los que empiezan podrán
reducir sus preguntas a preguntas más "incentivadoras".

También me servirán para ver que puedo mejorar en mis propias rutinas
o si estoy omitiendo alguna instrucción que pudiera ser básica, como
el famoso FLUSH, que nadie me había presentado jeje

Gracias por su tiempo y compartir su experiencia!

NOTA.- Por "Altas" me refiero al código más simple de un botón
AGREGAR.

Por "Bajas" al código mas simple de un boton ELIMINAR 1 REGISTRO.

Por "Cambios" a la manera más simple y correcta de efectuar cambios en
1 REGISTRO COMPLETO.

Por "consultas", a la manera más simple de "mostrar" al menos 1
REGISTRO, o un bloque o grupo de registros.

Tal vez hasta podrían especificar como se haría con los nativos y con
los comandos alternativos del lenguaje Sql nativo, o el NO nativo.

Gracias!

Victor Espina

unread,
Mar 2, 2012, 12:05:59 PM3/2/12
to publice...@googlegroups.com
Justo para eso esta PortalFox.  Yo creo que lo que la gente necesita no es mas informacion sobre como hacer las cosas, sino mas instruccion sobre COMO UBICAR la informacion que ya existe en internet.

Victor Espina

TheNewInquirer

unread,
Mar 2, 2012, 12:41:23 PM3/2/12
to Comunidad de Visual Foxpro en Español
Para un botón Agregar (Alta) uso esto:

Primero busco si está un cliente con un lostfocus() de un text del
número de cliente:

STORE 0 TO A

SELECT 0
USE CLIENTES
GO TOP

LOCATE FOR Xnumclie=val(alltrim(Thisform.txtnumclie.value))
IF FOUND()
A=MESSAGEBOX("EL NUMERO DE CLIENTE YA EXISTE",64+6, "EXISTE")
IF A=1
USE
Thisform.refresh()
Thisform.cmdsalir.setfocus()

ELSE

* Si no existe, pone el enfoque en el primer control donde se empezará
la captura de datos del cliente.

Thisform.txtnombreclie.SetFocus()

ENDIF
ENDIF
RETURN


(Claro, si el archivo va a estar indexado, crearia el índice CDX y
luego lo pondría en uso y buscaría con SEEK.)

Luego que no se encontró la clave y el usuario capturó los datos del
cliente.

Pongo esto en el boton Agregar Cliente:

SELECT 0
USE CLIENTES
GO BOTTOM
append blank

replace numclie with val(alltrim(thisform.txtnumclie.value)) ==>Uso
val porque en la tabla el dato es numérico.
replace nombre with alltrim(thisform.txtnombreclie.value)
replace Xcampos with (thisform.txtcampos.value)
Etc...

* Generando y reemplazando el último número de cliente.
SELE 0
USE PARAMETROS
GO 1

Xnumclie=VAL(TRANSFORM(YEAR(DATE()), '9999')
+SUBSTR(ALLTRIM(STR(UltCliente)),5))

REPLACE UltCliente WITH Xnumclie+1

FLUSH

USE

thisform.Refresh()
thisform.txtnumclie.Setfocus()

RETURN


Ups! Apenas lo de agregar.. jeje

TheNewInquirer

unread,
Mar 2, 2012, 2:07:24 PM3/2/12
to Comunidad de Visual Foxpro en Español
Maestro Victor,

Creo que la diferencia entre uno novato (como yo) y un master (como
usted) es diametralmente opuesta y extensa jeje.

Que pena que no me enteré que existía este foro desde el 2004 que ví
por primera vez portal fox.

Quizás me hubiera animado a hacer un manual práctico con todas las
ideas que he recibido en este foro, dirigido a los principiantes.

Por ejemplo, lo que comentó Irlándes de las 2 formas de trabajar con
los grids fue super!. (Básicamente una abstracción de los comentarios
de los compañeros, en especial, Walter y el maestro Luis María).

http://groups.google.com/group/publicesvfoxpro/browse_thread/thread/27bd059cfab1c98b/f474c0f574333ce3?lnk=gst&q=irlandes+cursor+dos+caminos#f474c0f574333ce3

http://groups.google.com/group/publicesvfoxpro/browse_thread/thread/8b0b7c6ed54ddaeb/161c2633afe517d5?lnk=gst&q=grids#161c2633afe517d5

A veces cuando "no sabes que existen 2 métodos" y no tienes la idea
clara de lo estás haciendo, todo parece muy confuso para un learner.

Sigo sin encontrar información sobre el manejo de archivos en Fox...

Saludos!

Víctor Hugo Espínola Domínguez

unread,
Mar 2, 2012, 4:20:59 PM3/2/12
to publice...@googlegroups.com
MIra este enlace:  http://www.universalthread.com/ViewPageArticle.aspx?ID=744 

Saludos, Víctor.
Message has been deleted

Victor Espina

unread,
Mar 2, 2012, 4:42:37 PM3/2/12
to publice...@googlegroups.com
Y tu crees que yo "naci" asi?  cuando empeze a programar con Visual Foxpro, venia de varios anos programando con FoxBase y FoxPro/DOS y Windows, pero no sabia NADA de programacion visual, OOP y acceso a servidores como SQL Server.

Todo lo que aprendi a partir de ese momento fue a fuerza de investigar, leer, probar y luego de hacer TODO ESO, entonces preguntar en el grupo de fox en usenet, que de paso estaba en ingles. Si uno tiene un problema, pregunta en el grupo y obtiene una respuesta, logro solucionar y avanzar.

Pero si en lugar de eso, primero investigas, buscas, lees articulos anteriores, experimentas con las ideas que tomas de alli hasta que logras dar con la solucion, el aprendizaje logrado de esa forma es ENORME. 

He perdido la cuenta de la cantidad de veces que me tope con algo totalmente inesperado y provechoso mientras buscaba la respuesta a otro problema totalmente distinto.

Es algo que se ha comentado mucho en este grupo: mucha gente, en especial los nuevos, se limitan a preguntar y esperar que alguien les de una solucion al primer problema que encuentran, en lugar de dedicar tiempo y esfuerzo a intentar hallar la respuesta por sus propios medios.

En mis tiempos ni siquiera teniamos esa cosa magica llamada Google!!!

Saludos

Victor Espina

Carlos Miguel FARIAS

unread,
Mar 2, 2012, 4:47:12 PM3/2/12
to publice...@googlegroups.com
Para hacer las funciones básicas, lo primero que hay que definir, si vamos a trabajar con un enfoque xbase, solo aplicable a nativas y no migrable a SGBD (que a su vez da dos opciones adicionales, si usamos buffers o no) y la otra es usando vfp nativo, pensando en migrar luego a un SGBD.
Trabajando con SGBD es la tercer gran posibilidad (y acá tenemos si no conté mal tres formas alternativas)
Entonces, cual es la intención original, o a que apuntamos.

Creo que si empezamos de cero un proyecto (aún trabajando con nativas), deberíamos al menos pensar en un esquema basado en SQL, no quita que en algunas situaciones usemos el lenguaje xbase, pero evidentemente, si nuestra aplicación queremos que luego sea portable a un entorno de datos mas seguro, el esquema podríamos llamar "antiguo" no lo veo funcional.

Esto al menos me parece, es lo mas apropiado para los que todavía no tienen claro todas las posibilidades o hace poco que empiezan, el que ya tiene xbase dominado, por supuesto que con nativas puede seguir trabajando igual.

Entonces, si vamos a agregar registros usamos un INSERT INTO, si vamos leer un registro (o varios) usamos SELECT FROM, si vamos a modificar usaremos UPDATE (de SQL), si vamos a borrar, usaremos DELETE (de sql).
Los índices los crearemos de acuerdo a requerimientos, uno primario por supuesto, algún candidato si fuera conveniente, y algunos pocos más, los que deberán definirse en cuanto a la frecuencia de uso que hay (por ejemplo, indexar apellido y nombre de clientes, proveedores, nombre productos, etc,) ya que son datos que se consultan con frecuencia en lotes y en ese orden, y estos indices, que sean estructurales.
Con el esquema SQL, no tenemos que pensar en activar índices ni seleccionar áreas, ni otras cosas que normalmente es necesario cuando se usa el tradicional xbase.
Si tenemos consultas (SELECT FROM WHERE) habituales, podemos crear una vista local (hasta hay un asistente) y trabajar contra dichas vistas como si fueran tablas comunes (para incluir en selects)
Ojo no es conveniente hacer vistas sobre varias vistas, porque a veces las vistas básicas son muy rápidas, pero cuando se juntan varias vistas como origen de datos, a los motores se les confundir el modo de solución.
Entonces al insertar, previamente podemos hacer una rutina proactiva que primero haga un SELECT consultando por el valor de clave primaria que se va insertar, si responde que no esta insertamos, si dice esta, avisamos que duplicado o podemos usar una rutina reactiva que si da error, indicamos que hubo un duplicado (esto último lo haces envolviendo el insert con un try catch).
Al actualizar y borrar, debemos asegurar que en el WHERE se haga referencia a la clave primara.
Dentro del esquema de acceso con SQL a nativas, podemos utilizar Cursores Adapters

Concluyendo: Este esquema comentado, en el caso de tener que pasarnos a un SGBD, solo requiere encapsular las sentencias SQL con las funciones de acceso que sea necesario, pero no implica cambiar para nada la presentación lógica.
En n SGBD externo, nos manejamos por SQL passtrhu o con cursores adapters, estos últimos serían los que menos conversión necesitarian.

En fin: son opciones, y puede haber más.
Saludos: Miguel, La Pampa (RA)

TheNewInquirer

unread,
Mar 2, 2012, 10:41:12 PM3/2/12
to Comunidad de Visual Foxpro en Español
Gracias Carlos!

Lamentablemente suspendí hace años mis lecturas de Fox llevado por la
idea de que no sería mas compatible. Al no ver otro lenguaje tipo RAD
orientado al manejo de datos y no disponer de tiempo para "aprender"
el .NET (En ese tiempo un verdadero caos, según los mismos que lo
usaban), decidí dedicarme a otras cosas.

Por ello, aunque actualmente estoy desarrollando 2 proyectos pequeños,
no me siento con el nivel para adentrarme en el mundo SQL y no
quisiera poner en riesgo la información de mis clientes por mi falta
de experiencia.

Pretendo terminar (uno en mes y el otro quizás en 2), los proyectos
actuales. Luego vendrá la parte interesante: "Migrar esos sistemitas"
a Firebird o PostgreSql.

Quiero hacer hacer sistemas paralelos y someterlos a prueba. Una vez
pasada "la prueba de escritorio", ofreceré la "nueva versión" a los
clientes. Lo bueno es que para ese tiempo "ya tendre muy clara" la
lógica de los negocios y solo me ocuparé de la programación.

De hecho, ya me recomendaron aprender SQL y OOP en este foro. Espero
llegar a ese siguiente nivel dentro de poco y "poder hablar el mismo
idioma" con uds. los masters jeje

Gracias!

TheNewInquirer

unread,
Mar 2, 2012, 11:18:34 PM3/2/12
to Comunidad de Visual Foxpro en Español
Victor,

Las preguntas que hago en este foro, me ayudan a avanzar a pasos
agigantados. Aunque no son la única fuente que consulto.

El asunto es que en mi caso, ultimamente ya no estoy confiando mucho
en los manuales "oficiales" de visual foxpro, ya que veo que las
soluciones que reflejan la vasta experiencia práctica de los
compañeros, hace ver la ayuda oficial como alguien que lleva por el
camino contrario..

Considero las respuestas de los programadores de la vida real como una
excelente clase, donde tengo "maestros" que poseen gran experiencia
práctica y no tanto teórica. Eso es muy valioso !!

Claro, quizás haya alguien que solo "se limite" a hacer preguntas y
esperar respuestas. Aun así, de existir esas personas, no creo que
logren "terminar un proyecto completo"..

A veces uno pregunta porque necesita "guía, sugerencias o consejos" de
parte de gente experimentada. Después de recibir esa orientación, aún
quien pregunta tiene que pensar mucho no solo en la programación sino
en la lógica, el diseño, las necesidades del cliente, etc. para llegar
al punto de hacer algo útil. No creo que con solo la respuesta que se
ofrece "se le resuelva la vida" al desarrollador.

Hace años leí en una revista internacional un tema muy interesante:

¿Podemos ser de mentalidad mas abierta?..

La publicación decía: No existe alguien que tenga TODA LA RAZÓN, ni
alguien que esté TOTALMENTE EQUIVOCADO.

El intentar "clasificar" a todas las personas que hacen una pregunta
dentro de una misma categoría no parece reflejar un punto de vista
equilibrado o razonable. No es bueno "generalizar"..

Afortunadamente, cada persona es muy diferente de las demás y eso hace
la vida enriquecedora. Sino todo sería "pan con lo mismo" jeje

A veces, es como estar dentro de un rectangulo pero cada persona en
cada esquina diferente. Cada uno tendrá una perspectiva diferente, y
eso es lo que nos pasa muchas veces en la vida. Vemos la vida desde
"nuestro ángulo" de circunstancias.

Hasta uno de los científicos más eminentes de la historia reconoció
que las matemáticas (siendo una ciencia exacta) podrían ser
incorrectas en circunstancias muy diferentes.

"Cuando las leyes de la matemática se refieren a la realidad, no son
ciertas; cuando son ciertas, no se refieren a la realidad" (Albert
Einstein).

http://www.proverbia.net/citastema.asp?tematica=452

Espero que este sencillo mensaje pueda servir de algo en la vida,
aunque no sea de programación porque ahí no sé gran cosa jeje, ahi
ustedes son los masters !

Saludos!

Carlos Miguel FARIAS

unread,
Mar 3, 2012, 10:02:57 AM3/3/12
to publice...@googlegroups.com
Esta totalmente equivocado quien dice que tiene toda la razon, es mas no tengo toda la razon de estar todo equivocado.

Volviendo al tema de las rutinas de acceso.

Mi consejo es que si vas a seguir desarrollando aplicaciones que manejan datos, te tomes todo el tiempo posible que no es mucho, para aprender lo básico de SQL.
Con SQL podes reemplazar en una sola instrucción hasta 200 instrucciones de xbase común (un poco menos si usas SET RELATION, ya que esta es un INNER JOIN escrito de otra manera).

Además, si luego piensas migrar a un SGBD, la única forma de manejarlo con xbase común (como las nativas) es mediante vistas remotas, que no son  muy aconsejables.

El cursor adapter es una clase que envuelve una conexion a la bd con sql.

Si no aplicas nuevas técnicas, no haces honor al apodo que usas (el nuevo investigador)

Saludos: Miguel, Santa Rosa (LP)

edgar suarez kummers

unread,
Mar 3, 2012, 10:09:21 AM3/3/12
to publice...@googlegroups.com
La razón no se tiene.
Ni siquiera la mujer de uno la tiene.
La mujer se usa según se necesite y siempre que esté de acuerdo..
La razón se esgrime como una espada cuando se deja tomar por el cabo.

edgar
--
edgar suarez kummers
Reply all
Reply to author
Forward
0 new messages