Avatar billede kongen72 Nybegynder
03. november 2010 - 10:44 Der er 21 kommentarer og
1 løsning

alfabetisk pager

Hej

nogen som kan hjælpe mig med, at lave denne alfabetisk pager en smule om ?


    private void CreatePagingsWithFirstLetter()
    {
        DataTable dtSelect = new DataTable();

        if (this.ViewState["Paging"] == null)
        {
            SqlDataAdapter da = new SqlDataAdapter("Select Distinct Upper(Left(Title,1))[PageText], Upper(Left(Title,1)) [PageIndex] from Cars Order By PageText Asc", cnstr);

            da.Fill(dtSelect);
            DataRow drNew = dtSelect.NewRow();
            drNew["PageIndex"] = "All";
            drNew["PageText"] = "All";
            dtSelect.Rows.Add(drNew);

            this.ViewState["Paging"] = dtSelect;
        }
        else
            dtSelect = (DataTable)this.ViewState["Paging"];

        DataList1.DataSource = dtSelect;
        DataList1.DataBind();
    }

Vil gerne have ÆØÅ til sidst i min pager efter Z. Lige nu fucker det med, at Å bliver erstattet med A, Ø kommer efter O og Æ kommer efter A.

Vil os gerne, at de bogstaver som ikke findes i databasen. Skal komme frem i pageren -dog uden links.

Håber én herinde kan hjælpe mig med dette.

tak på forhånd.
Avatar billede Syska Mester
03. november 2010 - 10:54 #1
Hej,

Hvad siger du rækkefølgen fejler nu ?

Å burde ikke blive til A ... så er der i hvert fald et eller andet helt galt.
Hvad giver:
SELECT LEFT('Æling', 1)

Hvis du kører overstående sql statement i SSMS ?

Hvad type er din column ?

hvorfor selector du samme værdi 2 gange i din SQL Query ?

Hvis du skal have alle bogstaver med, så ville jeg nok oprette en table med dem ... og så måske lave en join over på din anden table. Men det er også noget rod ...

mvh
Avatar billede bkp Nybegynder
03. november 2010 - 11:00 #2
Prøv at tilføje COLLATE Danish_Norwegian_CI_AS, dette vil sortere din række efter dansk/norsk standard.

Select Distinct 
  Upper(Left(Title,1))[PageText],
  Upper(Left(Title,1)) [PageIndex]
from
  Cars
Order By
  PageText COLLATE Danish_Norwegian_CI_AS Asc
Avatar billede bkp Nybegynder
03. november 2010 - 11:04 #3
Bør du ikke sortere på Title end på PageText, det er mere korrekt.

Select Distinct 
  Upper(Left(Title,1))[PageText],
  Upper(Left(Title,1)) [PageIndex]
from
  Cars
Order By
  Title COLLATE Danish_Norwegian_CI_AS Asc
Avatar billede Syska Mester
03. november 2010 - 11:14 #4
Han bør slet ikke lave samme select 2 gange ... eneste forskel er jo hans alias.

mvh
Avatar billede bkp Nybegynder
03. november 2010 - 11:22 #5
Enig enig, men jeg har primært fokuseret på problemet ;-)
Avatar billede bkp Nybegynder
03. november 2010 - 11:44 #6
At lave en liste med forkortelser der skal have link (som du siger) og en liste med resten, kunne du relativt nemt lave på denne måde:

List<string> allList = new List<string>() {"A", "B", "C" ,...};
List<string> linkList = new List<string>();
foreach (DataRow row in dtSelect.Rows)
{
  linkList.Add((string)row["PageIndex"]);
}
List<string> noLinkList = allList.FindAll(pi => !linkList.Exists(lnk => lnk == pi));


Herefter har du en liste linkList med tegn fra tabellen, og noLinkList med tegn som ikke blev fundet.
Avatar billede kongen72 Nybegynder
03. november 2010 - 12:32 #7
Hej og tak for tilbagemeldingerne.

bkp: Jeg får følgende fejl ved, at benytte din kode, som sortere efter title - (ORDER BY items must appear in the select list if SELECT DISTINCT is specified.)
Avatar billede bkp Nybegynder
03. november 2010 - 12:46 #8
Hvis den virker med sortering på PageText så bruger du bare den, men det undrer mig egentlig lidt hvorfor det virker, har du allerede et felt i din tabel der hedder PageText?

Alternativt kunne du oprette et View eller Stored Procedure som du kalder, det vil jeg anbefale istedet for at flytte alt SQL ned i koden, egentlig burde du måske kigge nærmere på SQL to LINQ eller Entity Framework, her arbejder du med objekter istedet, og her kan du arbejde med lister uden det store arbejde.
Avatar billede kongen72 Nybegynder
03. november 2010 - 12:52 #9
Den virker heller ikke med sortering på PageText. De felter jeg har i min tabel er Title og Cars. Den indeholder ikke PageText.
Avatar billede bkp Nybegynder
03. november 2010 - 13:03 #10
Jeg har stiret mig blind på noget andet, du skal selvfølgelig gøre således

Select Distinct 
  Upper(Left(Title,1))[PageText]
from
  Cars
Order By
  Upper(Left(Title,1)) COLLATE Danish_Norwegian_CI_AS Asc
Avatar billede bkp Nybegynder
03. november 2010 - 13:05 #11
Grunden til at det andet ikke virker er at det du trækker ud indeholder ikke Title som du forsøgte at sortere på, så det du skal sortere på skal være det samme som du kører en Distinct på : Upper(Left(Title,1))
Avatar billede kongen72 Nybegynder
03. november 2010 - 14:09 #12
Jeg får desværre samme fejl som før
Avatar billede bkp Nybegynder
03. november 2010 - 14:20 #13
Så prøv følgende, opret et view:
CREATE VIEW vAlphabet
AS
Select Distinct
  Upper(Left(Title,1)) COLLATE Danish_Norwegian_CI_AS As Title
from
  Cars
GO


Herefter burde du kunne hente fra dette view på følgende måde:
SELECT 
  Title
FROM
  vAlphabet
Order By
  Title
Avatar billede Syska Mester
03. november 2010 - 18:52 #14
Overstående er bare en rigtig dårlig løsning IMO.

Hvorfor ikke løse det, så det altid virker med den table?

Hvis du siger at den ikke tager Å ud ... men A ud ... så vil du jo have sammen problem når du skal query din table.

Du kommer til at betale for det senere, hvis du ikke fikser din fejl, som gør at du ikke får et Å ud ... og at din sortering ikke virker ...

mvh
Avatar billede bkp Nybegynder
03. november 2010 - 19:21 #15
Hvis han skal fikse hans sorteringsfejl, skal han ændre sproget for hele databasen, men det er ikke nemt, det er faktisk ret besværligt at ændre når der er data. Det nemmeste er faktisk at bygge databasen på ny og sikre sig at man har valgt Dansk/Norsk, for ellers bruges forkert algoritme når der sorteres.

Derfor gav jeg ham tippet med at konvertere kollonnen til dansk sortering og ikke fransk eller hvad det er for en sortering databasen er sat op til, i det ovenstående view er alle data konverteret til dansk sorterings algoritme, så når han kalder dette view med en ORDER BY er data klar til dansk sortering.

Men du har ret i at det optimale var at bygge databasen på ny med rigtige indstillinger.

Jeg føler jeg gentager mig selv, men prøv at køre nedenstående sql i din SQL Editor, så tror jeg det siger mere end ord ;-)

DECLARE @Cars1 TABLE (
    Title varchar(1) COLLATE Danish_Norwegian_CI_AS
)
DECLARE @Cars2 TABLE (
    Title varchar(1) COLLATE French_CS_AS
)

INSERT INTO @Cars1 (Title)
SELECT 'c' UNION
SELECT 'æ' UNION
SELECT 'a' UNION
SELECT 'ø' UNION
SELECT 'b' UNION
SELECT 'å' UNION
SELECT 'i' UNION
SELECT 'h' UNION
SELECT 'q' UNION
SELECT 't'

INSERT INTO @Cars2 (Title)
SELECT 'c' UNION
SELECT 'æ' UNION
SELECT 'a' UNION
SELECT 'ø' UNION
SELECT 'b' UNION
SELECT 'å' UNION
SELECT 'i' UNION
SELECT 'h' UNION
SELECT 'q' UNION
SELECT 't'

SELECT 'Dansk', Title FROM @Cars1 ORDER BY Title
SELECT 'Fransk', Title FROM @Cars2 ORDER BY Title
SELECT 'Fransk > Dansk', Title FROM @Cars2 ORDER BY Title COLLATE Danish_Norwegian_CI_AS
Avatar billede bkp Nybegynder
03. november 2010 - 19:26 #16
Har arbejdet som DBA, så jeg har selv haft de samme problemer idet at jeg skulle joine data fra 2 databaser, hvor den ene var dansk og den anden var et andet sprog og det kunne kun løses med COLLATE.
Avatar billede bkp Nybegynder
03. november 2010 - 19:28 #17
Buzzz > Jeg har lige læst din besked igen, og det lyder lidt som om du har misforstået problemet, han får alle tegn ud, men de blev sorteret forkert.
Avatar billede bkp Nybegynder
03. november 2010 - 19:29 #18
Men for at gøre en lang historie kort, så har han jo lukket denne sag da han føler den er løst ;-)
Avatar billede Syska Mester
03. november 2010 - 19:56 #19
Bare fordi han føler sig tilfreds, er det bestemt ikke den optimale løsning, da det ikke er et produktions system han sidder ved ... da han har stillet tidligere spørgsmål herinde, så ved jeg det er på hobby basis ... er jeg ret sikker på.

Derfor bør han løse det korrekt.

Du skriver jo også kun at han "føler" det er løst, men du må da kunne se det ikke er en optimal løsning. Det er en nødløsning, hvis man ikke må ændre i DB design, men det tvivler jeg så lidt på, da hans spørgsmål angiver han er ved at udvikle det :-)

Næst, så burde han også kunne lave den sortering i hans kode, og deraf helt slippe for at skulle lave et view :-) Hvis det kun er sortering der går galt.

"Vil gerne have ÆØÅ til sidst i min pager efter Z. Lige nu fucker det med, at Å bliver erstattet med A, Ø kommer efter O og Æ kommer efter A." skriver han.

Så har han tydeligvis forklaret sig forkert, der står jo at "Å" bliver erstatet med "A" ...

Du har så bare været heldig ikke at lægge så  meget i hans forklaring :-)
Avatar billede bkp Nybegynder
03. november 2010 - 20:31 #20
Hehe ja jeg tror vi er meget enige når det kommer til stykket, vi har bare forskellig måde at sige det på, jeg er nok bare den diplomatiske type ;-)
Men jeg vil give dig ret i at databasen burde være lavet rigtigt.
Avatar billede Syska Mester
03. november 2010 - 21:12 #21
Vi siger det på samme måde vil jeg mene ... jeg kan ikke se hvordan din er mere diplomatisk, men måske pga flere misforståelser :-)

Jeg synes bare at han skal være klar over at han har en design fejl i hans database, i stedet for at prøve at rette en fejl, som nemt kunne rettes.

mvh
Avatar billede neetsp Nybegynder
10. november 2010 - 09:54 #22
Hej Kongen,

jeg havde samme problem, og fik samme fejl:

(ORDER BY items must appear in the select list if SELECT DISTINCT is specified.)

Jeg fandt ud af, at den mente det bogstavligt...

SELECT DISTINCT City COLLATE Danish_Norwegian_CI_AS from Users order by City COLLATE Danish_Norwegian_CI_AS

Altså COLLATE på både det man vælger, og på order by......
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester