Учетная строка включает в себя счет и до девяти учетных измерений. Длина любой из частей не может превышать 12 символов.
Я уже затрагивал эту тему в предыдущем посте, но решил вернуться, ведь разбирать учетную строку на части в запросах приходится часто и довольно быстро надоедает вспоминать ее раскладку.
Можно облегчить себе задачу, если создать в базе набор функций, каждая из которых будет возвращать нужное учетное измерение. В результате вместо substring(GL06001, 13, 6) можно будет писать dbo.Dim1(GL06001). В добавок отчеты, сделанные с использованием таких функций можно будет без проблем переносить на другие инсталляции Scala, где разбивка учетной строки отличается, потребуется только подправить функции.
Можно пойти еще дальше и читать разбивку учетной строки из настроек и сделать функции универсальными. Не советую этого делать, т.к. использоваться они могут довольно часто, а зачем нам лишние запросы? Поправить же функции при необходимости дело пары минут.
Сами функции получаются простыми (создать лучше во всех компанейских базах данных, чтобы при вызове не нужно было указывать имя БД).
Для примера возьмем следующую разбивку учетной строки: Счет - 12, УИ1 - 4, УИ2 - 6, УИ3 - 6, УИ4 - 4, УИ5 - 3, УИ6 - 6, УИ7 - 3, УИ8 - 2, УИ9 - 4. Создаем функции:
CREATE FUNCTION dbo.Account(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(left(@AccountString, 12))
END
GO
CREATE FUNCTION dbo.Dim1(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 13, 4))
END
GO
CREATE FUNCTION dbo.Dim2(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 17, 6))
END
GO
CREATE FUNCTION dbo.Dim3(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 23, 6))
END
GO
CREATE FUNCTION dbo.Dim4(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 29, 4))
END
GO
CREATE FUNCTION dbo.Dim5(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 33, 3))
END
GO
CREATE FUNCTION dbo.Dim6(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 36, 6))
END
GO
CREATE FUNCTION dbo.Dim7(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 42, 3))
END
GO
CREATE FUNCTION dbo.Dim8(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 45, 2))
END
GO
CREATE FUNCTION dbo.Dim9(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 47, 4))
END
GO
-- Проверяем, получилось ли:
select top 100 GL06001 AccStr,
dbo.Account(GL06001) Acc,
dbo.Dim1(GL06001) Dim1,
dbo.Dim2(GL06001) Dim2,
dbo.Dim3(GL06001) Dim3,
dbo.Dim4(GL06001) Dim4,
dbo.Dim5(GL06001) Dim5,
dbo.Dim6(GL06001) Dim6,
dbo.Dim7(GL06001) Dim7,
dbo.Dim8(GL06001) Dim8,
dbo.Dim9(GL06001) Dim9
from GL06CCYY