朋友们晚上好:
  又来打扰各位真的不好意思啊!不过为了学习我还是来了,问题如下,请高手指教……
  有两个表:zhuce和jiaoyi(“注册”表和“交易”表)     表zhuce有列ID、name、a1、a2(自动ID、用户名、赠币、兑换币)       其中ID=1 name="19180108" a1=50 a2=1000 (意思是:用户19180108有50枚赠币1000枚兑换币)      表jiaoyi有列ID、name、b1、b2、b3、b4(自动ID、用户名、交易类别、支出、存入、余额)       其中ID=1 name="x" b1="gszz" b4=10000 (意思是:x部门的公司总帐余额为10000枚兑换币)     说明:公司总帐和交易明细在同一张表上,总帐固定在id=1行中,交易明细根据交易顺序插入,        b1="gszz"表示公司总帐, b1="jymx"表示交易明细,如果用户交易额小于赠币,那么只扣除用户赠币,        不产生交易记录,如果大于赠币,则扣除用户兑换币并记录交易明细。        例:用户19180108购买x部门产品需100枚(赠币或兑换币)的程序如下(文字程序)     取19180108用户赠币比较是否大于支出额,如大于则a1=a1-支出额,保存数据,返回值1。        否则a2=a2-支出额,(如果a2小于支出额,则中断操作返回值2)保存数据,并且在表jiaoyi中记录结果,                返回值3

          此例各表结果如下:
     表zhuce: ID=1 name="19180108" a1=50 a2=900      表jiaoyi:ID=1 name="x" b1="gszz" b4=10100      ID=2 name="19180108" b1="jymx" b2=100 b4=900      ID=3 name="x" b1="jymx" b3=100 b4=10100 要求:三个输入参数(用户名、部门名、交易额),               一个返回值(1表示赠币交易、2表示帐户额不够中断交易、3表示交易成功)。
   
   以上程序完全用存储过程完成,在ASP中调用一次即可。

解决方案 »

  1.   


    nvarchar   和   varchar   的区别是存储方式不同
    varchar是按字节存储的.而带 "n "的nvarchar是按字符存储的
    比如说   varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节.所以varchar(40)只能存储20个中文字符.
    nvarchar(40),就可以存储40个中文字符,也就是说可以存储80个字节长度的字符.nvarchar要相对于存储的字符类型.比如有些字符是占3个字节的. 字符集是在安装   SQL   Server   时选择的,不能更改。使用   Unicode   数据类型,列可存储由   Unicode   标准定义的任何字符,包含由不同字符集定义的所有字符。Unicode   数据类型需要相当于非   Unicode   数据类型两倍的存储空间。Unicode   数据使用   SQL   Server   中的   nchar、varchar   和   ntext   数据类型进行存储。对于存储来源于多种字符集的字符的列,可采用这些数据类型。当列中各项所包含的   Unicode   字符数不同时(至多为   4000),使用   nvarchar   类型。当列中各项为同一固定长度时(至多为   4000   个   Unicode   字符),使用   nchar   类型。当列中任意项超过   4000   个   Unicode字符时,使用   ntext   类型。
      

  2.   

    表jiaoyi有列ID、name、b1、b2、b3、b4(自动ID、用户名、交易类别、支出、存入、余额)其中ID=1 name="x" b1="gszz" b4=10000 (意思是:x部门的公司总帐余额为10000枚兑换币)
    name 到底是用户名,还是部门?
      

  3.   

    name是用户名,只不过部门的用户名是用字母表示,而用户的用户名是用数字表示。
      

  4.   

    --> 测试数据: zhuce
    if object_id('zhuce') is not null drop table zhuce
    go 
    create table zhuce (ID int identity(1,1),name varchar(20),a1 int,a2 int)
    insert into zhuce
    select '19180108',50,1000--> 测试数据: jiaoyi
    if object_id('jiaoyi') is not null drop table jiaoyi
    go 
    create table jiaoyi (
    ID int identity(1,1),
    name varchar(20),
    b1 varchar(20), --类别
    b2 int, --支出
    b3 int, --存入
    b4 int --余额
    )
    insert into jiaoyi
    select 'x','gszz',0,0,10000
    go 
    alter PROC Sp_Jymx
    @name varchar(100),
    @bm varchar(100),
    @money decimal(18,2)
    AS
     
    DECLARE @M1 DECIMAL(18,2) --赠
    DECLARE @M2 DECIMAL(18,2) --对SELECT @M1=a1,@M2=a2 FROM zhuce WHERE name=@name  -- 自己加其它乱七八糟的情况,如 用户不存在IF @M1>=@money --赠币足够
    BEGIN
    --插入 用户交易明细
    INSERT jiaoyi 
    SELECT @name,'jymx',@money,0,a2 FROM zhuce 
    WHERE name=@name --插入 部门交易明细 
    INSERT jiaoyi 
    SELECT @bm,'jymx',0,@money,b4+@money 
    FROM jiaoyi 
    WHERE name=@bm and ID=1  --总帐固定在id=1行中,不知道是不是这样? --更新注册
    UPDATE zhuce 
    SET a1=a1-@money
    WHERE name=@name   --更新总账
    UPDATE jiaoyi 
        SET b4=b4+@money
    WHERE name=@bm and ID=1 --总帐固定在id=1行中,不知道是不是这样? RETURN 1
    END
    ELSE
    IF @M1<@money AND @M2>=@money -- 赠币不够,兑换币足够
    BEGIN
    --插入 用户交易明细
    INSERT jiaoyi 
    SELECT @name,'jymx',@money,0,a2-@money FROM zhuce 
    WHERE name=@name --插入 部门交易明细 
    INSERT jiaoyi 
    SELECT @bm,'jymx',0,@money,b4+@money 
    FROM jiaoyi 
    WHERE name=@bm and ID=1  --总帐固定在id=1行中,不知道是不是这样? --更新注册
    UPDATE zhuce 
    SET a2=a2-@money
    WHERE name=@name     --更新总账
    UPDATE jiaoyi 
    SET b4=b4+@money
    WHERE name=@bm and ID=1 --总帐固定在id=1行中,不知道是不是这样? return 3
    END
    ELSE -- 赠币不够,兑换币也不够
    return 2

    GOEXEC Sp_Jymx '19180108','X',100SELECT * FROM ZHUCE
    SELECT * FROM JIAOYI
    ID          name                 a1          a2
    ----------- -------------------- ----------- -----------
    1           19180108             50          900(1 行受影响)ID          name                 b1                   b2          b3          b4
    ----------- -------------------- -------------------- ----------- ----------- -----------
    1           x                    gszz                 0           0           10100
    2           19180108             jymx                 100         0           900
    3           X                    jymx                 0           100         10100(3 行受影响)
      

  5.   

    非常感谢您js_szy,根据您的程序修改后测试通过,也让我掌握了部分存储过程知识。好了,再次谢谢!有机会再聊……