Håller på med en hemsida med produkter. Produkttexterna finns på olika språk. Har inte kollat igenom koden så noga på nått vis. Finns det alltså en kolumn som heter ProductEnglish också? I sådana fall skulle du kanske kunna göra så här : Nej det gör det inte. Tjena Åhh, detta kan vara precis vad jag har letat efter. Alltså att man får en fallback på ett språk. Perfekt!Om ett värde i databasen inte finns, hämta ett annat
Nu håller jag på med en sp som ska hämta alla produkterna. Man skickar som parameter med vilket språk man vill använda sig av. Men om informationen inte finns på språket man skickar in vill jag att man ska få den engelska texten eftersom den alltid finns.
Tabellerna som används är:
tLanguage (LanguageID, LanguageName)
tProduct (Information om produkten)
tProductStr (Information om produkten som ska kunna vara på olika språk. tex beskrivning av produkten)
Just nu ser min sp ut så här:
CREATE PROCEDURE [dbo].[spGetAllProducts]
@ProductCategory varchar(10) = '',
@LanguageID varchar(3) = 'ENG'
AS
SELECT
tProduct.ProductID,
ProductName,
ProductCategory,
tProductStr.ProductDescription,
tProductStr.ProductLongText,
BackgroundImage,
ProductImage,
ProductSweden,
ProductNorway,
ProductFinland,
ProductDenmark
FROM
tProduct
INNER JOIN
tProductStr ON
tProductStr.ProductID = tProduct.ProductID
WHERE
ProductCategory LIKE CASE @ProductCategory WHEN '' THEN ProductCategory ELSE @ProductCategory END AND
tProductStr.LanguageID = @LanguageID
ORDER BY ProductCategory, ProductName
GO
Så jag måste kolla när jag joinar in tProductStr om strängen finns för det valda språket. Någon som har nåt tips om hur jag kan göra detta på nåt smidigt sätt?
Tack på förhand!Sv: Om ett värde i databasen inte finns, hämta ett annat
Men skulle det inte underlätta om du gjorde en separat tabell med det engelska språket? Eftersom att det alltid skulle finnas.
Alternativt en extra kolumn i produkt-huvud-tabellen (om det nu fanns en sån?)
/DSv: Om ett värde i databasen inte finns, hämta ett annat
CREATE PROCEDURE [dbo].[spGetAllProducts]
@ProductCategory varchar(10) = '',
@LanguageID varchar(3) = 'ENG'
AS
SELECT
tProduct.ProductID,
ProductName,
ProductCategory,
tProductStr.ProductDescription,
tProductStr.ProductLongText,
BackgroundImage,
ProductImage,
IsNull(ProductSweden,ProductEnglish),
IsNull(ProductNorway,ProductEnglish),
IsNull(ProductFinland,ProductEnglish),
IsNull(ProductDenmar,ProductEnglish)k
FROM
tProduct
INNER JOIN
tProductStr ON
tProductStr.ProductID = tProduct.ProductID
WHERE
ProductCategory LIKE CASE @ProductCategory WHEN '' THEN ProductCategory ELSE @ProductCategory END AND
tProductStr.LanguageID = @LanguageID
ORDER BY ProductCategory, ProductName
GO
I värsta fall får du ju dock samma sträng fyra gånger om texten inte finns på något språk...Hoppas jag förstod dig rätt, och inte kastar ur mig något heltokigt :-)
Sv: Om ett värde i databasen inte finns, hämta ett annat
I tabellen tProductStr finns fälten StrId, LanguageID, ProductID, ProductDescription, ProductLongText.
När man lägger till en ny produkt och skriver in en description och lång text så läggs det in i den tabellen med engelska som standard.
Och om man nu valt svenska på sidan och description för den nyinlaggda produkten inte finns vill jag kunna "falla" tillbaka och hämta den engelska strängen.
Men jag har löst den programmeringsmässigt på hemsidan nu men antar att det bästa vore om man skötte allt i min SP istället.Sv: Om ett värde i databasen inte finns, hämta ett annat
Så här brukar jag bygga språkstöd för en tabell och om du kör SQL 2000 så kanske detta vara något för dig.
Om vi utgår från tabellen Products.. Den innehåller ProductID int IDENTITY, Productname nvarchar(100) och Productdescription nvarchar(4000)..
Tabell nr 2 heter ProductsLANG och innehåller ProductLANGID int IDENTITY, ProductID int, LanguageID int, Productname nvarchar(100), Productdescription nvarchar(4000) och den är till för innehålla de kolumner som jag vill ha språkstöd för i huvudtabellen..
Detta vrappar jag in i en UDF (kom i SQL Server 2000).. Den ser ut så här..
CREATE FUNCTION dbo.Products
(
@LanguageID int
)
RETURNS table
AS RETURN
(
SELECT Products.ProductID,
ISNULL(ProductsLANG.Productname, Products.Productname) AS Productname,
ISNULL(ProductsLANG.Productdescription, Products.Productdescription) AS Productdescription
FROM Products LEFT OUTER JOIN (SELECT ProductID, Productname, Productdescription FROM ProductsLANG WHERE LanguageID = @LanguageID) ProductsLANG ON Products.ProductID = ProductsLANG.ProductID
)
För att plocka fram produkter på valt (ex 1 för engelska) språk kör jag följande sql och så länge jag använder funktionen istället för tabellen så kommer jag få språkstöd...
SELECT *
FROM fnProducts(1)Sv: Om ett värde i databasen inte finns, hämta ett annat
Men jag har ett till problem. Det ska finnas en näringstabell för varje produkt och den kan variera, alltså produkterna kanske inte innehåller samma ämnen osv. Bör man bygga en (eller två) egna tabeller för detta ändamål tycker du eller kan man använda samma produkttabeller som i ditt exempel. Tänker på att det kan vara olika många strängar som ställer till det.