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;
我為剛接觸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;
示示例如下:
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
分布這10000個SN來自EXCEL 这个没明白您的意思
我们这里使用Oracle数据库表中的记录都超过了1000万,都没有出现你说过的情况!!!你的需求其实很简单,一个SQL语句就解决了!!!Select Group_Name, Count( * )
From YOUR_TABLE_NAME
Froup By Group_Name;
我程式功能為根據客戶提供的近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分布,
由之前的表達不好,還請見諒
望高手相助,完成本人第一枝程式。
而且SERIAL_NUMBER是無規則,並且是我導入的
ListView1 中有个 Allocby 属性(缺省=0),加大它,可以分配更多的内存,可以存更多记录.
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久不回答问题,如有不正确的地方望理解 :)
而且SERIAL_NUMBER是無規則,並且是我導入的
-----------------我倒,你不能建个临时表吗?
感謝你的幫忙,我要結帖,
請問積分如何給阿日。
我用IN 語句對10000條SERIAL_NUMBER分10部份進行查詢,並分10次賦值到LISTVIEW控件中,而現在我想將相同GROUP_NAME進行漚總。就如EXCEL 的篩遷功能一樣。
我再一次申明因我們公司的部門劃分不一樣,加臨時表的方法是最後的方法,我一般不想使用。因為這涉及到部門會議,以及各種其它方面情況。
望阿日可以幫我解決下這個篩選功能
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永遠沒有絕對的資深,只有不斷持學習和進步。