Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Enumerar filas de un select (https://www.clubdelphi.com/foros/showthread.php?t=57859)

lucasarts_18 30-06-2008 15:40:15

Enumerar filas de un select
 
Hola.

Estoy manejando un simple select y necesito que unos de ellos sea un campo computado que me muestre la cantidad de filas, esto es.

Código:

fila  codigo nombre        cantidad
1    0001    Camisa        5
2    0544    zapatos        6
3    0547    Polerar        28

Se entiende la idea :), basicamente eso, poder tener un campo fila que sin la necesidad de tenerlo almacenado en la base de datos.

Tambien puede crearlo directamente desde php, pero siempre pienso que es más optimo que estas cosas las haga el propio motor ;)

Gracias....

PD1: En oracle existe un palabra reservada (función) llamada rownums que permite hacer esto.

PD2: ¿Cómo puedo formatear acá en el club las filas de más arriba?, he visto forista que lo hacen y les queda bastante ordenado, ¿existe alguna etiqueta que permita hacer esto?

enecumene 30-06-2008 16:27:21

Hola, no sé si te servirá, pero ahí va:

Código SQL [-]
 set @RNUM = 0;
select @RNUM := @RNUM+1 row_number, Tabla.* from Tabla;

Saludos.

lucasarts_18 30-06-2008 16:56:48

Cita:

Empezado por enecumene (Mensaje 297234)
Hola, no sé si te servirá, pero ahí va:

Código SQL [-] set @RNUM = 0; select @RNUM := @RNUM+1 row_number, Tabla.* from Tabla;


Saludos.

Hola, eso al parecer es para MS-SQL Server. :o

Hasta Luego .-

enecumene 30-06-2008 17:13:40

Cita:

Empezado por lucasarts_18 (Mensaje 297240)
Hola, eso al parecer es para MS-SQL Server. :o

Hasta Luego .-

Ah Joder, es que todo se me parece :D.

Saludos.

roman 30-06-2008 17:29:19

Yo acabo de probarlo con MySQL y sí funciona bien.

// Saludos

lucasarts_18 30-06-2008 17:36:45

Cita:

Empezado por roman (Mensaje 297248)
Yo acabo de probarlo con MySQL y sí funciona bien.

// Saludos


:eek::eek: bueno, tendré que probarlo, no lo hice ya que esas instrucciones me olian a microsoft, lo haré apenas llegue a casa, acá no trabajo con MySQL. :(

Bye.

roman 30-06-2008 17:38:44

Cita:

Empezado por lucasarts_18 (Mensaje 297223)
PD2: ¿Cómo puedo formatear acá en el club las filas de más arriba?, he visto forista que lo hacen y les queda bastante ordenado, ¿existe alguna etiqueta que permita hacer esto?

¿Te refieres a algo así?

Código:

+------+--------+---------+----------+
| fila | codigo | nombre  | cantidad |
+------+--------+---------+----------+
| 1    | 0001  | Camisa  |  5      |
+------+--------+---------+----------+
| 2    | 0544  | zapatos |  6      |
+------+--------+---------+----------+
| 3    | 0547  | Polerar | 28      |
+------+--------+---------+----------+

// Saludos

enecumene 30-06-2008 17:41:38

Oye Roman, ¿cómo demonios logras cuadrar ese cuadro en el club?, nunca me sale así, perdón si me salgo del tema, no pude evitar hacer la pregunta.

Saludos.

roman 30-06-2008 17:47:56

Si bebieras menos chela... :D

No, ya en serio, lo que yo hago es hacer la tabla en el block de notas, pues como usa letra de ancho fijo me permite formarla correctamente. Luego copio y pego en el mensaje dentro de una etiqueta [code]. Al pegar, la tabla se descuadra en el editor porque el editor de mensaje no usa letra de ancho fijo, pero no importa porque la etiqueta [code] sí, por lo que al mostrar el mensaje ya queda bien.

// Saludos

enecumene 30-06-2008 17:52:43

Vale, gracias Roman, para la próxima ya sabré como hacerlo, muchas gracias.

Cita:

Empezado por Roman
Si bebieras menos chela... :D
Si dejas de invitarme tanto, tal vez :D

lucasarts_18 30-06-2008 18:08:03

Cita:

Empezado por roman (Mensaje 297253)
¿Te refieres a algo así?

Código:

+------+--------+---------+----------+
| fila | codigo | nombre  | cantidad |
+------+--------+---------+----------+
| 1    | 0001  | Camisa  |  5      |
+------+--------+---------+----------+
| 2    | 0544  | zapatos |  6      |
+------+--------+---------+----------+
| 3    | 0547  | Polerar | 28      |
+------+--------+---------+----------+

// Saludos

Sí Román, gracias por el tips, a la noche lo intentaré desde casa, acá me da miedo, jejeje....;)

lucasarts_18 01-07-2008 03:24:08

Lo he intentado y no me funciona.

Con esta frase y como bien dice nuestro compañero julián, me explicado como el culo, jeje.
Lo que quiero decir es que la columna donde debe aprecer el número de filas simplemente me aparece null.

Gracias .-

roman 01-07-2008 16:31:23

Así probé yo y funciona:

Código PHP:

<?php
mysql_query
('set @fila = 0');
$filas mysql_query('select @fila := @fila + 1 as fila, clave, nombre from cliente')
?>
<table>
<tr>
    <th>Fila</th>
    <th>Clave</th>
    <th>Nombre</th>
</tr>
<?php while ($fila mysql_fetch_assoc($filas)): ?>
<tr>
    <td><?php echo $fila['fila'?></td>
    <td><?php echo $fila['clave'?></td>
    <td><?php echo $fila['nombre'?></td>
</tr>
<?php endwhile ?>
</table>

// Saludos

enecumene 01-07-2008 17:01:47

Yo siempre lo he logrado hacerlo en php, más no he podido hacerlo en delphi con Zeos.

Saludos.

roman 01-07-2008 17:13:16

Código Delphi [-]
ZQuery1.SQL.Text := 'set @fila = 0';
ZQuery1.ExecSQL;

ZQuery1.SQL.Text :=
  'select @fila := @fila + 1 as fila, clave, nombre from solicitante';
ZQuery1.Open;

// Saludos

enecumene 01-07-2008 17:44:10

Vale, no sabía que se puede hacer dos sentencias con el mismo TZQuery y me ha funcionado bien. Gracias.

Saludos

roman 01-07-2008 17:55:52

Cita:

Empezado por enecumene
no sabía que se puede hacer dos sentencias con el mismo TZQuery

Estee.. Más bien es lo que no se puede hacer. A ver, hasta donde yo sé, MySQL no acepta sentencias múltiples en una misma consulta, por ello no se puede poner

Código Delphi [-]
ZQuery1.SQL.Add('set @fila = 0');
ZQuery1.SQL.Add('select @fila := @fila + 1 as fila, clave, nombre from solicitante');

y ejecutar la consulta. Hay que hacerlo por separado. No es que se hagan dos consultas, sólo estás reusando el ZQuery. Lo mismo podría hacerse con dos ZQuery

Código Delphi [-]
ZQuery1.SQL.Text := 'set @fila = 0';
ZQuery1.ExecSQL;

ZQuery2.SQL.Text :=
  'select @fila := @fila + 1 as fila, clave, nombre from solicitante';
ZQuery2.Open;

// Saludos

enecumene 01-07-2008 17:58:53

Ahh ok, ya entendí, ahora lo tengo más claro, de nuevo gracias Roman.

Saludos.

tcp_ip_es 02-07-2008 11:55:58

ahora que he visto lo de la ejecución de dos sentencias como bien ha comentado Roman, me gustaría saber si con un TAdoQuery + ODBC + MySQL funcionaría también....

roman 02-07-2008 16:30:39

Pues podrías hacer la prueba, yo ya la hice con PHP y Zeos, te toca a tí :p

Pero no veo razon por la cual no funcione, ya que es una característica de MySQL y no de las componentes que se usen. El único requisito que veo es que ambas consultas se realicen bajo la misma conexión.

// Saludos

tcp_ip_es 03-07-2008 08:54:56

Pues por lo que he probado no me funciona. No me reconoce la variable @fila en la segunda consulta:

Código:

AdoQuery1.SQL.Add('set @fila = 0');
AdoQuery1.ExecSQL;

AdoQuery1.sql.clear;
AdoQuery1.SQL.Add('select @fila:= @fila + 1 as fila, Cod_Factura,
Importe_Total from facturas');
AdoQuery1.Open;

Tengo un TAdoConnection con el siguiente conectionstring:

Código:

Provider=MSDASQL.1;Persist Security Info=False;Data Source=ANDC;
Extended Properties="DATABASE=andc;DESCRIPTION=Analitica DC;DSN=ANDC;
OPTION=0;PORT=0;SERVER=intranetdes;UID=andc"

El Adoquery1 utiliza dicha conexión.

La versión de MySql es 5.0.19.nt y el Driver ODBC es MyODBC Driver 3.51.
Es como si cada ejecución de consulta la tratara como una sesión distinta con lo que no reconoce la variable ya creada. Alguna idea????

Saludos, Tony

roman 03-07-2008 09:40:02

Hola Tony,

Acabo de probar y me marca este error:

Cita:

Objeto Parameter mal definido. Se proporcionó información incompleta o incoherente.
Al parecer los dos puntos los confunde con un parámetro (y ahora me pregunto ¿cómo es que a ZEOS no le pasalo mismo?).

Afortunadamente he podido solucionarlo diciéndole que haga caso omiso del "parámetro":

Código Delphi [-]
AdoQuery1.SQL.Text := 'set @fila = 0';
AdoQuery1.ExecSQL;

ADOQuery1.ParamCheck := false; // <-- añadir esto

AdoQuery1.SQL.Text :=
  'select @fila := @fila + 1 as fila, clave, nombre from solicitante';
AdoQuery1.Open;

aunque me queda la duda de qué hacer en caso de que realmente tengamos algún parámetro en la consulta.

La cadena de conexión que usé:

Cita:

DRIVER={MySQL ODBC 3.51 Driver};SERVER=server;DATABASE=database;USER=user;PASSWORD=password;OPTION=3
y también con el driver 5.1.

// Saludos

tcp_ip_es 03-07-2008 09:56:32

Pues es verdad ahora como meteríamos un parámetro :confused: :confused:
La cuestión es que a mi no me daba tu error :
Cita:

Objeto Parameter mal definido. Se proporcionó información incompleta o incoherente.
Me daba directamente el del ODBC:

Cita:

[MySQL][ODBC 3.51 Driver]You have an error in your SQL syntax near bla bla bla
Por eso creía que el error venía de Mysql.... debería de haber alguna forma de introducir parametros asi como cuando utilizamos las dos comillas para una comilla, o como el quotedstr :D

Saludos, Tony

P.D. Con lo que has dicho me funciona correctamente.

roman 03-07-2008 10:09:41

Cita:

Empezado por tcp_ip_es
como cuando utilizamos las dos comillas para una comilla

¡Eureka! :)

Me ha funcionado poniendo dos ::

Código Delphi [-]
AdoQuery1.SQL.Text := 'set @fila = 0';
AdoQuery1.ExecSQL;

AdoQuery1.SQL.Text :=
  'select @fila ::= @fila + 1 as fila, clave, nombre from solicitante where tipo_id = :tipoId';

AdoQuery1.Parameters.ParamByName('tipoId').DataType := ftInteger;
AdoQuery1.Parameters.ParamByName('tipoId').Value := 4;

AdoQuery1.Open;

// Saludos

tcp_ip_es 03-07-2008 10:47:49

Sabía que tenía que haber algo asi.... :D

lucasarts_18 05-07-2008 16:10:53

Hola.

Disculpen por haber abandonado este hilo, recien he tenido un tiempo para retomar esto, gracias enecumene y Román, funciona perfecto, no conocía esto de los SET en mysql, solo en MS-SQL Server :o, por eso mi equivocación inicial.

:p:p:p:p Mil Gracias, hasta la próxima.

Bye.


La franja horaria es GMT +2. Ahora son las 21:39:21.

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