凭证生成报错:不能在具有唯一索引“IDX_FLEX工TEKUNIQUE”的对象“dbo.T_BD_FLEXITEMDETAILV”中插入重复键的行

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:2

凭证生成报错:不能在具有唯一索引“IDX_FLEX工TEKUNIQUE”的对象“dbo.T_BD_FLEXITEMDETAILV”中插入重复键的行

问题描述:

上传图片

解决方案:

重建计算列可以解决该问题,重建方法有两个:

方法一:通过前台加一个核算维度,提交审核(会重建计算列),再反审核删除刚刚加的维度即可。

方法二:通过脚本重建,重建脚本如下:

DECLARE @DEFINCOL NVARCHAR(4000)=''
	DECLARE @COLNAME NVARCHAR(100)=''
	DECLARE FLEX_CUR CURSOR FOR
		SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID('T_BD_FLEXITEMDETAILV') AND NAME NOT IN('FID','FOPCODE','FCALCOL') ORDER BY COLID;
	--收集列名形成新列的定义字串
	OPEN FLEX_CUR;
	FETCH NEXT FROM FLEX_CUR INTO @COLNAME;
	WHILE @@FETCH_STATUS = 0
		BEGIN
			IF LEN(@DEFINCOL)=0
				SET @DEFINCOL = 'RTRIM(CONVERT(VARCHAR(80),'+@COLNAME+'))'
			ELSE
				SET @DEFINCOL = @DEFINCOL+'+''_''+RTRIM(CONVERT(VARCHAR(80),'+@COLNAME+'))'
			FETCH NEXT FROM FLEX_CUR INTO @COLNAME;
		END;
	CLOSE FLEX_CUR;
	DEALLOCATE FLEX_CUR;
	 
	--检查FCALCOL列
	IF EXISTS(SELECT * FROM SYSCOLUMNS WHERE ID=OBJECT_ID('T_BD_FLEXITEMDETAILV') AND NAME ='FCALCOL')
	BEGIN
		--检查索引
			IF EXISTS(SELECT * FROM SYSINDEXES WHERE ID=OBJECT_ID('T_BD_FLEXITEMDETAILV') AND NAME='IDX_FLEXITEMUNIQUE') 
			--删除原有索引
			DROP INDEX IDX_FLEXITEMUNIQUE ON T_BD_FLEXITEMDETAILV;                  
			--删除原有列
			ALTER TABLE T_BD_FLEXITEMDETAILV DROP COLUMN FCALCOL;
	END;
	--重建列
	EXEC('ALTER TABLE T_BD_FLEXITEMDETAILV ADD FCALCOL AS ('+@DEFINCOL+')');
	--重建索引(当存在历史重复记录时,仅创建普通索引)
	IF EXISTS(SELECT * FROM (SELECT MIN(FID) FID1,MAX(FID) FID2 FROM T_BD_FLEXITEMDETAILV GROUP BY FCALCOL) TM WHERE FID1<>FID2)
	BEGIN
		--重建普通索引
		EXEC('CREATE INDEX IDX_FLEXITEMUNIQUE ON T_BD_FLEXITEMDETAILV(FCALCOL)');
	END
	ELSE
	BEGIN
		--重建唯一索引
		EXEC('CREATE UNIQUE INDEX IDX_FLEXITEMUNIQUE ON T_BD_FLEXITEMDETAILV(FCALCOL)');
	END;

凭证生成报错:不能在具有唯一索引“IDX_FLEX工TEKUNIQUE”的对象“dbo.T_BD_FLEXITEMDETAILV”中插入重复键的行

问题描述:解决方案:重建计算列可以解决该问题,重建方法有两个:方法一:通过前台加一个核算维度,提交审核(会重建计算列),再反审核删...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息