金蝶K3有个最大的问题就是流程复杂而且你没法批量做。销售出库单审核后,下推生成发票就是这样一个坑爹的设计,它只能一张一张下推,加上金蝶本身就SQL写得很差慢得要死,当销售出库单多的时候,下推生成销售发票工作量非常巨大。

下面的程序可以帮你减轻这个工作量,也就是销售出库单审核时自动生成销售发票并审核钩稽:

CREATE TRIGGER [dbo].[AutoSale]
ON [dbo].[ICStockBill]
/*
 日期:2012-03-28
 作者:鲁志译
 描述:审核销售出库单时,自动生成销售发票,审核并钩稽
*/
FOR UPDATE AS
DECLARE
 @Status INT,
 @TranType INT,
 @InterID INT,
 @SaleInterID INT,
 @InvoiceID INT,
 @BillNo VARCHAR(20),
 @SaleBillNo VARCHAR(20),
 @DigitWidth INT,
 @Amount DECIMAL(15, 5),
 @ID INT,
 @GroupNo INT,
 @BillerID INT;

SELECT @BillerID = FUserID FROM t_User WHERE FName = 'Administrator';

SELECT
 @BillNo = FBillNo,
 @Status = FStatus,
 @TranType = FTranType,
 @InterID = FInterID,
 @BillerID = FBillerID,
 @InvoiceID = FRelateInvoiceID
FROM
 inserted;

IF UPDATE(FCheckerID) AND @Status = 1 AND @TranType = 21 AND @InvoiceID = 0
BEGIN
 EXEC p_GetAnyBillNo '80', 1, @SaleInterID OUTPUT, @SaleBillNo OUTPUT, @DigitWidth OUTPUT;

 INSERT INTO ICSaleEntry
 (
  FInterID,
  FEntryID,
  FItemID,
  FQty,
  FPrice,
  FAmount,
  FTaxRate,
  FTaxAmount,
  FUnitID,
  FAuxPrice,
  FAuxQty,
  FTaxPrice,
  FAuxTaxPrice,
  FSourceEntryID,
  FStdAmount,
  FStdTaxAmount,
  FAmountincludetax,
  FStdAmountincludetax,
  FBatchNo,
  FClassID_SRC,
  FKFDate,
  FKFperiod,
  FPeriodDate,
  FPriceDiscount,
  FAuxPriceDiscount,
  FSourceTranType,
  FSourceInterId,
  FSourceBillNo,
  FRemainQty,
  FRemainAmount,
  FRemainAmountFor,
  FNote,
  FMTONo
 )
 SELECT
  @SaleInterID,
  FEntryID,
  t_ICItem.FItemID,
  FQty,
  100 * FConsignPrice / (100 + t_ICItem.FTaxRate),
  100 * FConsignAmount / (100 + t_ICItem.FTaxRate),
  t_ICItem.FTaxRate,
  t_ICItem.FTaxRate * FConsignAmount / (100 + t_ICItem.FTaxRate),
  ICStockBillEntry.FUnitID,
  100 * FConsignPrice / (100 + t_ICItem.FTaxRate),
  FAuxQty,
  FConsignPrice,
  FConsignPrice,
  FEntryID,
  100 * FConsignAmount / (100 + t_ICItem.FTaxRate),
  t_ICItem.FTaxRate * FConsignAmount / (100 + t_ICItem.FTaxRate),
  FConsignAmount,
  FConsignAmount,
  FBatchNo,
  21,
  FKFDate,
  ICStockBillEntry.FKFPeriod,
  FPeriodDate,
  FConsignPrice,
  FConsignPrice,
  21,
  @InterID,
  @BillNo,
  FQty,
  FConsignAmount,
  FConsignAmount,
  '',
  FMTONo
 FROM
  ICStockBillEntry
  LEFT JOIN t_ICItem ON t_ICItem.FItemID = ICStockBillEntry.FItemID
 WHERE
  FInterID = @InterID;

 INSERT INTO ICSale
 (
  FInterID,
  FBillNo,
  FTranType,
  FROB,
  FClassTypeID,
  FYear,
  FPeriod,
  FFincDate,
  FDate,
  FCustID,
  FDeptID,
  FEmpID,
  FBillerID,
  FCurrencyID,
  FExchangeRate,
  FCompactNo,
  FSaleStyle,
  FAcctID,
  FYearPeriod,
  FYtdIntRate,
  FNote,
  FSelTranType,
  FManagerID,
  FBrID,
  FVchInterID,
  FSettleID,
  FSysStatus,
  FCussentAcctID,
  FSettleDate,
  FItemClassID,
  FAdjustExchangeRate
 )
 SELECT
  @SaleInterID,
  @SaleBillNo,
  80,
  FROB,
  1000002,
  YEAR(FDate),
  MONTH(FDate),
  FDate,
  FDate,
  FSupplyID,
  FDeptID,
  FEmpID,
  @BillerID,
  1,
  1,
  '',
  FSaleStyle,
  0,
  CONVERT(VARCHAR(7), FDate, 120),
  0,
  FNote,
  FSelTranType,
  0,
  0,
  0,
  0,
  2,
  1091,
  FDate,
  1,
  1
 FROM
  ICStockBill
 WHERE
  FInterID = @InterID;

 SELECT @ID = ISNULL(MAX(FID), 0) + 1 FROM t_RP_Contact;

 SELECT @Amount = SUM(FConsignAmount) FROM ICStockBillEntry WHERE FInterID = @InterID;

 INSERT INTO t_RP_Contact
 (
  FID,
  FYear,
  FPeriod,
  FRP,
  FType,
  FDate,
  FFincDate,
  FNumber,
  FCustomer,
  FDepartment,
  FEmployee,
  FCurrencyID,
  FExchangeRate,
  FAmount,
  FAmountFor,
  FRemainAmount,
  FRemainAmountFor,
  FInvoiceID,
  FRPDate,
  FK3Import,
  FBillType,
  FInvoiceType,
  FItemClassID,
  FExplanation,
  FPreparer,
  FStatus,
  FToBal
 )
 SELECT
  @ID,
  YEAR(FDate),
  MONTH(FDate),
  1,
  3,
  FDate,
  FDate,
  @SaleBillNo,
  FSupplyID,
  FDeptID,
  FEmpID,
  1,
  1,
  @Amount,
  @Amount,
  @Amount,
  @Amount,
  @SaleInterID,
  FDate,
  1,
  1,
  1,
  1,
  '',
  @BillerID,
  1,
  1
 FROM
  ICStockBill
 WHERE
  FInterID = @InterID;

 INSERT INTO t_RP_Plan_Ar
 (
  FOrgID,
  FDate,
  FAmount,
  FAmountFor,
  FRemainAmount,
  FRemainAmountFor,
  FRP,
  FInterID
 )
 SELECT
  FID,
  FDate,
  FRemainAmount,
  FRemainAmount,
  FRemainAmount,
  FRemainAmount,
  FRP,
  FInvoiceID
 FROM
  t_RP_Contact
 WHERE
  FID = @ID;

 UPDATE
  t_Organization
 SET
  FLastTradeDate = FDate,
  FLastTradeAmount = @Amount
 FROM
  t_Organization, inserted
 WHERE
  FItemID = FSupplyID;

 SELECT @GroupNo = ISNULL(MAX(FGroupNo), 0) + 1 FROM ICHookRelations;
 
 INSERT INTO
  ICHookRelations
 SELECT
  @GroupNo,
  1,
  0,
  0,
  @SaleInterID,
  @SaleBillNo,
  'X',
  MONTH(FDate),
  YEAR(FDate),
  0,
  FDate,
  FEntryID,
  FItemID,
  0,
  FQty,
  FSupplyID,
  0,
  @BillerID,
  0,
  FSaleStyle,
  FConsignAmount,
  80,
  0
 FROM
  ICStockBillEntry
  LEFT JOIN ICStockBill ON ICStockBill.FInterID = ICStockBillEntry.FInterID
 WHERE
  ICStockBillEntry.FInterID = @InterID
 UNION SELECT
  @GroupNo,
  1,
  0,
  1,
  @InterID,
  @BillNo,
  'X',
  MONTH(FDate),
  YEAR(FDate),
  0,
  FDate,
  FEntryID,
  FItemID,
  0,
  FQty,
  FSupplyID,
  0,
  @BillerID,
  0,
  FSaleStyle,
  FConsignAmount,
  21,
  0
 FROM
  ICStockBillEntry
  LEFT JOIN ICStockBill ON ICStockBill.FInterID = ICStockBillEntry.FInterID
 WHERE
  ICStockBillEntry.FInterID = @InterID;

 UPDATE
  ICStockBill
 SET
  FRelateInvoiceID = @SaleInterID,
  FHookInterID = @GroupNo,
  FHookStatus = 2
 WHERE
  FInterID = @InterID;

 UPDATE
  ICStockBillEntry
 SET
  FAllHookQTY = FQty,
  FCurrentHookQTY = FQty,
  FQtyInvoice = FQty,
  FAuxQtyInvoice = FQty
 WHERE
  FInterID = @InterID;

 UPDATE
  ICSale
 SET
  FCheckDate = FDate,
  FCheckerID = @BillerID,
  FStatus = 1,
  FHookerID = @BillerID,
  FArApStatus = FArApStatus | 1,
  FHookStatus = 2,
  FHookInterID = @GroupNo
 WHERE
  FInterID = @SaleInterID;

 UPDATE
  ICSaleEntry
 SET
  FAllHookQTY = FQty,
  FAllHookAmount = FAmountincludetax,
  FCurrentHookQTY = FQty,
  FCurrentHookAmount = FAmountincludetax,
  FStdAllHookAmount = FAmountincludetax,
  FStdCurrentHookAmount = FAmountincludetax
 WHERE
  FInterID = @SaleInterID;

 

本人所写的批量生成发票及批量录回款程序在我公司已经使用七八个月,没任何问题。如果有类似需求的用户,请与本人联络。