En este post te mostraré cómo arreglar el error de mi plugin de impresión que dice: Error en el servidor: sql: no rows in result set.
Este error dice que no hay filas en la base de datos, y tal vez te estarás preguntando qué tiene que ver la impresión con una base de datos, por lo que justamente eso será lo que trataré en este post.
sql: no rows in result set
En las primeras versiones del plugin, existía la opción setImpresora
que era para establecer la impresora en la que se imprimirían los tickets. Una vez establecida, ese nombre de impresora se quedaba guardado en una base de datos SQLite3.
Este error se ocasiona porque no hay datos en la base de datos porque no has invocado a setImpresora
, entonces cuando intentas imprimir te da ese error porque no hay datos en la base de datos (no hay rows, o sea filas, en la base de datos).
Más adelante implementé la función imprimirEnImpresora
que permite que tú indiques cuál impresora usar al imprimir, enviándole el nombre de la impresora como cadena.
Solución correcta
Yo siempre he recomendado usar el método imprimirEnImpresora
en lugar del método end
para terminar la impresión, de este modo tú te encargas de guardar el nombre de la impresora y pasarlo al plugin al imprimir.
Entonces para solucionar este problema, no hagas esto, esto es incorrecto:
let impresora = new Impresora(RUTA_API);
impresora.setFontSize(1, 1);
impresora.write("Fuente 1,1\n");
impresora.setFontSize(1, 2);
impresora.write("Fuente 1,2\n");
impresora.setFontSize(2, 2);
impresora.write("Fuente 2,2\n");
impresora.setFontSize(2, 1);
impresora.write("Fuente 2,1\n");
impresora.setFontSize(1, 1);
impresora.setEmphasize(1);
impresora.write("Emphasize 1\n");
impresora.setEmphasize(0);
impresora.write("Emphasize 0\n");
impresora.setAlign("center");
impresora.write("Centrado\n");
impresora.setAlign("left");
impresora.write("Izquierda\n");
impresora.setAlign("right");
impresora.write("Derecha\n");
impresora.setFont("A");
impresora.write("Fuente A\n");
impresora.setFont("B");
impresora.write("Fuente B\n");
impresora.feed(2);
impresora.write("Separado por 2\n");
impresora.cut();
impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial
impresora.end()
.then(valor => {
loguear("Al imprimir: " + valor);
});
Haz lo siguiente, eso sí es correcto:
let impresora = new Impresora(RUTA_API);
impresora.setFontSize(1, 1);
impresora.write(`Tratando de imprimir en ${nombreImpresora}
`);
impresora.write(mensaje);
impresora.cut();
impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial
impresora.imprimirEnImpresora(nombreImpresora)
.then(valor => {
loguear("Al imprimir: " + valor);
});
La diferencia es que estoy invocando a imprimirEnImpresora
pasando el nombre de la impresora, y no simplemente al método end
.
Solución simple
Otra solución es simplemente invocar a setImpresora
. La mayoría de ocasiones este problema ocurre porque el cliente usa el plugin gratuito e invoca a setImpresora
correctamente; le funciona y compra la versión premium, pero al usar la versión premium se le olvida invocar a setImpresora
, por lo que aparece el error sql: no rows in result set.
En resumen
Puedes hacer dos cosas: volver a invocar al método setImpresora
con el nombre de tu impresora, o comenzar a usar el método imprimirEnImpresora
en lugar del método end
.