[sql] volgend resultaat ophalen

Pagina: 1
Acties:

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Ik heb een sql procedure die meldingen ophaalt , voor de betreffende persoon die is ingelogd. Deze procedure geeft bijvoorbeeld meldingid 1,5,8,10 , 12 terug
Door nu op zo'n meldingid te klikken, krijg men de meldingsdetails te zien.

overzichtscherm
code:
1
select * from melding where persoonid = @persoonid


detailscherm
code:
1
 select * from meldingdetail where meldingid=@meldingid


Nu is mijn bedoeling om in die meldingsdetails een button next en een button previous neer te zetten.
Dus als men bij de meldingsdetails 8 zit, dat men naar 10 gaat als men op next klikt en naar 5 gaat als men op previous klikt.

Nu is mijn vraag, hoe kan ik als ik op meldingid 8 zit, het id van de vorige en de volgende ophalen. Op de meest eenvoudige methode.

Alvast bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je kan aan de event-handler van die button code hangen waarmee je gaat gaan kijken wat het volgende id is op je overzichtscherm.
In wat heb je die applicatie geschreven?

https://fgheysels.github.io/


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 23:28
Wat dacht je van kleiner/groter dan en dan een limit van 1 resultaat, waarbij je of oplopend of aflopend sorteerd?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je sql query zou er als volgt uit kunnen zien:

code:
1
2
3
4
5
'volgend record ophalen
select top 1 * from melding where id > @huidigeId order by id

'vorig record
select top 1 * from melding where id < @huidigeId order by id

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Pathogen
  • Registratie: April 2004
  • Laatst online: 26-05 15:49

Pathogen

Shoop Da Whoop

dan zal je denk ik de hele database in een array moeten ophalen en van daaruit verder werken... elke keer een nieuwe opvraag query is ook nog eens ernstig vertragend

Gebruik een array met indexen op IDnummers, zodat je van daaruit gemakkleijk de rest kan weergeven

(BTW als je array tweedimensionaal moet zijn (denk t wel) kun je het zo doen:)
array[1] = new array('ID','naam','etc');
array[2] = new array('ID','naam','etc');

Zo kun je je hele database kwijt hoop ik

edit:
Ja nou zo te zien kan het makkelijker... :)

[ Voor 13% gewijzigd door Pathogen op 08-04-2004 11:56 ]


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
@whoami

Het is een webapplicatie, de id's op je overzichtscherm ben ik dus kwijt in een nieuw scherm
Het is geschreven in vb.net

@Thrackan

Leuk idee voor een windows applicatie, maar te veel data voor een webbased applicatie

@P_de_B

Dat is inderdaad de oplossing die ik in gedachten had. Ik heb nu zoiets

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@order as int, --moet een boolean worden uiteraard
@huidigeId as int
 
AS
 
DECLARE @sql_string nvarchar(400)
 
set @sql_string = '
select top 1 * from melding 
 
IF @order=1
 BEGIN
     set @sql_string = @sql_string + 'where id > @huidigeId order by id Asc  ')'
 END

 IF @order=2
 BEGIN
     set @sql_string = @sql_string + 'where id < @huidigeId order by id Desc ')'
 END

EXECUTE sp_executesql @sql_string


Het enige nadeel nu nog is dat de next en previous button altijd zichtbaar zijn, terwijl next natuurlijk niet kan bij het laatste record en previous niet kan bij het eerste record.

[ Voor 4% gewijzigd door Tinuske op 08-04-2004 12:15 ]


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
hmmm, die kun je toch gewoon afvangen door een

code:
1
SELECT MIN(id) FROM foo


vs

code:
1
SELECT MAX(id) FROM foo


edit:
Hoe zit het eigenlijk met ado Paging in .NET :?

[ Voor 18% gewijzigd door faabman op 08-04-2004 12:21 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

Tinuske schreef op 08 april 2004 @ 12:14:

Het enige nadeel nu nog is dat de next en previous button altijd zichtbaar zijn, terwijl next natuurlijk niet kan bij het laatste record en previous niet kan bij het eerste record.
Gewoon voor beide vast de ID's ophalen (dus volgende en vorige). Is er geen dan geen button weergeven. Is die er wel dan de button laten leiden naar de melding met dat ID, waar je weer hetzelfde doet.

Je haalt dus het id van de melding een stap eerder op zodat je kunt zien of ze wel bestaan.

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Paging werkt goed
Zie hier :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
CREATE PROCEDURE calSelectMeldingen
@CurrentPage int,
@PageSize int,
@melderid int
AS

-- We don't want to return the # of rows inserted
-- into our temporary table, so turn NOCOUNT ON
SET NOCOUNT ON

--Creeer een temp tabel om de data op te slaan
--Voeg een id colum toe aan de records 
CREATE TABLE #TempTable
(
  ID2 int IDENTITY PRIMARY KEY,
ID integer,
status nvarchar(30),
  Naam  nvarchar (50),
 Omschrijving nvarchar (255),
Datum nvarchar (255),
tekst varchar(255)


)
--Vul de tabel met meldingen
INSERT INTO #TempTable 
(
ID,
Naam,
Omschrijving,
Datum,
tekst
)
    SELECT ID=calMelding.MeldingID,calStatus.Naam,calMelding.Omschrijving,Datum= Convert(varchar, CONVERT(datetime, calMelding.datum - 2), 103)
    FROM    calMelding,calStatus (NOLOCK)
AND     calMelding.MelderID = @melderid
--Creeer variabelen om het eerste en laatste record te identificeren , welke geselecteerd moeten worden 
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)
--Selecteer 1 pagina met data gebaseerd op bovenstaande records
SELECT 
*,RecordCount = 
    (
     SELECT COUNT(*) 
     FROM #TempTable TT
    -- WHERE TT.ID >= @LastRec
    )
FROM 
  #TempTable
WHERE 
  ID2 > @FirstRec 
AND
  ID2 < @LastRec
GO


vervolgens kijk ik welke buttons ik enable/disable met

code:
1
2
3
4
5
6
  pageNumber = Session.Item("pagenumber")
        pageCount = Session.Item("pagecount")
        btnfirst.Enabled = (pageNumber <> 1)
        btnprev.Enabled = (pageNumber > 1)
        BtnNext.Enabled = (pageNumber < pageCount And Not pageCount = 0)
        btnlast.Enabled = (pageNumber <> pageCount And Not pageCount = 0)


Het liefste bouw ik in de sql waar ik nu mee bezig ben ook iets in, waarmee ik terugkrijg of ik de next en previous button moet laten zien. Maar daar ga ik mee aan de slag..

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Tinuske schreef op 08 april 2004 @ 12:26:
Het liefste bouw ik in de sql waar ik nu mee bezig ben ook iets in, waarmee ik terugkrijg of ik de next en previous button moet laten zien. Maar daar ga ik mee aan de slag..
Waarom doe je het met dynamische SQL? Je kunt toch gewoon je SQL statement tussen IF statements doen?

Het probleem met je vorige en volgende knoppen kun je bijvoorbeeld wel oplossen door het aantal records groter (of kleiner natuurlijk) dan @huidigeId te tellen. Is dit groter dan 1 heb je in ieder geval nog een volgend record.


code:
1
2
3
4
5
6
7
8
9
10
IF @order=1
BEGIN
    SELECT top 1 *,
        (select count(*) 
        from melding where Id > @huidigeId
        FROM melding ) as MeerRecords
    FROM melding
    WHERE id > @huidigeId 
    ORDER BY id ASC 
END

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
@ p_de_b

Ik doe het nu op de volgende manier omdat de order by verschillend moet zijn.
Stel ik heb 1,5,8 en ik zit op 8 en ik ga zoeken op kleiner dan, geeft ie 1 terug ipv 5, daarom moet de order by hier anders zijn dan bij groter dan.

@Bosmonster

Het idee wat jij hier ophaalt, zou denk ik het beste zijn. (meteen het probleem vd buttons opgelost)
Hoe combineer ik mijn sql statement, zodat deze zowel de vorigeid als de volgendeid ophaalt ?
Daar loop ik een beetje vast nu ...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

Een onderdeel waar door veel mensen op dit moment overheengelezen wordt is volgens mij dat de vorige en volgende operatie niet het naastliggende record in de DB ophaald, maar het record dat hoort bij het naastliggende id uit het resultaat van de eerdere query.

Gelukkig is dit redelijk makkelijk op te lossen door ook het kriterium mee te geven dat bij de eerste query werd gebruikt.

De oplossing met de temp tabel vind ik persoonlijk trouwens nogal ranzig.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Janoz schreef op 08 april 2004 @ 12:38:
Een onderdeel waar door veel mensen op dit moment overheengelezen wordt is volgens mij dat de vorige en volgende operatie niet het naastliggende record in de DB ophaald, maar het record dat hoort bij het naastliggende id uit het resultaat van de eerdere query.
Volgens mij wel :?

Hij doet een TOP 1 van records waaarij het id > huidige Id
Het idee wat jij hier ophaalt, zou denk ik het beste zijn. (meteen het probleem vd buttons opgelost)
Hoe combineer ik mijn sql statement, zodat deze zowel de vorigeid als de volgendeid ophaalt ?
Daar loop ik een beetje vast nu ...
Zoiets zou moeten werken
code:
1
2
3
SELECT TOP 1 *, 'volgende' FROM bla WHERE Id > @huidigeId
UNION 
SELECT TOP 1 *, 'vorige' FROM bla WHERE Id < @huidigeId

Oops! Google Chrome could not find www.rijks%20museum.nl


  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
Is VB.net zo verschillend van VB6 dat dit niet mogelijk is?

overzichtscherm
code:
1
select * from melding where persoonid = @persoonid


detailscherm
code:
1
2
3
select * from melding, meldingdetail 
where meldingid=@meldingid and persoonid=@persoonid
sort by meldingid asc

Hierdoor staan de meldingsdetails op volgorde van de id's en kan je ze langsgaan met 'recordset'.movenext & moveprevious

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • Pathogen
  • Registratie: April 2004
  • Laatst online: 26-05 15:49

Pathogen

Shoop Da Whoop

Tinuske schreef op 08 april 2004 @ 12:14:

@Thrackan

Leuk idee voor een windows applicatie, maar te veel data voor een webbased applicatie
Hehe en ik heb nog nooit een win applicatie gemaakt ;)

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
@Janoz
Mssql kent geen limit functie, de oplossing met de temptabel is daarom naar mijn weten
de beste en snelste om met paging te werken

Ken jij een betere methode ?

@P_de_B

als ik jou voorgesteld code doe
code:
1
2
3
SELECT TOP 1 *, 'volgende' FROM bla WHERE Id > @huidigeId
UNION 
SELECT TOP 1 *, 'vorige' FROM bla WHERE Id < @huidigeId


en ik voer als id 3800 in
krijg ik 3950 en 66 terug, terwijl het in werkelijkheid 3950 en 3760 moet zijn

als ik onderstaande doe , krijg ik wel 3760 terug
code:
1
SELECT TOP 1 *, 'vorige' FROM bla WHERE Id < @huidigeId order by id DESC


icm met de andere , krijg ik weer 3950 en 66 terug
code:
1
2
3
SELECT TOP 1 *, 'volgende' FROM bla WHERE Id > @huidigeId
UNION 
SELECT TOP 1 *, 'vorige' FROM bla WHERE Id < @huidigeId order by id DESC


Enig idee ?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Sorry, de laatste ORDER BY ID DESC moet er niet bij....

Trouwens, hier staat een goede paging techniek met SQL Server

[ Voor 24% gewijzigd door P_de_B op 08-04-2004 13:16 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
P_de_B schreef op 08 april 2004 @ 13:12:
[...]
Sorry, de laatste ORDER BY ID DESC moet er niet bij....
De order by moet dus 2x verschillende zijn.
Bij kleinder dan meldingid moet deze DESC zijn en bij groter dan meldingid, moet deze ASC zijn.

De nextid ophalen is niet zo moeilijk, maar de previousid ophalen, lukt kennelijk niet op bovenstaande manier.

Heb je een oplossing ?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
stel dat je de volgende id's hebt:

2,6,8,13,21 en je huidige ID is 8

select top 1 * from tabel where id > @huidigeId order by id zal het record met id 13 geven
select top 1 * from tabel where id < @huidigeId order by id zal het record met id 6 geven

het moet werken volgens mij

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
P_de_B schreef op 08 april 2004 @ 13:19:
stel dat je de volgende id's hebt:

2,6,8,13,21 en je huidige ID is 8

select top 1 * from tabel where id > @huidigeId order by id zal het record met id 13 geven
select top 1 * from tabel where id < @huidigeId order by id zal het record met id 6 geven

het moet werken volgens mij
Ik het heb geprobeerd en ik krijg echt 2 en 13 terug ipv 6 en 13.
Is dat ook niet logisch ? Er wordt bij het 1e record (id = 2) begonnen en deze voldoet meteen aan id<@huidigeID en deze wordt dan ook teruggegeven als top1.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
En wat als je ORDER BY DESC doet om die vorige id te verkrijgen?
Dan moet je toch het record met id 6 krijgen.

https://fgheysels.github.io/


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
@whoami

Zie hierboven ook :

als ik onderstaande doe , krijg ik wel 3760 terug
code:

SELECT TOP 1 *, 'vorige' FROM bla WHERE Id < @huidigeId order by id DESC


icm met de andere , krijg ik weer 3950 en 66 terug
code:

SELECT TOP 1 *, 'volgende' FROM bla WHERE Id > @huidigeId
UNION
SELECT TOP 1 *, 'vorige' FROM bla WHERE Id < @huidigeId order by id DESC

Heeft dit niet iets met die UNION te maken ofzo ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Als je huidigeId 8 is, kan je nooit iets terugkrijgen dat groter is dan 8 met deze query:
code:
1
2
select top 1 id from tabel where id < 8
order by id desc

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Tinuske schreef op 08 april 2004 @ 13:36:
Heeft dit niet iets met die UNION te maken ofzo ?
Ja, je hebt gelijk. Dit gaat niet werken met een union. ik heb m'n kop er niet echt bij vandaag :X

als je het in 2 afzonderlijke selects doet, moet je in je clientcode bij beide afzonderlijke resultaten kunnen komen.


select [..] order by id
select [..] order by id desc

en dan de 1e resultset uilezen. Dan

RecordSet.NextRecordSet (klassiek asp)

of

DataReader.Read() ? (C#) etc.

en je kunt bij de resultaten van de 2e select.

[ Voor 11% gewijzigd door P_de_B op 08-04-2004 14:39 ]

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1