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)
-   -   ir a la posicion de un registro específico (https://www.clubdelphi.com/foros/showthread.php?t=57474)

BlueSteel 16-06-2008 20:40:06

ir a la posicion de un registro específico
 
Hola a Todos...

Estoy realizando una aplicación que me permite elegir los ganadores para un concurso.

Los ganadores se sortean de acuerdo a las personas que han comprados abonos. Los datos los tengo almacenados en una tabla de SQL Server. Para realizar la elección del numero, lo que realizo primero es obtener la cantidad de abonos vendidos, para lo cual realizo un

Código SQL [-]
 
Select Count(*) from vendidos

Luego aplico un Ramdon al valor anterior, lo que me dará el Numero (posición) del Ganador.

Código Delphi [-]
Ramdon(Total_Abonos_Vendidos)

Mi consulta es como me posiciciono en el Registro que fue Sorteado ???

Se que el RecNo me entrega la posición, pero como me posiciono en el registro del valor que me entrega el Ramdon???

Salu2:p:D

poliburro 16-06-2008 20:52:06

Cita:

Empezado por BlueSteel (Mensaje 293933)
Mi consulta es como me posiciciono en el Registro que fue Sorteado ???

Se que el RecNo me entrega la posición, pero como me posiciono en el registro del valor que me entrega el Ramdon???


RecNo?, Es una función? en que versión de SQlServer está?

BlueSteel 16-06-2008 20:59:13

Hola Poliburro...

Estoy en SQLServer 2000

si realizo

Código Delphi [-]
 
 Edit1.Text := IntToStr(ADQ_Select.RecNo);

me entregará la posición del registro en la cual me ubico....


pero lo que tengo como dato, es la posición... entonces lo que quiero realizar es alguna función que se posicione en la "posición", valga la redundancia, que le estoy entregando...


Sorry... pero lo estoy trabajando desde el Delphi 7..... a lo mejor eso te confundio,, y pensastes que RecNo es una función del SQL Server...

Salu2:p:D

poliburro 16-06-2008 22:11:45

Código SQL [-]
 
-- =============================================
-- Create procedure basic template
-- =============================================
-- creating the store procedure
IF EXISTS (SELECT name 
    FROM   sysobjects 
    WHERE  name = N'GetIdByPos' 
    AND    type = 'P')
    DROP PROCEDURE GetIdByPos
GO
CREATE PROCEDURE GetIdByPos (@RecNo As Int, @RowId As Int Output)
 
AS

CREATE TABLE #Temporal (RecNo Int IDENTITY(1,1), 
                                    [RowId] [numeric](6, 0))
Insert 
  Into #Temporal  (rowId) 
  Select FieldId From Table
 
Select @RowId = RowId
  From #Temporal
 Where RecNo = @RecNo
 
Drop Table #Temporal

GO
Return

BlueSteel 16-06-2008 22:41:12

Gracias amigo poliburro

cada vez me impresionas más.....:eek::eek:

ahora, donde agrego esto.. y como lo utilizo desde delphi ???:confused::confused:

Al final los datos los estoy trabajando desde un Vista, en donde tienen todos los datos que necesitaba

Salu2:p:D

poliburro 16-06-2008 22:51:05

Me explico,


Este procedimiento crea una tabla temporal con una columna identity que simula el RecNo de ADO y el RowNum de Oracle.

En esta tablatemporal vas a insertar el campo id de la tabla de donde deseas sacar el registro en la posición deseada.

A este procedimiento le pasas que número de registro que deseas y te devolverá el Id correspondiente a esa posición.

con el id puedes obtener toda la fila.

Espero haber comprendido tu problema, si no, con confianza pregunta

BlueSteel 17-06-2008 00:30:57

Bueno...

te cuento, con lo que me distes, al final realice un procedimiento para crear la tabla y trabajar sobre ella... así que despues solo utilizo el locate para ubicar la posición...

gracias por tu ayuda... me sirvio bastante...

Salu2:p:D

jhonny 17-06-2008 00:41:04

No se si con ADO es igual que con otros conectores, pero si le asignas un valor a RecNo, el cursor se para en dicha posición...
Por ejemplo

Código Delphi [-]
AdoDataset1.RecNo := 250;

Y listo, pero bueno, de ahí a la eficiencia de esto, pues no creo que sea mejor que traer el dato de una vez, como lo ha planteado poliburro.

BlueSteel 17-06-2008 01:02:46

Cita:

Empezado por jhonny (Mensaje 294010)
No se si con ADO es igual que con otros conectores, pero si le asignas un valor a RecNo, el cursor se para en dicha posición...
Por ejemplo


Código Delphi [-]AdoDataset1.RecNo := 250;



Y listo, pero bueno, de ahí a la eficiencia de esto, pues no creo que sea mejor que traer el dato de una vez, como lo ha planteado poliburro.

Hola Jhonny...

bueno, antes de preguntar habia probado eso pero con un ADOQuery.. pero no me funciono.... :eek::confused:


Salu2:p:D

Caro 17-06-2008 03:51:41

Hola BlueSteel, yo he utilizado RecNo con Ado y si me ha funcionado.

Código Delphi [-]
 AdoQuery1.RecNo := 5;

Saluditos

poliburro 17-06-2008 04:43:09

Cita:

Empezado por BlueSteel (Mensaje 294014)
Hola Jhonny...

bueno, antes de preguntar habia probado eso pero con un ADOQuery.. pero no me funciono.... :eek::confused:


Salu2:p:D


Tiene que ver con la manera en que defines la propiedad cursor.

Aunque a mi, como lo has notado me gusta cargarle la mano al motor, que él se encargue de procesar los datos que para eso fué hecho.
Y delphi para proporcionarle al usuario la manera de interactuar con esa información.

Ojo, es cuestión de enfoques. Al principio yo era como todos, programando todo en delphi, pero tras los jalones de orejas que me dieron varios Maestros DBAs y arquitectos de BI, aprendí a explotar el poder de las bases de datos.

Saludos

Neftali [Germán.Estévez] 17-06-2008 12:39:23

Cita:

Empezado por jhonny (Mensaje 294010)
No se si con ADO es igual que con otros conectores, pero si le asignas un valor a RecNo, el cursor se para en dicha posición...

Revisa que estés cargando todos los registros en memoria (CursorLocation del ADOConnection y ADOQuery) sino me temo que esto puede no funcionar.


La franja horaria es GMT +2. Ahora son las 20:33:54.

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