全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1846
推到 Plurk!
推到 Facebook!

[StringGrid]第2筆搜尋如何尾隨第1筆搜尋的RowCount之後

缺席
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-10 16:01:32 IP:60.248.xxx.xxx 訂閱
我在StringGrid 下兩筆SQL,

以下是我的第一段語法,第二段跟第一段只有一行不一樣其餘都一樣


[code delphi]

//填入的欄位,1~5 都是固定值 , 6~10 是變數
Cells[1,RowCount-2] := '工單';
Cells[2,RowCount-2] := '機種名稱';
Cells[3,RowCount-2] := '批量';
Cells[4,RowCount-2] := '已投入';
Cells[5,RowCount-2] := '今日組裝';
Cells[6,RowCount-2] := '組裝不良';
Cells[7,RowCount-2] := '組裝直通率';
Cells[8,RowCount-2] := '今日測試';
Cells[9,RowCount-2] := '測試不良';
Cells[10,RowCount-2] := '測試直通率';

//SQL
S1 := 'SELECT A.WORK_ORDER "工單",C.PART_NO "機種名稱",D.TARGET_QTY "批量",D.INPUT_QTY "已投入", '
'NVL(A.OUTPUT_QTY,0) "今日組裝",NVL(SUM(B.FAIL_QTY),0) "組裝不良", '
'TRUNC((A.OUTPUT_QTY - (SUM(B.FAIL_QTY)))*100 / A.OUTPUT_QTY,0)||''%'' "組裝直通率" '

'FROM SAJET.G_KB_COUNT A, '
'SAJET.G_SN_COUNT B, '
'SAJET.SYS_PART C, '
'SAJET.G_WO_BASE D '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND A.WORK_DATE = B.WORK_DATE '
'AND A.WORK_ORDER = D.WORK_ORDER '
'AND A.MODEL_ID = C.PART_ID '
'AND A.STAGE_NAME IN (''1.ASSY'') ' //第二段SQL跟這段一模一樣,唯一不同就是這裡下的 STAGE 不同,第二筆是2.TEST
'AND A.WORK_DATE = TO_CHAR(SYSDATE,''YYYYMMDD'') '
'GROUP BY A.WORK_ORDER,C.PART_NO,D.TARGET_QTY,D.INPUT_QTY,A.STAGE_NAME,A.OUTPUT_QTY '
'ORDER BY A.STAGE_NAME ';
[/code]


那我想以A.WORK_ORDER 當作主鍵,第二段搜尋出來的資料,
如果"組裝的WORK_ORDER" = "測試WORK_ORDER" , 那就填入"組裝"後面的"測試欄位"
那如果 WORK_ORDER不等於 , 就自動排列在組裝的下一行...

請問該如何實現....

感謝大家....
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-03-10 16:02:42, 註解 無‧
lovemari 重新編輯於 2008-03-11 13:05:35, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-11 08:28:39 IP:60.248.xxx.xxx 訂閱
補充敘述


[code delphi]
Cells[1,RowCount-2] := '工單';
Cells[2,RowCount-2] := '機種名稱';
Cells[3,RowCount-2] := '批量';
Cells[4,RowCount-2] := '已投入';
Cells[5,RowCount-2] := '今日組裝';
Cells[6,RowCount-2] := '組裝不良';
Cells[7,RowCount-2] := '組裝直通率';
Cells[8,RowCount-2] := '今日測試';
Cells[9,RowCount-2] := '測試不良';
Cells[10,RowCount-2] := '測試直通率';
[/code]


cells[1-4] ,工單,機種名稱,批量,已投入,是固定值
cells[5-7] ,組裝的值,以工單來當主鍵,如果搜尋有組裝資料,就填入數據到Cells[5 - 7]
cells[8-10],測試的值,以工單來當主鍵,如果搜尋有測試資料,就填入數據到Cells[8 - 10]
=======================第一種問題======================
假設工單11A00001 , (機種名稱,批量,已投入,先不管)
有組裝數據跟測試數據,那希望呈現成為
11A00001,今日組裝=8,組裝不良=0,組裝直通率=100%,今日測試=8,測試不良=1,測試直通率=88%
由於組裝跟測試的SQL是分開下的,如果測試的工單=組裝的工單(都是11A00001來講,有組裝跟測試的數據)
就把搜尋出來的測試數據跟組裝數據,以一行來顯示
======================第二種問題=======================
假設我組裝搜尋出來的工單有三筆,11A00001,22A00002,33A00003,但是
測試搜尋出來有兩筆而且跟組裝的工單不一樣,44A00004,55A00005
這時候希望呈現的是..
11A00001,今日組裝=10,組裝不良=0,組裝直通率=100%,今日測試=0,測試不良=0,測試直通率=0 (沒有測試數據)
22A00002,今日組裝=20,組裝不良=0,組裝直通率=100%,今日測試=0,測試不良=0,測試直通率=0 (沒有測試數據)
33A00003,今日組裝=30,組裝不良=0,組裝直通率=100%,今日測試=0,測試不良=0,測試直通率=0 (沒有測試數據)
44A00004,今日組裝=0,組裝不良=0,組裝直通率=0,今日測試=40,測試不良=0,測試直通率=100% (沒有組裝數據)
55A00005,今日組裝=0,組裝不良=0,組裝直通率=0,今日測試=50,測試不良=0,測試直通率=100% (沒有組裝數據)
就是希望能呈現44A,55A系列的測試數據能夠自動排列在組裝的下一行(RowCount)
因為一開始不知道組裝搜尋出來的數據有多少RowCount,想要測試數據就自動排列在
組裝的RowCount 1

------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-12 02:30:04 IP:220.134.xxx.xxx 訂閱

[code delphi]
while not adods.eof do begin
indStr := trim(aods.FieldByName('WORK_ORDER ').AsString);
ttC := ttStr.indxof(indStr) ;
if ttC > -1 then begin
SG.Cells[6,ttC] :=........
end else begin
SG.Cells[1,ttR]:=...
ttStr.Add(indStr);
Inc(ttR);
end;
end;
[/code]


===================引 用 lovemari 文 章===================
我在StringGrid 下兩筆SQL,

以下是我的第一段語法,第二段跟第一段只有一行不一樣其餘都一樣


[code delphi]

//填入的欄位,1~5 都是固定值 , 6~10 是變數
Cells[1,RowCount-2] := '工單';
Cells[2,RowCount-2] := '機種名稱';
Cells[3,RowCount-2] := '批量';
Cells[4,RowCount-2] := '已投入';
Cells[5,RowCount-2] := '今日組裝';
Cells[6,RowCount-2] := '組裝不良';
Cells[7,RowCount-2] := '組裝直通率';
Cells[8,RowCount-2] := '今日測試';
Cells[9,RowCount-2] := '測試不良';
Cells[10,RowCount-2] := '測試直通率';

//SQL
S1 := 'SELECT A.WORK_ORDER "工單",C.PART_NO "機種名稱",D.TARGET_QTY "批量",D.INPUT_QTY "已投入", '
'NVL(A.OUTPUT_QTY,0) "今日組裝",NVL(SUM(B.FAIL_QTY),0) "組裝不良", '
'TRUNC((A.OUTPUT_QTY - (SUM(B.FAIL_QTY)))*100 / A.OUTPUT_QTY,0)||''%'' "組裝直通率" '

'FROM SAJET.G_KB_COUNT A, '
'SAJET.G_SN_COUNT B, '
'SAJET.SYS_PART C, '
'SAJET.G_WO_BASE D '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND A.WORK_DATE = B.WORK_DATE '
'AND A.WORK_ORDER = D.WORK_ORDER '
'AND A.MODEL_ID = C.PART_ID '
'AND A.STAGE_NAME IN (''1.ASSY'') ' //第二段SQL跟這段一模一樣,唯一不同就是這裡下的 STAGE 不同,第二筆是2.TEST
'AND A.WORK_DATE = TO_CHAR(SYSDATE,''YYYYMMDD'') '
'GROUP BY A.WORK_ORDER,C.PART_NO,D.TARGET_QTY,D.INPUT_QTY,A.STAGE_NAME,A.OUTPUT_QTY '
'ORDER BY A.STAGE_NAME ';
[/code]


那我想以A.WORK_ORDER 當作主鍵,第二段搜尋出來的資料,
如果"組裝的WORK_ORDER" = "測試WORK_ORDER" , 那就填入"組裝"後面的"測試欄位"
那如果 WORK_ORDER不等於 , 就自動排列在組裝的下一行...

請問該如何實現....

感謝大家....
------
程式沒有這麼難
只是還沒打通其中要絕
編輯記錄
shunaaron 重新編輯於 2008-03-12 02:31:56, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-12 11:17:16 IP:60.248.xxx.xxx 訂閱
痾 大大我有點看不是很懂耶

你能夠說明一下嗎?



===================引 用 shunaaron 文 章===================

[code delphi]
while not adods.eof do begin
indStr := trim(aods.FieldByName('WORK_ORDER ').AsString);
ttC := ttStr.indxof(indStr) ;
if ttC > -1 then begin
SG.Cells[6,ttC] :=........
end else begin
SG.Cells[1,ttR]:=...
ttStr.Add(indStr);
Inc(ttR);
end;
end;
[/code]


------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-12 11:33:55 IP:60.248.xxx.xxx 訂閱
有人提供一各方法把第二段的語法加上回圈

[code delphi]
FOR i:=1 to StringGrid1.RowCount-1 do
j:=i;
if StringGrid1.Cells[1,j] <> ''

then begin
.....
....
....
WORK_ORDER = ''' StringGrid1.Cells[0,j] '''

[/code]


我照作了 可是依然無法實現我的目的

是不是那錯了
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-05-13 01:17:12 IP:220.134.xxx.xxx 訂閱
ttC := ttStr.indxof(indStr) ;
當ttC等於-1時,表示尚未在StringGrid裡出現
所以算是"新"的資料
至資料加入StringGrid裡
並且加到ttSr(TStringList)裡
在加StringGrid的RowCount 1
如果不是-1就表示有加過了
就加在相對的列後面
ttC所對印的值
會是StringGrid的列數
所以直接加用SG.Cells[6,ttC] 即可
TRY
===================引 用 lovemari 文 章===================
痾 大大我有點看不是很懂耶

你能夠說明一下嗎?



===================引 用 shunaaron 文 章===================

[code delphi]
while not adods.eof do begin
indStr := trim(aods.FieldByName('WORK_ORDER ').AsString);
ttC := ttStr.indxof(indStr) ;
if ttC > -1 then begin
SG.Cells[6,ttC] :=........
end else begin
SG.Cells[1,ttR]:=...
ttStr.Add(indStr);
Inc(ttR);
end;
end;
[/code]


------
程式沒有這麼難
只是還沒打通其中要絕
編輯記錄
shunaaron 重新編輯於 2008-05-13 01:19:31, 註解 無‧
系統時間:2024-04-19 8:29:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!