Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   El primer registro de tabla sql (https://www.clubdelphi.com/foros/showthread.php?t=95938)

giantonti1801 02-11-2022 02:37:30

El primer registro de tabla sql
 
hola foro, tengo una tabla con un campo numero que se incrementa automaticamente a esta misma tabla tengo un campo de condicion 'NEW' o 'OLD' ahora bien quiero que sql recorra la tabla busque todo lo que tengan la condicion 'NEW' y me lo ordene por numero, es decir quiero ver solo el primer registro que tiene el numero mas antiguo:
Ejemplo

10 xxxx xxxxx xxxx xxxx Activo xxx xxxx
6 xxxx xxxxx xxxx xxxx Activo xxx xxxx
11 xxxx xxxxx xxxx xxxx Activo xxx xxxx
7 xxxx xxxxx xxxx xxxx Activo xxx xxxx


si yo realizo la consulta me trae me debería traer el numero 6 (Registro mas Antiguo dentro de la tabla) pero por algo que talvez estoy obviando me esta trayendo e el numero 7

Código SQL [-]
SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero desc

Si alguien tiene alguna idea que como realizar esta consulta se lo agradeceria

mamcx 02-11-2022 03:21:58

La clausula TOP sirver para, de 100 registros, devolver solo los primeros N *que cumplan la condición*.

Esta NO "analiza" los resultados.


---

Si tienes un SQL Server relativamente nuevo la forma mas simple es con una clausula window, tipo:

https://stackoverflow.com/questions/...w-from-a-group

Código SQL [-]
SELECT * FROM (
SELECT 
*,
row_number() OVER(PARTITION BY AQUI_UN_CAMPO_AGRUPA ORDER BY order DESC) AS order 

 FROM tiket
)a WHERE  order = 1

Neftali [Germán.Estévez] 02-11-2022 08:36:38

También puedes usar la función MIN, ya que lo que quieres es el mínimo valor del campo NUMERO.
Yo creo que esto te puede funcionar:

Código SQL [-]
SELECT * FROM ticket T INNER JOIN 
(
SELECT MIN(numero) AS MINIMO FROM ticket WHERE status='NEW'
) T2 ON T2.MINIMO=T.numero

Esto busca en la tabla el mínimo valor del campo NUMERO según el WHERE (que debería ser 6) y luego hace la JOIN para traerse el resto de campos de la tabla.

NOTA: Asumo que ese campo NUMERO debe tener un índice, si no es así añádeselo.

duilioisola 02-11-2022 15:24:52

Cita:

si yo realizo la consulta me trae me debería traer el numero 6 (Registro mas Antiguo dentro de la tabla) pero por algo que talvez estoy obviando me esta trayendo e el numero 7
SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero desc
Creo que el problema es que estás pidiendo el primero, ordenado de forma descendente.

7 <---
6
5
...

La consulta correcta sería:
Código SQL [-]
SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero

giantonti1801 02-11-2022 17:27:12

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 548898)
También puedes usar la función MIN, ya que lo que quieres es el mínimo valor del campo NUMERO.
Yo creo que esto te puede funcionar:

Código SQL [-]
SELECT * FROM ticket T INNER JOIN 
(
SELECT MIN(numero) AS MINIMO FROM ticket WHERE status='NEW'
) T2 ON T2.MINIMO=T.numero

Esto busca en la tabla el mínimo valor del campo NUMERO según el WHERE (que debería ser 6) y luego hace la JOIN para traerse el resto de campos de la tabla.

NOTA: Asumo que ese campo NUMERO debe tener un índice, si no es así añádeselo.

Perfecto! me funciona en Sql Manager sin ningun problema pero ahora me esta dando problema en la aplicacion

Código:

begin
    With ADOQuery1 do
        begin
        Close;
        Sql.Clear;
        Open;
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus=NEW') T2 ON T2.MINIMO=T.Item';
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
        Label1.Caption := 'A000' + ADOQuery1.fieldbyname('Item').asstring;
        end;


kuan-yiu 02-11-2022 17:32:58

Tienes el open antes de cargar la sentencia SQL

giantonti1801 02-11-2022 17:58:48

Cita:

Empezado por kuan-yiu (Mensaje 548916)
Tienes el open antes de cargar la sentencia SQL

Código:

With ADOQuery1 do
        begin
        Close;
        Sql.Clear;
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
        Open;
        ADOQuery1.First;

        while not ADOQuery1.Eof do
        begin
        Label1.Caption := 'A000' + ADOQuery1.fieldbyname('Item').asstring;
        end;

No ni siquiera haciendo eso es que el error me lo da justamente es esta linea y no me deja compilarlo para verificar

duilioisola 02-11-2022 18:04:53

Aquí tienes un lío de comillas.
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
                                                                                                      ^^^^^ ;
                                                                                                   ^^
Debería ser
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: ''NEW'' ';

Admás no se bien qué es el "estatus =:"

kuan-yiu 02-11-2022 18:09:16

Como te han indicado, las comillas de 'NEW' están mal.
Yo prefiero usar QuotedStr(miDato), siempre que tengo que poner comillas.
Además '=:' indica que le pasas un parámetro. O bien sobran las comillas de 'NEW' y tienes que indicar el valor de ese parámetro, o bien sobra ':'

giantonti1801 02-11-2022 18:29:23

Cita:

Empezado por duilioisola (Mensaje 548918)
Aquí tienes un lío de comillas.
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
                                                                                                      ^^^^^ ;
                                                                                                   ^^
Debería ser
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: ''NEW'' ';

Admás no se bien qué es el "estatus =:"


Código:

procedure TFormCaja.SpeedButton1Click(Sender: TObject);
begin
    With ADOQuery1 do
        begin
        Close;
        Sql.Clear;
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: ''NEW'' ';
        Open;
        ADOQuery1.First;

        while not ADOQuery1.Eof do
        begin
        Label1.Caption := 'A000' + ADOQuery1.fieldbyname('Item').asstring;
        end;


      end;
end;

Sigue dandome un error
Adjunto error

NOTA: el estatus es un campo que me dice si es nuevo 'NEW' o ya ha sido utilizado 'OLD' la idea que haga un filtro de todos lo que tengan la condicion 'NEW'

cloayza 02-11-2022 18:37:44

Estimado puede utilizar el método indicado por el colega kuan-yiu o usar parametros...

Código Delphi [-]
With ADOQuery1 do
       ... 
        //Utilizando Parametros
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =:Estatus';
        ParamByName('Estatus').AsString:='NEW';

        //kuan-yiu: Utilizando QuitedStr
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus ='+QuotedStr('NEW');
        
        Open;
        ...

Saludos y buena suerte...

Neftali [Germán.Estévez] 03-11-2022 09:20:27

Cita:

Empezado por giantonti1801 (Mensaje 548915)
Perfecto! me funciona en Sql Manager sin ningun problema pero ahora me esta dando problema en la aplicacion

Si no dices "qué problemas" concretamente te está dando es difícil saber qué pasa.

Cita:

Empezado por giantonti1801 (Mensaje 548917)
No ni siquiera haciendo eso es que el error me lo da justamente es esta linea y no me deja compilarlo para verificar

Lo mismo.
Si tienes un error pero no das detalles de cual es, es difícil saber qué está pasando o darte más información.


La franja horaria es GMT +2. Ahora son las 05:53:37.

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