saber si existe una columna en una tabla .dbf ??

1,571 views
Skip to first unread message

Saul Piña Hernandez

unread,
Oct 11, 2014, 2:58:08 PM10/11/14
to publice...@googlegroups.com
Saludos, cual sería la sentencia para saber si existe una columna en una tabla.dbf?

muchas gracias

Víctor Hugo Espínola Domínguez

unread,
Oct 11, 2014, 3:07:57 PM10/11/14
to publice...@googlegroups.com
Hola Saúl

? TYPE("alias.NombreColumna") <> "U"

Saludos,
Víctor.
Lambaré - Paraguay.

francisco prieto

unread,
Oct 11, 2014, 3:10:41 PM10/11/14
to publice...@googlegroups.com
ummm...

Una columna en realidad es un campo...

Tenes 

field(n) especificando n te dice que campo es
afield te arma un array con todos los campos
Type("tabla.columna") si te da U es que no existe...

Saludos,

Pancho
Córdoba
Argentina



Antonio Meza

unread,
Oct 11, 2014, 3:10:49 PM10/11/14
to publice...@googlegroups.com
Con AFIELDS() obtienes la lista de los campos de una tabla o cursor

SELECT TuTabla
nCampos = AFIELDS(arrayListaDeCampos)
For a = 1 to nCampos
     ? arrayListaDeCampos(a,1)
next

Saul Piña Hernandez

unread,
Oct 11, 2014, 3:30:25 PM10/11/14
to publice...@googlegroups.com
Saludos,  en el caso que menciona Victor Hugo

digamos que tengo los nombres de la tabla ycampos en unas variables:

mitabla <---nombre de la tabla en cuestion
micampo <-- nombre del campo a buscar, si existe, no agregar, si NO existe entonces agregar un nuevo campo


El siguiente es el codigo que llevo armado, pero aun no funciona correctamente:

y1=YEAR(DATE())
m1=MONTH(DATE())
d1=DAY(DATE())
ini="stock1\stock"+ALLTRIM(STR(m1))+ALLTRIM(STR(y1))+".dbf"

micampo="e"+ALLTRIM(STR(d1))
mitabla=ini
WAIT WINDOW mitabla


IF FILE(mitabla)
WAIT WINDOW "si existe"
USE &mitabla

    IF TYPE(&mitabla+"."+&micampo) <> "U"
    WAIT WINDOW "si existe campo"
    ELSE
    WAIT WINDOW "no existe"
    *ALTER table &mitabla add &micampo n(6)
    BROWSE
    ENDIF
   
ELSE
WAIT WINDOW "crear tabla"
thisform.creartabla

ENDIF

francisco prieto

unread,
Oct 11, 2014, 3:35:13 PM10/11/14
to publice...@googlegroups.com

El 11 de octubre de 2014, 16:30, Saul Piña Hernandez <vfxpro...@gmail.com> escribió:
IF TYPE(&mitabla+"."+&micampo) <> "U"

Saul,

Esto...

 IF TYPE(&mitabla+"."+&micampo) <> "U"

Va asi

 IF TYPE(mitabla+"."+micampo) <> "U"

Saludos,

Pancho
Córdoba
Argentina

Saul Piña Hernandez

unread,
Oct 11, 2014, 3:44:53 PM10/11/14
to publice...@googlegroups.com
No funciona, siempre dice que no existe "aunque ya haya sido creado el campo"  (no lo encuentra)

alguna sugerencia?

por cierto ya le quité el & a las variables y nada.

Saul Piña Hernandez

unread,
Oct 11, 2014, 3:51:19 PM10/11/14
to publice...@googlegroups.com
Saludos de nuevo, con el código que expuso Antonio, si me da la lista de campos, pero como podría relacionarla con la variable micampo para hacer la comparativa de si es el campo que estoy buscando?

gracias.


francisco prieto

unread,
Oct 11, 2014, 4:08:21 PM10/11/14
to publice...@googlegroups.com
AHHHHHHHHHHHHHHHHHHHHHHH


El problema esta aca

ini="stock1\stock"+ALLTRIM(STR(m1))+ALLTRIM(STR(y1))+".dbf"

micampo="e"+ALLTRIM(STR(d1))
mitabla=ini

Mitabla solo puede ser el nombre sin el path ni el dbf...

es decir...

mitabla="stock"+ALLTRIM(STR(m1))+ALLTRIM(STR(y1))

Pero para verificar que la columna existe deberias hacer algo asi...

Select * from &ini into cursor pedrito

y luego

IF TYPE("pedrito."+micampo) <> "U"


Saludos,

Pancho
Córdoba
Argentina

Saul Piña Hernandez

unread,
Oct 11, 2014, 4:32:37 PM10/11/14
to publice...@googlegroups.com
Gracias francisco, ya está funcionando el codigo.

Feliz fin de semana!!

Saul Piña Hernandez

unread,
Oct 11, 2014, 4:40:19 PM10/11/14
to publice...@googlegroups.com
Ultima pregunta:

Cúantos campos podria tener una tabla?  100 campos o más?

edgar suarez kummers

unread,
Oct 11, 2014, 4:42:47 PM10/11/14
to publice...@googlegroups.com

edgar suarez kummers

unread,
Oct 11, 2014, 4:43:16 PM10/11/14
to publice...@googlegroups.com

edgar suarez kummers

unread,
Oct 11, 2014, 4:44:57 PM10/11/14
to publice...@googlegroups.com
No son 256, creo que son 255, hay que hacer una prueba real.

Saul Piña Hernandez

unread,
Oct 11, 2014, 5:15:16 PM10/11/14
to publice...@googlegroups.com
perverso, gracias

Antonio Meza

unread,
Oct 11, 2014, 5:17:14 PM10/11/14
to publice...@googlegroups.com
No se la cantidad que puedan tener de campos una tabla, pero si tiene mas de 100 se me hace que no esta normalizada y luego tendrás problemas para hacer consultar.

saludos
Antonio Meza

francisco prieto

unread,
Oct 11, 2014, 5:31:04 PM10/11/14
to publice...@googlegroups.com
Saul,

254 si hay valores nulos en algun campo sino 255.


Saludos,

Pancho
Córdoba
Argentina

Víctor Hugo Espínola Domínguez

unread,
Oct 11, 2014, 5:47:35 PM10/11/14
to publice...@googlegroups.com
Hola Saúl

Casi coincido con lo que te dijo Antonio, yo le aplicaría STRTRAN("más de 100", "100", "20") ;-)

Muestranos el diseño de la base de datos y te ayudaremos a normalizarla.

Saludos,
Víctor.
Lambaré - Paraguay.

alfonsoa...@gmail.com

unread,
Oct 11, 2014, 6:07:43 PM10/11/14
to Lista Google VFP
Mira en la ayuda esta función.....
 
AFIELDS( ArrayName [, nWorkArea | cTableAlias ] )
 
 
 
 
 
-------Mensagem original-------



Este email está livre de vírus e malware porque a proteção avast! Antivirus está ativa.


IMSTP22.gif

HernanCano

unread,
Oct 11, 2014, 10:33:20 PM10/11/14
to publice...@googlegroups.com
Saúl:
Dices que ya solucionaste.

Así que quizá no sea necxesario que leas este mensaje.... Pero me interesa ackarate:

1.
Cuando haces:

ini="stock1\stock"+ALLTRIM(STR(m1))+ALLTRIM(STR(y1))+".dbf"
micampo="e"+ALLTRIM(STR(d1))
mitabla=ini
IF FILE(mitabla)
WAIT WINDOW "si existe"
USE &mitabla
IF TYPE(&mitabla+"."+&micampo) <> "U"

entonces cuando tengamos el primero de mayo del 2015 (2015-05-01), el IF quedará así:
   IF TYPE("stock1\stock115.dbf.e1") <> "U"

¿Estamos de acuerdo?
Eso fallará siempre.... porque en mitabla tienes toda la ruta completa y la extensión.

Lo que le debes "entregar" a la función TYPE es algo como STOCK115.E1 cuando quieres preguntar si el campo E1 existe en STOCK115.DBF . Digamos que lo que debes hacer es preguntar por el ALIAS del archivo que pretendes, no toda la ruta completa incluso extensión (.DBF).

Podríamos decir que tu código lo cambiamos por:

ini="stock1\stock"+ALLTRIM(STR(m1))+ALLTRIM(STR(y1))+".dbf"
micampo="e"+ALLTRIM(STR(d1))
mitabla=ini
IF FILE(mitabla)
WAIT WINDOW "si existe"
USE &mitabla
M.cAlias = alias()
IF TYPE(M.cAlias+"."+micampo) <> "U" && esta es mi recomendación

Incluso mientras reescribía las líneas anteriores, noté que los símbolos clave de sol están mal ubicados, y quedan como lo escribí o de la sgte forma:

IF TYPE("&cAlias..&micampo) <> "U"

Pero no me queda claro si esta última sintaxis es correcta (me parece que debe ir dos puntos, pero no estoy seguro)... Prefiero la que está marcada como ésta es mi recomendación...
----------------------------
Una inquietud más en otro post.... con respecto a la fecha ....

HERNAN



HernanCano

unread,
Oct 11, 2014, 11:34:16 PM10/11/14
to publice...@googlegroups.com

Saúl:
Tomando la misma fecha del ejemplo dado en el post anterior el primero de mayo del 2015 (2015-05-01), quedamos con un DBF así:

ini = "stock1\stock"+ALLTRIM(STR(m1))+ALLTRIM(STR(y1))+".dbf"
mitabla = ini

Entonces las variables MiTabla e INI tendrán el sgte valor

MITABLA = "STOCK1\STOCK115.DBF"

Pero ese 115 puede entenderse de dos maneras....

¿Pero acaso no habrá confusión entre 1-15 (enero-2015) y 11-5 (mayo-2005)?

Claro que si me contestas que "no puede verse como 11-5, pues el programa empezó en el 2009", lo aceptaré.
------------------------------------
Si haces un dir por DOS o desde el Explorador de Windows, y ordenas por nombre de archivo, creq que los archivos no se verán en orden cronológico.

¿Por qué no acatamos la recomendación de la norma ISO 8601 - NTC 1034?
------------------------------------

Daniel Del Giudice

unread,
Oct 12, 2014, 7:44:54 PM10/12/14
to publice...@googlegroups.com
Hola Saul,

yo utilizo fsize()

if fsize("micampo") = 0
   alter table...
endif

No me falló nunca. Saludos.

Daniel Del Giudice
Santiago del Estero
Argentina

Saúl Piña

unread,
Oct 13, 2014, 1:14:09 PM10/13/14
to publice...@googlegroups.com
Gracias Hernan por el consejo, pero si revisas las variables que utilizo para armar la tabla es "m1" y "y1" esto quiere decir el "mes" y el "año" entonces sería de esta manera:
MITABLA = "STOCK1\STOCK515.DBF"  <--- se refiere a 5 (mes) y 15 (año)

Víctor Hugo Espínola Domínguez

unread,
Oct 13, 2014, 4:03:10 PM10/13/14
to publice...@googlegroups.com
Hola Saúl

Es mucho mejor encadenar el año con el mes:

miTabla = "stock1\stock" + SUBSTR(DTOS(DATE()), 3, 4) + ".dbf"
o
miTabla = "stock1\stock" + LEFT(DTOS(DATE()), 6) + ".dbf"

Saludos,
Víctor.
Lambaré - Paraguay.


HernanCano

unread,
Oct 13, 2014, 7:17:53 PM10/13/14
to publice...@googlegroups.com
Saúl:
115 se refiere a nov-2005 ó a ene-2015?


El lunes, 13 de octubre de 2014 12:14:09 UTC-5, Saúl Piña escribió:
Gracias Hernan por el consejo, pero si revisas las variables que utilizo para armar la tabla es "m1" y "y1" esto quiere decir el "mes" y el "año" entonces sería de esta manera:
MITABLA = "STOCK1\STOCK515.DBF"  <--- se refiere a 5 (mes) y 15 (año)

El sábado, 11 de octubre de 2014 22:34:16 UTC-5, HernanCano escribió:

MITABLA = "STOCK1\STOCK115.DBF"

HernanCano

unread,
Oct 13, 2014, 7:19:18 PM10/13/14
to publice...@googlegroups.com
Sí, Víctor. 

Mi recomendación precisamente es algo como:
miTabla = "stock1\stock" + LEFT(DTOS(DATE()), 6) + ".dbf"


Luis Maria Guayan

unread,
Oct 14, 2014, 8:24:39 AM10/14/14
to publice...@googlegroups.com
-- Saber si existe un campo en una tabla --
http://comunidadvfp.blogspot.com/2004/07/saber-si-existe-un-campo-en-una-tabla.html

-- Busca un nombre de campo en una tabla --
http://comunidadvfp.blogspot.com/2000/04/busca-un-nombre-de-campo-en-una-tabla.html


Luis María Guayán
Tucumán, Argentina
_____________________________
http://comunidadvfp.blogspot.com

El 11/10/2014 a las #4, Saul Piña Hernandez escribió:

Luis Maria Guayan

unread,
Oct 14, 2014, 8:32:17 AM10/14/14
to publice...@googlegroups.com
Otra mas que puede servir:

-- Buscar el nombre de un campo en todas las tablas de una DBC --
http://comunidadvfp.blogspot.com/2008/05/estas-dos-maneras-de-buscar-el-nombre.html

Luis María Guayán
Tucumán, Argentina
_____________________________
http://comunidadvfp.blogspot.com

Reply all
Reply to author
Forward
0 new messages