//通过系统设置的穿口打印到各厨房 ---分单
  prtsetQ.Close;
  prtsetQ.SQL.Clear;
  prtsetQ.SQL.Add('select * from prtset where type=' + '''' + 'C' + '''' + ' and port like ' + '''' + '%' + rjsmain.computer_name + '%' + '''' + ' order by bh');
  prtsetQ.Open;
  while not prtsetQ.Eof do
  begin
    printername := prtsetQ.FieldValues['port'];
    prtQ.Close;
    prtQ.SQL.Clear;
    //可根据不同的打印机往不同的窗口打印水单
    prtQ.SQL.Add('select * from dcd where djh='
      + '''' + djh + '''' + ' and cfdyjhm=' + '''' + prtsetQ.FieldByName('bh').AsString
      + '''' + ' and ((dcd.prn is null and dcd.zfbz=0) or ((prn='
      + '''' + 'Y' + '''' + ') and (zfbz=1))) and sl>0 order by djh, ID');
    prtQ.Open;
    prtQ.First;
    if prtQ.RecordCount > 0 then
    begin
      mm := Tprinter.Create;
      jj := mm.printers.Count - 1;
      for ii := 0 to jj do
      begin
        if lowercase(mm.printers.Strings[ii]) = lowercase(printername) then
        begin
          while not prtQ.Eof do
          begin
            AssignPrn(PText);
            Rewrite(PText);
            try
              mm.PrinterIndex := ii;
//              mm.Canvas.Font.name := '楷书';
              mm.Canvas.Font.Size := 8;
              writeln(PText, ' 单据号:' + prtQ.FieldByName('djh').AsString);
              writeln(PText, ' 餐厅:' + prtQ.FieldByName('th').AsString + '  台位号:' + prtQ.FieldByName('twbh').AsString);
              writeln(PText, '  菜    名    数量   加工描述');
              writeln(PText, ' ' + prtQ.FieldByName('mc').AsString + '  ' + prtQ.FieldByName('sl').AsString + ' ' + prtQ.FieldByName('memo').AsString);
            finally
              CloseFile(PText);
            end;
            //另一种方法
{            mm.PrinterIndex := ii;
            mm.BeginDoc;
            mm.Canvas.Font.Size := 8;
            mm.Canvas.TextOut(50, 20, ' 单据号:' + prtQ.FieldByName('djh').AsString);
            mm.Canvas.TextOut(50, 100, ' 餐厅:' + prtQ.FieldByName('th').AsString + '  台位号:' + prtQ.FieldByName('twbh').AsString);
            mm.Canvas.TextOut(50, 180, ' 菜        名         数量    加工描述');
            mm.Canvas.TextOut(50, 260, prtQ.FieldByName('mc').AsString);
            mm.Canvas.TextOut(550, 260, prtQ.FieldByName('SL').AsString);
            mm.Canvas.TextOut(700, 260, prtQ.FieldByName('memo').AsString);
            mm.EndDoc;}
            //结束
            prtQ.Next;
          end;
        end;
      end;
    end;
    prtsetQ.Next;
  end;

解决方案 »

  1.   

     這同你的網絡和客戶端電腦的配置有很大關系,SQL沒發現大的問題。
      

  2.   

    将创建mm这句mm := Tprinter.Create;移到if prtQ.RecordCount > 0 then 之前,否则每条记录都创建一次也会费时。
      

  3.   

        prtQ.Close;
        prtQ.SQL.Clear;
        //可根据不同的打印机往不同的窗口打印水单
        prtQ.SQL.Add('select * from dcd where djh='
          + '''' + djh + '''' + ' and cfdyjhm=' + '''' + prtsetQ.FieldByName('bh').AsString
          + '''' + ' and ((dcd.prn is null and dcd.zfbz=0) or ((prn='
          + '''' + 'Y' + '''' + ') and (zfbz=1))) and sl>0 order by djh, ID');
        prtQ.Open;
        prtQ.First; 
    这一段,先查询,然后通过Filter来取得你要的内容。这样会比你每次都查询要快点。