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
ENDWITHNOTE 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