Page 1 of 1

Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 7:27 am
by desdesummer87
Me estoy haciendo viejo, sin duda, pues por más que lo intento, no acierto a desarrollar una función que me permita imprimir la estructura de una base de datos DBF en uso, desde el programa que la maneja... Sólo la estructura, nó el contenido de los registros

Por favor: ¿Alguien me echa una mano...?

Gracias

Re: Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 7:34 am
by Antonio Linares
Prueba asi:
Code: Select all  Expand view

for n = 1 to FCount()
   ? FieldName( n ), FieldType( n ), Len( FieldGet( n ) )
next
 

Re: Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 9:07 am
by desdesummer87
Gracias Antonio, pero no reconoce la función FieldType...

Hé conseguido una aproximación mediante el siguiente código:

------------------------------------------------------
Use cuenta.dbf
aEstruct = DBStruct()
For i = 1 To Len(aEstruct)
? aEstruct[i, DBS_NAME], aEstruct[i, DBS_TYPE], aEstruct[i, DBS_LEN], aEstruct[i, DBS_DEC]
Next
----------------------------------------------------------

Continúo intentando la impresión...

Gracias de nueva

Re: Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 9:49 am
by JmGarcia
Para crear un DBF desde código se hace así:
Code: Select all  Expand view
dbCreate("FICHERO.DBF",{{"CAMPO_01  ","C",10,0},;
                        {"CAMPO_02  ","M", 8,0},;
                        {"CAMPO_03  ","N",10,3}})
o de la siguiente forma:
Code: Select all  Expand view
aCampos:={{"CAMPO_01  ","C",10,0},{"CAMPO_02  ","M", 8,0},{"CAMPO_03  ","N",10,3},{"CAMPO_N   ","C",10,0}}
dbCreate("FICHERO.DBF",aCampos)

Luego la estructura es del tipo array bidimensional de N elementos con 4 elementos por fila.
Entonces los campos son el 1 para el nombre, el 2 para el tipo (Number, Character, Memo), el 3 para la longitud del campo y el 4 para los decimales si es number.

Luego puedes listarlo así tambien:
Code: Select all  Expand view
use cuenta.dbf
aEstruct:=DBStruct()
use

for i=1 to Len(aEstruct)
   ? aEstruct[i,1],aEstruct[i,2],aEstruct[i,3],aEstruct[i,4]
next i

Re: Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 10:19 am
by desdesummer87
Gracias JmGarcia, pero hasta ahí ya habia llegado yo. En realidad el código que indicas es practicamente el mismo que adjunté yo, pues da lo mismo invocar la constante por su nombre, que por la posición que ocupa en el array multidimensional. Lo que me interesa no es la visualización por pantalla, que se consigue así, sinó la salida por impresora mediante un objeto Report.

Gracias no obstante...

Re: Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 11:35 am
by Antonio Linares
Prueba con este código:

ValType( FieldGet( n ) )

Re: Imprimir estructura de una base dbf

PostPosted: Tue May 24, 2011 8:26 pm
by desdesummer87
Gracias a todos los que se han dignado contestar, pero lamentablemente el problema persiste. Nada de lo aportado lleva a la salida por impresora...

Re: Imprimir estructura de una base dbf

PostPosted: Wed May 25, 2011 3:11 pm
by Willi Quintana
Hola, prueba asi:
Salu2

Code: Select all  Expand view


use cuenta.dbf
aEstruct:=DBStruct()
use

PRINT oPrn NAME cTitle PREVIEW

      If Empty( oPrn:hDC )
         Return(Nil)          // Printer was not installed or ready
      EndIf
 
      nLin    := 0.3
      nPag    := 0
      nLinMax := 27
      nItens  := 0
      PAGE

      FOR i=1 to LEN(aEstruct)
         oPrn:CmSay(nLin,1, aEstruct[i,1] )
         oPrn:CmSay(nLin,3, aEstruct[i,2] )
         oPrn:CmSay(nLin,5, STR(aEstruct[i,3],5,0) + "." + STR(aEstruct[i,4],1,0) )
         nLin += 0.5
      NEXT i

      ENDPAGE
ENDPRINT
 

Re: Imprimir estructura de una base dbf

PostPosted: Thu May 26, 2011 3:48 pm
by desdesummer87
Muchas gracias Willi Quintana.

Voy a probar y te cuento...

Re: Imprimir estructura de una base dbf

PostPosted: Thu May 26, 2011 4:10 pm
by desdesummer87
¡¡ EUREKA...!! Miles de gracias Willi. Tu código cumple sobradamente lo que pretendía.... Como has podido comprobar, mis conocimientos son ya escasos pues hace varioss años que dejé la programación ( estoy retocando por compromiso, una aplicación desarrollada hace tiempo), pero si en algún momento surgiera la ocasión de poder corresponderte, cuenta conmigo. Aquí estaré.

Gracias de nuevo.