DECLARE p_assis1 PROCEDURE FOR p_ass_orders
 @m = :ls_maker,         
 @mn = :ls_makename,
 @vid = :ls_vendorid, 
 @vname = :ls_vendorname,
 @s_type = :ls_saletype,
 @s_type1 = :ls_saletype1;  
EXECUTE p_assis1; 
if SQLCA.sqlcode = -1 then
 MessageBox("错误信息", SQLCA.sqlerrtext)
else
 messagebox("信息" , "制单成功!")CLOSE   p_assis1;

解决方案 »

  1.   

    上面是我在pb中写的调用存储过程,

    以下是我的存储过程
    if exists( select 1 from sysobjects where  id = object_id( 'p_ass_orders') and type = 'P' )
    drop procedure p_ass_orders
    go/*制作总计定单*/create procedure p_ass_orders
    @m char(6) , 
    @mn varchar(12) , 
    @vid char(8) ,
    @vname varchar(30) , 
    @oid char(12),
    @s_type char(4),
    @s_type1 char(2)
    as
    beginif @m = '' or @m is null  
         begin  
           raiserror( '传递参数错误!' , 16 , 1 )  
           return 0  
         end  
    declare @cnt int  
    select @cnt = count(*) from assistorder where maker = @m 
    print @cnt
      if @cnt = 0 or @cnt is null  
         begin  
           raiserror( '没有需要制作的制单数据!' , 16 , 1 )  
           return 0  
         end  
      begin tran         execute p_id 'order' ,  @oid output  declare @ld_money decimal (15,4), @ld_quantity decimal (15,4)

    select @ld_money = sum(quantity * price) from assistorder  where maker = @m
    insert into ordermain(orderid,vendorid,vendorname,operator,operatorname,maker,makername,makedate,deliverdate,contractid,saletype,moneyamt,killdate,status,flag,creator,createdate,re,deptid,gifts)
    values( @oid , @vid , @vname , '' , '' , @m , @mn , getdate() , '' , @vid + @s_type1 , @s_type , @ld_money , null , '' ,'制作之中' , '' , getdate() , '' , '00', null) declare @sqlstr varchar(8000)
    set @sqlstr='insert into orderdetail(orderid,comid,quantity,arrive,rawprice,purchasetaxrate,price,saleprice,warehouseid,warehouse,no,deptid)
    select '''+cast(@oid as varchar)+''',assistorder.comid,sum(assistorder.quantity),'',plu.rawprice ,plu.purchasetaxrate ,assistorder.price , pluloction.saleprice ,assistorder.warehouseid ,warehouse.warehouse,'',00
    from assistorder , plu , plulocation , warehouse
    where (assistorder.comid = plu.comid) and (assistorder.comid = plulocation.comid) and (assistorder.warehouseid = warehouse.warehouseid) and (assistorder.deptid = plulocation.deptid)
    group by assidtorder.comid,plu.rawprice ,plu.purchasetaxrate ,assistorder.price , plulocation.saleprice ,assistorder.warehouseid ,plulocation.warehouse'        exec(@sqlstr) if @@error <> 0 
      begin 
        --print "执行失败!"
        return 3
      end 
    else 
       --print "执行成功!"
       return 0end GO
      

  2.   

    我想将,@oid ,返回到pb中,因为我的@oid,本身也是在存储过程中,调用的另外一个存储过程得到的,“,execute p_id 'order' ,  @oid output ”
    他可能有多个值,我想将他都可以反回到,pb 中,不知道怎么做,
    有知道的,可否,指点一下,非常感谢,
      

  3.   

    if exists( select 1 from sysobjects where  id = object_id( 'p_ass_orders') and type = 'P' )
    drop procedure p_ass_orders
    go/*制作总计定单*/create procedure p_ass_orders
    @m char(6) , 
    @mn varchar(12) , 
    @vid char(8) ,
    @vname varchar(30) , 
    @oid char(12),
    @s_type char(4),
    @s_type1 char(2)
    as
    begin
    DECLARE @TABLE TABLE(ID INT NULL)------------
    if @m = '' or @m is null  
         begin  
           raiserror( '传递参数错误!' , 16 , 1 )  
           return 0  
         end  
    declare @cnt int  
    select @cnt = count(*) from assistorder where maker = @m 
    print @cnt
      if @cnt = 0 or @cnt is null  
         begin  
           raiserror( '没有需要制作的制单数据!' , 16 , 1 )  
           return 0  
         end  
      begin tran         execute p_id 'order' ,  @oid output 
    INSERT INTO  @TABLE (ID) VALUES(@oid )---------------------------
    declare @ld_money decimal (15,4), @ld_quantity decimal (15,4)

    select @ld_money = sum(quantity * price) from assistorder  where maker = @m
    insert into ordermain(orderid,vendorid,vendorname,operator,operatorname,maker,makername,makedate,deliverdate,contractid,saletype,moneyamt,killdate,status,flag,creator,createdate,re,deptid,gifts)
    values( @oid , @vid , @vname , '' , '' , @m , @mn , getdate() , '' , @vid + @s_type1 , @s_type , @ld_money , null , '' ,'制作之中' , '' , getdate() , '' , '00', null) declare @sqlstr varchar(8000)
    set @sqlstr='insert into orderdetail(orderid,comid,quantity,arrive,rawprice,purchasetaxrate,price,saleprice,warehouseid,warehouse,no,deptid)
    select '''+cast(@oid as varchar)+''',assistorder.comid,sum(assistorder.quantity),'',plu.rawprice ,plu.purchasetaxrate ,assistorder.price , pluloction.saleprice ,assistorder.warehouseid ,warehouse.warehouse,'',00
    from assistorder , plu , plulocation , warehouse
    where (assistorder.comid = plu.comid) and (assistorder.comid = plulocation.comid) and (assistorder.warehouseid = warehouse.warehouseid) and (assistorder.deptid = plulocation.deptid)
    group by assidtorder.comid,plu.rawprice ,plu.purchasetaxrate ,assistorder.price , plulocation.saleprice ,assistorder.warehouseid ,plulocation.warehouse'        exec(@sqlstr) if @@error <> 0 
      begin 
        --print "执行失败!"
        return 3
      end 
    else 
       --print "执行成功!"
       return 0
    SELECT * FROM  @TABLE ---------------
    end GO有DATAWINDOW(用过程做数据源)
      

  4.   

    楼上的,,我不是很懂呀,
    可否说详细点啊,
    我本事想,在让存储过程返回@oid这个值,在pb中接收到,
    让后,让他显示在一个数据窗口中啊,
      

  5.   

    to : caiyunxia(monkey) ( )
    、你的这个,是建一个临时表吗,,
    DECLARE @TABLE TABLE(ID INT NULL)------------
      

  6.   

    如果通过这个,将@oid加进,刚建的表中,,INSERT INTO  @TABLE (ID) VALUES(@oid )---------------------------SELECT * FROM  @TABLE ---------------
    end 那我在pb中,怎么得到这个值拉,
      

  7.   

    DECLARE @TABLE TABLE(ID INT NULL)------------定义表变量建数据窗口,数据源为过程
      

  8.   

    dw_1.retrievels_maker,ls_makename,ls_vendorid,ls_vendorname,ls_saletype,ls_saletype1)
      

  9.   

    dw_1.retrieve(ls_maker,ls_makename,ls_vendorid,ls_vendorname,ls_saletype,ls_saletype1)
      

  10.   

    to:caiyunxia(monkey) ( )
    你这个,没得到我想要的值拉,我想要返回@oid,拉,
    ls_maker,ls_makename,ls_vendorid,ls_vendorname,ls_saletype,ls_saletype1
    这些,是我要传到存储过程的一些变量啊,
      

  11.   

    是不是要需要在pb中定义一个,变量,@oid,为接受变量啊,
    DECLARE p_assis1 PROCEDURE FOR p_ass_orders
     @m = :ls_maker,         
     @mn = :ls_makename,
     @vid = :ls_vendorid, 
     @vname = :ls_vendorname,
     @s_type = :ls_saletype,
     @s_type1 = :ls_saletype1
     @oid = :ls_oid;  -------------------------------
    EXECUTE p_assis1; 
    fetch p_assis1 into ls_oid ;  -------------------------
    if SQLCA.sqlcode = -1 then
     MessageBox("错误信息", SQLCA.sqlerrtext)
    else
     messagebox("信息" , "制单成功!")CLOSE   p_assis1;
    ,那如果我有多个值拉,,我不知道怎么半拉,
      

  12.   

    及SELECT * FROM  @TABLE 返回的只
      

  13.   

    dw_1.retrieve(ls_maker,ls_makename,ls_vendorid,ls_vendorname,ls_saletype,ls_saletype1)
    你这个能返回吗,我建一个datawindow,,可是datawindow object 都没有啊,
      

  14.   

    ls_maker,ls_makename,ls_vendorid,ls_vendorname,ls_saletype,ls_saletype1
    可是这几个是我从pb中传过去的值啊,
    你说的,,用数据源,p_ass_orders
    我还是不明白,
      

  15.   

    PB建DATAWINDOW时选过程为数据源,过程名p_ass_orders(你建的过程)
    注意:过程做数据源时应自动提交,不然会锁表
      

  16.   

    有个问题啊,我用你的方法做了之后,
    为什么,,
    对我这个过程而言,本来,我的要求是做一张单的就是返回一个oid,以前可以实现,但是,现在为什么产生了三个oid啊,那闷,啊,
      

  17.   


    if exists( select 1 from sysobjects where  id = object_id( 'p_ass_orders') and type = 'P' )
    drop procedure p_ass_orders
    go/*制作总计定单*/create procedure p_ass_orders
    @m char(6) , 
    @mn varchar(12) , 
    @vid char(8) ,
    @vname varchar(30) , 
    @s_type char(4),
    @s_type1 char(2)as
    begin
    create table #t1
    (
    orderid char(12) not null
    )
    if @m = '' or @m is null  
         begin  
           raiserror( '传递参数错误!' , 16 , 1 )  
           return 0  
         end  
    declare @cnt char(12) , @oid char(12)
    select @cnt = count(*) from assistorder where maker = @m 
      if @cnt = 0 or @cnt is null  
         begin  
           raiserror( '没有需要制作的制单数据!' , 16 , 1 )  
           return 0  
         end  
      begin tran      
           execute p_id 'order' , @oid output  
          declare @ld_money decimal (15,4) , @ld_quantity decimal (15,4)

    select @ld_money = sum(quantity * price) from assistorder  where maker = @m insert into ordermain(orderid,vendorid,vendorname,operator,operatorname,maker,makername,makedate,deliverdate,contractid,saletype,moneyamt,killdate,status,flag,creator,createdate,re,deptid,gifts)
    values( @oid , @vid , @vname , '' , '' , @m , @mn , getdate() , '' , @vid + @s_type1 , @s_type , @ld_money , null , '' ,'制作之中' , '' , getdate() , '' , '00', null)
    insert into orderdetail(orderid,comid,quantity,arrive,rawprice,purchasetaxrate,price,saleprice,warehouseid,warehouse,no,deptid)
    select @oid,assistorder.comid,sum(assistorder.quantity),0.00 ,plu.rawprice ,plu.purchasetaxrate ,assistorder.price , assistorder.saleprice ,'00' , '总部' ,'', '00'
    from assistorder , plu 
    where assistorder.comid = plu.comid 
    group by assistorder.comid,plu.rawprice ,plu.purchasetaxrate ,assistorder.price , assistorder.saleprice 
           
    if @@error <> 0 or @@rowcount = 0
      begin 
                rollback tran
        return -1
      end 
               insert into #t1 (orderid) select @oid
               commit tran 
               delete  from assistorder where maker = @m
       select orderid from #t1   
       return 0
              
    end GO
      

  18.   

    以上的过程,我只是产生一个oid,
      

  19.   

    可以考虑用,存储过程做数据源,见一个datawindow,
    需要在过程中,先建一个临时表,将数据加到这个表中,
    再在pb中,retrieve(参数1,参数2。)