【问题标题】:What are the possible values and text description for batch job status in AX 2012?AX 2012 中批处理作业状态的可能值和文本描述是什么?
【发布时间】:2019-01-15 20:32:55
【问题描述】:

我正在创建一个报告来显示 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)

【问题讨论】:

    标签: axapta dynamics-ax-2012-r2


    【解决方案1】:

    枚举是BatchStatus,它存储在模型存储数据库中,但我不认为枚举名称和/或值被存储。它最终代表一个整数。

    以下是整数值 0-8 的基本枚举:

    除了以下例外,文本标签与名称(即英文)相同。

    • 0 - 保留(保留)
    • 4 - 结束(已完成)
    • 6 - 未运行 (NotRun)

    您可能只需使用 CASE 语句创建一个 SQL 存储过程,因为这些状态很少从基本代码更改。

    【讨论】:

      【解决方案2】:

      感谢@Alex Kwitny 提供的信息,我能够弄清楚如何将其从数据库中取出。一旦我有了枚举的名称,我就可以在 ModelElement 表中找到它,并将它链接回 ElementHandle 值上的 ModelElementData 表。 ModelElementData 表有一个存储在 varbinary 中的 Properties 字段,可以将其分解为多个片段以读取主数据库中每个整数值的值。我花了一段时间来解析所有内容并将二进制文件转换为文本,但现在我可以引用枚举值,以防将来发生任何变化,方法是将我的查询转换为可以从我的主查询中调用的函数报告。

      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];
      

      【讨论】:

      • 这看起来像是一个有趣的练习,但 BatchStatus 本质上被认为是静态的。对该枚举的任何修改都会引起一些相当大的讨论,并且可能没有正当理由这样做。我想它虽然有效!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 2016-11-15
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      相关资源
      最近更新 更多