Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2019-04

Problema con Zeos e PostgreSQL en versión de Lazarus 2.00

6 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Alfonso Arias Lemas

Hola colegas.
Me ocurre algo que me tiene ya con la cabeza echando chispas. Tengo una aplicación desarrollada y en "producción" desde la versión 1.6 de Lazarus, hasta ahí todo bien. Resulta que la semana anterior hice la migración de la versión 1.8 para la 2.00 de Lazarus y todo perfecto, mas a principio de semana cuando los clientes comenzaron a explotar el sistema comenzaron los problemas.
Cuando voy a grabar una transacción que incluye mas de una sentencia SQL el sistema compilado con la versión 2.00 me da error:

Resalto que esto no sucedía antes.
Haciendo un /debugger /(depurando el sistema) tomo las sentencias SQL para PostgreSQL que da error desde el sistema y a modo de ejemplo:

*UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; UPDATE app.a_pt SET
longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='', potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200; *
las coloco en el analizador de consultas del pgadmin e corren perfectamente mas si ejecuto esta misma sentencia desde el programa me da el error anterior.

Y, el error no sucede solo con estas sentencias, sino siempre que envio para PostgreSQL mas de una como por ejemplo cuando deseo eliminar registros de tablas padres e hijos, deseo insertar mas de un registro en una tabla y así.....
Busque en otros forum mas lo unico que sugieren es que realiza las transacciones sentencia por sentencia pero yo necesito que sea univoca y atómica, o sea, todo o nada.

Alguien sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 existe algún parámetro o propiedad nueva que permita hacer/definir transacciones simples o complejas con mas de una sentencia.

Saludos.

*Alfonso**Arias Lemas*

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20190404/bfecdbd6/attachment.html> ------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: nljgmcgfbfhgmagl.png
Type: image/png
Size: 4054 bytes
Desc: no disponible
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20190404/bfecdbd6/attachment.png>

Reply by email

José Mejuto
to Alfonso Arias Lemas
Alfonso Arias Lemas wrote 12 lines
Resalto que esto no sucedía antes. Haciendo un /debugger /(depurando el sistema) tomo las sentencias SQL para PostgreSQL que da error desde el sistema y a modo de ejemplo: *UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; UPDATE app.a_pt SET longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='', potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200; * las coloco en el analizador de consultas del pgadmin e corren perfectamente mas si ejecuto esta misma sentencia desde el programa me da el error anterior.

Hola,

Múltiples sentencias en un único query no se deben de usar, porque si eso es válido, esto también debería serlo y verás que no tiene sentido:

-------
SELECT * from TABLENOMBRES;
SELECT * from TABLECOCHES;
-------
Busque en otros forum mas lo unico que sugieren es que realiza las transacciones sentencia por sentencia pero yo necesito que sea univoca y atómica, o sea, todo o nada.

La transacción es eso, única y atómica. Todas las operaciones hasta que realices el Commit se harán en una sola operación, o el Commit fallará.

Alguien sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 existe algún parámetro o propiedad nueva que permita hacer/definir transacciones simples o complejas con mas de una sentencia.

Supongo que estás trabajando en modo "AutoCommit", eso lo que hace es que cada vez que realices una operación se ejecuta un "Commit" oculto. En este ejemplo de stackoverflow te lo muestran con código de ejemplo:

https://stackoverflow.com/questions/16759373/multiple-statements-delphi-tzquery-zeos-error

Saludos.

Reply by email

Alfonso Arias Lemas
to José Mejuto

Concuerdo con ambos, con José Mejuto y Pedro Pablo, estoy tratando de mudar el Chip. Provengo de SQL Server y Visual Foxpro y allí si es muy común este tipo de sentencia como el ejemplo de José de dos sentencias SQL (select) que las considero normal ya que SQL Server lo permite devolviendo los dos cursores, útil para disminuir los accesos al banco de datos cuando las consultas son pequeñas pudiendo colocar tantas query a devolver como se deseen.
En el caso de la respuesta de Pablo concuerdo también ya que los procedimientos almacenados son mas rápidos y de echo ya comencé por esa vía en algunos casos sin descartar el ejemplo que mandó José, muy interesante y ya lo estoy implementando.
Una de las situaciones que tengo es la siguiente.
Mis sistemas generalmente hacen acceso a las bases de datos remotamente en otro país, siempre fue así y trabajo sin problema con tiempos de respuestas aceptables. El sistema tenia en determinadas circunstancias que cargar tablas con mil o dos mil registros y en algunos momentos mas, eso tenia que realizarse en el momento, no de noche ni en periodos de poco movimiento. Yo lo que hacia era crear una query con todos los INSERT juntos y se los pasaba a Postgresql, con la versión 1.8 de Lazarus y Zeos 7.1.x se procesaba todo en un tiempo aceptable. Ahora que hice el upgrade para lazarus 2.00 y Zeos 7.2.x me da ese error. Entretanto ya me estoy apoyando en el ejemplo de José de forma a usar transacciones, espero que esta vía también tenga mas o menos el mismo efecto pues no tengo mucho tiempo, en esta semana la aplicación estuvo parada debido a este problema casi todos los dias y lo que tengo es la cabeza echando humo por la gente reclamando, se podrán imaginar.

Saludos

*Alfonso**Arias Lemas *

José Mejuto wrote 48 lines
El 04/04/2019 a las 23:46, Alfonso Arias Lemas via Lazarus-es escribió: > Resalto que esto no sucedía antes. > Haciendo un /debugger /(depurando el sistema) tomo las sentencias SQL > para PostgreSQL que da error desde el sistema y a modo de ejemplo: > > *UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; > UPDATE app.a_pt SET > longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='', > potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200; > * > las coloco en el analizador de consultas del pgadmin e corren > perfectamente mas si ejecuto esta misma sentencia desde el programa > me da el error anterior. Hola, Múltiples sentencias en un único query no se deben de usar, porque si eso es válido, esto también debería serlo y verás que no tiene sentido: ------- SELECT * from TABLENOMBRES; SELECT * from TABLECOCHES; ------- > Busque en otros forum mas lo unico que sugieren es que realiza las > transacciones sentencia por sentencia pero yo necesito que sea > univoca y atómica, o sea, todo o nada. La transacción es eso, única y atómica. Todas las operaciones hasta que realices el Commit se harán en una sola operación, o el Commit fallará. > > Alguien sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 > existe algún parámetro o propiedad nueva que permita hacer/definir > transacciones simples o complejas con mas de una sentencia. Supongo que estás trabajando en modo "AutoCommit", eso lo que hace es que cada vez que realices una operación se ejecuta un "Commit" oculto. En este ejemplo de stackoverflow te lo muestran con código de ejemplo: https://stackoverflow.com/questions/16759373/multiple-statements-delphi-tzquery-zeos-error Saludos.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20190405/1e72ae91/attachment-0001.html>

Reply by email

Alfonso Arias Lemas
to José Mejuto: Múltiples sentencias en un único query no se deben de usar, porque si eso es válido,…

Hola José.
Implementé el ejemplo que mandas en

https://stackoverflow.com/questions/16759373/multiple-statements-delphi-tzquery-zeos-error

y continua a dar el mismo error, me llamó la atención que es para Delphi pero no se si sería equivalente 100% para Lazarus. A modo de ejemplo use la misma query mostrada en el Email enviado por mi que podría ser un procedimiento almacenado sin duda pero para ejemplificar sirve.

*UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; ** **UPDATE app.a_pt SET
longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='',** **potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200;** *
en este caso yo necesito que si es actualizada una sentencia sea la otra también y si no nada.

*Alfonso**Arias Lemas*

Email: alfonsoariaslemas en gmail.com <mailto:alfonsoariaslemas en gmail.com>

Skype: alfonso291104

Viber: +34 666072614

WhatsApp: +34 666072614

Móvel CV: *+238 5882123/9578108*

José Mejuto wrote 48 lines
El 04/04/2019 a las 23:46, Alfonso Arias Lemas via Lazarus-es escribió: > Resalto que esto no sucedía antes. > Haciendo un /debugger /(depurando el sistema) tomo las sentencias SQL > para PostgreSQL que da error desde el sistema y a modo de ejemplo: > > *UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; > UPDATE app.a_pt SET > longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='', > potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200; > * > las coloco en el analizador de consultas del pgadmin e corren > perfectamente mas si ejecuto esta misma sentencia desde el programa > me da el error anterior. Hola, Múltiples sentencias en un único query no se deben de usar, porque si eso es válido, esto también debería serlo y verás que no tiene sentido: ------- SELECT * from TABLENOMBRES; SELECT * from TABLECOCHES; ------- > Busque en otros forum mas lo unico que sugieren es que realiza las > transacciones sentencia por sentencia pero yo necesito que sea > univoca y atómica, o sea, todo o nada. La transacción es eso, única y atómica. Todas las operaciones hasta que realices el Commit se harán en una sola operación, o el Commit fallará. > > Alguien sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 > existe algún parámetro o propiedad nueva que permita hacer/definir > transacciones simples o complejas con mas de una sentencia. Supongo que estás trabajando en modo "AutoCommit", eso lo que hace es que cada vez que realices una operación se ejecuta un "Commit" oculto. En este ejemplo de stackoverflow te lo muestran con código de ejemplo: https://stackoverflow.com/questions/16759373/multiple-statements-delphi-tzquery-zeos-error Saludos.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20190405/a59ef96e/attachment-0001.html>

Reply by email

Iván Mesa
to Alfonso Arias Lemas

Prueba a usar los bloques en postgres:
Do $$
Declare
//aquí pones variables si necesitas
Begin
//aquí los comandos.
End;
$$
Mira este link: https://www.postgresql.org/docs/9.0/sql-do.html

Un abrazo.
iDesk

Enviado desde Correo para Windows 10

De: Alfonso Arias Lemas via Lazarus-es
Enviado: viernes, 5 de abril de 2019 15:21
Para: lazarus-es en lists.lazarus-ide.org
CC: Alfonso Arias Lemas
Asunto: Re: [Lazarus-es] Problema con Zeos e PostgreSQL en versión de Lazarus 2.00

Hola José.
Implementé el ejemplo que mandas en

https://stackoverflow.com/questions/16759373/multiple-statements-delphi-tzquery-zeos-error

y continua a dar el mismo error, me llamó la atención que es para Delphi pero no se si sería equivalente 100% para Lazarus. A modo de ejemplo use la misma query mostrada en el Email enviado por mi que podría ser un procedimiento almacenado sin duda pero para ejemplificar sirve.

UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200;
UPDATE app.a_pt SET longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='',
                                    potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200;

en este caso yo necesito que si es actualizada una sentencia sea la otra también y si no nada. Alfonso Arias Lemas
Email: alfonsoariaslemas en gmail.com
Skype: alfonso291104
Viber: +34 666072614
WhatsApp: +34 666072614
Móvel CV: +238 5882123/9578108
 
El 5/4/2019 a las 6:58 AM, José Mejuto via Lazarus-es escribió: El 04/04/2019 a las 23:46, Alfonso Arias Lemas via Lazarus-es escribió:

Resalto que esto no sucedía antes.
Haciendo un /debugger /(depurando el sistema) tomo las sentencias SQL para PostgreSQL que da error desde el sistema y a modo de ejemplo:

*UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; UPDATE app.a_pt SET longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='', potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200; *
las coloco en el analizador de consultas del pgadmin e corren perfectamente mas si ejecuto esta misma sentencia desde el programa me da el error anterior.

Hola,

Múltiples sentencias en un único query no se deben de usar, porque si eso es válido, esto también debería serlo y verás que no tiene sentido:

-------
SELECT * from TABLENOMBRES;
SELECT * from TABLECOCHES;
-------

Busque en otros forum mas lo unico que sugieren es que realiza las transacciones sentencia por sentencia pero yo necesito que sea univoca y atómica, o sea, todo o nada.

La transacción es eso, única y atómica. Todas las operaciones hasta que realices el Commit se harán en una sola operación, o el Commit fallará.

Alguien sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 existe algún parámetro o propiedad nueva que permita hacer/definir transacciones simples o complejas con mas de una sentencia.

Supongo que estás trabajando en modo "AutoCommit", eso lo que hace es que cada vez que realices una operación se ejecuta un "Commit" oculto. En este ejemplo de stackoverflow te lo muestran con código de ejemplo:

https://stackoverflow.com/questions/16759373/multiple-statements-delphi-tzquery-zeos-error

Saludos.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20190405/41cc9984/attachment.html>

Reply by email

Alfonso Arias Lemas

Hola Ivan.
Precisamente ahora estoy con eso, cree la función siguiente:

*CREATE OR REPLACE FUNCTION cmdsql(ss text)**
**          RETURNS integer AS**
**$BODY$**
**DECLARE**
**          Result        Integer;**
**BEGIN**
**        Result:=0;**
**        BEGIN**
**            EXECUTE $1;**
**            EXCEPTION WHEN OTHERS THEN** **            Result:=-1;**
**        END;**
**        RETURN Result;**
**END**
**$BODY$**
**      LANGUAGE plpgsql VOLATILE STRICT**
**      COST 1;**
*
donde le paso como parámetro la(s) secuencia(a) SQL para que sean ejecutadas desde dentro de la función.
Ya lo probé y parece que funciona.

Saludos

*Alfonso**Arias Lemas*

Email: alfonsoariaslemas en gmail.com <mailto:alfonsoariaslemas en gmail.com>

Skype: alfonso291104

Viber: +34 666072614

WhatsApp: +34 666072614

Móvel CV: *+238 5882123/9578108*

Iván Mesa wrote 27 lines
Prueba a usar los bloques en postgres: Do $$ Declare //aquí pones variables si necesitas Begin //aquí los comandos. End; $$ Mira este link: https://www.postgresql.org/docs/9.0/sql-do.html Un abrazo. iDesk Enviado desde Correo <https://go.microsoft.com/fwlink/?LinkId=550986> para Windows 10

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20190405/3deacdea/attachment-0001.html>

Reply by email