找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 3549|回复: 0

[技巧] U8存货明细账出现错行的解决方案

[复制链接]
发表于 2009-9-15 10:40:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
存货明细账中经常出现错行的现象,就是某些字段出现在了不该出现的位置上,而它自己的位置又被别的字段所占据了,经过仔细测试以后,发现这是数据表中有非法字符造成的.
以下是修复语句.
--作用:去除指定表中数据类型是VARCHAR,CHAR,NVARCHAR的字段值中的不可见字符
--日期:2004-11-04
--作者:CXL
--注意:使用前请指定对应要修改的表名,并且需要在对应数据库下执行;
SET NOCOUNT ON
DECLARE    @TblName     VARCHAR(100)
DECLARE    @UpdateString    NVARCHAR(1000)
DECLARE    @SelectString    NVARCHAR(1000)
DECLARE    @COlName    VARCHAR(100)
DECLARE @COUNT        INT
SET    @TblName = 'ia_subsidiary'--指定想要修改的表名
--定义游标取出指定表内的数据类型是VARCHAR,char,nVARCHAR的字段名称
DECLARE    cur_ColName     CURSOR
FOR
SELECT    col.name
FROM    syscolumns AS col
    inner join sysobjects     AS obj     ON col.ID = obj.ID
    INNER join systypes     AS typ     ON col.xtype = typ.xtype
WHERE    obj.xtype ='U'
AND    obj.name = @TblName
AND    typ.name IN ('VARCHAR','CHAR','NVARCHAR','NCHAR')
FOR    READ ONLY
--打开游标
OPEN    cur_ColName
FETCH    NEXT    FROM    cur_ColName INTO    @ColName
IF    @@FETCH_STATUS<>0
BEGIN
    PRINT '没有对应表或字段,'
    PRINT '请确认当前数据库内有' + @TblName + '表,'
    PRINT '或该表内有VARCHAR、CHAR、NVARCHAR、NCHAR类型的字段!'
    GOTO LABCLOSE
END
--循环修改
WHILE    @@FETCH_STATUS=0
BEGIN   
    --拼修改字符串
    --去掉左边的不可见字符
    SET    @SelectString =    'SELECT    @COU=COUNT(*)   
                 FROM    ' + @TblName +'
                WHERE    ASCII(LEFT(' + @ColName +',1))<32
                AND    '+ @ColName + ' IS NOT NULL'
   
    EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    WHILE    @COUNT>0
    BEGIN
        SET    @UpdateString =
            '    UPDATE    ' + @TblName +
            '    SET    ' + @ColName + '=RIGHT(' + @ColName + ',LEN(' + @ColName + ')-1)
                WHERE    ASCII(LEFT(' + @ColName + ',1))<32
                AND    ' + @ColName + ' IS NOT NULL'
   
        EXEC sp_executesql @UpdateString   
        EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    END
    --去掉右边的不可见字符
    SET    @SelectString =    'SELECT    @COU=COUNT(*)   
                 FROM    ' + @TblName +'
                WHERE    ASCII(RIGHT(' + @ColName +',1))<32
                AND    '+ @ColName + ' IS NOT NULL'
   
    EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    WHILE    @COUNT>0
    BEGIN
        SET    @UpdateString =
            '    UPDATE    ' + @TblName +
            '    SET    ' + @ColName + '=LEFT(' + @ColName + ',LEN(' + @ColName + ')-1)
                WHERE    ASCII(RIGHT(' + @ColName + ',1))<32
                AND    ' + @ColName + ' IS NOT NULL'
   
        EXEC SP_EXECUTESQL @UpdateString   
        EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    END
    PRINT 'column:  ' + @ColName + '---ok'
    FETCH    NEXT FROM cur_ColName    INTO    @ColName
END
--关闭、释放游标
LABCLOSE:    CLOSE    cur_ColName
        DEALLOCATE    cur_ColName
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-11-24 06:31 , Processed in 0.037925 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表