Diagnósticos y mensajes de error
El compilador reporta cada problema con un código E##### (p.ej. E00221), un nivel de severidad y un mensaje en español con los valores concretos interpolados.
Niveles
| Nivel | Significado |
|---|---|
error | Impide la generación de código; el objeto no compila. |
warning | No impide compilar, pero señala algo probablemente no intencional (p.ej. una variable declarada y nunca usada). |
Cómo se ven
Por línea de comandos (formato humano):
[2026-07-24T21:26:47Z] ERROR E00221 (line: 12, column: 5): La variable 'x' declara char(16773105), fuera del rango permitido (1-16773104).
O en JSON (--format json, el que consume la extensión de VSCode para pintar los subrayados rojos/amarillos en el editor):
{"errors": [{"line": 12, "column": 5, "severity": "error", "message": "..."}]}
Algunos ejemplos representativos
| Código | Situación |
|---|---|
E00001 | Se esperaba una sección @Nombre y se encontró otra cosa. |
E00128 | Un archivo referenciado por el .warpcfg (p.ej. la clave SSH de @Connection) no existe en esta máquina — no bloquea validate/generate, pero hará falta para build/reverse. |
E00148 | El campo de field(...) no se encontró: en field(Campo), en ninguna tabla de @References/Tables; en field(Tabla.Campo), porque la tabla no está referenciada o no contiene ese campo. |
E00149 | El campo de field(Campo) es ambiguo: existe en más de una tabla de @References/Tables; indique la tabla con field(Tabla.Campo). |
E00152 | Una variable de @Variables fue declarada pero nunca usada (warning). |
E00178 | Una variable usada en @Layout no está declarada en el ámbito global de @Variables. También se reporta cuando un camino &variable.miembro apunta a un miembro inexistente. |
E00179 | No se puede pasar ‘&{arg}’ (un parámetro in o una constante, de sólo lectura) a ‘{name}’, que lo modifica internamente (directa o indirectamente). |
E00192 | {name}() sólo puede usarse dentro de un Event, Procedure o Function de un Screen (la posición del cursor sólo existe tras leer la pantalla). |
E00195 | Uso inválido de RefreshSelectRow()/For Each Row fuera de un Screen con DataGridView. |
E00206 | String(): se esperaban de 2 a 4 argumentos (numero, enteros[, decimales][, relleno]), se encontraron {found}. |
E00210 | Dos variables o caminos de @Layout truncan al mismo campo DDS (los caminos de struct se aplanan: . pasa a _, mayúsculas, 10 caracteres; p. ej. cli.Codigo y cli_Codigo). |
E00221 | char fuera del rango permitido para una variable standalone en @Variables (1-16.773.104). |
E00222 | number con precisión fuera de rango (1-63) en @Variables. |
E00223 | number cuya escala es mayor que su precisión. |
E00224 | varchar fuera del rango permitido (1-16.773.100). |
E00237 | Tipo de miembro no admitido en un template de struct: sólo se permiten char/varchar/number/date/time/timestamp/field, struct(Template) y list(struct(Template)) (no se admite matrix ni list de tipos escalares). |
E00238 | struct(Nombre) referencia un template que no existe en @Variables; también se reporta para templates inexistentes dentro de miembros de otro template y de list(struct(X)). |
E00240 | Acceso &Variable.Miembro a un miembro que no existe en el template del struct. |
E00242 | Se pasó una variable struct(OtroTemplate) donde se esperaba un template distinto (la comparación es por nombre exacto, no por estructura). |
E00253 | El format de StringToDate/NumberToDate/IsDate/DateToString debe ser uno de Iso/Usa/Eur/Jis/Mdy/Dmy/Ymd/Jul, o un patrón de texto con YYYY, MM y DD una vez cada uno (p.ej. "YYYYMMDD", "DD/MM/YYYY"; en DateToString, de hasta 10 caracteres). |
E00269 | La Description de una tabla (@Structure) supera los 50 caracteres que admite TEXT en DDS. |
E00270 | La Description de un campo (@Fields) supera los 50 caracteres que admite TEXT en DDS. |
E00271 | La Description de un índice (@Indexes) supera los 50 caracteres que admite TEXT en DDS. |
E00278 | list no tiene el método invocado (válidos: Add, Clear, Init, Remove, Count, Split, Json). |
E00281 | La Description de @Properties (de un Program o Screen) supera los 50 caracteres que admite TEXT en los mandatos CL de compilación (CRTBNDRPG/CRTDSPF/CHGPFM). Mismo límite y criterio que E00269/E00270/E00271. |
E00284 | Port de @License es 0. |
E00285 | Host de @License no es un host válido. |
E00286 | Fingerprint de @License no es una huella SHA-256 válida. |
E00287 | Aviso: @License tiene Host pero no Fingerprint. |
E00288 | Aviso: @License tiene Host y File juntos (File se ignora). |
E00290 | @Connection/@Deployment/@License declarados directamente dentro de @GeneratorConfig, sin envolverlos en un @Profile "Nombre". |
E00291 | @GeneratorConfig no declara ningún @Profile. |
E00292 | El perfil pedido con --profile o Default Profile no existe entre los @Profile declarados (se listan los disponibles). |
E00293 | Hay varios @Profile declarados y no se indicó cuál usar (ni --profile ni Default Profile), así que el compilador no puede elegir uno solo (se listan los disponibles). |
E00294 | .Json() usado como sentencia suelta: devuelve el JSON como valor y debe usarse en una expresión (&texto = &Persona.Json()). |
E00295 | .Json() aplicado a una variable que no es struct ni list. |
E00296 | Se llamó a un método distinto de Json sobre un struct (el único método válido es Json). |
E00297 | .Json() sobre una list cuyo elemento no es un tipo escalar (char, varchar, number, date, time, timestamp) ni un struct. |
E00298 | Una variable del ámbito local también está declarada en global; el nombre no puede repetirse porque ambos ámbitos viven a nivel de módulo en el RPG generado. |
E00299 | El template de struct ‘{template}’ se contiene a sí mismo (directa o indirectamente) a través de sus miembros struct/list(struct). |
E00300 | La variable ‘{variable}’ ocuparía {size} bytes, más que el máximo de una variable RPG (16773104): reduzca el tamaño de sus miembros o de las listas que contiene (una list dentro de un struct reserva 100 elementos). |
E00301 | JsonSplit(): el primer argumento debe ser una &Variable (o miembro de struct) char/varchar, o un texto literal; se encontró {found}. |
E00302 | JsonSplit(): ‘&{variable}’ debe ser una list de char o varchar (ahí se guardan las líneas). |
E00303 | JsonSplit(): la sangría debe ser un número, se encontró {found}. |
E00304 | El parámetro ‘&{variable}’ de @Parameters no puede ser una list de ese tipo ni una matrix: sólo se admiten list de char o varchar (un arreglo de líneas de texto, que termina en la primera línea vacía). |
E00305 | {method}(): ‘&{variable}’ debe ser {expected} cuyos miembros sean char, varchar, number o date, con una trama de hasta 32766 posiciones.{hint} |
E00306 | {method}() debe usarse como {where}. |
E00307 | {function}(): se esperaba un valor char/varchar o una list de char/varchar, se encontró {found}. |
E00308 | {function}(): ‘&{variable}’ debe ser una list(struct(…)). |
E00309 | {function}(): la trama de {width} posiciones no cabe en los elementos de ‘&{variable}’ (char/varchar({element})). |
E00310 | La constante ‘{name}’ debe ser de tipo char, varchar o number. |
E00311 | El valor de la constante ‘{name}’ no es válido para su tipo: {detail}. |
E00312 | La constante ‘&{variable}’ no se puede modificar. |
E00313 | El parámetro ‘&{variable}’ de @Parameters no puede ser una constante. |
E00314 | La constante ‘&{variable}’ no puede mostrarse en un campo de pantalla: cópiela a una variable. (En un Block imprimible de un Program sí se puede usar.) |
E00315 | La tabla ‘{table}’ no tiene PrimaryKey en @Indexes: ‘Join In’ la lee por su llave primaria. |
E00316 | Join In {table}: el campo ‘{field}’ de su llave primaria ({key}) no existe en la tabla recorrida ni en las tablas ya unidas. Use ‘On’ para indicar de dónde sale cada campo. |
E00317 | Join In {table}: los campos de ‘On’ del lado de la tabla unida deben ser exactamente los de su llave primaria ({key}), sin repetir ni omitir ninguno. |
E00318 | Join In {table}: el campo ‘{field}’ ({target_type}) no acepta ‘{source}’ ({source_type}). |
E00319 | El campo ‘{field}’ pertenece a la tabla ‘{table}’ unida con ‘Join In’ y es de sólo lectura: no se puede asignar. |
E00320 | Style: ‘{name}’ no es un color ni un atributo conocido. Colores: Green, White, Red, Blue, Yellow, Pink, Turquoise. Atributos: Reverse, High, Underline, Blink, Hidden. |
E00321 | Style: sólo se admite un color por Style; se encontró ‘{name}’ además de ‘{previous}’. |
E00322 | La condición no es válida en @Layout: sólo admite variables, números, textos, comparaciones, And/Or/Not y llamadas Funcion() sin argumentos. |
E00323 | Demasiados Style en el mismo elemento: se admite a lo sumo uno sin condición y tres con condición. |
E00324 | Style sin color ni atributo: indique al menos uno (por ejemplo Style(Red) o Style(Reverse)). |
E00325 | Style sólo se admite en un Screen. |
E00326 | Exit sólo es válido dentro de un bucle (For Each, For Each Row, For o While). Dentro de una Procedure, Function o Event, el bucle debe estar en el mismo cuerpo. |
E00327 | ‘{keyword}’ es una palabra reservada que sólo es válida dentro de un ‘Do Case’ (Do Case / Case <condición> / Otherwise / EndCase). |
E00328 | Round(): se esperaban 2 argumentos (expresión, decimales), se encontraron {found}. |
E00329 | Round(): ‘decimales’ debe ser un literal entero entre 0 y {max} (constante en tiempo de compilación: define la escala del resultado). |
E00330 | Round(): el primer argumento debe ser de tipo Number (encontrado {type}). |
E00344 | El texto de la tecla del evento ‘{event}’ no puede estar vacío ni pasar de {max} caracteres. |
E00345 | El evento ‘{event}’ tiene el mismo nombre que una Procedure o Function de este archivo; ambos generan un subprocedimiento con ese nombre. Renombre uno de los dos. |
E00331 | SetFocus() sólo es válido en un Screen. |
E00332 | SetFocus(): ‘&{variable}’ no es la variable de ningún Input del @Layout. |
E00333 | SetFocus() no recibe argumentos (se pasaron {found}). |
E00334 | SetFocus() es una sentencia: no devuelve ningún valor y no puede usarse dentro de una expresión. |
E00335 | Refresh sólo es válido en un Screen. |
E00336 | Cursor(): se esperaba 1 argumento (&variable), se encontraron {found}. |
E00337 | Cursor(): el argumento debe ser una &variable. |
E00338 | Cursor(): ‘&{variable}’ no es la variable de ningún Input ni de ninguna columna del DataGridView del @Layout. |
E00339 | La tabla ‘{table}’ no tiene PrimaryKey en @Indexes: ‘When Duplicate’ relee el registro existente por su llave primaria. |
E00340 | El campo ‘{field}’ es parte de la llave primaria de ‘{table}’: ‘When Duplicate’ no puede reasignarlo. |
E00341 | String(): el relleno debe ser un texto literal de un solo carácter (por ejemplo “0” o “ “). |
E00342 | Int(): se esperaba 1 argumento (un número), se encontraron {found}. |
E00343 | Int(): el argumento debe ser de tipo Number (encontrado {type}). |
E00346 | Function Keys Row ({row}) fuera de rango: debe estar entre 1 y {max} (Rows - 1; la última fila queda para los mensajes). |
E00347 | ‘{color}’ no es un color válido para las teclas de función; use Green, White, Red, Blue, Yellow, Pink o Turquoise. |
E00348 | El tamaño de pantalla {rows}x{columns} no es válido: un 5250 solo admite 24x80 o 27x132. |
E00349 | El formato de registro ‘{name}’ no es válido: hasta {max} caracteres, solo letras y dígitos, y debe empezar por una letra. |
E00350 | El nombre de objeto ‘{name}’ no es válido para IBM i: hasta {max} caracteres, solo letras y dígitos, y debe empezar por una letra. Renombre el archivo (o la propiedad Name). |
E00351 | Return sin valor dentro de la Function ‘{name}’: una Function debe devolver un valor (Return &variable o Return expresión). |
E00352 | La Function ‘{name}’ no devuelve ningún valor: agregue al menos un Return con valor. |
E00198 | LoadRow() sólo puede usarse dentro de un Event o de una Procedure de un Screen (una Function no, porque se invoca como expresión). |
E00199 | Retirado: LoadRow() ya no exige estar dentro de un For Each. |
E00200 | Retirado: ya no hay límite de un solo For Each con LoadRow() dentro de Event Load. |
E00201 | El For Each que carga el DataGridView (con LoadRow()) debe declarar un Index: sin uno, no hay campos ordenados con los que reanudar la carga al presionar Page Down. |
E00353 | {element} termina en la columna {end}, pero la pantalla tiene {max} columnas: IBM i rechaza el campo o lo parte en dos filas. Acorte el texto o los anchos, o mueva el elemento a la izquierda. |
E00356 | {scope} declara la variable local ‘{variable}’, que tapa a la variable global de una Column del DataGridView: LoadRow() copiaría el valor de la local. Renombre la variable local. |
E00357 | El nombre del evento ‘{event}’ no es válido: se usa como nombre de subprocedimiento, así que solo admite letras, dígitos y _ y debe empezar por una letra. El texto que se ve en la fila de teclas va aparte: Event ‘Nombre’ 6 “Texto con espacios”. |
E00358 | {function}() espera {expected} argumento(s), pero recibió {found}. |
E00359 | {function}(): el argumento {arg} debe ser texto (char o varchar), no {type}. |
E00360 | {function}(): el argumento {arg} debe ser numérico, no {type}. |
E00361 | {function}(): el argumento {arg} debe ser un literal: {rule}. |
E00362 | Mod(): el argumento {arg} no puede tener decimales (RPG exige enteros en %rem); use Int() para truncarlo. |
E00363 | &{variable}.Split() solo admite una list de char o varchar (cada trozo es un texto). |
E00364 | Falta ‘EndTry’ para cerrar el bloque ‘Try’. |
E00365 | El código de estado ‘{code}’ de ‘Catch’ no es válido: debe ser un número entre 100 y 9999 (los errores de programa son 100-999 y los de archivo 1000-2999). |
E00366 | {function}() solo puede usarse dentro de un bloque ‘Catch’. |
E00367 | Un ‘Try’ necesita al menos un ‘Catch’. |
E00368 | Este ‘Catch’ nunca se ejecuta: un ‘Catch’ sin filtro anterior (línea {line}) ya atrapa todos los errores. Ponga el ‘Catch’ sin filtro al final. |
E00369 | El parámetro ‘{variable}’ de @Parameters se usa en @Layout y su nombre tiene 10 caracteres o menos: en una Screen el campo DDS toma ese mismo nombre y RPG lo confunde con el parámetro (no compila en IBM i). Use un nombre de más de 10 caracteres. |
E00370 | {function}(): el argumento {arg} debe ser {expected}, se encontró {type}. |
Cada mensaje tiene un código, un nivel (error/warning) y una plantilla con los datos concretos del caso ({variable}, {length}, etc.) que el compilador completa al reportarlo.
Idioma de los mensajes
El compilador trae embebidos los catálogos de mensajes en español y en inglés, con los mismos códigos y los mismos datos de cada plantilla. El idioma se elige con --lang (o -g):
warpgate --action validate --lang en
warpgate --action validate -g es
- Si se omite
--lang, se toma de la variable de entornoLANG(por ejemploes_PE.UTF-8usaes). - Si
LANGno indica un idioma real (C,POSIXo vacía), se usaen. - Un archivo externo
resources/messages_<idioma>.jsonjunto al ejecutable puede sobrescribir mensajes del catálogo embebido.
En VSCode, el idioma se controla con el setting warpgate.language (ver Comandos de VSCode).
Qué cubre el idioma
--lang no afecta sólo a los diagnósticos con línea/columna (E*, W*). Todos los textos de cara al usuario salen del catálogo y respetan el idioma elegido:
- Las líneas de log del CLI en validación, generación, ingeniería inversa y despliegue.
- El progreso y los errores del despliegue (
[Despliegue]en español,[Deployment]en inglés): conectando, subiendo, ejecutando, etc. - Los errores de conexión SSH/FTP/SFTP (por ejemplo, «no se pudo conectar» / «could not connect») y los errores de transporte.
- Los mensajes de licencias: denegaciones del servicio, licencia individual, estado (
license-status) y solicitud (license-request). - Los errores de generación, como
@Connectiono@Deploymentno encontrados.
Estos mensajes usan la serie de códigos M00001–M00106 (en messages_es.json y messages_en.json). A diferencia de los E*, no llevan línea ni columna.
Quedan siempre en español algunos errores internos del generador de código (invariantes del tipo «debería haberlo detectado la validación») y los textos que provienen del sistema operativo (por ejemplo, Connection refused (os error 111)).
Cuándo se disparan
- Al guardar/abrir un
.warpen VSCode (warpgate.validateOnSave/validateOnOpen), si hay un.warprojresuelto para ese archivo. - Manualmente con
warpgate --action validate— no toca IBM i, es puramente local. - Nota de licencia:
validateno exige licencia;generate/build/reversesí (ver Licenciamiento). - Como parte de
generate/build/reverse— si hay errores, no se llega a generar/desplegar código.