Hej, Gör om denna princip till sql: Principen är jag med på, men är det ingen som har synpunkter på hur man gör det optimalt med SQL.Formatera siffror högerjusterat, fylla ut med nollor
Jag har en applikation där beställaren vill ha en kod för varje post, som är en sammanslagning av en produktkod och ett löpnummer taget från en separat löpnummerserie för varje produkt.
Exempel. De första posterna på produkterna PK och SK kommer att heta PK1,SK1,PK2,SK2 o s v
I databasen är detta separerat i två kolumner, Code(varchar) och Number(int). Nu till frågan:
För att sorteringen i användargränssnittet (i en grid, när man klickar på ett kolumnhuvudet) ska bli riktig så måste jag fylla ut med nollor för mellan produktkoden och löpnumret så att löpnumret blir högerjusterat. Ex PK0001, PK0123 o s v. Eventuellt kommer jag att tillåta att användaren själv bestämmer hur många positioner som ska hållas (dvs i praktiken hur många poster som kan registreras på produkten) eller så kommer jag dynamiskt att öka på med en position när så krävs. När post nummer 100 läggs in så kommer post P99 att visas som P099 för användaren i fortsättningen.
Jag behöver alltså en liten effektiv SQL-snutt som slår samman kolumnerna Code och Number och högerjusterar Number i x antal positioner...jag hoppas ni förstår. Jag kan säkert fixa en lösning på detta själv med lite stränghantering i SQL, men eftersom det kan handla om tusentals poster som ska formateras på detta vis så vill jag gärna ha tips på effektivast möjliga lösning.
Idag använder jag följande snutt för att slå ihop de två kolumnerna (och gardera mig för NULL-värden) :
ISNULL(Task.Code + Convert(varchar,ISNULL(Task.Number,'''')),'''') as TaskNumberSv: Formatera siffror högerjusterat, fylla ut med nollor
varde = 532
newstring = right("00000" & varde, 5)
vilket ger 00532Sv: Formatera siffror högerjusterat, fylla ut med nollor
Bör jag t ex göra en vy av SQL-frågan, och sedan hämta datan från vyn? Nedan har jag en SQL-sats som fungerar och det är den fetstilta texten som är intressant. Den känns inte så snygg.
Om jag lägger nedanstående i en vy, kommer SELECT-satsen som ligger i den fetstilta texten (subqueryn som hämtar maxlängden på siffran) att köras mer än en gång? Inte en gång per rad som returneras hoppas jag?
SELECT dbo.Task.ID, dbo.Task.ProjectID, dbo.Task.Priority, dbo.Task.Header, dbo.Task.Description, dbo.Task.TestInformation, dbo.Task.StatusID,
dbo.Task.ResponsibleID, dbo.Task.LocationID, dbo.Task.TaskTypeID, dbo.Task.RequiresManualChange, dbo.Task.ManualDescription,
dbo.Task.CheckedOut, dbo.Task.CheckedOutByID, dbo.Task.CheckedOutDate, dbo.Task.Assigned, dbo.Task.AssignedToID, dbo.Task.AssignedByID,
dbo.Task.AssignedDate, dbo.Task.RegisteredByID, dbo.Task.RegisteredDate, dbo.Task.ReportedBy, dbo.Task.ReportedCompany,
dbo.Task.ReportedEmail, dbo.Task.ReportedPhone, dbo.Task.ReportedDate, dbo.Task.VersionVerifiedID, dbo.Task.VersionFoundID, dbo.Task.Notify,
dbo.Task.SeverityID, dbo.Task.MailBoxID, dbo.Project.Name AS ProjectName, ISNULL(VersionFound.Name, '''') AS VersionFoundName,
ISNULL(VersionVerified.Name, '''') AS VersionVerifiedName, dbo.TaskType.Name AS TaskTypeName, ISNULL(dbo.Status.Name, '''') AS StatusName,
ISNULL(dbo.Location.Name, '''') AS LocationName, ISNULL(dbo.Severity.Name, '''') AS SeverityName, ISNULL(dbo.Priority.Name, '''') AS PriorityName,
dbo.Task.SourceFileChanges, dbo.Task.DataBaseChanges, dbo.Task.StoredProcedureChanges, dbo.Task.OtherChanges,
dbo.Task.ExternalDescription, dbo.Task.LocationSetGUID, ISNULL(dbo.LocationSet.Name, '''') AS LocationSetName, dbo.Task.ProductGUID,
ISNULL(dbo.Product.Name, '''') AS ProductName, dbo.Task.Number, dbo.Task.Code, <b>ISNULL(dbo.Task.Code, '')
+ ISNULL(RIGHT('0000000000' + CONVERT(varchar, dbo.Task.Number),
(SELECT Len(CONVERT(varchar, MAX(ISNULL(Task.Number, 0))))
FROM Task)), '') AS TaskNumber</b>, dbo.Task.LastChangeDate, dbo.Task.LastChange, dbo.MailBox.LastMessageDate
FROM dbo.Task LEFT OUTER JOIN
dbo.Project ON dbo.Project.ID = dbo.Task.ProjectID LEFT OUTER JOIN
dbo.Version VersionFound ON VersionFound.ID = dbo.Task.VersionFoundID LEFT OUTER JOIN
dbo.Version VersionVerified ON VersionVerified.ID = dbo.Task.VersionVerifiedID LEFT OUTER JOIN
dbo.TaskType ON dbo.TaskType.ID = dbo.Task.TaskTypeID LEFT OUTER JOIN
dbo.Status ON dbo.Status.ID = dbo.Task.StatusID LEFT OUTER JOIN
dbo.Location ON dbo.Location.ID = dbo.Task.LocationID LEFT OUTER JOIN
dbo.LocationSet ON dbo.LocationSet.GUID = dbo.Task.LocationSetGUID LEFT OUTER JOIN
dbo.Severity ON dbo.Severity.ID = dbo.Task.SeverityID LEFT OUTER JOIN
dbo.Priority ON dbo.Priority.ID = dbo.Task.Priority LEFT OUTER JOIN
dbo.Product ON dbo.Product.GUID = dbo.Task.ProductGUID LEFT OUTER JOIN
dbo.MailBox ON dbo.MailBox.ID = dbo.Task.MailBoxID