[vfp] Cursor Vs Use Tabla

1,467 views
Skip to first unread message

Rita Cecila Restrepo De La Hoz

unread,
Feb 27, 2012, 9:42:13 AM2/27/12
to Comunidad de Visual Foxpro en Español
Hola chicos
Que tenga un lindo dia al lado de sus seres queridos.


Ya tengo diseñadas muchas de las interfaces y están funcionando correctamente los objetos y con las secuencias que me recomendaron, Miguel, Datamav, Antonio, su tertulia fue muy productiva para mi, ya que pude localizar muchos errores o mas bien no los llamemos errores, sino redundancias innecesarias y centrarme en organizar mejor mis pantallas (Interfaces como ustedes les dicen, existe un porque para esta definición?), gracias por su valiosa guía.

Ahora manos a la maza, ya tengo que definir consultas y/o organizar las guardadas de eso datos.

Hasta el momento tengo las tablas y estoy utilizando y funcionando bien:

Para consultar
Explicación de como lo entiendo: Abro la tabla con USE y el ALIAS, llamo el INDEX para que se organice la tabla con el campo principal, busco con el SEEK
con mi_variable_busqueda que seria la variable principal (Código, identificación y otras), si existe cargo en diferentes variables la información de los diferentes campos y cierro la base de datos para que no este mucho tiempo abierta, sino existe cierro la base de datos y cargo las diferentes variables, por ultimo cargo mis variables a los diferentes objetos, de ese punto ya puedo seguir trabajando.

USE mi_tabla ALIAS nombre_alias
INDEX ON campo TO mi_index
SEEK mi_variable_busqueda
IF FOUND()
     mi_variable_2 = campo2
     mi_variable_3 = campo3
     mi_variable_4 = campo4
     CLOSE ALL
ELSE
     CLOSE ALL
     mi_variable_2 = ""
     mi_variable_3 = ""
     mi_variable_4 = 0
ENDIF
mi_form.mi_objeto2.value = mi_variable_2
mi_form.mi_objeto3.value = mi_variable_3
mi_form.mi_objeto4.value = mi_variable_4


Para guardar
Explicación de como lo entiendo: Abro la tabla con USE y el ALIAS, llamo el INDEX para que se organice la tabla con el campo principal, busco con el SEEK
con mi_variable_busqueda que seria la variable principal (Código, identificación y otras), si NO existe remplazo el campo principal con mi variable principal esto dentro de un IF...ENDIF para que si existe no se pueda modificar la información de ese campo principal (como cédulas, código y otros) y remplazo el resto de los campo con el resto de las variables, cierro la tabla, continua el proceso.

USE mi_tabla ALIAS nombre_alias
INDEX ON campo TO mi_index
SEEK mi_variable_busqueda
IF EOF()
    REPLACE campo1 = mi_variable_busqueda
ENDIF
REPLACE campo2 WITH mi_variable_2
REPLACE campo3 WITH mi_variable_3
REPLACE campo4 WITH mi_variable_4
CLOSE ALL

Para retirar
Explicación de como lo entiendo: Abro la tabla con USE y el ALIAS, llamo el INDEX para que se organice la tabla con el campo principal, busco con el SEEK
con mi_variable_busqueda que seria la variable principal (Código, identificación y otras) y borro el registro pero ya no lo hago físicamente con el PACK por recomendación de muchos, el mantenimiento de las tablas lo hago desde otra aplicación de mantenimiento..

USE mi_tabla ALIAS nombre_alias
INDEX ON campo TO mi_index
SEEK mi_variable_busqueda
DELETE
CLOSE ALL

INQUIETUD UNO
Todo esto lo tengo funcionando bien, pero por recomendación (no recuerdo) me dijeron que ya no necesitaba llamar el index que el se cargaba automáticamente cada ves que yo llamara una tabla, pero si tengo dos index como hago entonces, en una consulta lo tengo por identificación y en otra por alfabético.

INQUIETUD PRINCIPAL
Estuve leyendo sobre cursores sql, que el cursor se crea como una tabla temporal, como hago para que se pase la información de una tabla a una tabla temporal, y teniendo la tabla temporal puedo manipular la información de los registros, como modificar alguna información de algún registro y por ultimo si ya tengo las modificaciones como actualizar mi tabla con el cursor.

Quiero dejar funcionando correctamente todo antes de evolucionar mas tablas al manejo de SQL-Fire, mil gracias por su colaboración.

Cordialmente.

Rita.
  

Luis Santander

unread,
Feb 27, 2012, 9:54:14 AM2/27/12
to publice...@googlegroups.com
USE mi_tabla INDEX mi_index
SEEK mi_variable_busqueda
IF FOUND()
     mi_variable_2 = campo2
     mi_variable_3 = campo3
     mi_variable_4 = campo4
ELSE
     mi_variable_2 = ""
     mi_variable_3 = ""
     mi_variable_4 = 0
ENDIF
USE
mi_form.mi_objeto2.value = mi_variable_2
mi_form.mi_objeto3.value = mi_variable_3
mi_form.mi_objeto4.value = mi_variable_4

********
USE mi_tabla INDEX mi_index
SEEK mi_variable_busqueda
IF !FOUND()

Luis Santander

unread,
Feb 27, 2012, 9:56:58 AM2/27/12
to publice...@googlegroups.com
para agregar o modificar
********
USE mi_tabla INDEX mi_index
SEEK mi_variable_busqueda
IF !FOUND()
     APPEND BLANK
    REPLACE campo1 = mi_variable_busqueda
ELSE
REPLACE campo2 WITH mi_variable_2
REPLACE campo3 WITH mi_variable_3
REPLACE campo4 WITH mi_variable_4
ENDIF
USE
*******
y para borrar

USE mi_tabla INDEX mi_index
SEEK mi_variable_busqueda
IF FOUND()
      DELETE
ENDIF
USE


 
 

Intel Man

unread,
Feb 27, 2012, 10:43:47 AM2/27/12
to publice...@googlegroups.com
Hola, esta parte de "consultar" puedes hacerlo asi (creo que te recomendaron no usar el index cada vez que abras la tabla) solo se usa una vez y no uses indices .idx usa indices .cdx son mas faciles de administrar).

SOLO UNA VEZ...... NO A CADA RATO :)    (Osea cuando creas la tabla o cuando crear otro indice, y lo usas en la ventana de comandos)

USE MI_TABLA
INDE TAG MI_INDEX ON CAMPO

Ahora el codigo que yo utilizaria seria este:
USE mi_tabla order mi_index=SEEK(mi_variable_busqueda)
mi_form.mi_objeto2.value = campo2
mi_form.mi_objeto3.value = campo3
mi_form.mi_objeto4.value = campo4
CLOSE data

Eso es todo :)

Ya que el seek si no encuentra datos se va al final, y si asignas a algun control cuanto esta al final ( eof() ) solo devuelve datos vacios y no es necesario crear variables con datos vacios por que ya es por default los datos vacios.



Para la parte de "guardar" utilizaria esto:

Tienes que usar un append blank (otros te diran un insert) para agregar un registro mas con el nuevo código (campo1):


USE mi_tabla order mi_index
if !SEEK(mi_variable_busqueda)
    append blank
    REPLACE campo1 with mi_variable_busqueda
ENDIF
REPLACE campo2 WITH mi_form.mi_objeto2.value, campo3 WITH mi_form.mi_objeto3.value,campo4 WITH mi_form.mi_objeto4.value
close data all

No es necesario crear tannnnnnnnnnnntas variables si puedes usar defrente el valor del objeto.

Saludos


Para los indices puedes tener hacer asi en la ventana de comandos (SOLO UNA VEZ)


use tu_tabla exclusive
inde tag tu_tag1 on campo1
inde tag tu_tag2 on campo2
inde tag tu_tag3 on campo3
inde tag tu_tag4 on campo4

Eso solo una vez y tiene cuatro indices ya generados (se genera un solo archivo automaticamente:  tu_tabla.cdx)

Cuando abres la tabla solo especificas el orden que quieres usar, por ejemplo:

use tu_tabla order tu_tag3

O puedes abrir tu tabla y despues solo cambias el orden:

use tu_tabla
................
tu codigo
...............
set order to tu_tag2

O cualquiera que hayas creado.

Para ver los indices creados haces asi:

use tu_tabla
display status

Eso te mostrara todos los indices de tu tabla.


Yo manejo tablas temporales solo para grids, lo demas de ingreso de datos lo hago defrente en las tablas.

Saludos.



Date: Mon, 27 Feb 2012 09:42:13 -0500
Subject: [vfp] Cursor Vs Use Tabla
From: ritacecil...@gmail.com
To: publice...@googlegroups.com

TheNewInquirer

unread,
Feb 27, 2012, 11:04:28 AM2/27/12
to Comunidad de Visual Foxpro en Español
Bastante Legible Luis..


Rita,

Acerca de tu inquietud uno: "pero si tengo dos index como hago
entonces, en una consulta lo tengo por identificación y
en otra por alfabético".

Puedes crear indices ANIDADOS y elegir el orden que quieres usar con
SET ORDER TO (TAG). Recuerda que para crear indices anidados debes
convertir los campo a tipo Caracter usando las funciones STR(),
DTOS(), etc y anidar los indices con "+". Mira este ejemplo:

SET DATE ITALIAN

CLOSE DATABASES
SET SAFETY OFF

SET EXCLUSIVE ON ==>Ponemos las tablas en exclusivo temporalmente
para crear los indices.

USE Transacciones
INDEX ON ALLTRIM(NOMBRE)+DTOS(FECHA) TAG Nombre
USE

USE Areas
INDEX ON ALLTRIM(Oficina) TAG Oficina
USE

SET EXCLUSIVE OFF ==> Activamos el modo compartido, para trabajo en
red.

SELE 0
USE Transacciones
SET ORDER TO Nombre

SELE 0
USE Areas
SET ORDER TO Oficina

Lo ultimo lo haces cuando quieres presentar datos en un grid y que
aparezcan ordenados por cierta columna.

Cuidate!

Luis Santander

unread,
Feb 27, 2012, 11:08:34 AM2/27/12
to publice...@googlegroups.com
Eso es correcto y disculpa mi intromision, pero mi intencion fue
corregirle un poco el codigo que posteo Rita, quizas mas adelante
cuando ella este mas inmersa en esto de la programacion en VFP
la podremos llevar y ayudar a tener un codigo mas legible y a nivel
mas avanzado de VFP.

Gracias
saludos.


Carlos Miguel FARIAS

unread,
Feb 27, 2012, 11:10:29 AM2/27/12
to publice...@googlegroups.com
Estimada Rita:
Contestando por partes, (como dijo un descuartizador de mis pagos)

> Hola chicos
 Gracias por lo de chico, todo hombre tiene un niño en algún rincón del corazón, si el corazón es redondo, no lo estoy encontrando.
Que tenga un lindo día al lado de sus seres queridos.
Acá en Argentina, tenemos un día feriado (200 años desde que izaron la bandera por primera vez).
El día lindo, con mi familia bien (salvo salud, pero es otra historia no contable aquí)                                                                                                                                  
                                                                                                                                  
> Ya tengo diseñadas muchas de las interfaces y están funcionando correctamente los objetos y con las secuencias que me recomendaron, Miguel, Datamav, Antonio, su tertulia fue muy productiva para mi, ya que pude localizar muchos errores o mas bien no los llamemos errores, sino redundancias innecesarias y centrarme en organizar mejor mis pantallas (Interfaces como ustedes les dicen, existe un porque para esta definición?), gracias por su valiosa guía.
Si fui partícipe necesario para tu solución, ¿necesitare un abogado?


> Ahora manos a la maza, ya tengo que definir consultas y/o organizar las guardadas de eso datos.
Tal como presumía, nos agarran con las mano en la maza.


> Hasta el momento tengo las tablas y estoy utilizando y funcionando bien:
Alabado el Fox.


> Para consultar
> Explicación de como lo entiendo: Abro la tabla con USE y el ALIAS, llamo el INDEX para que se organice la tabla con el campo principal, busco con el SEEK
con mi_variable_busqueda que seria la variable principal (Código, identificación y otras), si existe cargo en diferentes variables la información de los diferentes campos y cierro la base de datos para que no este mucho tiempo abierta, sino existe cierro la base de datos y cargo las diferentes variables, por ultimo cargo mis variables a los diferentes objetos, de ese punto ya puedo seguir trabajando.
  Conceptualmente correcto, codificación mejorable:

  Sobre el código original, algunas cuestiones previas
USE mi_tabla ALIAS nombre_alias  && Si estas en un form, y este código se usar varias veces, mejor abrir en entorno de datos, acá al abrir así, podes estar cerrando otra tabla requerida en el área actual
INDEX ON campo TO mi_index   && Para indexar, se necesita acceso exclusivo, lo tienes previsto? Si esto código se usa repetido, conviene crear índice en otra parte o hacerlo estructural. Además, como dices que es índice principal, este debería estar ya creado como estructural
SEEK mi_variable_busqueda && Es más práctico usar la funcion SEEK(), que te convina en un solo paso, el comando SEEK y el FOUND()...
IF FOUND() && ...en la función seek, se puede indicar además, la tabla (sin haber seleccionado el area) y el indice a utilizar (sin haber activado el indice, si estructural)

     mi_variable_2 = campo2
     mi_variable_3 = campo3
     mi_variable_4 = campo4
     CLOSE ALL   && El close es muy violento, cierra todas las tablas, no estará cerrando otras que estes usando y debas seguir usando?...
ELSE
     CLOSE ALL   && ...Si igual quisieras hacer el CLOSE, lo mas limpio es ponerlo despues del ENDIF

     mi_variable_2 = ""
     mi_variable_3 = ""
     mi_variable_4 = 0
ENDIF
mi_form.mi_objeto2.value = mi_variable_2   && ver codificación más elegante, a continuación, dicen que más rápida

mi_form.mi_objeto3.value = mi_variable_3
mi_form.mi_objeto4.value = mi_variable_4

Alternativa a las ultimas tres lineas
WITH mi_form   && si este código esta dentro de un formulario, podes reemplazar mi_form por THISFORM, queda mas reutilizable
   .mi_objeto2.value = mi_variable_2
   .mi_objeto3.value = mi_variable_3
   .mi_objeto4.value = mi_variable_4
ENDWITH

 

> Para guardar
> Explicación de como lo entiendo: Abro la tabla con USE y el ALIAS, llamo el INDEX para que se organice la tabla con el campo principal, busco con el SEEK
> con mi_variable_busqueda que seria la variable principal (Código, identificación y otras), si NO existe remplazo el campo principal con mi variable principal esto dentro de un IF...ENDIF para que si existe no se pueda modificar la información de ese campo principal (como cédulas, código y otros) y remplazo el resto de los campo con el resto de las variables, cierro la tabla, continua el proceso.
Conceptualmente correcto, el código podría mejorarse con las mismas observaciones que el caso anterior
Si el índice es principal, como en el caso anterior, debería directamente meterse como estructural.

USE mi_tabla ALIAS nombre_alias
INDEX ON campo TO mi_index
SEEK mi_variable_busqueda
IF EOF()   && No serìa FOUND()? o como en el caso de arriba usar SEEK()
    REPLACE campo1 = mi_variable_busqueda   && (?) no creo que funcione.
ENDIF
REPLACE campo2 WITH mi_variable_2 && Aca reemplazas encuentres o no, no estas pisando otro registro?

REPLACE campo3 WITH mi_variable_3
REPLACE campo4 WITH mi_variable_4
CLOSE ALL

> Para retirar
> Explicación de como lo entiendo: Abro la tabla con USE y el ALIAS, llamo el INDEX para que se organice la tabla con el campo principal, busco con el SEEK
con mi_variable_busqueda que seria la variable principal (Código, identificación y otras) y borro el registro pero ya no lo hago físicamente con el PACK por recomendación de muchos, el mantenimiento de las tablas lo hago desde otra aplicación de mantenimiento..
La mismas acotaciones que en los conceptos y códigos anteriores


USE mi_tabla ALIAS nombre_alias
INDEX ON campo TO mi_index
SEEK mi_variable_busqueda
DELETE   && Si no encontró en el registro anterior, que borra?

CLOSE ALL

> INQUIETUD UNO
> Todo esto lo tengo funcionando bien, pero por recomendación (no recuerdo) me dijeron que ya no necesitaba llamar el index que el se cargaba automáticamente cada ves que yo llamara una tabla, pero si tengo dos index como hago entonces, en una consulta lo tengo por identificación y en otra por alfabético.
  Se presupone que los índices de uso habitual están creados como estructurales, y estos están disponibles con solo abrir la tabla.
El índice alfabético, supongo por nombre, puede activarse para hacer las vistas (por ejemplo en una grilla, para cargar desplegables).
Como los nombres pueden repetirse, todas las acciones que modifiquen la tabla (altas, cambios y bajas)  deben hacerse sobre el indice primario (aquel que no se repite)
Si usas la función SEEK() como te sugerí antes, no hace falta activar el índice (SET INDEX), ya que el índice a usar se indica como parámetro de la función.


> INQUIETUD PRINCIPAL
> Estuve leyendo sobre cursores sql, que el cursor se crea como una tabla temporal, como hago para que se pase la información de una tabla a una tabla temporal, y teniendo la tabla temporal puedo manipular la información de los registros, como modificar alguna información de algún registro y por ultimo si ya tengo las modificaciones como actualizar mi tabla con el cursor.
Un cursor sirve para copiar o como copia de un conjunto de datos elegidos desde las tablas.
El Cursor puede crearse con un comando CREATE CURSOR o más simple con un SELECT FROM INTO CURSOR de SQL.
Si el cursor es creado con SQL, y debe modificarse agregar READWRITE como clausula adicional a CURSOR en el SELECT (en el caso de crearse desde tablas fox).
Para pasar las modificaciones desde el cursor a las tablas, lo mas simple es crear un bucle donde para cada fila del cursor modificada, efectúas la acción pertinente sobre la tabla.
En cualquier opción, es fundamental que en el cursor estén incluidos las columnas(campos) que integran la clave primara de la tabla.
Como actuas sobre la tabla dependerá si son tablas nativas o en SGBD externo (firebird, mysql, etc.).



> Quiero dejar funcionando correctamente todo antes de evolucionar mas tablas al manejo de SQL-Fire, mil gracias por su colaboración.
Si vas a usar SQL (nativo o en SGBD externos), la consulta de un registro sería así.

SELECT campo2, campo3, campo4;
   FROM mi_tabla INTO CURSOR nombre_alias;
      WHERE clave_primaria_mi_tabla=mi_
variable_busqueda
WITH
THISFORM
   IF _TALLY=0  
&& no encontrado, puede usarse RECCOUNT(nombre_alias)
      STORE "" TO .mi_objeto2.value, .mi_objeto3.value
      .mi_objeto4.value = 0
   ELSE  
&& _TALLY debería darte 1, si da mas de uno, tenes una clave primaria que no sirve
      SELECT nombre_alias
      .mi_objeto2.value = campo2
      .mi_objeto3.value = campo3
      .mi_objeto4.value = campo4
   ENDIF
ENDWITH

NOTE para sgbd no nativo, debes adaptar como le transferis el SELECT;
puedes observar que no se menciona el indice, es más, funcionaria hasta sin indice, pero siempre conviene acceder sobre clave primaria.
 
para actualizar
 
  UPDATE mi_tabla;
     SET campo2 = mi_variable_2;
     ,   campo3 = mi_variable_3;
     ,   campo4 = mi_variable_4;
     WHERE clave_primaria_mi_tabla=mi_
variable_busqueda

para retirar (o quitar)

  DELETE FROM mi_tabla WHERE clave_primaria_mi_tabla=mi_variable_busqueda
 
  Como se puede observar, el SQL es G E N I A L .
  y con muy simple agregado de algunas cositas, te funciona con cualquier SGBD externo.
      
> Cordialmente.
  Gratis, no. Cobro una sonrisa. Si mandas un montón de agradecimientos, que vengan con envase que se me desparraman

Rita Cecila Restrepo De La Hoz

unread,
Feb 27, 2012, 3:21:02 PM2/27/12
to publice...@googlegroups.com
Gracias a todos, no había contestado porque nos tienen a millón con las evaluaciones..

Retomo por partes como dijo el mismo descuartizador de Carlos Miguel.

Como Oficial de Policía se lo que significa una izada de Bandera y se el sentimiento patrio que alberga, por eso te deseo un lindo día y muchas felicidades por tu efemérides, yo también siento orgullo patrio cuando es en Colombia.

Solo puedo decirte feliz día, la cervezas ya tendremos la oportunidad de disfrutarlas, de eso tenlo por seguro, por ahora te mando y ordeno que te tomes como dos... pero cajas de cervezas bien heladas, eso también va para todos los foreros Argentinos. :-).

Hasta yo tengo mucho de niña, creo que el ser niño o niña es un medio de protección de todos sus buenos recuerdos, fíjate que aquí en el foro me pegaron un tronco de regaño por ser expresiva como niña, y se que lo fui, pero no fue intencional, solo fue que expresaba mi alegría al ver todo lo que estaba haciendo y aprendiendo, te pongo una anécdota que me paso aquí, nos llevaron a jugar painball  y no me divertí tanto porque, prácticamente se convirtió en una practica, pero... un docente de la unidad de informática forense, porque estábamos conectados y por que somos bastantes chicas, nos pusimos a jugar Operación 7, nunca lo había jugado, pero me divertí como niña chiquita, asomaba la cabeza y me la volaban y yo toteada de la risa, fue muy divertido, conclusión, todos tenemos un niño o niña muy adentro.

A mi me gusta agarrar a la gente con las manos en la maza, ademas nuestro sistema penal, sino sorprendes al delincuente en flagrancia, se complica un poco el caso inclusive aunque tengas muchas pruebas, INCOMPRENSIBLE no crees?

Con referencia a que si necesitarías un abogado, no creo siento mucha gratitud por compartir sus experiencias, creo que son mucho mas importantes que las mismas lineas de códigos, cuando Datamav se refirió a que era un caos ordenado y paquidérmico, describió totalmente nuestro actual sistema penal y acusatorio, pero tengo ideas, en Colombia existe un dicho, hecha la ley hecha la trampa, eso lo utilizan los abogados mucho para defender a los delincuentes, pues tratare utilizar ese mismo dicho para combatirlos, no es nada secreto, confidencial o ilegal lo que te voy a contar, del 100% de los homicidios casi el 40% son con armas debidamente legalizadas, pero..., la ley NO PERMITE hacer una impronta o una prueba de balística sin una orden judicial, hasta ese punto es lo correcto, y lo acepto, pero como saber cual por decir una marca llama indumil cal. 38 que se vendieron en el año es la correcta, a diferencia de las leyes norteamericanas que cuando se vende un arma el poseedor autoriza hacer una prueba de balistica para tener los registros y así se pueden resolver muchos casos aquí, en Colombia no se puede hacer ninguna prueba sin la autorización del dueño o de un juez, como te dije donde se puede hacer la trampa y ya lo consulte, es que en Colombia el único vendedor de armas es el mismo estado por medio de indumil y por ser el estado el dueño inicial del arma antes de entregársela a nuevo propietario, el podría hacer las pruebas que quiera, por ende parte de mi interés de esta aplicación que estoy desarrollando, es poder guardar las pruebas balísticas "Gráficas" antes de la venta y registrarla con la impronta del arma, sin importar su propietario, en el evento que en un homicidio se presente una bala y esta al corroborarse con la base de datos y si da positivo, con el numero de la impronta se puede rastrear por medio de los archivos de indumil al tenedor o propietario actual, pero me dirás y porque no enlazas la información del propietario a la impronta, porque la jurisprudencia y las leyes colombianas no permiten tener ese tipo de información, sino solo al interesado, en este caso a indumil, pero ya seria una base mas firme, parte de mi interés es el de guardar las imágenes en las tablas, recuerdas?, bueno es para eso, para mantener segura la información.

Con referencia a tus recomendaciones del código ya te seguiré contestando y molestando, tanto a ti como al resto de los foreros.

Pero de todas maneras mil y mil espumosas de agradecimiento. Jejejejeje.

Cordial y afectuoso saludo.

Rita.

mpulla

unread,
Feb 27, 2012, 4:15:42 PM2/27/12
to Comunidad de Visual Foxpro en Español
Hola Rita.

Cuando haces
INDEX ON campo TO mi_index
Estas creando un indice por lo que solo tienes que hacerlo una vez.

Como comento un compañero cambiate a indices CDX, estos se habren
solos cuando los necesitas, los creas de esta manera:
INDEX ON campo TAG mi_indice


*Inquietud uno
Evalua cambiar la forma de buscar:
Seek() por sentencias Sql

Sentencias Sql es utilizado por VFP y por SGDB como Sql Server, MySql,
Postgre, etc y si algún momento decides migrar a cualquier SGDB
tendrias menos en que preocuparte

Si ya tienes definidos tus indices, VFP sacara probecho de ellos si
buscas tus datos mediante sentencias Sql

Prueba esto:
**en el Set Path debe estar definido donde esta tus datos caso
contrario tendrias que darle la ruta completa si no VFP te pedira
indiques donde esta la tabla.

Select campo2, campo3, campo4 From mitabla where codigo = mivariable
into cursor rsdata

*si te devuelve un cursor vacio los campos estaran en blanco no
tendrias que preocuparte de esto.
mi_variable_2 = rsdata.campo2
mi_variable_3 = rsdata.campo3
mi_variable_4 = rsdata.campo4

If _Tally = 0 &&Verficamos si no trajo nada
=messagebox('No existen registros procesados..!', 64, 'Mensaje de
aviso')
endif

Con sql puedes hacer muchas cosas como:
Buscar ocurrencias dentro de un campo (claro todo tiene un costo Like
no esta optimizado pero para tablas con unos cuantos miles de
registros esto va rapido)
Select campo2, campo3, campo4 From mitabla where codigo like '%JUAN%'
into cursor rsdata

Buscar en tablas valores <, >, =, between
Select * From mitabla where ncosto > 12
Select * From mitabla where ncosto < 20
Select * From mitabla where ncosto = 20
Select * From mitabla where ncosto between 20 and 50

fijate en la ayuda SQL commands

*-inquietud principal
En mi opinion personal Cursor Adapter te va hacer la vida mas facil,
tanto para traer datos como para actualizar.

Saludos.
Mauricio

Mario Oviedo

unread,
Mar 9, 2012, 3:47:10 PM3/9/12
to publice...@googlegroups.com
yo tengo varios ejemplos de como hacer una consulta
haga un esquema en word y subela a mi correo y le ayudo
este es mi correo  maoviedoarrobahormail.com

usted debe de tener un prg en donde debe de tener
la creacion de sus indices, por cada archio creado 
va adicionando cada indice a este archivo

y ahi incluir la sentencia pack, que es aqui en donde desparece
tos los items marcados de su tabla dbf

cuando trabaja en red usted debe de decirles a sus usarios salirse 
de la aplicacion porque indexara sus archivos
porque no puede indexar si sus tabla estan siendo utilizados
mas aun si utiliza el pack

esta la forma de abrir archivos sin utilizar motor de bases de datos
ya que ahi no conozco

por ejemplo como le explican
supongamos este es su prg en donde tendran sus indexamiento
no es una forma si no indexa.prg

use clientes exclusive
pack
index codigo tag codigo
index on nombre tag nombre

use vehiculos exclusive
pack
index on equipo tag equipo
index on placa tag placa
index on descrip tag descrip


set exclusive on 

use clientes 
pack
index codigo tag codigo
index on nombre tag nombre

use vehiculos
pack
index on equipo tag equipo
index on placa tag placa
index on descrip tag descrip

set exclusice off


ejemplo en un load de una forma como abrir sus inideces
son 3 indices pero solo quiero uno en especial


use vehiculo 
use vehiculos exclusive
pack
index on equipo tag equipo
index on placa tag placa
index on descrip tag descrip


use vehiculo in 0 again order placa shared

no es necesario colocar equipo y descrip
porque no los utilizare

y cuando haga un
seek m.placa
m.descrip=vehiculo.descrip

y aqui ya tengo la descripcion de ese vehiculo
Reply all
Reply to author
Forward
0 new messages