我正在创建一个报告,以显示Microsoft AX 2012中批处理作业的问题,但无法找到任何内容将SQL Server的BATCHJOB表中的整数状态值链接到应用程序中显示的文本描述。有人告诉我这应该存在于枚举的模型数据库中,但是我无法确定该数据库中数据之间的正确链接。我也无法在网络搜索或Microsoft提供的任何文档中找到此信息。有谁能够提供这些值,或者告诉我在哪里可以找到它们?
SELECT bj.[STATUS] AS [bj_STATUS]
-- 1: Didn't run - what else?
-- 2: Canceled - what else?
-- 3: Error?
-- 4: Success?
-- 5: ?
-- 6: ?
-- 7: ?
-- 8: Withhold?
-- Waiting
-- Ended
-- Withhold
-- Executing
-- Ready
-- Finished
-- Error
-- Didn't run
,bj.[CAPTION] AS [bj_CAPTION]
,bjh.[STARTDATETIME] AS [bjh_STARTDATETIME]
,bjh.[ENDDATETIME] AS [bjh_ENDDATETIME]
,bjh.[BATCHCREATEDBY] AS [bjh_BATCHCREATEDBY]
,bjh.[CANCELEDBY] AS [bjh_CANCELEDBY]
,bg.[GROUP_] AS [bg_GROUP]
,bg.[DESCRIPTION] AS [bg_DESCRIPTION]
,bh.[SERVERID] AS [bh_SERVERID]
FROM [MicrosoftDynamicsAX].[dbo].[BATCHJOB] bj WITH(NOLOCK)
INNER JOIN [MicrosoftDynamicsAX].[dbo].[BATCHJOBHISTORY] bjh WITH(NOLOCK)
ON bjh.[BATCHJOBID] = bj.[RECID]
INNER JOIN [MicrosoftDynamicsAX].[dbo].[BATCH] b WITH(NOLOCK)
ON b.[BATCHJOBID] = bj.[RECID]
INNER JOIN [MicrosoftDynamicsAX].[dbo].[BATCHGROUP] bg WITH(NOLOCK)
ON bg.[GROUP_] = b.[GROUPID]
INNER JOIN [MicrosoftDynamicsAX].[dbo].[BATCHHISTORY] bh WITH(NOLOCK)
ON bh.[BATCHID] = b.[RECID]
AND bh.[BATCHJOBID] = bj.[RECID]
AND bh.[BATCHJOBHISTORYID] = bjh.[RECID]
WHERE bjh.[STARTDATETIME] > GETDATE() - 1 -- AND bj.[STATUS] NOT IN(1, 2, 4)
答案 0 :(得分:3)
枚举是BatchStatus
,它存储在模型存储数据库中,但是我认为不存储枚举名称和/或值。最终代表整数。
以下是基本枚举,其整数值为0-8:
除了以下例外,文本标签与名称相同(英文)。
您可能只是用CASE语句创建一个SQL存储过程,因为这些状态很少会从基本代码中更改。
答案 1 :(得分:1)
由于@Alex Kwitny提供的信息,我能够弄清楚如何将其从数据库中删除。一旦有了枚举的名称,就可以在ModelElement表中找到它,并将其链接回ElementHandle值上的ModelElementData表。 ModelElementData表具有存储在varbinary中的“属性”字段,可以将其细分为多个部分,以读取主数据库中每个整数值的值。我花了一些时间来解析所有内容并将二进制文件转换为文本,但是现在我可以引用枚举值,以防万一将来发生任何更改,方法是将查询转换为可以从主查询中调用的函数报告。
DECLARE @name AS VARCHAR(40) = 'BatchStatus'
, @value AS INT = 1
, @language AS VARCHAR(8) = 'en_us';
DECLARE @bin AS VARBINARY(MAX);
SET @bin =
(
SELECT TOP (1)
med.[Properties]
FROM [MicrosoftDynamicsAX_Model].[dbo].[ModelElement] me
INNER JOIN [MicrosoftDynamicsAX_Model].[dbo].[ModelElementData] med
ON med.[ElementHandle] = me.[ElementHandle]
WHERE me.[Name] = @name
AND me.[ElementType] = 40
ORDER BY med.[LayerId] DESC
);
DECLARE @pos AS INT;
DECLARE @flags AS INT;
DECLARE @count AS INT;
DECLARE @idx AS INT;
DECLARE @off AS INT;
DECLARE @result AS VARCHAR(255);
SET @pos = 3;
SET @off = CAST(SUBSTRING(@bin, @pos, 1) AS INT) - 1;
SET @pos = @pos + 1;
WHILE @off > 0
BEGIN
WHILE SUBSTRING(@bin, @pos, 2) <> 0x0000
SET @pos = @pos + 2;
SET @pos = @pos + 2;
SET @off = @off - 1;
END;
SET @flags = CAST(SUBSTRING(@bin, @pos, 3) AS INT);
SET @pos = @pos + 3;
IF @flags & 0x008000 = 0x008000
BEGIN
WHILE SUBSTRING(@bin, @pos, 2) <> 0x0000
SET @pos = @pos + 2;
SET @pos = @pos + 2;
END;
IF @flags & 0x000002 = 0x000002
SET @pos = @pos + 1;
SET @pos = @pos + 1;
SET @count = CAST(SUBSTRING(@bin, @pos, 1) AS INT);
IF @count > 0
BEGIN
SET @pos = @pos + 1;
IF @flags & 0x000200 = 0x000200
SET @idx = @value;
ELSE
BEGIN
SET @idx = 0;
SET @off = 2 + CAST(CAST(REVERSE(SUBSTRING(@bin, @pos, 2)) AS BINARY(2)) AS INT) * 2;
SET @off = @off + 2 + CAST(CAST(REVERSE(SUBSTRING(@bin, @pos + @off, 2)) AS BINARY(2)) AS INT) * 2;
WHILE CAST(SUBSTRING(@bin, @pos + @off + @idx, 1) AS INT) <> @value
AND @idx < @count
SET @idx = @idx + 1;
IF CAST(SUBSTRING(@bin, @pos + @off + @idx, 1) AS INT) <> @value
SET @idx = -1;
END;
IF @idx >= 0
BEGIN
SET @pos = @pos + 2;
WHILE 1 = 1
BEGIN
SET @off = 0;
SET @result = '';
WHILE SUBSTRING(@bin, @pos + @off, 2) <> 0x0000
BEGIN
SET @result = @result + CHAR(CAST(REVERSE(SUBSTRING(@bin, @pos + @off, 2)) AS BINARY(2)));
SET @off = @off + 2;
END;
SET @pos = @pos + @off + 2;
IF @idx <= 0
BREAK;
SET @idx = @idx - 1;
END;
END;
ELSE
SET @result = '~ENUM NOT FOUND~';
END;
ELSE
SET @result = '~ERROR~';
IF SUBSTRING(@result, 1, 1) = '@'
BEGIN
DECLARE @module AS VARCHAR(3);
DECLARE @label AS INT;
SET @module = SUBSTRING(@result, 2, 3);
SET @label = CAST(SUBSTRING(@result, 5, DATALENGTH(@result) - 4) AS INT);
SET @result =
(
SELECT TOP (1)
[Text]
FROM [MicrosoftDynamicsAX_Model].[dbo].[ModelElementLabel]
WHERE [LabelId] = @label
AND [Module] = @module
AND [Language] = @language
ORDER BY [LayerId] DESC
);
END;
SELECT @value AS [Id]
, @result AS [Status];