Avatar billede niklask Nybegynder
01. november 2011 - 10:43 Der er 8 kommentarer og
1 løsning

COALESCE henter alle data i kolonnen.

Hej eksperter.

Jeg er igang med at lave en webshop, og skal bruge en ordreliste. Jeg har 2 tabeller til mine ordre:
tblOrders
OrderID
OrderDate
OrderSentDate
Name
Address
ZipCode
City
Phone
Email
Total

tblOrderLines
OrderLineID
OrderID
ProductID
Quantity
Price


Lige pt. forsøger jeg med denne query:
DECLARE @Products varchar(MAX)
DECLARE @Quantity varchar(100)
DECLARE @Prices varchar(MAX)
DECLARE @Total money
SELECT @Products = COALESCE(@Products + ',<br/>', '') + CAST(tblProducts.ProductName AS varchar),
      @Quantity = COALESCE(@Quantity + '<br/>', '') + CAST(tblOrderLines.Quantity AS varchar),
      @Prices = COALESCE(@Prices + '<br/>', '') + CAST(tblOrderLines.Price AS varchar),
      @Total = tblOrders.Total
FROM tblOrderLines
INNER JOIN tblProducts ON tblOrderLines.ProductID = tblProducts.ProductID
INNER JOIN tblOrders ON tblOrderLines.OrderID = tblOrders.OrderID
SELECT @Products AS Products, @Quantity AS Quantity, @Prices AS Prices, OrderID, OrderDate, Name, Address, ZipCode, City, Phone, Email, CONVERT(varchar,@Total,0)
FROM tblOrders
WHERE tblOrders.OrderSentDate IS NULL


Men den henter alle produkter i tblOrderLines, istedet for for den med det rette OrderID. Ved at hardcode mit ID, får jeg det rigtige resultat, men jeg kan ikke lige fikse så den fungerer ordenligt. Når jeg hardcoder ID'et ind, sætter jeg denne WHERE-clause ind efter mine INNER JOIN's.
WHERE tblOrderLines.OrderID = 1


Og får dette resultat:
Products
TestProduct1<br/>TestProduct 2

Quantity
2<br/>1

Price
10<br/>45


Og uden WHERE-clause'et bliver de andre produkter, antal og pris som er i tblOrderLines, tilføjet.

Jeg leder derfor efter en løsning som kan regne det rigtige ID ud.

Håber i kan hjælpe :)
Avatar billede Syska Mester
01. november 2011 - 12:09 #1
Hvad er det du vil have ud af din query og på hvad baggrund.

mvh
Avatar billede niklask Nybegynder
01. november 2011 - 12:13 #2
En ordreliste med et navn, adresse osv. fra tblOrders, og hvilke produkter denne person har bestilt fra tblOrderLines.

Det smider jeg så ind i en repeater som viser alle usendte ordre.
Avatar billede Syska Mester
01. november 2011 - 12:47 #3
Jeg ville ikke have min logisk i databasen.

Jeg ville joine i databasen og tage duplicate data med ned. Så i dit forretnings lag ville jeg ordne min data ... så du får en ordre med alle ordre linjer.

mvh
Avatar billede niklask Nybegynder
02. november 2011 - 10:32 #4
Kan du give et eksempel på hvordan du ville gøre det?
Avatar billede Syska Mester
02. november 2011 - 10:52 #5
Jeg vil som sådan nok bruger en ORM.

Der er nok at vælge mellem. Bruger selv Entity Framework. Men NHibernate kunne også være et godt valg.

Det ville gøre alt dette meget nemmere.

var context = new ShopContext();

var order = context.Orders.Include("OrderLines").SingleOrDefault(a => a.OrderId == 10);

Der har du så din order som et object med alle dine OrderLines.

Console.WriteLine(order.OrderId);
foreach(var item in order.OrderLines)
{
Console.WriteLine(item);
}

Oversåtende kan du også lave DataBinding med ...

Kig eventuelt på: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

Og ja ... søg på google. Det er dejlig at arbejde med ORMs ...

De gør netop som jeg ville gøre ... altså hente duplicate data ned og derefter mappe det ned til de forskellige klasser.

Håber det kan bruges ... der kan nok også laves en rimelig simple udgave som bare bruger SqlDataReader.
Avatar billede niklask Nybegynder
02. november 2011 - 12:32 #6
Okay, tak for svaret. Jeg lader lige spørgsmålet stå åben lidt endnu, for at se om der er en som kan klare den på den måde jeg havde planlagt. Hvis ikke der er kommet noget indenfor et par dage, får du bare pointene :)
Avatar billede niklask Nybegynder
04. november 2011 - 08:40 #7
Valgte at bruge et GridView samt et DetailsView som en midlertidig løsning. Men smid et svar buzzzz :) Og tak for input
Avatar billede Syska Mester
04. november 2011 - 08:47 #8
svar
Avatar billede Syska Mester
04. november 2011 - 08:47 #9
svar
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
Computerworld tilbyder specialiserede kurser i database-management

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