Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-05-2023
adrall adrall is offline
Miembro
 
Registrado: ene 2007
Posts: 94
Poder: 18
adrall Va por buen camino
Warning: Setting user variables within expressions is deprecated

Hola buenas,

Utilizo el siguiente código para extraer los registros de una tabla simple, tipo cuenta bancaria en MySQL y arrastro el saldo mediante la variable @isaldo, lo cual me funciona perfectamente.

Código SQL [-]
SET @isaldo:=0; 
SELECT *, @isaldo:=ROUND(@isaldo+entrada-salida,2) AS saldo FROM datos ORDER BY fecha_valor;

Sin embargo ahora MySQL me devuelve el siguiente mensaje de aviso:

Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. SQL.sql 1 17


Sabeis como podria actualizar este código para evitar problemas en futuras versiones de la BD.

Actualmente utilizo la version MySQL 8.0.30

Gracias y saludos.
Responder Con Cita
  #2  
Antiguo 12-05-2023
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.954
Poder: 27
delphi.com.ar Va camino a la fama
Te lo está diciendo en el warning, en lugar de usar
Código SQL [-]
SELECT @isaldo:=ROUND(@isaldo+entrada-salida,2)....
debes usar
Código SQL [-]
SELECT ROUND(@isaldo+entrada-salida,2) INTO @isaldo....

Saludos
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 14-05-2023
adrall adrall is offline
Miembro
 
Registrado: ene 2007
Posts: 94
Poder: 18
adrall Va por buen camino
Código SQL [-]
SELECT @isaldo:=ROUND(@isaldo+entrada-salida,2)....

Código SQL [-]
SELECT ROUND(@isaldo+entrada-salida,2) INTO @isaldo....


Si, ya entiendo lo que dice el Warning pero como se desarrolla? porque así tal cual no funciona ya que ahí no se indica de que tabla se extraen entrada o salida etc.
Responder Con Cita
  #4  
Antiguo 15-05-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Código SQL [-]
select campo from tabla into variable
Responder Con Cita
  #5  
Antiguo 15-05-2023
adrall adrall is offline
Miembro
 
Registrado: ene 2007
Posts: 94
Poder: 18
adrall Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Código SQL [-]
select campo from tabla into variable
Esto devuelve error: Result consisted of more than one row

@isaldo debea tener un valor diferente, el saldo de la cuenta, en cada fila tal como devuelve el codigo que uso ahora y que lanza el Warning y esto es lo que no sé implementar con SELECT ... INTO ....

Gracias

Última edición por adrall fecha: 15-05-2023 a las 14:09:03.
Responder Con Cita
  #6  
Antiguo 15-05-2023
adrall adrall is offline
Miembro
 
Registrado: ene 2007
Posts: 94
Poder: 18
adrall Va por buen camino
Stack overflow nos da la solución tanto en MariaDB como en Mysql 8.0:

https://dbfiddle.uk/v7D9TniE

Última edición por adrall fecha: 15-05-2023 a las 14:30:36.
Responder Con Cita
  #7  
Antiguo 15-05-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entonces no has hecho la pregunta correcta, porque ese enlace no habla nada de almacenar valor en variable.
Responder Con Cita
  #8  
Antiguo 15-05-2023
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.954
Poder: 27
delphi.com.ar Va camino a la fama
Cita:
Empezado por adrall Ver Mensaje
Esto devuelve error: Result consisted of more than one row
Nunca usé esa sintaxis, pero según entiendo deberías tener el mismo error con la sintaxis anterior.
En resumen, si quieres asignar una variable desde una consulta, el resultado debe ser de una fila. Alternativamente deberías usar cursores, para ir recorriendo el resultado y aplicando tu lógica a cada registro.


Cita:
Empezado por adrall Ver Mensaje
Stack overflow nos da la solución tanto en MariaDB como en Mysql 8.0:

https://dbfiddle.uk/v7D9TniE
Esto es radicalmente otra cosa, restarle a un campo el resultado de una consulta agrupada.

Saludos.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #9  
Antiguo 15-05-2023
adrall adrall is offline
Miembro
 
Registrado: ene 2007
Posts: 94
Poder: 18
adrall Va por buen camino
Expongo un código que me da un Warning y pido una solución para ese codigo sin utilizar variables incluidas en las expresiones para evitar el warning. Me respondeis con lo de que el mismo mensaje te da la solución o bien poneis código que es erroneo como el tuyo Casimiro.

Encuentro en Stackoverflow una solución para mi código que como dije en la pregunta sirve para "extraer los registros de una tabla simple, tipo cuenta bancaria en MySQL arrastrando el saldo mediante la variable @isaldo" que, creo que no es dificil de entender.

En el enlace aparece un código que hace exactamente eso: extraer datos de una tabla arrastrando el saldo sin utilizar variables y lo comparto con vosotros.
Responder Con Cita
  #10  
Antiguo 15-05-2023
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.954
Poder: 27
delphi.com.ar Va camino a la fama
Cita:
Empezado por adrall Ver Mensaje
Encuentro en Stackoverflow una solución para mi código que como dije en la pregunta sirve para "extraer los registros de una tabla simple, tipo cuenta bancaria en MySQL arrastrando el saldo mediante la variable @isaldo" que, creo que no es dificil de entender.

En el enlace aparece un código que hace exactamente eso: extraer datos de una tabla arrastrando el saldo sin utilizar variables y lo comparto con vosotros.
La verdad que para mi "extraer datos de una tabla arrastrando el saldo sin utilizar variables" no es algo claro, dado que no conozco ni el modelo de datos ni que quieres específicamente con "extraer". ¿Extraer datos relacionado por algún criterio, contabilizar, o simplemente acumular?
La solución que pones y la pregunta inicial, dan resultados muy distintos, según el resultado en el mismo sitio que nos has compartido: https://dbfiddle.uk/JtNBNuKa
OVER PARTITION agrupa, en cambio el código original acumula.

PD: Todos los que colaboran en el foro, invierten su tiempo desinteresadamente para ayudar al resto, si varios usuarios no comprendimos tu problema, o bien si es difícil de comprender, o no te has explicado del todo bien o simplemente no entendemos de la materia.

Saludos.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #11  
Antiguo 15-05-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por adrall Ver Mensaje
... poneis código que es erroneo como el tuyo Casimiro.
Además de lo comentado por delphi.com.ar ¿por qué dices que mi código es erróneo? yo no he puesto ningún código, es un "metacódigo", un ejemplo, para que lo adaptes a tu código, o sea, para que uses el nombre de tus tablas, tus campos, tus variables, etc.

Última edición por Casimiro Notevi fecha: 16-05-2023 a las 09:44:31.
Responder Con Cita
  #12  
Antiguo 16-05-2023
adrall adrall is offline
Miembro
 
Registrado: ene 2007
Posts: 94
Poder: 18
adrall Va por buen camino
Muchas gracias a los dos por vuestra ayuda.

Yo, más allá de si he hecho la pregunta 100% correcta, intentaba compartir un código que soluciona mi problema.

En cuanto al código de Casimiro, por supuesto que es un metacodigo y por supuesto que lo he adaptado a mis tablas / estructura pero repito, si ejecutas este código derivado de tu metacodigo:

Código SQL [-]
SET @variable:=0;
SELECT campo_que_sea FROM tabla INTO @variable;

Devuelve este error: Result consisted of more than one row.

Solo estoy informando de este punto.

Repito, muchas gracias
Responder Con Cita
  #13  
Antiguo 16-05-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No hay problema, nos alegra de que lo hayas solucionado
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Que significa el error: Received content of invalid Content-Type setting:text/html... vfogliatti Delphi para la web 7 23-01-2015 13:00:39
Por que suspend y resume estan "deprecated" edgar.benavides C++ Builder 3 23-02-2010 04:02:41
[linux]Firebird2.0,inet server err: setting KEEPALIVE socket option sakuragi Firebird e Interbase 6 06-06-2007 02:16:05
Expresiones Regulares (¿o Regular Expressions?) Ñuño Martínez Varios 12 13-10-2006 23:36:40
Warning Salomon Varios 2 05-04-2004 20:53:23


La franja horaria es GMT +2. Ahora son las 02:00:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi