现在小弟在开发ERP模块中进销存的金额检验存储过程时遇到一点问题,请高手指教!
下表只例出进销存表中的部分字段,省去公司代号、库位代号、入库单价等字段!
物料编号 单位    单据编号            单据类别        出入标志   入库数   出库数
71111 PCS CIN-06-0001 来料验收入库 增 11472 0
71111 PCS OU060012 其他出库单 减 0 11472
71111 PCS CIN-06-0001 来料验收入库 减 0 11472
71111 PCS CIN-06-0001 来料验收入库 增 11472 0
71111 PCS OU060012 其他出库单(反审核) 增 11472 0
71111 PCS OU060012 其他出库单 减 0 11472
71111 PCS OIN-06-0001 其他入库单 增 956 0
71111 PCS CIN-06-0001 来料验收入库 减 0 11472
71111 PCS CIN-06-0001 来料验收入库 增 11472 0
71111 PCS OU060141 其他出库单 减 0 240
71111 PCS OU060142 其他出库单 减 0 90此进销存表根据不同的单据共有655333条出入库记录!
我现在想要做的是:
当单据被反审核后,就相当于其数据冲红不显示!然后删除其中的记录!
我测试查询这些需要冲红的记录时,发现并不正确,请高手指教!
select A.WareHId,A.Itemid,A.inQty,A.outQty,B.inQty,B.outQty,A.Billid,A.Iostyle,A.comm from inviolog A inner join inviolog B on 
A.corpcode=B.corpcode and A.warehid=B.WareHid and A.Itemid=B.Itemid
and charindex(A.iostyle,B.iostyle)>0 and a.inqty=b.Outqty and A.billid=B.Billid and ((A.ioflag='增' and B.ioflag='减') or (A.ioflag='减' and B.ioflag='增'))以上SQL用到的:
WareHID=库位代号,iostyle=单据类别,Billid=单据编号,COMM=备注信息请高手帮我!

解决方案 »

  1.   

    物料编号 单位    单据编号            单据类别        出入标志   入库数   出库数
    71111   PCS    CIN-06-0001          来料验收入库       增        11472      0
    71111   PCS    OU060012             其他出库单         减         0        11472
    71111   PCS    CIN-06-0001       来料验收入库(反审核)  减         0        11472
    71111   PCS    CIN-06-0001          来料验收入库       增        11472       0
    71111   PCS    OU060012             其他出库单(反审核) 增        11472       0
    71111   PCS    OU060012             其他出库单         减         0        11472
    71111   PCS    OIN-06-0001          其他入库单         增        956         0
    71111   PCS    CIN-06-0001      来料验收入库(反审核)   减          0       11472
    71111   PCS     CIN-06-0001        来料验收入库        增        11472       0
    71111   PCS     OU060141           其他出库单          减          0        240
    71111   PCS      OU060142          其他出库单          减          0         90___________________________________________________________________________________
      

  2.   

    现在真正需要分析的物料要变成以下这种情况:
    物料编号 单位    单据编号            单据类别        出入标志   入库数   出库数
    71111   PCS     CIN-06-0001        来料验收入库        增        11472       0
    71111   PCS    OU060012             其他出库单         减         0        11472
    71111   PCS    OIN-06-0001          其他入库单         增        956         0
    71111   PCS     OU060141           其他出库单          减          0        240
    71111   PCS      OU060142          其他出库单          减          0         90
    ________________________________________________________________________________
      

  3.   

    以下数据被冲红掉
    _________________________________________________________________________________
    71111   PCS    CIN-06-0001          来料验收入库       增        11472      0
    71111   PCS    CIN-06-0001       来料验收入库(反审核)  减         0        11472
    _________________________________________________________________________________
    71111   PCS    OU060012             其他出库单         减         0        11472
    71111   PCS    OU060012             其他出库单(反审核) 增        11472       0
    _________________________________________________________________________________
    71111   PCS    CIN-06-0001          来料验收入库       增        11472       0
    71111   PCS    CIN-06-0001      来料验收入库(反审核)   减          0       11472
    _________________________________________________________________________________
    其单据编号相同并且其入库数等于其出库数时,该单据自动被冲红,不在核算的范围当中!
    我的意思就是查出真正需要核算的数据!
      

  4.   

    你的进销存表没有主键吗?你的第一条记录和第四条记录完全一样.
    因为你没有主键只能这样查:
    select distinct A.WareHId,A.Itemid,A.inQty,A.outQty,B.inQty,B.outQty,A.Billid,A.Iostyle,A.comm from inviolog A inner join inviolog B on 
    A.corpcode=B.corpcode and A.warehid=B.WareHid and A.Itemid=B.Itemid
    and charindex(A.iostyle,B.iostyle)>0 and a.inqty=b.Outqty and A.billid=B.Billid and ((A.ioflag='增' and B.ioflag='减') or (A.ioflag='减' and B.ioflag='增'))
    这样查出来的应该是需要冲红的记录.
    如果有主键就好办了.
      

  5.   

    LZ,你把表结构贴出来啊光看你的SELECT语句太抽象了
      

  6.   

    建立扩展你的表结构吧,将红冲和被红冲记录做一个标记flag,查询不就好办了
      

  7.   

    SELECT *
    FROM table1 a
    WHERE NOT EXISTS 
    (SELECT 1
    FROM table1 b
    WHERE b.单据编号=a.单据编号
    AND b.单据类别=
    CASE a.单据类别 
    WHEN '来料验收入库' THEN '来料验收入库(反审核)'
    WHEN '其他出库单' THEN '其他出库单(反审核)'
    END 
    AND b.出入标志=
    CASE a.出入标志
    WHEN '增' THEN '减'
    WHEN '减' THEN '增'
    END 
    AND b.入库数=a.出库数
    AND b.出库数=a.入库数)
      

  8.   

    --出入库记录
    create table [dbo].[InvIOLog](
        [CORPCODE] nvarchar (10) NOT NULL ,
        [WarehID] nvarchar(20) not null,
        [ITEMID] nvarchar(20) not null,
        [ITEMNAMEC] nvarchar(100) null,
        [UNIT] nvarchar(10) NULL,
        [BillID] nvarchar(100) not null,
        [IOSTYLE] nvarchar(20) not null,
        [IOFLAG] nvarchar(4) not null,
        [IOTIME] DATETIME not null,
        [INQTY] decimal(10,2) not null default(0),
        [OUTQTY] decimal(10,2) not null default(0),
        [PRICE] decimal(14,6) default(0),
        [UnitCost] decimal(14,6) default(0),
        [STOCK] decimal(10,2) not null default(0),
        [Comm] nvarchar(100) null,
        [Principal] nvarchar(20) null
    )
      

  9.   

    这个表是已经在很久之前就建好了的。
    数据库设计是不能够随便改的!
    我现在需要从出入库记录中计算出期初数,期末数,期初金额、期末金额等这些东西来!
    Price、UnitCost分别代表含税单价、移动加权平均单价。
      

  10.   

    churchatp1(别看资料,看聊效!) 
    非常感谢你,我现在在我的SQL上加上distinct关键字,已经能够找出需要冲红的记录来了!
    bugchen888(臭虫) 
    谢谢你!但是由于关系到多公司、多库位管理,所以在你提供的SQL语句的连接条件中必须加上公司代号、库位代号的连接条件!……
    我会在明天下午来结贴,希望更多的朋友提出优化的方案出来,谢谢!