Muchachos Como usar 2 tablas Diferentes en un formulario con objetos no enlazados a los campos

117 views
Skip to first unread message

Oswal Noguera

unread,
Jun 16, 2017, 1:55:11 AM6/16/17
to Comunidad de Visual Foxpro en Español
buena tengo una duda muy grande, como puedo usar 2 tablas diferentes en 1 formulario sin que esten enlazados los textbox en la Propiedad: ControlSource.

Mi evento Init en el Formulario es :

OPEN DATABASE "C:\Users\personal\Desktop\1. Proyecto de Analisis II - sin resctricciones en la base dato\pepsicola.dbc"
USE telefonos
SET DELETED ON
SET ORDER TO telefono
PUBLIC accion AS CHARACTER
PUBLIC encontro AS Boolean
PUBLIC marcado AS Boolean
THIS.inicio

ese Código solo me sirve para una tabla quiero meter otra tabla para que me muestre la informacion de esa tabla, pero cuando la meto y hago otro USE  medice que  File in use...
si no entiende digame que no entiende para explicarlo mas detallado. de todas manera pondre imagenes
Sin título.png
Sin título32.png

Carlos Miguel FARIAS

unread,
Jun 16, 2017, 7:14:26 AM6/16/17
to Grupo Fox
USE telefonos IN 0 SHARED ALIAS Tele
USE telefonos IN 0 SHARED ALIAS Fono AGAIN
Luego la primera la referencias por tele y a la segunda por fono

Para hacer una busqueda por un índice usas función SEEK

LOCAL lcAyN AS STRING
IF SEEK(cBusca, "Tele", "xNroTel")   && busca cBusca en teléfonos con su alias Tele usa índice xNroTel
   NOTE que aquí queda "sobre" el registro al encontrarlo,
*      sin necesidad de elegir el área ni activar índices
   lcAyN = Tele.Apellido_Nombre   && aquí recupera nombre en variable local
ELSE
   NOTE que aquí pondrá el código que necesite si no encontró lo buscado
ENDIF

La ventaja de accede a las tablas de esa manera es que:
a) Son menos líneas de código, ya no se necesita posicionarse en el área para recuperar datos (ni volver al área previa al terminar)
b) No se activan índices ex-profeso (podría estar activado un browse por ejemplo por Apellido_Nombre para ver en una grilla los datos ordenados y se efectúa la búsqueda y posicionamiento por otro índice
c) Al no activar índices, si luego se ejecuta una sentencia SQL, el desempeño (performance) es mejor
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe

Fidel Charny

unread,
Jun 16, 2017, 8:26:38 AM6/16/17
to Comunidad de Visual Foxpro en Español
No entiendo bien qué necesitas, pero aparte de lo dicho por Miguel
1) En lugar de variables públicas, utiliza propiedades del formulario
Addproperty(Thisform,"Accion","")
Addproperty(Thisform,"Encontro",.F.)
Addproperty(thisform,"Marcado",.f.)
2) Los controles puede estar liados por ControlSource a una fuente de datos (tabla, cursor, propiedad del formulario/clase, propiedad array del form/clase, etc) o bien puedes atacar directamente la propiedad Value del control.
Thisform.TxtNombre.Value = tabla.Nombre
La diferencia es que cuando lias por controlSource, el cambio en el control se refleja en el origen de datos. Cuando atacas por .Value, los cambios que hagas en el control no se reflejan en el origen de datos.
3) Siempre puedes saber si la tabla ya está abierta
IF !USED("Tabla")
        USE Tabla IN 0 SHARED
ENDIF
o
IF !USED("ALIAS_TABLA")
        USE tabla IN 0 SHARED AGAIN ALIAS Alias_tabla
ENDIF
VisualFox utiliza siempre el alias. Si no colocas la cláusula ALIAS, el alias se genera de todos modos con el nombre de la tabla.
Te dejo un link
https://fdbozzo.blogspot.com.ar/2014/01/como-usar-una-tabla-foxpro-varias-veces.html

Oswal Noguera

unread,
Jun 16, 2017, 10:42:47 PM6/16/17
to Comunidad de Visual Foxpro en Español
hermano lo que necesito es que me deje abrir otra tabla diferente que es la de empleado en ese formulario para mostrar el nombres. vez con eso cuando busque el telefono me muestre la cedula y nombre de ese empleado.

HernanCano

unread,
Jun 17, 2017, 1:16:22 AM6/17/17
to Comunidad de Visual Foxpro en Español
Oswal:
Con esta respuesta tuya parece que no has entenbdido la propuesta de Miguel.
Claro que él se basó en USE...ALIAS... AGAIN dado que te expresaste inadecuadamente (<1>en tu código sólo hablas de un solo DBF, <2>no muestras otro código que es donde se genera el error, y <3>tampoco aclaras que "la primera vez muestra bien... pero la segunda aparece el error").

Un probable escenario que resuelve tu planteamiento sería al sgte:
(el ver un código que genera variables públicas nos hace rascar la cabeza... al igual que rutas absolutas.... Mientras escribía esta propuesta me dí cuenta que yo tenía el mismo modo de pensar que Fidel)
(si el indexado de EMPLEADOS no es por TELEFONO y por eso te pierdes en el resto de código, la culpa es tuya)

** :: evento Init en el formulario 
set deleted on
open database "PEPSICOLA.dbc"
use TELEFONOS in 0 shared 
use EMPLEADOS in 0 shared 
set order to TELEFONO in TELEFONOS
set order to TELEFONO in EMPLEADOS
 
AddProperty ( ThisForm, 'Accion'  , ''  )
AddProperty ( ThisForm, 'Encontro', .f. )
AddProperty ( ThisForm, 'Marcado' , .f. )
 
This.Inicio


** :: evento LostFocus del textbox txtTelefono 
local M.cBusca, M.lcCed, M.lcNom as string
M.lcNom = ''
M.lcCed = ''
M.cBusca = padr ( alltrim(ThisForm.txtTelefono.Value), len(EMPLEADOS.TELEFONO) )

if seek ( M.cBusca, "EMPLEADOS", "xNroTel" ) && busca M.cBusca en EMPLEADOS
   M.lcNom = EMPLEADO.NOMBRE                 && aquí captura el nombre
   M.lcCed = EMPLEADO.CEDULA                 && aquí captura la cedula
else
   MessageBox ( 'No se encontró el teléfono '+alltrim(M.cBusca) )
endif

ThisForm.txtNombres  .Value = M.lcNom
ThisForm.txtCeduEmple.Value = M.lcCed
**

Cuéntame: ¿cómo aplicaste la propuesta de Fidel --con respecto al IF !USED()-- para que todavía no te diera?

Si el código te sirve, o no te da, o sí te resuelve, nos cuentas....

Oswal Noguera

unread,
Jun 18, 2017, 10:25:14 PM6/18/17
to Comunidad de Visual Foxpro en Español
muchachos me siguen dando el mismo error ? ahí esta en la imagen
Sin título.png

Andres Naranjo Robledo

unread,
Jun 18, 2017, 11:58:21 PM6/18/17
to Comunidad de Visual Foxpro en Español
Amigo mejor Utiliza Cursores de VFP9 , , cuando hayas llenado los cursores que son tablas o mallas de datos de la base de datos

Utilizas es SELECT curlaminas

Mira qui te dejo:

conex2 = SQLSTRINGCONNECT('DATABASE=datosmysql;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PWD=12345;PORT=3306;SERVER=localhost;UID=root;')
?conex2
=SQLEXEC(conex2, 'SELECT * FROM laminas;', 'curlaminas')



SELECT curlaminas
 
Thisform.List1.ColumnCount=6
Thisform.List1.ColumnWidths='50,300,75,75,100,50'
Thisform.List1.ColumnLines=.T.
Thisform.List1.ControlSource='curlaminas'
Thisform.List1.RowSourceType= 6
Thisform.List1.RowSource='codigo_lamina, nombre_lamina, fecha_celebracion, fecha_registro, nombre_categoria, stock'

Thisform.Refresh



=SQLEXEC(conex2, 'SELECT * FROM usuarios;', 'curusuarios')


Thisform.List1.ColumnCount=5
Thisform.List1.ColumnWidths='120,120,120,120,120'
Thisform.List1.ColumnLines=.T.
Thisform.list1.RowSourceType= 2
Thisform.list1.RowSource='curusuarios'




---------------
OTRA FORMA

----------------



Thisform.List2.ColumnCount=5
Thisform.List2.ColumnWidths='120,120,120,120,120'
Thisform.List2.ColumnLines=.T.
Thisform.list2.RowSourceType= 3
Thisform.list2.RowSource='SELECT curusuarios'


------------
TERCERA FORMA

----------------


SELECT curusuarios

Thisform.List3.ColumnCount=2
Thisform.List3.ColumnWidths='120,120'
Thisform.List3.ColumnLines=.T.
Thisform.List3.ControlSource='curusuarios'
Thisform.list3.RowSourceType= 6
Thisform.list3.RowSource='nombres, telefono'



Saludos
Ecuador , Guayaquil









-----------------------------------------------------------

Elkin Fernando Ortiz

unread,
Jun 19, 2017, 12:05:50 AM6/19/17
to publice...@googlegroups.com

Usa selecto(nom_cursor)

Fidel Charny

unread,
Jun 19, 2017, 6:10:54 AM6/19/17
to Comunidad de Visual Foxpro en Español
Podrás quejarte de lo mismo un millón de veces si no haces ningún cambio en tu código, o si lo haces de modo incompleto.
IF !USED("TELEFONOS")
         USE TELEFONOS IN 0 SHARED
ENDIF
IF !USE("EMPLEADO")
        USE EMPLEADOS IN 0 SHARED
ENDIF

Carlos Miguel FARIAS

unread,
Jun 19, 2017, 7:05:34 AM6/19/17
to Grupo Fox
Algunas soluciones propuestas no las entiendo, tiene problemas de usar tablas nativas, y le pasan una solución con mysql y cursores. La de Fidel es el primer paso correcto. Creo que nuestro colega Oswal no tiene en claro que Fox usa el concepto de área o canal para conectarse a cada tabla nativa que abre.
Si se hacen seguidas...
USE Telefonos   && se abre en el área activa (cerrando cualquier otra tabla abierta en el área actual)
USE Empleados   && se abre en el área activa (cerrando en este caso Teléfonos).
El IN 0, hace que fox busque un área-canal libre, luego, la tabla se selecciona por nombre tabla (o ALIAS, si se especificó)
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza nos acompañe, 0° de temperatura y un relator en la radio indico: temperatura actual 0° NO HAY TEMPERATURA

ZeRoberto

unread,
Jun 19, 2017, 7:16:26 AM6/19/17
to publicesvfoxpro
Revisa las sesiones privadas


Saludos
Message has been deleted

Mauricio Gonzalez

unread,
Jun 19, 2017, 4:31:26 PM6/19/17
to Comunidad de Visual Foxpro en Español
Haz una cosa sencilla:
*
CLOSE TABLE ALL
OPEN DATABASE "C:\Users\personal\Desktop\1
USE telefonos IN 0 ORDER telefono
USE PHONO in 0
SET DELETED ON
*        SET ORDER TO telefono

HernanCano

unread,
Jun 20, 2017, 11:31:24 PM6/20/17
to Comunidad de Visual Foxpro en Español
Oswal:
Nos muestras una imagen donde nos enseñas que se está ejecutando el formulario frmTelefonos, el motor va en el evento Init; ya ejecutó el OPEN DATABASE... y cuando necesita ejecutar el use TELEFONOS in 0 dice que ya está en uso.

Pues entonces te cuento que el archivo TELEFONOS ya está en uso y por lo tanto no necesitas volverlo a abrir.

Pregunta:
Si TELEFONOS ya está abierto, ¿por qué quieres volverlo a abrir? (¿-----o acaso no está abierto?? no está abierto??? ¿¿seguro???)

Alternativa:
¿Cómo te fue con la propuesta CLOSE TABLES ALL de Mauricio?

Alternativa 2:
¿Cómo te fue con la propuesta IF !USED("xxxxxxxxxxxxx") de Mauricio?

Cuéntame......


El domingo, 18 de junio de 2017, 21:25:14 (UTC-5), Oswal Noguera escribió:

HernanCano

unread,
Jun 20, 2017, 11:38:33 PM6/20/17
to Comunidad de Visual Foxpro en Español
Buenos, Oswal.... supondré que piensas seguir mi consejo.....

Ya tienes abierto el TELEFONOS.dbf.

Antes de ejecutar el form ya está abierto TELEFONOS..... Entonces debes (1) cerrar todo (CLOSE TABLES ALL) anted de empezar a abirir (propuesta de Mauricio), (2) usar sesión privada de datos (propuesta de ZeRoberto), o (3) utilizar el método IF !USED("xxxxxxxxxxxxx" (propuesta de Mauricio)

-----------------------------------------------------

Me gustaría conocer más de tu escenario: 
Antes de ejecutar el form tienes abierto TELEFONOS.DBF. ¿Por qué? (no es que sea un error, sino que deseo conocer más de tu ambiente).



El domingo, 18 de junio de 2017, 21:25:14 (UTC-5), Oswal Noguera escribió:

Oswal Noguera

unread,
Jun 21, 2017, 12:23:30 AM6/21/17
to publice...@googlegroups.com
no muchachos a ver, yo fui el que me explique mal y disculpen por eso. ustedes son unos crack y a mi me falta aprender que joder. pues yo en el formulario quiero usar 2 tablas diferentes al mismo tiempo. vez sin cerrarlo. por que asi al buscar el telefono del empleado me saldria la cedula y atravez de la conexion a la otra tabla que es la de empleado me mostraria el nombre de ese telefono y cedula que seleccione. asi me explico. y mauricio poco entiendo esos codigo pero voy aplicarlo y tratar de resolverlo. men gracias por la paciencia y la ayuda. de nuevo

HernanCano

unread,
Jun 22, 2017, 12:51:59 AM6/22/17
to Comunidad de Visual Foxpro en Español

>>> ... por que asi al buscar el telefono del empleado me saldria la cedula y atravez de la conexion a la otra tabla 
>>> ... que es la de empleado me mostraria el nombre de ese telefono y cedula que seleccione.

Ok.... Entonces empieza implementando la propuesta de Mauricio y nos cuentas.

Alternativa:
¿... la propuesta CLOSE TABLES ALL de Mauricio?

Es decir: al ejemplo que te puse, encabezado con ** :: evento Init en el formulario, agrégale lo que dice Mauricio. 

Oswal Noguera

unread,
Jun 22, 2017, 4:47:30 AM6/22/17
to Comunidad de Visual Foxpro en Español
buenas hernan aplique lo que decia mauricio en el evento init. bien me corrio y ya no me dice file en use. pero no me muestra el nombres. lo demas datos si normal. OJO: acuerdate que el atributo de nombres es de la tabla de empleado. y no de telefonos. son 2 tablas diferentes abiertas al mismo tiempo en un solo formulario. no estoy usando el controlsource .


El viernes, 16 de junio de 2017, 1:25:11 (UTC-4:30), Oswal Noguera escribió:
Sin título1.png
Sin título2.png
Reply all
Reply to author
Forward
0 new messages