sawMedlem sedan mars 20011 880 inlägg Så här ser min SQL ut i min AcessDataSourrce:
SELECT
[gatId], [gata] FROM [t_gata]
WHERE [kvarterId] = ? ORDER BY [gata],[stadDag]
stadDag är numeriskt 1 - 5
Resultatet blir:
Kringelvägen 10 a
Kringelvägen 10 b
Kringelvägen 12 a
Kringelvägen 12 b
Kringelvägen 2 a
Kringelvägen 2 b
osv
Hur gör jag en ORDER BY där 2 a går före 10 a?
OBS adressen är i samma fält. :q
saw skrev:
OBS adressen är i samma fält. :q
I vilket sammanhang är det? Jag skulle nog separerat på gata och gatunummer från början, brukar vara enklare så. Jag brukar alltid separera Gata, nummer och uppgång, och sen enkelt sätta ihop dom tre i min SELECT:
SELECT CONCAT_WS(' ', gata, nummer, post) AS gata
Ger precis samma utskrift, fast underlättar massa saker.
Du kanske kan lösa det på något bra sätt med t.ex. ORDER BY ... CASE WHEN... men är osäker på hur det isf. skulle se ut.
dAEkMedlem sedan feb. 20041 816 inlägg Det bästa vore om du sparade infon i olika fält, precis som Micke skriver.
Om det inte är för sent: designa om databasen!
Annars kanske det går att skapa en UDF eller en funktion i SQL men det kommer inte bli lika effektivt jämfört med separata fält.
sawMedlem sedan mars 20011 880 inlägg I vilket sammanhang är det?
Jag vet inte vad du menar.
Visst hadde det varit lättare med flera fält här, men nu är det så...
Frågan är hur man skall göra ORDER BY...
Det finns idag över 300 poster på t_gata så designa om är inget allternativ som lätt låter sig göras.
dAEkMedlem sedan feb. 20041 816 inlägg Sorry, missade att det gällde Access. Utan att blanda in UDF eller en egenskapad Sql-funktion blir det nog svårt. Vet inte ens om det ö.h.t. går att göra sånt i Access.
Efter att ha suttit och sökt efter lösningar igår ser det ganska mörkt ut. Det verkar vara ett vanligt problem men utan någon bra lösning. Är det hemskt viktigt att det sorteras "rätt" är det som sagt ett alternativ att designa om databasen och splitta upp datat i flera kolumner och använda dessa när sorteringen utförs. Det är ju inte så bökigt m.h.a. regex oavsett språk. Att lösa det med en order by verkar inte gå.
Kan du inte sköta sorteringen i programmet istället för i databasen?
saw skrev:
I vilket sammanhang är det?
Jag vet inte vad du menar..
Alltså, av vilken anledning (om det finns någon speciell) har du löst det på det här sättet?
saw skrev:
Det finns idag över 300 poster på t_gata så designa om är inget allternativ som lätt låter sig göras.
Nej, det är aldrig för sent att göra om och göra rätt, oavsett om det redan finns 1, 300 eller 100,000 poster i tabellen.
Det här löser du lätt, bygg ett dummyscript som loopar igenom alla poster, dela upp din befintliga sträng och skjut in i dina tre nya kolumner, jag ser inte alls problemet.
Du kan ju börja med att ta reda på hur många poster det handlar om som "kan" vara ett problem.
Om vi säger att det finns en adress som är Sveavägen 53b, då kan du med t.ex. regexp i ASP (som jag antar att du använder om du kör MS Access) för att separera gatunamnet från numret genom att plocka ut allt från \w\s (bokstäver + mellanslag) tills att det kommer en siffra. Efter det kan du skilja det sista "paret" åt genom \d\w (siffra/bokstav) för att separera nummer och uppgång.
Det finns många lösningar på det här, men jag råder dig att lägga den lilla stund det här tar, för du kommer garanterat att vinna på det i längden.
sawMedlem sedan mars 20011 880 inlägg Förslaget är inte illa och det gäller inte bara databasen utan alla koder som är baserade
på det här.
Det låter märkvärdigt men det verkar som jag har fått det att fungera med..
private void fyllListBox()
{
int iId = 0;
OleDbDataAdapter myda;
DataSet ds;
string sSelected = "";
if(ListBox1.SelectedItem!=null)
sSelected = ListBox1.SelectedItem.ToString();
ListBox1.Items.Clear();
try
{
if (DropDownList1.SelectedValue != null)
iId = Convert.ToInt32(DropDownList1.SelectedValue);
sql = "SELECT gatId, gata,stadDag FROM t_gata WHERE kvarterId =" + iId
+ " ORDER BY stadDag,gatId,gata";
myda = new OleDbDataAdapter(sql, DBConn);
ds=new DataSet();
myda.Fill(ds,"Table");
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ListBox1.Items.Add(new ListItem(ds.Tables[0].Rows[i]["gata"].ToString(),
ds.Tables[0].Rows[i]["gatId"].ToString()));
int iStadDag = Convert.ToInt32(ds.Tables[0].Rows[i]["stadDag"]);
switch (iStadDag)
{
case 1:
ListBox1.Items[i].Attributes.Add("style", "background-color: #a9f2c8; color:#3e885e");
break;
case 2:
ListBox1.Items[i].Attributes.Add("style", "background-color: #95cff7; color:#197dc3");
break;
case 3:
ListBox1.Items[i].Attributes.Add("style", "background-color: #f6f3ad; color:#969105");
break;
case 4:
ListBox1.Items[i].Attributes.Add("style", "background-color: #fcb0d2; color:#f4187a");
break;
case 5:
ListBox1.Items[i].Attributes.Add("style", "background-color: #f6cd9c; color:#ba6808");
break;
default:
ListBox1.Items[i].Attributes.Add("style", "background-color:white;color:black");
break;
}
}
ListBox1.Items.FindByText(sSelected).Selected = true;
}
catch{ }
finally
{
DBConn.Close();
}
}
Nu sorteras bra (vad jag kan se).
Vad jag inte gillar är att jag inte kan få till det med parameter när jag
använder mig av DataTable, men det kanske jag kan få ett tips om???
(Om du funderar på färgerna så är det för att min arbetsgivare lätt vill kunna
se vilken dag städas vilken trappuppgång).