如何更正妨碍报告管理器集成的数据错误

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 2931999
概要
这篇文章提供了对于 Microsoft Dynamics SL 2011 管理报告程序 2012年运行 Diagnostics.sql 脚本的步骤。此脚本可以确定可能阻止成功管理报告程序集成的数据错误。数据错误可以来自多个源和可能导致表之间的不一致或创建无效的字段值。

在这篇文章的底部也有几个用于查找中先生可能会导致问题的小写字母数据的脚本中。
解决方案
将下面的脚本文件下载,然后按照下列步骤对 Microsoft Dynamics SL 应用程序数据库报告管理器中运行脚本。为了便于查看更改为文本输出的输出类型。

注意:在 MR2.zip 文件中包含的 Diagnostics2.Sql 文件中包含此相同的信息。

重要:更新管理 Studio 中的任何数据之前始终进行数据库备份。

第 1 步

  • 您是否有多个货币 ID 设置?

    Select 'Step1a', CASE WHEN COUNT(*)>1 then 'YES' else 'NO' end, count(*) from currncy with (nolock)

    备注:
    • 不 = 单一货币
    • 是 = 多种货币在货币维护设置且具有列出的电话号码
  • 是否启用了多货币?

    Select top 1 'Step1b',case isnull((select MAX(mcactivated) from cmsetup),-99) WHEN 1 then 'ENABLED' when -99 then 'NOT SETUP' else 'NOT ENABLED' end

    注意:此脚本会返回"启用"未设置。

第 2 步

寻找错误的货币设置记录。每种情况下的计算结果。若要执行此操作的帮助联系 Microsoft 动态技术支持。
  • 这应该是应用数据库基础货币:

    Select 'Step2a',BaseCuryId from glsetup with (nolock)

  • 实际会计基础货币 (平衡类型 = 'a') 应的基础货币的数据库。

    Select 'Step2b',BaseCuryID,LedgerID, BalanceType from ledger with (nolock)
  • BaseCuryID字段中给定的应用数据库的所有公司的所有应相同。

  • 下面的脚本显示与系统数据库相关联的所有应用程序数据库的BaseCuryID字段。

    Select 'Step2c',BaseCuryID, CpnyID, databasename from vs_company with (nolock)
  • BaseCuryIDs字段应存在货币维护表中。所有外币也应都存在此表中。

    Select 'Step2d',curyid from currncy with (nolock)

第 3 步

查找不正确的CuryIDledgerID字段中的交易记录和摘要记录的值。这些语句访问只有排名前 100 位的记录。若要查看所有记录,从脚本中删除单词"top 100"。
  • 有一个货币 ID 不在币种维护表中的 Accthist。

    Select top 100 'Step3a',CpnyID, LedgerID, FiscYr, Acct, SUB, CuryId, * from accthist with (nolock) where CuryId not in (select CuryId from Currncy with (nolock))

    修复: 您可能需要更新CuryID字段与BaseCuryID字段相匹配。但该记录可能已经存在。在这种情况下您会收到 6909 消息。如果发生这种情况,确定该记录是否是必需的。

  • 与会计记录 (或不在分类帐表中的会计) 不匹配的货币 id 的 Accthist。

    Select top 100 'Step3b',a.CpnyID, a.LedgerID, a.FiscYr, a.Acct, a.SUB, a.CuryId, l.BaseCuryID,* from accthist a with (nolock) left join Ledger l with (nolock) on a.LedgerID=l.LedgerID where l.LedgerID is null OR l.BaseCuryID<>a.CuryId

    修复: 此更新取决于每种情况。

  • 不在货币维护表中有 CuryID 的 CuryAcct。

    Select top 100 'Step3c',CpnyID, LedgerID, FiscYr, Acct, SUB,BaseCuryID, CuryId, * from curyacct with (nolock) where CuryId not in (select CuryId from Currncy with (nolock))

    修复: 此更新将取决于每种情况。您可能需要如果没有相应的 AcctHist 记录以后再删除该记录。以及您可能需要更新的CuryID字段。但该记录可能已经存在。在这种情况下您会收到 6909 消息。如果发生这种情况,决定是否需要记录。

  • CuryAcct 与 BasecuryID 与会计记录不匹配 (或不在分类帐表中的会计)。

    Select top 100 'Step3d',c.CpnyID, c.LedgerID, c.FiscYr, c.Acct, c.SUB,c.BaseCuryID, c.CuryId,l.BaseCuryID, * from curyacct c with (nolock) left join Ledger l with (nolock) on c.LedgerID=l.LedgerID where l.LedgerID is null OR c.BaseCuryID<>l.BaseCuryId

    修复: 此更新取决于每种情况。

  • 与货币维护表中没有的 CuryID GLTran。

    Select top 100 'Step3e',CpnyID, LedgerID, FiscYr, Acct, SUB,BaseCuryID, CuryId,* from gltran with (nolock) where Posted='P' and CuryId not in (select CuryId from Currncy)

    修复: 此更新取决于每种情况。您可能需要将CuryId字段更新为有效的值。

  • GLTran 与BaseCuryID字段值不匹配的会计记录 (或不在分类帐表中的会计)。

    Select top 100 'Step3f',g.CpnyID, g.LedgerID, g.FiscYr, g.Acct, g.SUB, g.BaseCuryID, g.CuryId, * from gltran g with (nolock) left join Ledger l with (nolock) on g.LedgerID=l.LedgerID where g.Posted='P' and g.LedgerID is null OR l.BaseCuryID<>g.BaseCuryId

    若要修复: 更新将取决于每种情况。您可能需要将BaseCuryID字段更新为有效的值。

第 4 步

查找不匹配的摘要记录。
  • 查找没有 AcctHist 记录的 CuryAcct 记录。

    Select top 100 'Step4a',c.CpnyID, c.LedgerID, c.FiscYr, c.Acct, c.Sub, c.BaseCuryID, c.CuryId,*from CuryAcct c with (nolock)left join AcctHist a with (nolock) on c.CpnyID=a.CpnyID and c.Acct=a.Acct and c.Sub=a.Sub and c.LedgerID=a.LedgerID and c.FiscYr=a.FiscYrwhere a.CpnyID is null order by c.CpnyID, c.Acct, c.SUB, c.ledgerid, c.FiscYr

    修复: Fix4a.SQL 脚本从 MR2.zip 上运行单币种和多币种数据库如果报告了错误。

  • 没有 CuryAcct 记录查找 Accthist。

    Select top 100 'Step4b',a.CpnyID, a.LedgerID, a.FiscYr, a.Acct, a.Sub, a.CuryId, *from AcctHist a with (nolock)left join Curyacct c with (nolock) on c.CpnyID=a.CpnyID and c.Acct=a.Acct and c.Sub=a.Sub and c.LedgerID=a.LedgerID and c.FiscYr=a.FiscYrwhere a.BalanceType='A' and c.CpnyID is null order by a.CpnyID, a.Acct, a.SUB, a.ledgerid, a.FiscYr

    修复: 对于多货币数据库或者初始化 curyacct 记录在总帐中的初始化模式 > 帐户历史记录或过帐交易记录帐户/子/会计/fiscyr/cpnyid/curyid。若要创建或更新总帐的 curyacct 记录 > 帐户历史记录 > 货币选项卡您必须为每个期间输入的数据。您在创建批次交易记录过帐到帐户时这将创建包含每个期间的值的 CuryAcct 记录。请确保您将用作过帐的年度年中报告该错误。然后反向批处理中删除从该客户资金。

    对于单一货币数据库打开的记录在总帐中 > 在过程中初始化模式如果仅有一个或两个记录的帐户历史记录。通过一定量的期初余额、 保存记录、 恢复它和再保存一次。这将创建的 curyacct 记录。或者您可以从这一节中的步骤 6a 运行该脚本。

  • 而 AcctHist GLTrans

    此查询将运行很慢如果有很多的 gltrans 项和所有条目是否有效。(查询实际运行更快如果有坏数据。)

    Select top 100 'Step4c',g.CpnyID, g.LedgerID, g.FiscYr, g.Acct, g.Sub, g.BaseCuryID, g.CuryId,* from GLTran g with (nolock)left join AcctHist a with (nolock) on g.CpnyID=a.CpnyID and g.Acct=a.Acct and g.Sub=a.Sub and g.LedgerID=a.LedgerID and g.FiscYr=a.FiscYrinner join vs_company c with (nolock) on g.CpnyID=c.CpnyID and c.CpnyCOA in (select CpnyID from glsetup with (nolock)) -- only companies in this application DBwhere g.posted='P' and a.CpnyID is null order by g.CpnyID, g.LedgerID, g.FiscYr, g.Acct, g.Suboption (force order) -- added for performance in larger databases

    修复: 评估的GLtrans字段条目。如果没有 AcctHist 记录财务信息不使用这些交易记录的报表
  • 这通常是因为旧的事务。您可能决定将其删除或采取一些其他措施。仔细评估这些条目。

第 5 步

寻找具有无效的日期或期间的 GLTrans 记录。此类记录可能会导致管理报告以下错误:
  • 错误文本: 年、 月和日的参数描述无法表示的日期时间。
  • 错误文本: 对象引用未设置为对象的一个实例。
  • GLTrans 有一个空白的FiscYr字段的记录。

    Select top 100 'Step5a',CpnyID, LedgerID, FiscYr, Acct, Sub, perpost, perent, trandate, Posted, Rlsed, BatNbr, Module, * from GLTran with (nolock) where FiscYr='' and (Rlsed=1 or Posted='P')

    若要修复: 请考虑更新基于 perpost 值的FiscYr字段。

  • GLTrans 具有远远超出正常范围内的 perpost 值的记录。

    Select top 100 'Step5b',CpnyID, LedgerID, FiscYr, Acct, Sub, perpost, perent, trandate, Posted, Rlsed, BatNbr, Module, *from GLTran with (nolock) where (PerPost>='204812' or PerPost<='195001') and (Rlsed=1 or Posted='P')

    修复: 这些批处理所有可能有将来期间过帐。您可以在总帐中打开这些批 > 日记帐交易记录期间初始化模式。
    删除它们、 更改要过帐的期间或根据需要处理它们。

  • GLTrans (经常通过让 2079 年) 是远超出正常范围的交易记录日期值的记录。

    Select top 100 'Step5c',CpnyID, LedgerID, FiscYr, Acct, Sub, perpost, perent, trandate,Posted, Rlsed, BatNbr, Module, *from GLTran with (nolock) where (trandate>='01/01/2048' or trandate<='01/01/1950') and (Rlsed=1 or Posted='P') and TranDate<>'1/1/1900'

    修复: 将更新为 crtd_datetime trandate。下面的脚本显示如何。

    update gltran set trandate=crtd_datetime where (trandate>='01/01/2048' or trandate<='01/01/1950') and (Rlsed=1 or Posted='P') and TranDate<>'1/1/1900' 

  • AcctHist 具有远远超出正常范围的 FiscYr 字段的记录。

    Select top 100 'Step5d',a.CpnyID, a.LedgerID, a.FiscYr, a.Acct, a.Sub, a.CuryId, *from AcctHist a with (nolock) where a.FiscYr>'2048' or a.FiscYr<'1950'

    修复: 它们可能不需要的记录。从历史上看操作数据中您可能已设置会计年度为未来年份为以后可能的审查的记录。

第 6 步

定位的实例中的AcctHist记录的金额不匹配中的CuryAcct记录的金额。

注意:在步骤 1 至 5 中的问题已得到修复后才运行此语句。

select top 1000 'Step6a', a.CpnyID, a.Acct, a.Sub, a.LedgerID, a.FiscYr, c.numCuryAcct, a.BegBal, c.begbal, a.PtdBal00, c.ptdbal00, a.PtdBal01, c.ptdbal01, a.PtdBal02, c.ptdbal02,   a.PtdBal03, c.ptdbal03, a.PtdBal04, c.ptdbal04, a.PtdBal05, c.ptdbal05, a.PtdBal06, c.ptdbal06, a.PtdBal07, c.ptdbal07, a.PtdBal08, c.ptdbal08,   a.PtdBal09, c.ptdbal09, a.PtdBal10, c.ptdbal10, a.PtdBal11, c.ptdbal11, a.PtdBal12, c.ptdbal12, a.ytdBal00, c.ytdbal00, a.ytdBal01, c.ytdbal01,  a.ytdBal02, c.ytdbal02, a.ytdBal03, c.ytdbal03, a.ytdBal04, c.ytdbal04, a.ytdBal05, c.ytdbal05, a.ytdBal06, c.ytdbal06, a.ytdBal07, c.ytdbal07,   a.ytdBal08, c.ytdbal08, a.ytdBal09, c.ytdbal09, a.ytdBal10, c.ytdbal10, a.ytdBal11, c.ytdbal11, a.ytdBal12, c.ytdbal12  from AcctHist a inner join (select count(*) as numCuryAcct, CpnyID, Acct, Sub, LedgerID, FiscYr, SUM(begbal) as begbal, SUM(ptdbal00) as ptdbal00, SUM(ptdbal01) as ptdbal01, SUM(ptdbal02) as ptdbal02, SUM(ptdbal03) as ptdbal03, SUM(ptdbal04) as ptdbal04, SUM(ptdbal05) as ptdbal05, SUM(ptdbal06) as ptdbal06, SUM(ptdbal07) as ptdbal07, SUM(ptdbal08) as ptdbal08, SUM(ptdbal09) as ptdbal09, SUM(ptdbal10) as ptdbal10, SUM(ptdbal11) as ptdbal11,SUM(ptdbal12) as ptdbal12, SUM(ytdbal00) as ytdbal00, SUM(ytdbal01) as ytdbal01, SUM(ytdbal02) as ytdbal02, SUM(ytdbal03) as ytdbal03, SUM(ytdbal04) as ytdbal04, SUM(ytdbal05) as ytdbal05, SUM(ytdbal06) as ytdbal06, SUM(ytdbal07) as ytdbal07, SUM(ytdbal08) as ytdbal08, SUM(ytdbal09) as ytdbal09, SUM(ytdbal10) as ytdbal10, SUM(ytdbal11) as ytdbal11, SUM(ytdbal12) as ytdbal12from curyacct group by CpnyID, Acct, Sub, LedgerID, FiscYr) c   on a.CpnyID=c.CpnyID and a.Acct=c.Acct and a.Sub=c.Sub and a.LedgerID=c.LedgerID and a.FiscYr=c.FiscYr  where round(a.BegBal,2)<>round(c.begbal,2) or round(a.PtdBal00,2)<>round(c.PtdBal00,2) or round(a.PtdBal01,2)<>round(c.PtdBal01,2) or   round(a.PtdBal02,2)<>round(c.PtdBal02,2) or round(a.PtdBal03,2)<>round(c.PtdBal03,2) or round(a.PtdBal04,2)<>round(c.ptdbal04,2) or   round(a.PtdBal05,2)<>round(c.PtdBal05,2) or round(a.PtdBal06,2)<>round(c.PtdBal06,2) or round(a.PtdBal07,2)<>round(c.PtdBal07,2) or   round(a.PtdBal08,2)<>round(c.PtdBal08,2) or round(a.PtdBal09,2)<>round(c.PtdBal09,2) or round(a.PtdBal10,2)<>round(c.PtdBal10,2) or   round(a.PtdBal11,2)<>round(c.PtdBal11,2) or round(a.PtdBal12,2)<>round(c.PtdBal12,2) or round(a.ytdBal00,2)<>round(c.ytdBal00,2) or   round(a.ytdBal01,2)<>round(c.ytdBal01,2) or round(a.ytdBal02,2)<>round(c.ytdBal02,2) or round(a.ytdBal03,2)<>round(c.ytdBal03,2) or   round(a.ytdBal04,2)<>round(c.ytdbal04,2) or round(a.ytdBal05,2)<>round(c.ytdBal05,2) or round(a.ytdBal06,2)<>round(c.ytdBal06,2) or   round(a.ytdBal07,2)<>round(c.ytdBal07,2) or round(a.ytdBal08,2)<>round(c.ytdBal08,2) or round(a.ytdBal09,2)<>round(c.ytdBal09,2) or   round(a.ytdBal10,2)<>round(c.ytdBal10,2) or round(a.ytdBal11,2)<>round(c.ytdBal11,2) or round(a.ytdBal12,2)<>round(c.ytdBal12,2)

对于单一货币数据库打开的记录在总帐中 > 帐户历史记录中只含有几个记录是否初始化模式。通过一定量的期初余额、 保存记录、 恢复记录,然后再次保存它。这将更新以匹配的Accthist记录的Curyacct记录。如果没有从 MR2.zip 文件运行 ResetCuryAcctfromAcctHistStep6a.sql 脚本的多个记录。

在多货币数据库中打开 GL > 如果有只几个记录和货币选项卡更正每个时间段分别根据然后单击初始化模式期间的帐户历史记录。如果没有从 MR2.zip 文件运行 MultiCurrencyStep6aFix.sql 脚本的多个记录。基CuryID记录所做的任何更改。

在完成第 6 步后,重新运行 Diagnostics2.SQL 脚本以验证它不再报告错误。



要查找在先生可能会导致问题的小写字母数据的其他脚本。

此脚本查找多个记录的Company.DatabaseName没有相同的大小写 (例如: SLDemoApp 和 SLDEMOAPP)。对系统数据库运行此脚本。

选择 c.DatabaseName,从公司 c 左边的外部联接 sys.databases c.CpnyID c.DatabaseName 上的 sd 逐份打印 Latin1_General_CS_AS = sd.name 逐份打印 Latin1_General_CS_AS

sd.name 为 null 的情况和 '数据库名称' 中 (选择 c1。从在 c1 的公司 c1 左外部联接公司 c2 的数据库名称。数据库名称 = c2。数据库名称在 c1。数据库名称 = c2。数据库名称和 c1。'数据库名称' 逐份打印 Latin1_General_CS_AS! = c2。'数据库名称' 逐份打印 Latin1_General_CS_AS)

为解决: 更新数据库名称为大写。




此脚本将查找小写的公司 ID和 accthist、 curyacct 和 gltran 表中的下级单位。对系统数据库运行此脚本。


声明 @DbName VARCHAR(50)
声明 @useStatement VARCHAR(256)
声明 @fullStatement VARCHAR(8000)

声明游标的 db_cursor
从公司中选择不同的数据库名称

打开 db_cursor
获取下一个从 db_cursor INTO @DbName

同时 @@FETCH_STATUS = 0
开始

设置 @DbName = LTRIM(RTRIM(@DbName))
设置 @useStatement = '使用' + @DbName + '
设置 @fullStatement =
选择子作为 '子-AcctHist-' + @DbName +' ',*
从 AcctHist
在何处 UPPER(sub)<>子逐份打印 Latin1_General_CS_AS

选择子作为 '子-GLTran-' + @DbName +' ',*
从 GLTran
在何处 UPPER(sub)<>子逐份打印 Latin1_General_CS_AS


选择子作为 '子-CuryAcct-' + @DbName +' ',*
从 CuryAcct
在何处 UPPER(sub)<>子逐份打印 Latin1_General_CS_AS

选择 CpnyID 作为 'CpnyID-AcctHist-' + @DbName +' ',*
从 AcctHist
其中 UPPER(CpnyID) <> CpnyID 逐份打印 Latin1_General_CS_AS

选择 CpnyID 作为 'CpnyID-GLTran-' + @DbName +' ',*
从 GLTran
其中 UPPER(CpnyID) <> CpnyID 逐份打印 Latin1_General_CS_AS


选择 CpnyID 作为 'CpnyID-CuryAcct-' + @DbName +' ',*
从 CuryAcct
其中 UPPER(CpnyID) <> CpnyID 逐份打印 Latin1_General_CS_AS


作为选择子子-SubAcct-+ @DbName + ' ',* SubAcct 从位置 (子逐份打印 sql_latin1_general_cp1_cs_as <> upper(SUB))
或 (ConsolSub 逐份打印 sql_latin1_general_cp1_cs_as <> upper(ConsolSub))
'

exec (@useStatement + @fullStatement)

获取下一个从 db_cursor INTO @DbName
结束

关闭 db_cursor
解除分配 db_cursor




为解决: 如果您发现任何小写字母的下级单位可以运行这些文件以将它们放入大写。


更新 GLTran 设置子 = UPPER(Sub)

更新 AcctHist 设置子 = UPPER(Sub)

更新 CuryAcct 设置子 = UPPER(Sub)



如果您发现任何小写字母公司 ID您可以运行这些文件以将它们放入大写。

更新 accthist 集 cpnyid = UPPER(cpnyid) 处 UPPER(CpnyID) <> CpnyID 逐份打印 Latin1_General_CS_AS

更新 curyacct 集 cpnyid = UPPER(cpnyid) 处 UPPER(CpnyID) <> CpnyID 逐份打印 Latin1_General_CS_AS

更新 gltran 集 cpnyid = UPPER(cpnyid) 处 UPPER(CpnyID) <> CpnyID 逐份打印 Latin1_General_CS_AS



小写字母LedgerID accthist、 curyacct 和 gltran 表中查找此脚本。针对应用数据库中运行此脚本。

选择最多的 1 LedgerID 从 AcctHist 处 UPPER(LedgerID) <> LedgerID 逐份打印 Latin1_General_CS_AS

选择最多的 1 LedgerID 从 GLTran 处 UPPER(LedgerID) <> LedgerID 逐份打印 Latin1_General_CS_AS

选择最多的 1 LedgerID 从 CuryAcct 处 UPPER(LedgerID) <> LedgerID 逐份打印 Latin1_General_CS_AS



为解决: 如果您发现任何小写字母LedgerID 的您可以运行这些文件以将它们放入大写。

更新 GLTran 设置 LedgerID = 的 UPPER(LedgerID) LedgerID 逐份打印 Latin1_General_BIN 其中像 [一-z] %%

更新 AcctHist 设置 LedgerID = 的 UPPER(LedgerID) LedgerID 逐份打印 Latin1_General_BIN 其中像 [一-z] %%

更新 CuryAcct 设置 LedgerID = 的 UPPER(LedgerID) LedgerID 逐份打印 Latin1_General_BIN 其中像 [一-z] %%


小写字母CuryID accthist、 curyacct 和 gltran 表中查找此脚本。针对应用数据库中运行此脚本。

选择最多的 1 CuryID 从 AcctHist 处 UPPER(CuryID) <> CuryID 逐份打印 Latin1_General_CS_AS

选择最多的 1 CuryID 从 GLTran 处 UPPER(CuryID) <> CuryID 逐份打印 Latin1_General_CS_AS

选择最多的 1 CuryID 从 CuryAcct 处 UPPER(CuryID) <> CuryID 逐份打印 Latin1_General_CS_AS



若要修复:2964624.

警告:本文已自动翻译

属性

文章 ID:2931999 - 上次审阅时间:06/17/2015 01:02:00 - 修订版本: 7.0

Microsoft Dynamics SL 2011 Service Pack 2, Microsoft Dynamics SL 2011 Service Pack 1, Microsoft Dynamics SL 2011 Feature Pack 1, Microsoft Dynamics SL 2011

  • kbmbsmigrate kbsurveynew kbmt KB2931999 KbMtzh
反馈