SoloCodigo

Programación General => Visual FoxPro => Mensaje iniciado por: Widark en Martes 20 de Septiembre de 2005, 15:26

Título: Crear Tabla Desde Otra
Publicado por: Widark en Martes 20 de Septiembre de 2005, 15:26
Hola a tod@s!

Me pasa lo siguiente, en una tabla tengo como registros los nombres de las columnas, tamaño y tipo, quiero que apartir de estos registros poder crear una tabla, como quien dice los registros pasaran a ser las columnas de otra tabla. Lo pense hacer con vector pero no se como ejecutar la instruccion CREATE con el vector. Muchas gracias por sus comentarios.  :blink:
Título: Re: Crear Tabla Desde Otra
Publicado por: DrakerDG en Jueves 22 de Septiembre de 2005, 15:20
:comp: Puedes usar el macro & para ejecutar la instruccion desde un string, de la siguiente manera:

Código: Text
  1.  
  2. LOCAL ARRAY copia(2)  && Arreglo donde se almacenará la tabla original
  3. LOCAL xStg as String  && Variable donde se almacenará la instruccion, en este caso CREATE...
  4. *  Para efectos del ejemplo crea una tabla con un campo llamado Registro.
  5. CREATE TABLE Tabla1&#59;
  6.    (Registro c(50))
  7. SELECT Tabla1  && Selecciona la tabla
  8. APPEND BLANK   && Crea un registro
  9. replace Registro WITH "Tamaño"  && Lo llena con el nombre Tamaño (relativo a tu consulta)
  10. APPEND BLANK   && Crea un registro
  11. replace Registro WITH "Tipo"  && Lo llena con el nombre Tipo (relativo a tu consulta)
  12. USE && Cierra la tabla
  13. *  Consulta la tabla para almacenarla en el arreglo "copia"
  14. SELECT *&#59;
  15.   FROM Tabla1&#59;
  16.   INTO ARRAY copia
  17.  
  18. SELECT tabla1
  19. USE &&  cierra el cursor de la Tabla1 (abierto por la consulta)
  20. *  Crea la instrucción para crear la Tabla2 en un string
  21. xStr = "CREATE TABLE Tabla2 (" + ALLTRIM(copia(1)) + " i," + ALLTRIM(copia(2)) + " c(50))"
  22. &xStr && Ejecuta el macro (Este ejecuta lo que esta almacenado en xStr)
  23. SELECT Tabla2 &&  Selecciona la tabla
  24. USE && Cierra la tabla
  25.  
  26. *NOTA:  Las tablas fueron creadas en el directorio actual por defecto.
  27.  
  28.  
  29.  

Espero te sirva. :hola:
Título: Re: Crear Tabla Desde Otra
Publicado por: Widark en Jueves 22 de Septiembre de 2005, 17:59
Gracias, por tu respuesta DrakerDG!

El codigo quedo así:
Código: Text
  1. LOCAL loCarpeta as String, loCrear as Boolean, loEjecutaCrear as String
  2. DIMENSION GeneraTabla(1,1)
  3.  
  4. IF EMPTY(strTablaActiva)
  5.   MESSAGEBOX("No hay ninguna tabla activa.",64,"Generar Tabla")
  6.   ELSE
  7.   IF BOF() AND EOF()
  8.     MESSAGEBOX("No hay registros para crear la Tabla.",64,"Generar Tabla")
  9.     ELSE
  10.       loCarpeta = GETFILE('DBF','','Crear',1,'Crear tabla')
  11.  
  12.     IF NOT EMPTY(loCarpeta)
  13.       loCrear = .T.
  14.       IF FILE(loCarpeta) = .T.
  15.         Result = MESSAGEBOX("¿Este archivo ya existe desea remplazarlo?",4 + 32)
  16.         IF Result = 6
  17.           loCrear = .T.
  18.           ELSE
  19.           loCrear = .F.
  20.         EndIf
  21.       EndIf
  22.       IF loCrear = .T.
  23.           PosicionB = RATC("\",loCarpeta) && Posicion del primer backslash de derecha a izquierda
  24.         Extencion = LEN(ALLTRIM(loCarpeta)) - (PosicionB + 4) && Para quitar la extencion con s
  25.         strEspacio = SUBSTR(loCarpeta,PosicionB + 1,Extencion)
  26.         IF AT(" ",strEspacio) > 0
  27.           MESSAGEBOX("El nombre de la Tabla no puede contener espacios.",64)
  28.           ELSE
  29.           
  30.           DIMENSION GeneraTabla(RECCOUNT(),3) && Dimensiono el Vector para los Campos
  31.           
  32.           Bmk = RECNO()
  33.           GO TOP
  34.           loEjecutaCrear = "Create Table " + loCarpeta + "("
  35.           I = 1
  36.           DO WHILE NOT EOF()
  37.             loEjecutaCrear = loEjecutaCrear + "'" +  ALLTRIM(nomcampo) + "'";
  38.                     + SPACE(1) + ALLTRIM(tipocampo) + "(" + ALLTRIM(tamcampo) + ")"
  39.             IF I < RECCOUNT()
  40.               loEjecutaCrear = loEjecutaCrear + ", "
  41.               I = I + 1
  42.             EndIf
  43.             Skip
  44.           EndDo
  45.           loEjecutaCrear = loEjecutaCrear + ")"
  46.           &loEjecutaCrear
  47.  
  48.         EndIf
  49.       EndIf
  50.     EndIf
  51.   EndIf
  52. EndIf
  53.  
Título: Re: Crear Tabla Desde Otra
Publicado por: Cyclop en Jueves 22 de Septiembre de 2005, 23:31
Prueba esto

Código: Text
  1. Use TablaOrigen In 0 Alias Origen
  2. Select Origen
  3. Copy Struc To C:\TablaDestino Production
  4.  
  5.  

Salu2

Cyclopz
Título: Re: Crear Tabla Desde Otra
Publicado por: Widark en Viernes 23 de Septiembre de 2005, 01:31
Gracias Cyclop!

lo que pasa es en la Tabla de origen guardo la estructura de la tabla que voy a generar ej:
Etiqueta | Nomcampo | Tipcampo | Tamcampo
Alguna             | campo1               |    C                   |      20
Varias              |  campo2              |     L                   |        01

La tabla que se generará en resumen seria así: Create Table (Nomcampo Tipcampo(tamcampo)), lo cual quiere decir que seria así: Create Table ('campo1' C(20), 'campo2' L(01)). DrakerDG me sugirio que guardara eso en un string y si no estoy mal el tipo de dato string almacena 255 caracteres.
Título: Re: Crear Tabla Desde Otra
Publicado por: DrakerDG en Viernes 23 de Septiembre de 2005, 09:12
:comp: El tipo de variable que almacena solo 255 caracteres es la tipo Character.  La variable tipo String puede almacenar miles, creo que la limitante es tu memoria RAM.  Para comprobar que si soporta grandes tamaños declare una variable tipo string en el evento Load de un form, es decir

Código: Text
  1.  
  2. *  En el evento Load del form
  3. PUBLIC sVariable as String   && Declara la variable tipo string
  4. sVariable = ""         && Inicializa la variable con una cadena vacía
  5.  
  6.  
  7.  

Agregue un EditBox, un par de Labels, un CommandButton y un Timer en el Form.

El eneto Timer de Timer1 escribí el siguiente código:

Código: Text
  1.  
  2. *  En el evento Timer del Timer1
  3. sVariable = sVariable + "0123456789"  && Agrega 10 caracteres cada vez.
  4. thisform.edit1.Value  = sVariable     && Estable la propiedad Value del EditBox con el contenido de la variable.
  5. thisform.label2.Caption = STR(LEN(sVariable)) + " Caracteres"  &&  Muestra el tamaño de la variable (Cantidad de caracteres)
  6.  
  7.  
  8.  

Establecí la propiedad enabled de Timer1 a .F. (False), para que no ejecutara el evento Timer al correr el Form.

En el evento Click del CommandButton escribí el código para habilidar y deshabilitar el Timer1.

Código: Text
  1.  
  2. * En el evento Click del CommandButton
  3. IF thisform.timer1.Enabled
  4.   this.Caption = "Iniciar..."
  5.   thisform.timer1.Enabled = .F.
  6. ELSE
  7.   this.Caption = "Parar..."
  8.   thisform.timer1.Enabled = .T.
  9. ENDIF
  10.  
  11.  
  12.  

Puedes utilizar una variable tipo string para almacenar la cantidad de caracteres que necesites.
Adjunte el formulario que te comento (Zip file), revisalo y me cuentas. :D
Título: Re: Crear Tabla Desde Otra
Publicado por: Widark en Viernes 23 de Septiembre de 2005, 15:25
:lol:, gracias DrakerDG!

solo hize el comentario por que me lo hicieron y no encontre en la ayuda la capacidad de el tipo de variable String, ya lo probe y me deja mucho más tranquilo, gracias por tu respuesta.
Título: Re: Crear Tabla Desde Otra
Publicado por: DrakerDG en Viernes 23 de Septiembre de 2005, 20:28
:comp: No hay problema, de hecho hice el ejemplo porque tambien dude y quize asegurarme.  :hola:
Título: Re: Crear Tabla Desde Otra
Publicado por: Cyclop en Lunes 26 de Septiembre de 2005, 20:43
Yo tengo un ejemplo bien chevere te lo envio luego
Título: Re: Crear Tabla Desde Otra
Publicado por: Widark en Martes 27 de Septiembre de 2005, 23:19
Listo, Cyclop as estare esperando :comp: