//Cfhzfy,Cffy,表为包含所要减的药品的记录表,表的cachedupdate为true;//databasename:=mzyf库
procedure TFcffy.Fcffyfx1SpeedButton1Click(Sender: TObject);
var
  list:tstringlist;
  i,zsl,ysl,zlsl,slsl:integer;//zsl总数量,ysf应发药品的数量,zlsl剩余药品的整量,slsl剩余药品的散量
  minkc:integer;//最小库存
  yf:integer;
begin
  yf:=getconfig(5,'mzyf','config');    //取药房种类2
  if isjkc=false then//判断是否门诊药房减库存  false 不是
  begin
    try
      dm.cfhzfy.Edit;//处方汇总表cachedupdate=true
      dm.cfhzfy['fyr']:=userinf.usercode;
      dm.cfhzfy['qdrq']:=nowdate;
      dm.cfhzfy.Post;
      dm.mzyf.StartTransaction;                   //开始进程mzyf库
      try
        dm.cfhzfy.ApplyUpdates;
        dm.mzyf.Commit;
        BitBtn1.Enabled:=false; //用来发药的按钮
      except
        dm.mzyf.Rollback;//回滚数据
        errormessage('未知的错误,数据没有保存!');
      end;
    finally
      dm.cfhzfy.Close;
      dm.cffy.Close;
      fcffyhx1.edit1.SetFocus;
    end;
  end
  else         //执行门诊药房减库
  begin
    try
      dm.cfhzfy.Edit;
      dm.cfhzfy['fyrq']:=getdate1('mzyf');//发药日期字段
      dm.cfhzfy['fyr']:=userinf.usercode; //发药人字段
      dm.cfhzfy['qdrq']:=nowdate;  //日期字段
      dm.cfhzfy.Post;
      list:=tstringlist.Create;
      list.Clear;
      dm.cffy.First;
      while not dm.cffy.Eof do//检索所发药品的种数,bh为唯一字段
      begin
        if (dm.cffy['invalid']=0) and (dm.cffy['sl']*dm.cffy['zh']>0) then//填加份数计算
          list.Append(dm.cffy['bh']);
        dm.cffy.Next;
      end;
      dm.kc.Close;
      dm.kc.Open; //打开库存表
      if ispubkc then
        requery(dm.pubkc,'kc','bh',list,'');
      dm.cffy.First;
      while not dm.cffy.Eof do
      begin
      ///////////////////以下是填加的过程,用来判断库存上下限//////////
      query1.Close;
      query1.sql.text:='select * from ymdm where ypcode=:ypcode';
      query1.ParamByName('ypcode').asstring:=dm.cffy.fieldbyname('ypcode').asstring;
      query1.open;      if yf=2 then//门诊药房减库      minkc:=query1.fieldbyname('mzminkc').asinteger  //最小库存该值为0
      else
      minkc:=query1.fieldbyname('zhminkc').asinteger;
      ///////////////////////////////////////////////// 以下填加份数计算zh是份数字段
        if (dm.cffy['invalid']=0) and (dm.cffy['sl']*dm.cffy['zh']>0) then
        begin
          if dm.kc.Locate('bh',dm.cffy['bh'],[loCaseInsensitive]) then
          begin
            zsl:=sltosepsl(dm.kc['sl'],dm.kc['tomin'])+dm.kc['sepsl'];   //当前库存中该药品的所有数量
            if dm.cffy['dwclass'] then   //判断所发药品的类型(是整瓶的还是散量)
              ysl:=sltosepsl(dm.cffy['sl']*dm.cffy['zh'],dm.kc['tomin']) //填加份数
            else
              ysl:=dm.cffy['sl']*dm.cffy['zh'];//填加(zh)份数
            if zsl-ysl>=0 then   //当前库存数-应发药数>=0
            begin
            if zsl-ysl<minkc then //当前库存数-应发药数<最小库存
              begin
              if messagebox(0,pchar(query1.fieldbyname('pm').asstring+'该药品发药数量已经低于库存下限是否继续?'),'提示',mb_yesno+mb_iconinformation)=idyes then
              begin
              sepsltosl(zsl-ysl,dm.kc['tomin'],zlsl,slsl);//减库根据药品规格计算出减库后的药品的整和散的数量
              dm.kc.Edit;
              dm.kc['sl']:=zlsl; //药品整量
              dm.kc['sepsl']:=slsl; //药品散量
              dm.kc.Post; //更新cachedupdate=true;
             end
            else
            exit;
            end
            else
            begin
              sepsltosl(zsl-ysl,dm.kc['tomin'],zlsl,slsl);//减库根据药品规格计算出减库后的药品的整和散的数量
              dm.kc.Edit;
              dm.kc['sl']:=zlsl;
              dm.kc['sepsl']:=slsl;
              dm.kc.Post;
              end;
            end
            else
            begin
             errormessage('"'+dm.cffy['ypname']+'"'+'该编号的药品数量不够,请重新划价');
             exit;
            end;
            end;
            //////////////////////////////////
          end
          else
           begin
             errormessage('库存中无'+'"'+dm.cffy['ypname']+'"'+'该编号的药品,请重新划价!');
             exit;
           end;
        dm.cffy.Next;
      end;
      dm.mzyf.StartTransaction; //开进程
      try
        dm.cfhzfy.ApplyUpdates;//更新
        dm.kc.ApplyUpdates;      //更新
        dm.mzyf.Commit;  //
        BitBtn1.Enabled:=false;
        infomessage('发药完成,请发下一处方!')
      except
        dm.mzyf.Rollback;
        if ispubkc then
          dm.pubyf.Rollback;
        errormessage('未知的错误,数据没有保存!');
      end;
    finally
      dm.cfhzfy.Close;
      dm.cffy.Close;
      dm.kc.Close;
      fcffyhx1.edit1.SetFocus;
     // infomessage('发药完成!')    end;
  end;