给你一个我以前开发的游标 CREATE PROC Sp_SaleRecordOut @RecordNo Char(10), --销售单号 @VoucherType Char(10), --凭证编码 @ClientID Char(6), --客户编号 @LocationID Char(6), --仓库编码 @Checker Char(10), --检验员 @Provider Char(10), --销售员 @PaperMaker Char(10), --制单人 @Confirmer Char(10), --审批人 @ADate Date, --开单日期 @Note VarChar(255), --备注 @Sender Char(10), --发送人 @Accept Char(10), --接收人 @Account Char(10), --记帐人 @Lender Char(20), --借方 @ErrorMessage VarChar(40) Output -- 返回的错误代码 AS DECLARE @RecordNoC Char(10), --单据号 @ItemNoC Char(6), --库存项目编码 @ItemNameC Char(30), --产品名称 @SalesAmountC Numeric(10,2), --定购数量 @UnitPriceC Numeric(10,2), --单价 @AUnitC Char(4), --单位 @TotalC Numeric(10,2), --总金额 @DisCountC Numeric(10,2), --折合率 @BatchNoC Char(6), --批次号 @SalesTypeC Char(1), --销售类型 0:成品仓库.1:主机仓库 @StoreAmount numeric(10,2), @StorePrice numeric(10,2) BEGIN TRAN DECLARE SalesRecord_Cur CURSOR FOR SELECT RecordNo, ItemNo, ItemName, SalesAmount, UnitPrice, AUnit, Total, DisCount, BatchNo, SalesType FROM DSalesRecord Where RecordNo=@RecordNo OPEN SalesRecord_Cur FETCH NEXT FROM SalesRecord_Cur INTO @RecordNoC, @ItemNoC, @ItemNameC, @SalesAmountC, @UnitPriceC, @AUnitC, @TotalC, @DisCountC, @BatchNoC, @SalesTypeC WHILE @@FETCH_STATUS = 0 BEGIN IF Exists (Select * From StoreInfo Where ItemNo=@ItemNoC) Begin --对库存流水表添加 Select @StoreAmount=Amount From StoreInfo Where ItemNo=@ItemNoC Select @StorePrice=UnitPrice From StoreItems Where ItemNo=@ItemNoC Insert MstoreList Values (@RecordNo, --流水号(凭证号) @RecordNo, --凭证号 @ClientID, --仓库编码 @Vouchertype, --凭证编码 '1', --进出标记(0:入库、1:出库) '0', --内部标记(0:外部、1:内部) @Note, --摘要 @ADate, --时间 @sender, --借方 @Lender, --贷方 @Checker, --检验员 @Accept, --接受人 @sender, --发送人 @Account, --记账人 @PaperMaker, --制票人 @Confirmer --审核人 ) IF @@ERROR != 0 OR @@ROWCOUNT != 1 Begin ROLLBACK TRAN SELECT @ErrorMessage = '数据处理的时候出错1!' CLOSE SalesRecord_Cur DEALLOCATE SalesRecord_Cur RETURN -1 End Else Begin Insert DstoreList values (@RecordNoC, --凭证号, @ItemNoC, --库存项目编号 @SalesAmountC, --实发数量 @AunitC, --单位 @unitPriceC, --单价 @SalesAmountC*@unitPriceC, --金额 @StoreAmount-@SalesAmountC,--余额 @BatchNoC, --批次号码 '' --备注 ) IF @@ERROR != 0 OR @@ROWCOUNT != 1 Begin ROLLBACK TRAN SELECT @ErrorMessage = '数据处理的时候出错2!' CLOSE SalesRecord_Cur DEALLOCATE SalesRecord_Cur RETURN -1 End Else Begin Update StoreInfo Set Amount=@StoreAmount-@SalesAmountC Where ItemNo=@ItemNoC AND LocationID=@LocationID IF @@ERROR != 0 --OR @@ROWCOUNT != 1 Begin ROLLBACK TRAN SELECT @ErrorMessage = '数据处理的时候出错3!' CLOSE SalesRecord_Cur DEALLOCATE SalesRecord_Cur RETURN -1 End ELSE Begin IF Exists (Select * from Client Where IsMain='Y' And ClientID=@ClientID) Begin Update StoreInfo Set Amount=@StoreAmount+@SalesAmountC Where ItemNo=@ItemNoC AND LocationID=@ClientID IF @@ERROR != 0 OR @@ROWCOUNT != 1 Begin ROLLBACK TRAN SELECT @ErrorMessage = '数据处理的时候出错4!' CLOSE SalesRecord_Cur DEALLOCATE SalesRecord_Cur RETURN -1 End End End End End End FETCH NEXT FROM SalesRecord_Cur INTO @RecordNoC, @ItemNoC, @ItemNameC, @SalesAmountC, @UnitPriceC, @AUnitC, @TotalC, @DisCountC, @BatchNoC, @SalesTypeC End CLOSE SalesRecord_Cur DEALLOCATE SalesRecord_Cur COMMIT TRAN RETURN 0GO
使用SQL语言的游标是SQL的事情,你在SQL里写就可以了,如果你想在程序里使用游标,那就是Delphi的事情,比如你想让当前的DataSet专到某一记录,那么就用Delphi里的游标(书签) var S:String; begin S:=Query1.Book;//记录要转到的记录 Query1.GotoBook(pointer(S));//将数据库转到s所记录的位置
CREATE PROC Sp_SaleRecordOut
@RecordNo Char(10), --销售单号
@VoucherType Char(10), --凭证编码
@ClientID Char(6), --客户编号
@LocationID Char(6), --仓库编码
@Checker Char(10), --检验员
@Provider Char(10), --销售员
@PaperMaker Char(10), --制单人
@Confirmer Char(10), --审批人
@ADate Date, --开单日期
@Note VarChar(255), --备注
@Sender Char(10), --发送人
@Accept Char(10), --接收人
@Account Char(10), --记帐人
@Lender Char(20), --借方
@ErrorMessage VarChar(40) Output -- 返回的错误代码
AS
DECLARE
@RecordNoC Char(10), --单据号
@ItemNoC Char(6), --库存项目编码
@ItemNameC Char(30), --产品名称
@SalesAmountC Numeric(10,2), --定购数量
@UnitPriceC Numeric(10,2), --单价
@AUnitC Char(4), --单位
@TotalC Numeric(10,2), --总金额
@DisCountC Numeric(10,2), --折合率
@BatchNoC Char(6), --批次号
@SalesTypeC Char(1), --销售类型 0:成品仓库.1:主机仓库
@StoreAmount numeric(10,2),
@StorePrice numeric(10,2)
BEGIN TRAN
DECLARE SalesRecord_Cur CURSOR
FOR SELECT
RecordNo,
ItemNo,
ItemName,
SalesAmount,
UnitPrice,
AUnit,
Total,
DisCount,
BatchNo,
SalesType
FROM DSalesRecord Where RecordNo=@RecordNo OPEN SalesRecord_Cur FETCH NEXT FROM SalesRecord_Cur INTO
@RecordNoC,
@ItemNoC,
@ItemNameC,
@SalesAmountC,
@UnitPriceC,
@AUnitC,
@TotalC,
@DisCountC,
@BatchNoC,
@SalesTypeC
WHILE @@FETCH_STATUS = 0
BEGIN
IF Exists (Select * From StoreInfo Where ItemNo=@ItemNoC)
Begin --对库存流水表添加
Select @StoreAmount=Amount From StoreInfo Where ItemNo=@ItemNoC
Select @StorePrice=UnitPrice From StoreItems Where ItemNo=@ItemNoC
Insert MstoreList Values
(@RecordNo, --流水号(凭证号)
@RecordNo, --凭证号
@ClientID, --仓库编码
@Vouchertype, --凭证编码
'1', --进出标记(0:入库、1:出库)
'0', --内部标记(0:外部、1:内部)
@Note, --摘要
@ADate, --时间
@sender, --借方
@Lender, --贷方
@Checker, --检验员
@Accept, --接受人
@sender, --发送人
@Account, --记账人
@PaperMaker, --制票人
@Confirmer --审核人
)
IF @@ERROR != 0 OR @@ROWCOUNT != 1
Begin
ROLLBACK TRAN
SELECT @ErrorMessage = '数据处理的时候出错1!'
CLOSE SalesRecord_Cur
DEALLOCATE SalesRecord_Cur
RETURN -1
End
Else
Begin
Insert DstoreList values
(@RecordNoC, --凭证号,
@ItemNoC, --库存项目编号
@SalesAmountC, --实发数量
@AunitC, --单位
@unitPriceC, --单价
@SalesAmountC*@unitPriceC, --金额
@StoreAmount-@SalesAmountC,--余额
@BatchNoC, --批次号码
'' --备注
)
IF @@ERROR != 0 OR @@ROWCOUNT != 1
Begin
ROLLBACK TRAN
SELECT @ErrorMessage = '数据处理的时候出错2!'
CLOSE SalesRecord_Cur
DEALLOCATE SalesRecord_Cur
RETURN -1
End
Else
Begin
Update StoreInfo Set Amount=@StoreAmount-@SalesAmountC
Where ItemNo=@ItemNoC AND LocationID=@LocationID
IF @@ERROR != 0 --OR @@ROWCOUNT != 1
Begin
ROLLBACK TRAN
SELECT @ErrorMessage = '数据处理的时候出错3!'
CLOSE SalesRecord_Cur
DEALLOCATE SalesRecord_Cur
RETURN -1
End
ELSE
Begin
IF Exists (Select * from Client Where IsMain='Y' And ClientID=@ClientID)
Begin
Update StoreInfo Set Amount=@StoreAmount+@SalesAmountC
Where ItemNo=@ItemNoC AND LocationID=@ClientID
IF @@ERROR != 0 OR @@ROWCOUNT != 1
Begin
ROLLBACK TRAN
SELECT @ErrorMessage = '数据处理的时候出错4!'
CLOSE SalesRecord_Cur
DEALLOCATE SalesRecord_Cur
RETURN -1
End
End
End
End
End
End
FETCH NEXT FROM SalesRecord_Cur INTO
@RecordNoC,
@ItemNoC,
@ItemNameC,
@SalesAmountC,
@UnitPriceC,
@AUnitC,
@TotalC,
@DisCountC,
@BatchNoC,
@SalesTypeC
End
CLOSE SalesRecord_Cur
DEALLOCATE SalesRecord_Cur
COMMIT TRAN
RETURN 0GO
var
S:String;
begin
S:=Query1.Book;//记录要转到的记录
Query1.GotoBook(pointer(S));//将数据库转到s所记录的位置