logologo
Empezar
Manual
Desarrollo
Plugins
API
Inicio
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Empezar
Manual
Desarrollo
Plugins
API
Inicio
logologo
Descripción general de RunJS
Importación de módulos
Renderizado en contenedor

Variables globales

window
document
navigator

ctx

ctx.blockModel
ctx.collection
ctx.collectionField
ctx.dataSource
ctx.dataSourceManager
ctx.element
ctx.exit()
ctx.exitAll()
ctx.filterManager
ctx.form
ctx.getModel()
ctx.getValue()
ctx.getVar()
ctx.i18n
ctx.importAsync()
ctx.initResource()
ctx.libs
ctx.location
ctx.logger
ctx.makeResource()
ctx.message
ctx.modal
ctx.model
ctx.notification
ctx.off()
ctx.on()
ctx.openView()
ctx.render()
ctx.request()
ctx.requireAsync()
ctx.resource
ctx.route
ctx.router
ctx.setValue()
ctx.sql
ctx.t()
ctx.view
Next PageDescripción general de RunJS
Aviso de traducción IA

Este documento ha sido traducido por IA. Para información precisa, consulte la versión en inglés.

#SQLResource

Resource para ejecutar consultas basadas en configuraciones SQL guardadas o SQL dinámico, con datos provenientes de interfaces como flowSql:run / flowSql:runById. Es adecuado para informes, estadísticas, listas SQL personalizadas y otros escenarios. A diferencia de MultiRecordResource, SQLResource no depende de las colecciones; ejecuta consultas SQL directamente y admite paginación, vinculación de parámetros, variables de plantilla ({{ctx.xxx}}) y control del tipo de resultado.

Relación de herencia: FlowResource → APIResource → BaseRecordResource → SQLResource.

Formas de creación: ctx.makeResource('SQLResource') o ctx.initResource('SQLResource'). Para ejecutar basándose en una configuración guardada, utilice setFilterByTk(uid) (el UID de la plantilla SQL); para depuración, utilice setDebug(true) + setSQL(sql) para ejecutar SQL directamente. En RunJS, ctx.api es inyectado por el entorno de ejecución.


#Escenarios de uso

EscenarioDescripción
Informes / EstadísticasAgregaciones complejas, consultas entre tablas y métricas estadísticas personalizadas.
Listas personalizadas JSBlockImplementación de filtrado, ordenamiento o asociaciones especiales mediante SQL con renderizado personalizado.
Bloques de gráficosImpulsa las fuentes de datos de los gráficos con plantillas SQL guardadas, admitiendo paginación.
Elección entre SQLResource y ctx.sqlUtilice SQLResource cuando se requiera paginación, eventos o datos reactivos; utilice ctx.sql.run() / ctx.sql.runById() para consultas simples y puntuales.

#Formato de datos

  • getData() devuelve diferentes formatos según setSQLType():
    • selectRows (predeterminado): Array, resultados de varias filas.
    • selectRow: Objeto único.
    • selectVar: Valor escalar (por ejemplo, COUNT, SUM).
  • getMeta() devuelve metadatos como la paginación: page, pageSize, count, totalPage, etc.

#Configuración de SQL y modos de ejecución

MétodoDescripción
setFilterByTk(uid)Establece el UID de la plantilla SQL a ejecutar (corresponde a runById; debe guardarse primero en la interfaz de administración).
setSQL(sql)Establece el SQL sin procesar (se usa para runBySQL solo cuando el modo de depuración setDebug(true) está habilitado).
setSQLType(type)Tipo de resultado: 'selectVar' / 'selectRow' / 'selectRows'.
setDebug(enabled)Cuando se establece en true, refresh llama a runBySQL(); de lo contrario, llama a runById().
run()Llama a runBySQL() o runById() según el estado de depuración.
runBySQL()Ejecuta utilizando el SQL definido en setSQL (requiere setDebug(true)).
runById()Ejecuta la plantilla SQL guardada utilizando el UID actual.

#Parámetros y contexto

MétodoDescripción
setBind(bind)Vincula variables. Utilice un objeto para marcadores :name o un array para marcadores ?.
setLiquidContext(ctx)Contexto de la plantilla (Liquid), utilizado para analizar {{ctx.xxx}}.
setFilter(filter)Condiciones de filtrado adicionales (pasadas en los datos de la solicitud).
setDataSourceKey(key)Identificador de la fuente de datos (utilizado en entornos con múltiples fuentes de datos).

#Paginación

MétodoDescripción
setPage(page) / getPage()Página actual (por defecto es 1).
setPageSize(size) / getPageSize()Elementos por página (por defecto es 20).
next() / previous() / goto(page)Navega por las páginas y activa refresh.

En SQL, puede utilizar {{ctx.limit}} y {{ctx.offset}} para hacer referencia a los parámetros de paginación. SQLResource inyecta automáticamente limit y offset en el contexto.


#Obtención de datos y eventos

MétodoDescripción
refresh()Ejecuta el SQL (runById o runBySQL), escribe el resultado en setData(data), actualiza los metadatos y activa el evento 'refresh'.
runAction(actionName, options)Llama a acciones subyacentes (por ejemplo, getBind, run, runById).
on('refresh', fn) / on('loading', fn)Se activa cuando se completa la actualización o cuando comienza la carga.

#Ejemplos

#Ejecución mediante plantilla guardada (runById)

ctx.initResource('SQLResource');
ctx.resource.setFilterByTk('active-users-report'); // UID de la plantilla SQL guardada
ctx.resource.setBind({ status: 'active' });
await ctx.resource.refresh();
const data = ctx.resource.getData();
const meta = ctx.resource.getMeta(); // page, pageSize, count, etc.

#Modo de depuración: Ejecución de SQL directamente (runBySQL)

const res = ctx.makeResource('SQLResource');
res.setDebug(true);
res.setSQL('SELECT * FROM users WHERE status = :status LIMIT {{ctx.limit}}');
res.setBind({ status: 'active' });
await res.refresh();
const data = res.getData();

#Paginación y navegación

ctx.resource.setFilterByTk('user-list-sql');
ctx.resource.setPageSize(20);
await ctx.resource.refresh();

// Navegación
await ctx.resource.next();
await ctx.resource.previous();
await ctx.resource.goto(3);

#Tipos de resultados

// Múltiples filas (predeterminado)
ctx.resource.setSQLType('selectRows');
const rows = ctx.resource.getData(); // [{...}, {...}]

// Fila única
ctx.resource.setSQLType('selectRow');
const row = ctx.resource.getData(); // {...}

// Valor único (ej. COUNT)
ctx.resource.setSQLType('selectVar');
const total = ctx.resource.getData(); // 42

#Uso de variables de plantilla

ctx.defineProperty('minId', { get: () => 10 });
const res = ctx.makeResource('SQLResource');
res.setDebug(true);
res.setSQL('SELECT * FROM users WHERE id > {{ctx.minId}} LIMIT {{ctx.limit}}');
await res.refresh();

#Escuchar el evento refresh

ctx.resource?.on?.('refresh', () => {
  const data = ctx.resource.getData();
  ctx.render(<ul>{data?.map((r) => <li key={r.id}>{r.name}</li>)}</ul>);
});
await ctx.resource?.refresh?.();

#Notas

  • runById requiere guardar la plantilla primero: El UID utilizado en setFilterByTk(uid) debe ser un ID de plantilla SQL ya guardado en la interfaz de administración. Puede guardarlo a través de ctx.sql.save({ uid, sql }).
  • El modo de depuración requiere permisos: setDebug(true) utiliza flowSql:run, lo que requiere que el rol actual tenga permisos de configuración de SQL. runById solo requiere que el usuario haya iniciado sesión.
  • Antirrebote (Debouncing) de Refresh: Múltiples llamadas a refresh() dentro del mismo ciclo de eventos solo ejecutarán la última para evitar solicitudes redundantes.
  • Vinculación de parámetros para prevención de inyecciones: Utilice setBind() con marcadores :name o ? en lugar de la concatenación de cadenas para evitar la inyección de SQL.

#Relacionado

  • ctx.sql - Ejecución y gestión de SQL; ctx.sql.runById es adecuado para consultas simples y puntuales.
  • ctx.resource - La instancia del recurso en el contexto actual.
  • ctx.initResource() - Inicializa y vincula a ctx.resource.
  • ctx.makeResource() - Crea una nueva instancia de recurso sin vincularla.
  • APIResource - Recurso de API general.
  • MultiRecordResource - Diseñado para colecciones y listas.