consulta para crear una dbf y un txt en el escritorio

113 views
Skip to first unread message

Marcelo Barberis

unread,
Jul 23, 2025, 4:05:40 AM7/23/25
to publicesvfoxpro
Buenas noches estoy intentando crear una tabla DBF en el escritorio y un archivo TXT pero primero me salta error al crear una dbf indicando campo duplicado o campo no valido y despues no me crea el txt por error de sintaxis, el codigo es el siguiente, si pueden darme algunos comentarios les agradeceria

CLEAR
LOCAL lcVersionList, lcVersionCode, lnCont, lcFileName, lcGrupo, lcLetra, lnSubCodigo
LOCAL ARRAY laLetters[26], laExtras[5]
LOCAL lnHandle, lcDesktopPath, lcTargetFolder, lcTxtFile, lcDbfFile

* --- Obtener ruta del escritorio ---
lcDesktopPath = GETENV("USERPROFILE") + "\Desktop"
lcTargetFolder = lcDesktopPath + "\ArchivosGenerados"

* Crear carpeta si no existe
IF NOT DIRECTORY(lcTargetFolder)
    MD (lcTargetFolder)
ENDIF

* Rutas de salida
lcTxtFile = lcTargetFolder + "\lista_archivos.txt"
lcDbfFile = lcTargetFolder + "\lista_archivos.dbf"

* Letras A-Z para rotar
FOR i = 1 TO 26
    laLetters[i] = CHR(64 + i)
ENDFOR

* Archivos adicionales a instalar
DIMENSION laExtras[5]
laExtras[1] = "setup.exe"
laExtras[2] = "helper.dll"
laExtras[3] = "readme.txt"
laExtras[4] = "logo.png"
laExtras[5] = "uninstaller.exe"

* Crear archivo TXT
lnHandle = FCREATE(lcTxtFile)
IF lnHandle < 0
    ? "Error al crear archivo TXT en: " + lcTxtFile
    RETURN
ENDIF

* Crear DBF
IF FILE(lcDbfFile)
    DELETE FILE (lcDbfFile)
ENDIF
CREATE TABLE (lcDbfFile) (nombre C(80), version C(10), descripcion C(50))

* --- Procesar versiones de librerías ---
FOR EACH lcVersion IN ALINES(STRTRAN(lcVersionList, ",", CHR(13)))

    * Asignar código fijo a cada versión
    DO CASE
        CASE lcVersion == "13.0.0"
            lcVersionCode = "3650"
        CASE lcVersion == "15.3.1"
            lcVersionCode = "4531"
        CASE lcVersion == "16.3.1"
            lcVersionCode = "5631"
        CASE lcVersion == "20.3.0"
            lcVersionCode = "8030"
        OTHERWISE
            lcVersionCode = "0000"
    ENDCASE

    ? "Archivos para versión " + lcVersion + " (" + lcVersionCode + ")"

    * Generar 52 archivos
    FOR lnCont = 1 TO 52
        * Grupo: G01 - G52
        lcGrupo = "G" + PADL(lnCont, 2, "0")
        * Letra rotatoria: A-Z
        lcLetra = laLetters[MOD(lnCont-1, 26)+1]
        * Subcódigo: aleatorio entre 10 y 99
        lnSubCodigo = 10 + INT(RAND()*90)
        lcSubCodigo = PADL(lnSubCodigo, 2, "0")

        * Construir nombre de archivo
        lcFileName = ;
            lcVersionCode + lcGrupo + lcLetra + lcSubCodigo

        * Escribir en TXT
        =FPUTS(lnHandle, lcFileName)

        * Insertar en DBF
        INSERT INTO (lcDbfFile) (nombre, version, descripcion) VALUES ;
            (lcFileName, lcVersion, "Archivos Libreria")

        * Crear archivo vacío en la carpeta para probar (opcional)
        STRTOFILE("", lcTargetFolder + "\" + lcFileName)
    ENDFOR

    ? "" && Salto de línea entre versiones
ENDFOR

* --- Procesar archivos adicionales ---
? "Archivos adicionales:"
FOR lnCont = 1 TO ALEN(laExtras)
    * Crear nombre con nuevo patrón
    * Ejemplo: EXT001X42
    lcGrupo = "EXT" + PADL(lnCont, 3, "0")
    lcLetra = laLetters[MOD(lnCont-1, 26)+1]
    lnSubCodigo = 10 + INT(RAND()*90)
    lcSubCodigo = PADL(lnSubCodigo, 2, "0")

    lcFileName = ;
        lcGrupo + lcLetra + lcSubCodigo

    * Escribir en TXT
    =FPUTS(lnHandle, lcFileName)

    * Insertar en DBF
    INSERT INTO (lcDbfFile) (nombre, version, descripcion) VALUES ;
        (lcFileName, "EXTRA", laExtras[lnCont])

    * Crear archivo vacío en la carpeta para probar (opcional)
    STRTOFILE("", lcTargetFolder + "\" + lcFileName)
ENDFOR

* Cerrar archivo TXT
=FCLOSE(lnHandle)

? "Generación completa:"
? "Carpeta: " + lcTargetFolder
? "TXT: " + lcTxtFile
? "DBF: " + lcDbfFile

--
Marcelo Barberis Gutierrez
Sistemas Informaticos
Villa Montes - Bolivia
Telef.: +591-76830544

Victor Espina

unread,
Jul 23, 2025, 10:54:52 AM7/23/25
to Comunidad de Visual Foxpro en Español
Apoyate en Chatgpt.  Pega ese codigo en una ventana de ChatGPT y luego dile cuales son los erroes exactos que te aparecen y ChatGPT te dira donde esta el error, muy probablemente, y te paso te explicara POR QUE se produce el mismo.


Victor Espina

Zarlu

unread,
Jul 24, 2025, 12:04:14 PM7/24/25
to Comunidad de Visual Foxpro en Español
Buenos días Alex!

Para crear la tabla el campo "descripcion" es un nombre largo no válido, recortalo.
Declaras la variable "lcVersionList", pero no veo donde asignas contenido

Suerte
zarlu
Chetumal, Quintana Roo, México

HernanCano

unread,
Jul 24, 2025, 1:31:20 PM7/24/25
to Comunidad de Visual Foxpro en Español
1. Debes agregar al inicio de tu script los sgtes tres comandos:
```
close databases all
clear all
close all &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
```
para que se puedan cerrar la DBF y los archivos de texto abiertos en la ejecución anterior.

Si no se hace ésto, el script dirá que la DBF está abierta y no puede CREATE TABLE, y/o que no puede FCREATE el archivo TXT.

2. Estás ejecutando la función ALINES de forma incorrecta. Te muestro una forma de arreglar.

3. En ALINES está saliendo un error:

La vble lcVersionList no existe, es decir no se le pone contenido.

¿Sabes qué quiere decir?

4. Alex: yo no te recomiendo --ni a ningún colega-- usar las IAs actuales --sin tener suficiente conocimientos en el lenguaje que van a replicar/usar--, por que tiene información de VFP incorrecta.
La mejor para "codificación", AI Studio de Google, dice que VFP no tiene capacidad para codificar en UTF8 ni para convertir a base64.

LeChat Mistral me induce a usar VFPJson --"que es una implementación creada por la comunidad"-- --que se encuentra supuestamente en VFPX-- para el manejo de Json.

close databases all
clear all
close all &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


CLEAR
LOCAL lcVersionList, lcVersionCode, lnCont, lcFileName, lcGrupo, lcLetra, lnSubCodigo
LOCAL ARRAY laLetters[26], laExtras[5]
LOCAL lnHandle, lcDesktopPath, lcTargetFolder, lcTxtFile, lcDbfFile

** --- Obtener ruta del escritorio ---

lcDesktopPath = GETENV("USERPROFILE") + "\Desktop"
lcTargetFolder = lcDesktopPath + "\ArchivosGenerados"

** Crear carpeta si no existe

IF NOT DIRECTORY(lcTargetFolder)
   MD (lcTargetFolder)
ENDIF

** Rutas de salida

lcTxtFile = lcTargetFolder + "\lista_archivos.txt"
lcDbfFile = lcTargetFolder + "\lista_archivos.dbf"

** Letras A-Z para rotar

FOR i = 1 TO 26
   laLetters[i] = CHR(64 + i)
ENDFOR

** Archivos adicionales a instalar

DIMENSION laExtras[5]
laExtras[1] = "setup.exe"
laExtras[2] = "helper.dll"
laExtras[3] = "readme.txt"
laExtras[4] = "logo.png"
laExtras[5] = "uninstaller.exe"

** Crear archivo TXT

lnHandle = FCREATE(lcTxtFile)
IF lnHandle < 0
   ? "Error al crear archivo TXT en: " + lcTxtFile
   RETURN
ENDIF

** Crear DBF

IF FILE(lcDbfFile)
   DELETE FILE (lcDbfFile)
ENDIF
CREATE TABLE (lcDbfFile) (nombre C(80), version C(10), descripcio C(50)) && recuerda: 10 caracteres

** --- Procesar versiones de librerías ---
**FOR EACH lcVersion IN ALINES(TT,STRTRAN(lcVersionList, ",", CHR(13)))  &&&&&& sintaxis incorrecta
ALINES ( TT, STRTRAN(lcVersionList, ",", CHR(13)) )
FOR EACH lcVersion IN TT

   ** Asignar código fijo a cada versión

   DO CASE
   CASE lcVersion == "13.0.0"
      lcVersionCode = "3650"
   CASE lcVersion == "15.3.1"
      lcVersionCode = "4531"
   CASE lcVersion == "16.3.1"
      lcVersionCode = "5631"
   CASE lcVersion == "20.3.0"
      lcVersionCode = "8030"
   OTHERWISE
      lcVersionCode = "0000"
   ENDCASE

   ? "Archivos para versión " + lcVersion + " (" + lcVersionCode + ")"

   ** Generar 52 archivos

   FOR lnCont = 1 TO 52
      ** Grupo: G01 - G52

      lcGrupo = "G" + PADL(lnCont, 2, "0")
      ** Letra rotatoria: A-Z

      lcLetra = laLetters[MOD(lnCont-1, 26)+1]
      ** Subcódigo: aleatorio entre 10 y 99

      lnSubCodigo = 10 + INT(RAND()*90)
      lcSubCodigo = PADL(lnSubCodigo, 2, "0")

      ** Construir nombre de archivo

      lcFileName = ;
          lcVersionCode + lcGrupo + lcLetra + lcSubCodigo

      ** Escribir en TXT
      =FPUTS(lnHandle, lcFileName)

      ** Insertar en DBF

      INSERT INTO (lcDbfFile) (nombre, version, descripcion) VALUES ;
        (lcFileName, lcVersion, "Archivos Libreria")

      ** Crear archivo vacío en la carpeta para probar (opcional)

      STRTOFILE("", lcTargetFolder + "\" + lcFileName)
   ENDFOR

   ? "" && Salto de línea entre versiones
ENDFOR

** --- Procesar archivos adicionales ---

? "Archivos adicionales:"
FOR lnCont = 1 TO ALEN(laExtras)
   ** Crear nombre con nuevo patrón
   ** Ejemplo: EXT001X42

   lcGrupo = "EXT" + PADL(lnCont, 3, "0")
   lcLetra = laLetters[MOD(lnCont-1, 26)+1]
   lnSubCodigo = 10 + INT(RAND()*90)
   lcSubCodigo = PADL(lnSubCodigo, 2, "0")

   lcFileName = ;
     lcGrupo + lcLetra + lcSubCodigo

   ** Escribir en TXT
   =FPUTS(lnHandle, lcFileName)

   ** Insertar en DBF

   INSERT INTO (lcDbfFile) (nombre, version, descripcion) VALUES ;
     (lcFileName, "EXTRA", laExtras[lnCont])

   ** Crear archivo vacío en la carpeta para probar (opcional)

   STRTOFILE("", lcTargetFolder + "\" + lcFileName)
ENDFOR

** Cerrar archivo TXT

=FCLOSE(lnHandle)

? "Generación completa:"
? "Carpeta: " + lcTargetFolder
? "TXT: " + lcTxtFile
? "DBF: " + lcDbfFile

** --

HernanCano

unread,
Jul 24, 2025, 1:32:21 PM7/24/25
to Comunidad de Visual Foxpro en Español
Presta atención a lo q te dice Zarlu.
Reply all
Reply to author
Forward
0 new messages