Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

NivelSignificado
errorImpide la generación de código; el objeto no compila.
warningNo 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ódigoSituación
E00001Se esperaba una sección @Nombre y se encontró otra cosa.
E00128Un 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.
E00148El 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.
E00149El campo de field(Campo) es ambiguo: existe en más de una tabla de @References/Tables; indique la tabla con field(Tabla.Campo).
E00152Una variable de @Variables fue declarada pero nunca usada (warning).
E00178Una 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.
E00179No 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).
E00195Uso inválido de RefreshSelectRow()/For Each Row fuera de un Screen con DataGridView.
E00206String(): se esperaban de 2 a 4 argumentos (numero, enteros[, decimales][, relleno]), se encontraron {found}.
E00210Dos 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).
E00221char fuera del rango permitido para una variable standalone en @Variables (1-16.773.104).
E00222number con precisión fuera de rango (1-63) en @Variables.
E00223number cuya escala es mayor que su precisión.
E00224varchar fuera del rango permitido (1-16.773.100).
E00237Tipo 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).
E00238struct(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)).
E00240Acceso &Variable.Miembro a un miembro que no existe en el template del struct.
E00242Se pasó una variable struct(OtroTemplate) donde se esperaba un template distinto (la comparación es por nombre exacto, no por estructura).
E00253El 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).
E00269La Description de una tabla (@Structure) supera los 50 caracteres que admite TEXT en DDS.
E00270La Description de un campo (@Fields) supera los 50 caracteres que admite TEXT en DDS.
E00271La Description de un índice (@Indexes) supera los 50 caracteres que admite TEXT en DDS.
E00278list no tiene el método invocado (válidos: Add, Clear, Init, Remove, Count, Split, Json).
E00281La 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.
E00284Port de @License es 0.
E00285Host de @License no es un host válido.
E00286Fingerprint de @License no es una huella SHA-256 válida.
E00287Aviso: @License tiene Host pero no Fingerprint.
E00288Aviso: @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.
E00292El perfil pedido con --profile o Default Profile no existe entre los @Profile declarados (se listan los disponibles).
E00293Hay 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.
E00296Se 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.
E00298Una 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.
E00299El template de struct ‘{template}’ se contiene a sí mismo (directa o indirectamente) a través de sus miembros struct/list(struct).
E00300La 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).
E00301JsonSplit(): el primer argumento debe ser una &Variable (o miembro de struct) char/varchar, o un texto literal; se encontró {found}.
E00302JsonSplit(): ‘&{variable}’ debe ser una list de char o varchar (ahí se guardan las líneas).
E00303JsonSplit(): la sangría debe ser un número, se encontró {found}.
E00304El 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})).
E00310La constante ‘{name}’ debe ser de tipo char, varchar o number.
E00311El valor de la constante ‘{name}’ no es válido para su tipo: {detail}.
E00312La constante ‘&{variable}’ no se puede modificar.
E00313El parámetro ‘&{variable}’ de @Parameters no puede ser una constante.
E00314La 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.)
E00315La tabla ‘{table}’ no tiene PrimaryKey en @Indexes: ‘Join In’ la lee por su llave primaria.
E00316Join 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.
E00317Join 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.
E00318Join In {table}: el campo ‘{field}’ ({target_type}) no acepta ‘{source}’ ({source_type}).
E00319El campo ‘{field}’ pertenece a la tabla ‘{table}’ unida con ‘Join In’ y es de sólo lectura: no se puede asignar.
E00320Style: ‘{name}’ no es un color ni un atributo conocido. Colores: Green, White, Red, Blue, Yellow, Pink, Turquoise. Atributos: Reverse, High, Underline, Blink, Hidden.
E00321Style: sólo se admite un color por Style; se encontró ‘{name}’ además de ‘{previous}’.
E00322La condición no es válida en @Layout: sólo admite variables, números, textos, comparaciones, And/Or/Not y llamadas Funcion() sin argumentos.
E00323Demasiados Style en el mismo elemento: se admite a lo sumo uno sin condición y tres con condición.
E00324Style sin color ni atributo: indique al menos uno (por ejemplo Style(Red) o Style(Reverse)).
E00325Style sólo se admite en un Screen.
E00326Exit 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).
E00328Round(): se esperaban 2 argumentos (expresión, decimales), se encontraron {found}.
E00329Round(): ‘decimales’ debe ser un literal entero entre 0 y {max} (constante en tiempo de compilación: define la escala del resultado).
E00330Round(): el primer argumento debe ser de tipo Number (encontrado {type}).
E00344El texto de la tecla del evento ‘{event}’ no puede estar vacío ni pasar de {max} caracteres.
E00345El 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.
E00331SetFocus() sólo es válido en un Screen.
E00332SetFocus(): ‘&{variable}’ no es la variable de ningún Input del @Layout.
E00333SetFocus() no recibe argumentos (se pasaron {found}).
E00334SetFocus() es una sentencia: no devuelve ningún valor y no puede usarse dentro de una expresión.
E00335Refresh sólo es válido en un Screen.
E00336Cursor(): se esperaba 1 argumento (&variable), se encontraron {found}.
E00337Cursor(): el argumento debe ser una &variable.
E00338Cursor(): ‘&{variable}’ no es la variable de ningún Input ni de ninguna columna del DataGridView del @Layout.
E00339La tabla ‘{table}’ no tiene PrimaryKey en @Indexes: ‘When Duplicate’ relee el registro existente por su llave primaria.
E00340El campo ‘{field}’ es parte de la llave primaria de ‘{table}’: ‘When Duplicate’ no puede reasignarlo.
E00341String(): el relleno debe ser un texto literal de un solo carácter (por ejemplo “0” o “ “).
E00342Int(): se esperaba 1 argumento (un número), se encontraron {found}.
E00343Int(): el argumento debe ser de tipo Number (encontrado {type}).
E00346Function 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.
E00348El tamaño de pantalla {rows}x{columns} no es válido: un 5250 solo admite 24x80 o 27x132.
E00349El formato de registro ‘{name}’ no es válido: hasta {max} caracteres, solo letras y dígitos, y debe empezar por una letra.
E00350El 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).
E00351Return sin valor dentro de la Function ‘{name}’: una Function debe devolver un valor (Return &variable o Return expresión).
E00352La Function ‘{name}’ no devuelve ningún valor: agregue al menos un Return con valor.
E00198LoadRow() sólo puede usarse dentro de un Event o de una Procedure de un Screen (una Function no, porque se invoca como expresión).
E00199Retirado: LoadRow() ya no exige estar dentro de un For Each.
E00200Retirado: ya no hay límite de un solo For Each con LoadRow() dentro de Event Load.
E00201El 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.
E00357El 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}.
E00362Mod(): 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).
E00364Falta ‘EndTry’ para cerrar el bloque ‘Try’.
E00365El 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’.
E00367Un ‘Try’ necesita al menos un ‘Catch’.
E00368Este ‘Catch’ nunca se ejecuta: un ‘Catch’ sin filtro anterior (línea {line}) ya atrapa todos los errores. Ponga el ‘Catch’ sin filtro al final.
E00369El 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 entorno LANG (por ejemplo es_PE.UTF-8 usa es).
  • Si LANG no indica un idioma real (C, POSIX o vacía), se usa en.
  • Un archivo externo resources/messages_<idioma>.json junto 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 @Connection o @Deployment no 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 .warp en VSCode (warpgate.validateOnSave/validateOnOpen), si hay un .warproj resuelto para ese archivo.
  • Manualmente con warpgate --action validate — no toca IBM i, es puramente local.
  • Nota de licencia: validate no exige licencia; generate/build/reverse sí (ver Licenciamiento).
  • Como parte de generate/build/reverse — si hay errores, no se llega a generar/desplegar código.