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
** --