dear aiirii:
  我為剛接觸DELPHI不久,因公司的操作 oracle DB 的plsqldev工具存在 : 
每次只能查出1000個已知關健字段的相關信息,超過1000後會報錯,
如果我將一個EXCEL表中共近10000條某字段字紀,導入DELPHI,來查出其的站別分布,就無法實現。(假設這表sfism4.r_wip_tracking_t 中有 serial_number,group_name,LINE_NAME 三字段)
我的serial_number 來自客房提供的EXCEL 文檔,可能會達到上10000
我用LISTVIEW 控件利用FOR 循環可實現查出每個SN的詳細信息,可站別分布無法得出,只能得出每SN的所在站別和個數。
CODE 如下:procedure TForm1.BitBtn2Click(Sender: TObject);
var
  VMsExcel, MsExcelWorkBook: variant;
  i: integer;
  k: integer;
  a: integer;
  SDate: Tdate;
  Temp: string;
  q:integer;
  Result_List: TStringlist;
begin
  try
    if fileexists(Ed_path.Text) then
    begin
      VMsExcel := CreateOleObject('Excel.Application');
      try      except
        Application.Messagebox('Excel沒有安裝!', '系統提示');
        Abort;
      end;      begin
        MsExcelWorkBook := VMsExcel.workbooks.open(Ed_path.Text);
        if (VMsExcel.Range[F10To26(1) + '1'].value = 'SN') then
        begin
          Bom_KP := TstringList.Create;
          Result_List := TStringlist.Create;
          q:=1;
          for i := 2 to VMsExcel.Activesheet.usedrange.rows.count do
          begin
            sn := trim(VMsExcel.Cells[i, 1].Value);
            with mbquery do
            begin
              close;
              SQL.Clear;
            if CheckBox1.Checked=false then
             begin
              sql.add('select * from sfism4.r_wip_tracking_t where serial_number=:sn');
              ParamByName('sn').AsString := sn;
              open;
              if mbquery.RecordCount > 0 then
              begin
                Temp := '1,' + inttostr(q) + ',' +
                  mbquery.fieldbyname('serial_number').AsString + ',' +
                  mbquery.fieldbyname('model_name').AsString + ',' +
                  mbquery.fieldbyname('line_name').AsString + ',' +
                  mbquery.fieldbyname('group_name').AsString + ',' +
                  mbquery.fieldbyname('next_station').AsString;
                Result_List.Add(temp); ////一條條累加起來 ,一起顯示
                temp := '';
                q:= q + 1 ;
              end;
             end;
             if CheckBox1.Checked=true then
              begin
               /// listview1.Visible:=false;
               //// dbgrid1.Visible:=true;
                listview1.Clear;
                sql.add('select t.group_name,count(t.serial_number) qty ' +
                'from sfism4.r_wip_tracking_t t where t.serial_number=:sn ' +
                ' group by t.group_name');
                ParamByName('sn').AsString := sn;
                open;
                if mbquery.RecordCount > 0 then
               begin
                Temp := '1,' + inttostr(q) + ',' +
                  mbquery.fieldbyname('group_name').AsString + ',' +
                  mbquery.fieldbyname('qty').AsString;
                Result_List.Add(temp); ////一條條累加起來 ,一起顯示
                temp := '';
                q:= q + 1 ;
               end;
              end;
           end;
          end;
          res := Result_List.Text; ////一條條累加起來 ,一起顯示
          Bom_KP.Text := res;
          ListView1.Items.Count := Bom_KP.Count + 1; ////(listview from 1to)  use by 364
          if Bom_KP.Count > 0 then
          begin
            for i := 0 to Bom_KP.Count - 1 do
            begin
              SplitString(Bom_KP[i], ',');
              if Temp_List[0] = '0' then
                ListView1.Items.Add.ImageIndex := 0
              else
                ListView1.Items.Add.ImageIndex := 1;              for a := 1 to Temp_List.Count - 1 do
              begin
                ListView1.Items[i].SubItems.Add(Temp_List[a]);  ////a=1表示為第二列如SN,KEYPART_NO, CHECK_FLAG填到表中
                application.ProcessMessages; ///代?在?行的?程中,接受到消息是不?行的,
              end;
            end;
            Bom_KP.Free;
            Temp_List.Free;
          end
        end
      end;
      MsExcelWorkBook.close;    end;
    panel3.Caption:='QUERY OK!'
  finally    VMsExcel.Quit;
  end;
end;

解决方案 »

  1.   

    我說的就是查出10000個SERIAL_NUMBER的group_name  分布這10000個SN來自EXCEL
    示示例如下:
    GROUP_NAME COUNT(SERIAL_NUMBER)
    CHANGESN      1
    MB             310
    VGA_F/T               93
    詳細分布我用LISTVIEW已經實現:



    SERIAL_NUMBER LINE_NAME  GROUP_NAME MODEL_NAME   IN_STATION_TIME KEY_PART_NO 
    2078864103488 2PCBB MB IBL30 LA5 2007/8/1 上午 12:53:21 46145932L05
    2079282800891 2PCBF MB IBL80 L04 2007/8/1 上午 12:53:17 46148632L04
    2079201201854 2PCBI MB IAT60 L22 2007/8/1 上午 12:53:16 46147932L22
    2079201201857 2PCBI MB IAT60 L22 2007/8/1 上午 12:53:07 46147932L22
    2079255800516 2PCBG MB HAT00 A01 2007/8/1 上午 12:52:52 46140332L01
    2079282800892 2PCBF MB IBL80 L04 2007/8/1 上午 12:52:50 46148632L04
    2079282800896 2PCBF MB IBL80 L04 2007/8/1 上午 12:52:44 46148632L04
    2079255800517 2PCBG MB HAT00 A01 2007/8/1 上午 12:52:42 46140332L01
    2079201201856 2PCBI MB IAT60 L22 2007/8/1 上午 12:52:39 46147932L22
    2079282800913 2PCBF MB IBL80 L04 2007/8/1 上午 12:52:37 46148632L04
      

  2.   

    我还是没明白楼主的意思,我說的就是查出10000個SERIAL_NUMBER的group_name    -- 根据表查询出10000个记录
    分布這10000個SN來自EXCEL               这个没明白您的意思
      

  3.   

    每次只能查出1000個已知關健字段的相關信息,超過1000後會報錯, --这是什么意思???
    我们这里使用Oracle数据库表中的记录都超过了1000万,都没有出现你说过的情况!!!你的需求其实很简单,一个SQL语句就解决了!!!Select Group_Name, Count( * )
           From YOUR_TABLE_NAME
           Froup By Group_Name;
      

  4.   

    我現在重新表達一下,本公司利用plsqldev工具操作DB ,此工具存在:
    我程式功能為根據客戶提供的近10000條serial_number 值,在sfism4.r_wip_tracking_t 表中查出它的group_name 分布.
    表單  sfism4.r_wip_tracking_t 中存在如下字段:
    SERIAL_NUMBER LINE_NAME     GROUP_NAME     MODEL_NAME     IN_STATION_TIME        KEY_PART_NO   
    2078864103488 2PCBB            MB            IBL30LA5      2007/8/1               46145932L05 
    2079282800891 2PCBF            MB            IBL80        L04 2007/8/1             46148632L04 
    2079201201854 2PCBI            F/T           IAT60        L22 2007/8/1            46147932L22 
    我用  select group_name  ,count(serial_number) from sfism4.r_wip_tracking_t where serial_number
    in ('','','',)  gruop by group_name   
    此中因公司只可用PLSQLDEV 來操作DB ,而對此工具,它存在用IN(‘’)語句時查詢紀綠不能超過1000條的限制,
    請問:我用何種方法可避開此限制,一次性顯示這10000個SERIAL_NUMBER的GROUP_NAME分布,
    由之前的表達不好,還請見諒
    望高手相助,完成本人第一枝程式。
      

  5.   

    而對此工具,它存在用IN(‘’)語句時查詢紀綠不能超過1000條的限制这只是Oracle的对“常量”的限制,如果你从表中查就没问题了:select ... from ... where ... in (select ... from ...)
      

  6.   

    這正是問題的關健,我要查的是10000條,而不是1000
    而且SERIAL_NUMBER是無規則,並且是我導入的
      

  7.   

    ListView1内存有限制.
    ListView1 中有个 Allocby 属性(缺省=0),加大它,可以分配更多的内存,可以存更多记录.
      

  8.   

    我勉强回答一下楼主的问题,请别见怪哦:
    1.写程序首先要搞清楚需求,楼主的需求到底是怎样的?我来分析一下:
      也就是站点信息查询,查询条件可多项,可直接由EXCEL拷贝到查询条件框(这比由用户导入EXCEL要简单多了)
      查询结果可按依据查询条件做汇总显示,又可查看各站点明细需求如果没猜错的话,其实现很简单(我很早前就做个这个),
    1.用memo(好像是这个)来接受条件的录入或拷贝,应该可直接从EXCEL拷贝10000条SN到memo(我做的查询一般只有几百条,不知道会不会超过一W的限制)
    2.DELPHI前端条件将memo数据循环连接(连接符可用‘/’或‘,’),作为参数传入到后台数据查询过程
    3.数据库后台存储过程首先对接受参数进行处理,将多个查询条件逐一分解,并加入到一临时表
    4.而后查询语句就类似于:select field1,field2,... from table1 where field in (select field from #temp)
    5.前台结果集用cxgrid显示,用户可自由实现分组,及明细查看,而不用写繁杂代码
    技术有限,就会cxgrid,有N久不回答问题,如有不正确的地方望理解 :) 
      
      
      

  9.   

    這正是問題的關健,我要查的是10000條,而不是1000 
    而且SERIAL_NUMBER是無規則,並且是我導入的
    -----------------我倒,你不能建个临时表吗?
      

  10.   

    wdsimon 
    感謝你的幫忙,我要結帖,
    請問積分如何給阿日。
      

  11.   

    現在出現一個新的問題,
    我用IN 語句對10000條SERIAL_NUMBER分10部份進行查詢,並分10次賦值到LISTVIEW控件中,而現在我想將相同GROUP_NAME進行漚總。就如EXCEL 的篩遷功能一樣。
    我再一次申明因我們公司的部門劃分不一樣,加臨時表的方法是最後的方法,我一般不想使用。因為這涉及到部門會議,以及各種其它方面情況。
    望阿日可以幫我解決下這個篩選功能
      

  12.   

    我勉强回答一下楼主的问题,请别见怪哦: 
    1.写程序首先要搞清楚需求,楼主的需求到底是怎样的?我来分析一下: 
        也就是站点信息查询,查询条件可多项,可直接由EXCEL拷贝到查询条件框(这比由用户导入EXCEL要简单多了) 
        查询结果可按依据查询条件做汇总显示,又可查看各站点明细 需求如果没猜错的话,其实现很简单(我很早前就做个这个), 
    1.用memo(好像是这个)来接受条件的录入或拷贝,应该可直接从EXCEL拷贝10000条SN到memo(我做的查询一般只有几百条,不知道会不会超过一W的限制) 
    2.DELPHI前端条件将memo数据循环连接(连接符可用‘/’或‘,’),作为参数传入到后台数据查询过程 
    3.数据库后台存储过程首先对接受参数进行处理,将多个查询条件逐一分解,并加入到一临时表 
    4.而后查询语句就类似于:select   field1,field2,...   from   table1   where   field   in   (select   field   from   #temp) 
    5.前台结果集用cxgrid显示,用户可自由实现分组,及明细查看,而不用写繁杂代码 
    技术有限,就会cxgrid,有N久不回答问题,如有不正确的地方望理解   :)   
        
        針對,阿日的回答我90%滿意,阿日的水平一定很高,這從個人涵養以及技術分析上可看出。
    在此奉勸某些人,不要以為多寫了點程式就了不起,IT永遠沒有絕對的資深,只有不斷持學習和進步。