zplCloud Blog
SQL Server como fuente de datos: el bucle del export, eliminado
La cadena de conexión nunca sale de tu máquina. Filtros, ordenación y paginación se ejecutan como T-SQL parametrizado en tu servidor.
El bucle del export, y por qué se rompe
Los datos de las etiquetas viven en un ERP, un WMS o una base de datos Azure SQL. El flujo habitual es exportar a CSV, arreglar los nombres de columna, subir, imprimir - y repetirlo mañana, porque el CSV ya está obsoleto.
El data hub de zplCloud elimina el export. Un agente CLI dentro de tu red guarda la cadena de conexión de SQL Server, la plataforma le envía una descripción de consulta, y solo vuelven las filas de resultado. La base de datos nunca se expone a internet y las credenciales nunca se almacenan en la nube.
Este post es la mecánica exacta: qué se ejecuta dónde, qué SQL se genera y cuáles son los límites duros.
Arquitectura en un párrafo
zplcloud proxy abre una conexión TLS saliente con api.zplcloud.com (SignalR). Sin puerto de entrada, sin regla NAT, sin VPN. Cuando abres una fuente de datos en la plataforma, el backend envía al agente un objeto de solicitud - consulta base, filtro, ordenación, offset, límite - y el agente lo convierte en T-SQL, lo ejecuta contra tu SQL Server con tu usuario de base de datos, y devuelve las filas. La cadena de conexión existe solo en la memoria del proceso del agente y en su configuración local.
Paso 1 - inicia el agente con uno o más servidores
# Se permiten varias banderas --sql; el NOMBRE es lo que eliges en la plataforma.
zplcloud proxy --agent "Lager" \
--sql PROD="Server=127.0.0.1;Database=erp;User Id=zplcloud;Password=…;Encrypt=True;TrustServerCertificate=True" \
--sql WAREHOUSE="Server=sql-wh.internal.lan,1433;Database=logistik;User Id=zplcloud;Password=…;Encrypt=True;TrustServerCertificate=True"
Equivalente sin poner secretos en la línea de comandos (acabarían en tu historial del shell):
# Windows PowerShell - una variable por servidor, nombre en el medio
$env:ZPLCLOUD_SQL_PROD_CONNECTION = "Server=127.0.0.1;Database=erp;User Id=zplcloud;Password=…;Encrypt=True;TrustServerCertificate=True"
zplcloud proxy --agent "Lager"
El banner de inicio lista lo encontrado: SQL servers: PROD, WAREHOUSE. La autenticación contra la plataforma usa --api-key <key> o ZPLCLOUD_API_KEY.
Hazlo persistente para operación desatendida:
- Windows:
setx ZPLCLOUD_SQL_PROD_CONNECTION "…", ozplcloud proxy --agent "Lager" --service-install --api-key sk_zplcloud_… - Linux/Raspberry Pi: misma bandera
--service-install; escribe una unidad systemdzplcloud-agent.serviceconRestart=always - Archivo en vez de env:
sqlservers.jsonjunto al binario o en~/.zplcloud/, forma{ "sqlServers": { "PROD": "Server=…" } } - Docker:
ZPLCLOUD_SQL_PROD_CONNECTIONendocker-compose.agent.yml
Notas sobre cadenas de conexión que cuestan una hora a la gente
Encrypt=True;TrustServerCertificate=Truees la pareja pragmática para un servidor interno con certificado autofirmado. QuitaTrustServerCertificatecuando tengas un certificado real.- Una instancia con nombre necesita
Server=host\INSTANCE; un puerto no estándar esServer=host,1433- coma, no dos puntos. - Usa un login SQL dedicado con
SELECTexactamente sobre las tablas que necesitan las etiquetas. El agente ejecuta todo como ese usuario, así que la base de datos es la frontera de permisos - no la plataforma.
Paso 2 - crea la fuente de datos
En Fuentes de datos el agente en ejecución aparece bajo Remote SQL Server con un chip por nombre configurado. Al hacer clic en un chip se rellena el formulario.
| Campo | Valor |
|---|---|
| Nombre | Lager-Artikel |
| Tipo | SQL Server |
| Servidor | PROD (el nombre de --sql PROD=…) |
| Consulta | SELECT ean, name, price FROM artikel |
Probar ejecuta SELECT 1 y devuelve servidor · base de datos. Campos lee los metadatos de columna vía SELECT TOP 1 * con CommandBehavior.SchemaOnly - obtiene el esquema sin traer datos. Si una consulta muy anidada no devuelve esquema, el agente reintenta una vez con SingleRow.
Paso 3 - qué ejecuta realmente el agente
Tu consulta base se envuelve como subconsulta. El filtro, la ordenación y la paginación los añade el agente:
SELECT * FROM ( SELECT ean, name, price FROM artikel ) AS ds
WHERE ean LIKE @p0
ORDER BY name
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
Tres cosas merecen leerse dos veces:
1. Los valores son parámetros, nunca concatenación de cadenas. El constructor de filtros emite @p0, @p1, … y vincula los valores a través de SqlCommand.Parameters. No hay ningún lugar donde un valor introducido por el usuario se convierta en texto SQL.
2. La paginación es nativa. limit 10 se convierte en FETCH NEXT 10 ROWS ONLY; SQL Server hace el trabajo y devuelve diez filas por la red, no un millón.
3. El recuento de filas es una consulta separada. Cuando pides el total, el agente ejecuta SELECT COUNT(*) FROM (<base>) AS ds con el mismo WHERE y los mismos parámetros.
Los límites duros (del código fuente del agente)
| Límite | Valor | Dónde aplica |
|---|---|---|
| Filas por solicitud | 1000 (RowCap) | limit se limita a 1…1000; por defecto cuando no se indica es 100 |
| Timeout de comando | 15 s | test, describe, query y count |
| Tipo de sentencia | solo SELECT | la consulta base se valida; las sentencias múltiples se rechazan |
| Columnas de orden/filtro | identificadores validados | no se pasan como SQL de forma libre |
Si necesitas más de 1000 filas en una vista - impresión por lotes, un catálogo completo - la plataforma pagina a través del conjunto de resultados con OFFSET creciente. Cada página es su propia solicitud de 1000 filas contra tu servidor, así que la memoria se mantiene plana independientemente del total.
Un timeout de 15 segundos es deliberado. Si tu consulta base no puede responder en 15 segundos, pertenece a una vista indexada o a una tabla con el índice correcto, no a una fuente de datos de etiquetas.
Paso 4 - úsalo en el diseñador y en Print Views
- Diseñador → pestaña Datos de prueba → Fuente de datos: elige la fuente de datos y pulsa Cargar. Los bindings de campo se renderizan con filas reales en lugar de texto de marcador de posición, así que ves las longitudes reales de campo antes de que nada llegue a una impresora.
- Print Views → configuración → Fuente de datos (Data Hub): la vista previa de la vista y su impresión usan la consulta en vivo. El operador ve datos actuales; nadie vuelve a subir un CSV.
Modos de fallo y qué significan
| Síntoma | Causa |
|---|---|
| El agente arranca pero no aparece ningún chip | falta el nombre --sql, o el agente se autenticó con una clave de otro workspace |
Probar falla al instante | cadena de conexión incorrecta (instancia, puerto, credenciales) - el error se transmite desde SQL Server |
Probar se cuelga y luego falla | timeout de 15 s: servidor inalcanzable desde la máquina del agente, o un cortafuegos descarta el paquete en silencio |
Campos no devuelve nada | la consulta base está demasiado anidada para SchemaOnly; el agente cae a SingleRow, que necesita al menos una fila existente |
| La consulta funciona, la Print View está vacía | la vista está vinculada a otra fuente de datos, o el filtro excluye todas las filas |
Plan
El data hub (fuentes de datos SQL Server y MongoDB a través del agente CLI) es parte del plan Pro. Detalles en la página de precios.