Es posible saber cuantas columnas tiene una tabla dbf al momento de utilizar?

2,097 views
Skip to first unread message

Saúl Piña

unread,
Apr 22, 2016, 10:31:18 AM4/22/16
to Comunidad de Visual Foxpro en Español
buenos dias,
Al momento de abrir una tabla dbf, me gustaria saber cuantas columnas tiene dicha tabla.
Es posible saber?

gracias

francisco prieto

unread,
Apr 22, 2016, 10:36:07 AM4/22/16
to Comunidad de Visual Foxpro en Español
Saul, primero tenes que abrir la tabla con un use o con un select sql y luego usar afield

Podrías abrirla como archivo a bajo nivel pero comenta para que queres hacer eso y te damos una mano.

Saludos,

Pancho
Córdoba
Argentina

Fidel Charny

unread,
Apr 22, 2016, 10:37:23 AM4/22/16
to Comunidad de Visual Foxpro en Español
También

lnColumnas = FCOUNT(lcCursor)

Saúl Piña

unread,
Apr 22, 2016, 11:16:18 AM4/22/16
to Comunidad de Visual Foxpro en Español
Gracias Fidel y Pancho!! 

la finalidad es que aun tengo algunos ejecutables que trabajan con Dbfs y a veces es necesario hacer algunos ajustes o cambios en los datos en las computadoras de mis clientes, entonces lo que hago es trarme a mi pc mediante conexion remota las tablas (toda la carpeta Datos que contiene la base de datos.dbc, tablas.dbf e index ). Hago los cambios y devuelvo todo de nuevo a la pc del cliente.

Esto es algo tedioso y me he dado a la tarea de tener un form donde pueda abrir las tablas y pasarlas a un grid y através del grid modificar los datos... Es decir, La idea es que en la pc del cliente abrir mi ejecutable para ver dbfs y desde alli ver el contenido de las tablas.

les paso el ejemplo para que vean como lo estoy armando, aunque le faltan algunas cosas como por ejemplo, la cantidad de columnas de la tabla y los nombres en el header para el grid de dicha tabla seleccionada..



dbfviewer2._rar

mapner

unread,
Apr 22, 2016, 11:40:57 AM4/22/16
to Comunidad de Visual Foxpro en Español
Select  MiTabla
nQtyCampos = AFIELDS(aFlds)

Saúl Piña

unread,
Apr 22, 2016, 1:13:00 PM4/22/16
to Comunidad de Visual Foxpro en Español
cada vez que deseo mostrar la tabla en el grid me aparece sin encabezados en las columnas...



A que se deberá?


HernanCano

unread,
Apr 22, 2016, 2:27:35 PM4/22/16
to Comunidad de Visual Foxpro en Español
Estás armando mal el grid....
ç

Saúl Piña

unread,
Apr 22, 2016, 2:39:37 PM4/22/16
to Comunidad de Visual Foxpro en Español
Este es el codigo que utilizo para mostrar tabla en grid...
recordando que el grid se alimenta de cualquier tabla, es por ello que se obtiene el Alias de la tabla desde una propiedad del form

thisform.ctabla=ALLTRIM(this.Value)
Thisform.grid1.RecordSource = ""
*!*    MESSAGEBOX("Evento Click: "+CHR(13)+;
*!*    "Directorio: "+pRuta+CHR(13)+;
*!*    "Nombre del Archivo: "+thisform.cTabla)

IF
! USED ( (thisform.cTabla) )
*WAIT WINDOW "No existe en el Data"
USE pRuta
+(thisform.cTabla) IN 0 EXCLUSIVE
ENDIF
SELECT
(Thisform.cTabla)
*brow

gnFieldcount
= AFIELDS(gaMyArray)  && Create array
FOR nCount
= 1 TO gnFieldcount
*!*       ? gaMyArray(nCount,1)  && Display field names
ENDFOR
Thisform.nColumnas = nCount-1
*WAIT WINDOW STR(Thisform.ncolumnas)
*select *from (thisform.cTabla) into cursor MiCursor
    WITH thisform
.grid1
   
.RecordSource=(Thisform.cTabla)
   
.AutoFit
   
.Refresh
    ENDWITH
thisform
.grilla



y este es el codigo de la propiedad grilla:
WITH thisform.grid1
.ColumnCount = Thisform.nColumnas
.FontSize = 8
.FontName = 'Tahoma'
.HeaderHeight = 24
.RowHeight = 18
.autoFit
ENDWITH


 

gracias



Elides Paredes

unread,
Apr 22, 2016, 2:43:19 PM4/22/16
to Comunidad de Visual Foxpro en Español

Estimado amigo Saúl
Mis saludos.

En ocasiones he tenido que cambiar la estructura de una tabla y me ha sido muy útil una función muy simple, porque me guarda en un txt la estructura de las tablas

List structure to "C:\Estructuras\nombre_archivo" &&  (texto) y obtengo algo así


Estructura de la tabla: C:\PROYECTO\TABLAS\CLIENTES.DBF

    1  COD_CLIENT   Carácter               10            
    2  EMPRESA       Carácter              120                
    3  RIF                  Carácter               13                
    4  ENCARGADO   Carácter               50            
    5  DIRECCION1  Carácter               80            
    6  CIUDAD          Carácter               20            
    7  ESTADO         Carácter               20            
    8  TELEFONO1   Carácter               16                
    9  TELEFONO2   Carácter               16                
   10  TELEFONO3   Carácter               16                
   11  CELULAR1      Carácter               16                
   12  CELULAR2      Carácter               16                
   13  EMAIL            Carácter               40                
   14  RETIENE        Lógico                  1 
 Ahí puedo evaluar antes de hacer cualquier modificación.

Espero haber sido útil..

Elides Paredes
Barquisimeto Venezuela

HernanCano

unread,
Apr 23, 2016, 1:10:39 PM4/23/16
to Comunidad de Visual Foxpro en Español
Saúl:
Por ningún lado veo que le pongas Caption al Header de cada columna.


El viernes, 22 de abril de 2016, 13:39:37 (UTC-5), Saúl Piña escribió:
Este es el codigo que utilizo para mostrar tabla en grid...
recordando que el grid se alimenta de cualquier tabla, es por ello que se obtiene el Alias de la tabla desde una propiedad del form

thisform.ctabla=ALLTRIM(this.Value)
Thisform.grid1.RecordSource = ""
*!*    MESSAGEBOX("Evento Click: "+CHR(13)+;
*!*    "Directorio: "+pRuta+CHR(13)+;
*!*    "Nombre del Archivo: "+thisform.cTabla)
IF
! USED ( (thisform.cTabla) )
*WAIT WINDOW "No existe en el Data"
USE pRuta
+(thisform.cTabla) IN 0 EXCLUSIVE
ENDIF
SELECT
(Thisform.cTabla)

gnFieldcount
= AFIELDS(gaMyArray)  && Create array
FOR nCount
= 1 TO gnFieldcount
*!*       ? gaMyArray(nCount,1)  && Display field names
ENDFOR
Thisform.nColumnas = nCount-1
*WAIT WINDOW STR(Thisform.ncolumnas)
*select *from (thisform.cTabla) into cursor MiCursor
    WITH thisform
.grid1
   
.RecordSource=(Thisform.cTabla)
   
.AutoFit
   
.Refresh
    ENDWITH
thisform
.grilla

Fidel Charny

unread,
Apr 24, 2016, 9:28:50 AM4/24/16
to Comunidad de Visual Foxpro en Español
El problema es que el control grid ya está sobre el form y tiene una determinada cantidad de columnas asignadas ( # -1)

Para que te aparezca  el Header configurado como el nombre de los campos de la tabla:

thisform.mitabla = EVL(thisform.mitabla,"CLIENTES")

* Automático
WITH thisform
.grid1
   
.recordSource = ""
   
.columncount = -1
   
.REcordsource = thisform.mitabla
   
.refresh
ENDWITH


* Asignando manualmente
thisform
.mitabla = EVL(thisform.mitabla,"CLIENTES")
lnFields
= AFIELDS(laFields,thisform.mitabla)
WITH thisform
.grid1
   
.recordSource = ""
   
.columncount = lnFields
   
.REcordsource = thisform.mitabla
    FOR i
= 1 TO m.lnFields
       
.Columns(i).Header1.Caption=PROPER(laFields[i,1])
       
.Columns(i).ControlSource= thisform.mitabla+"."+laFields[i,1]
    ENDFOR
   
.refresh
ENDWITH

Saúl Piña

unread,
Apr 25, 2016, 9:47:21 AM4/25/16
to Comunidad de Visual Foxpro en Español
Buenos dias,
Hernan cano: el asunto del porqué no tengo los header es porque el form toma cualquier tabla dbf que exista en la pc, entonces no es una tabla en particular, sino que puede ser cualquier tabla...a lo que por obviedad no debo escribir los nombres del header de forma "manual".

Fidel: Gracias, voy a probar el ejemplo y les aviso..

HernanCano

unread,
Apr 25, 2016, 2:07:38 PM4/25/16
to Comunidad de Visual Foxpro en Español
Saúl:
Si vas a ensayar lo que dice Fidel, entonces sí vas a seguir mi recomendación.

Saúl Piña

unread,
Apr 25, 2016, 3:20:53 PM4/25/16
to Comunidad de Visual Foxpro en Español
Ahora me topé con otro problema, me manda mensaje de que la database no es la del origen de la tabla..  entonces, no se si necesito abrir la database primero y despues las tablas..
el asunto es que busco la carpeta de las tablas y despues me traigo el listado de nombres de tablas para despues en un list dar clic y que me traiga los datos en un grid completamente editable.






Fidel Charny

unread,
Apr 25, 2016, 6:51:28 PM4/25/16
to Comunidad de Visual Foxpro en Español

Sobre el comando USE.

"When used with a noncurrent database, the USE command opens the database automatically but does not set the database as the current database. When the table closes, the database remains open."

SET DATABASE TO [DatabaseName]

Saúl Piña

unread,
Apr 26, 2016, 9:37:27 AM4/26/16
to Comunidad de Visual Foxpro en Español
Set database to
lo debo escribir justo antes de abrir el path y seleccionar tablas?

gracias y saludos Fidel!!



Fidel Charny

unread,
Apr 26, 2016, 10:19:52 AM4/26/16
to Comunidad de Visual Foxpro en Español
Saul
Si no abres la dbc (open database) sino que directamente utilizas USE DATABASE!TABLA, la dbc se abre pero no se establece como Current database.
De ahí que, o abres la dbc, o bien, explicitas la current database
USE miDbc!Mitabla
SET DATABASE TO miDbc
SELECT MITABLA

Pero no veo cual es el problema de abrir la Dbc antes de abrir sus tablas.
También deberías pensar si no es posible (y quizá más seguro) escribir los parches de actualización y que se corran directamente en lo de tus clientes,

Saúl Piña

unread,
May 2, 2016, 10:26:33 AM5/2/16
to Comunidad de Visual Foxpro en Español
Oks, entiendo el concepto, pero vuelvo al problema inicial:

se supone que voy a abrir una tabla "cualquiera, al azar" es decir, no se el nombre de dicha tabla, es por ello que capturo el nombre de esa tabla en un list y despues al seleccionar desde el list el nombre de la tabla ahora si abrir la tabla.

me comentan que debo escribir el nombre de la base de datos; pero como saber el nombre de la base de datos si se obtiene la tabla al azar?

gracias Fidel

Fidel Charny

unread,
May 2, 2016, 11:43:38 AM5/2/16
to Comunidad de Visual Foxpro en Español
Vaya Saúl. No puedes abrir una tabla con nombre de tabla al azar. Lo que puede ser al azar, es el alias. Las tablas deben estar creadas para poder abrirlas.
Se supone que tienes una lista de nombres de tablas que sacaste de alguna parte. O cómo es que generas esa lista?
Te puedes ayudar con DBC(), DBUSED(), DBGETPROP()

Saúl Piña

unread,
May 2, 2016, 3:10:54 PM5/2/16
to Comunidad de Visual Foxpro en Español
Perdón Fidel, me voy a explicar un poco mejor...je,je

Me di a la tarea de crear un formulario que me ayudara a abrir tablas y poder editar sus datos, la finalidad de esto, es poder abrir las tablas en las computadoras donde no está instalado VFP, en su mayoria en computadoras de mis clientes.

Entonces lo que hago es lo siguiente:

1. Buscar la carpeta donde estan las tablas con adir(*.dbf)
2. Una vez que hace un scan / endscan obtengo todos los nombres de las tablas de dicha carpeta, estos datos de nombres de tablas las inserto en un cursor temporal y finalmente ese cursor temporal lo muestro en un list.
3. Para mostrar los datos de la lista de nombres de tablas que estan en el list, hago clic en el nombre de la tabla, asi que se realiza dos tareas:
A) obtener la ruta de la tabla seleccionada del list.
B) armar la ruta y nombre de la tabla y agregarlo a una propiedad llamada "ctabla" en el form.
4. De esta manera abro la tabla y la muestro en el grid. Pero nunca hago referencia a la "BASE DE DATOS.DBC"

y esa es mi gran duda, como saber como se llama la base de datos cuando selecciono la carpeta en cueston?

envío una imagen del form.

gracias...
 


Fidel Charny

unread,
May 2, 2016, 4:35:35 PM5/2/16
to Comunidad de Visual Foxpro en Español
Y todavía no dijiste lo principal. Por que a esta altura lo único que me queda por suponer es que hablas de tablas de un sistema que no es tuyo. O es que las dbc cambian de nombre?
Si cuando abres una tabla de la única manera en que puede abrirse en fox (comando USE) se abre implícitamente la base de datos que la contiene (aunque no se coloca como current database) lo único que tienes que hacer es un ADATABASES(ArrayName) para saber que bases de datos (y su ubicación) tienes abiertas. Puedes meter la información en un combo y seleccionar la que sea.

Ejemplo Trucho
CLOSE DATABASES all
lcUse="c:\ThFlyProg\datos\buytran.DBF"
USE (lcUse) IN 0 SHARED
ln =ADATABASES(ladata)
? ln
? ladata[1,1}
? ladata[1,1]      >> COMPRAS
? ladata[1,2]     >>  C:\THFLYPROG\DATA\COMPRAS.DBC
SET DATABASE TO (laData[1,1])
? SET("Database")

Saúl Piña

unread,
May 3, 2016, 9:54:29 AM5/3/16
to Comunidad de Visual Foxpro en Español
Buenos dias.

Definitivamente las tablas son mias, solo que no acostumbro instalar VFP en las computadoras de los clientes, y a veces es algo "engorroso" copiar la carpeta "datos" y traerme todo remotamente a mi pc para fionalmente abrir y editar lo que se solicita. Mas en cambio si puedo abrir con un formulario en la pc del cliente, sería mucho más practico. Pero no todas mis tablas con bases de datos, llevan el mismo nombre o puede ser incluso hasta 2 sistemas y no quiero estropear la base de datos, es un terreno donde no quisiera cometer errores, ya que la información es lo mas valioso para mis clientes y paa mi..

Saludos.

Irwin Rodriguez

unread,
May 3, 2016, 10:06:00 AM5/3/16
to publice...@googlegroups.com
Hola Saúl,

Pues no se si entendi bien pero creo que este ejemplo te puede servir en algo:

USE c:\miTabla.dbf ALIAS miAlias IN 0

COPY STRUCTURE EXTENDED TO C:\miCopia

USE c:\miCopia.dbf ALIAS miCopia IN 0

SELECT COUNT(FIELD_NAME) FROM miCopia INTO ARRAY arrTotReg

?arrTotReg[1]

Saludos...!
--
DISTRIBUIDORA IRSESU, C.A
J-29947174-7
Irwin Rodríguez
- Director
Analista Programador - Freelance
+584125210679

Barquisimeto - Venezuela
Desarrollos online dentro y fuera del país

Saúl Piña

unread,
May 3, 2016, 10:14:41 AM5/3/16
to Comunidad de Visual Foxpro en Español
En resumen:

Como hacen ustedes para editar tablas dbfs en aquellas computadoras donde no esta VFP instalado?

y por editar me refiero a desde cambiar un simple dato en un campo hasta dar mantenimiento de limpieza / pack a registros borrados.

gracias.

Irwin Rodriguez

unread,
May 3, 2016, 10:22:06 AM5/3/16
to publice...@googlegroups.com
Yo una vez hice algo similar, lastima que no tenga el formulario a la mano pero era mas o menos asi:

Me cree un formulario que me emulaba la ventana de comandos, agregué una caja de texto donde colocaba el comando a ejecutar y luego al pulsar ENTER lo corria internamente, algo asi:


lcComando = Alltrim(Thisform.text1.Value)
&lcComando

Empaquetas el formulario con las runtimes y ejecutas en el cliente.

Ya con eso resolvia el tema de tener que andar instalando VFP en cada maquina.

Espero te sirva.

Saludos!


Carlos Miguel FARIAS

unread,
May 3, 2016, 1:24:52 PM5/3/16
to Grupo Fox

En mi caso, usaba un comando browse sin indicar campos, te trae todo. No es prolijo pero efectivo.
Saludos: Carlos Miguel FARIAS

Foxshin

unread,
May 3, 2016, 3:33:35 PM5/3/16
to Comunidad de Visual Foxpro en Español
Hola :-)

Dándole una mirada al archivo que subiste, me parece que ya estabas en el camino, solamente que le faltaba unos detallitos, practicamente es lo que te recomendó Fidel (por lo menos en el evento click que fue el que miré):

WITH Thisform
    .ctabla=ALLTRIM(This.Value)
   
    .LockScreen = .T.
    WITH .Grid1
        .RecordSource = ''
        .ColumnCount = -1
        **
        IF USED('Tabla')
            USE IN 'Tabla'
        ENDIF
        USE pRuta+(Thisform.cTabla) IN 0 EXCLUSIVE ALIAS 'Tabla'
        **
        .RecordSource = 'Tabla'
        LOCAL lnFieldCount,lnCount
        lnFieldCount = AFIELDS(gaMyArray,'Tabla')  && Crea array con los nombres de las columnas
        FOR lnCount = 1 TO lnFieldcount
            .Columns(lnCount).Header1.Caption = PROPER(gaMyArray(lnCount,1))
        ENDFOR
        RELEASE lnFieldCount,lnCount
        .AutoFit()
        .Refresh()
    ENDWITH
    .LockScreen = .F.
*    .nColumnas = nCount-1 && Exactamente no sé para qué usas ésta propiedad
*    .grilla()  && Me parece que no sería necesario esto pero en gustos y colores...
ENDWITH
***
Espero sirva

Saludos.


Reply all
Reply to author
Forward
0 new messages