TStringList該怎麼用?? |
缺席
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
小弟下好幾各SQL 然後需要做Order By
想先丟到TStringList 作好Order by 再填入 StringGrid 請教該怎麼寫這段呢? [code delphi] With AdvStringGrid1 do begin Cells[0,0] := 'This Week'; Cells[1,0] := 'Work Order'; Cells[2,0] := 'Product Name'; Cells[3,0] := 'Target QTY'; Cells[4,0] := 'In Pdline Time'; Cells[5,0] := 'Input QTY'; Cells[6,0] := 'Assyt'; Cells[7,0] := 'BurnIn'; Cells[8,0] := 'Test'; Cells[9,0] := 'Packing'; Cells[10,0] := 'QC'; Cells[11,0] := 'Repair'; Cells[12,0] := 'WareHouse'; end; with csTempWOa do begin Close; Params.Clear; w1 := 'SELECT ROW_NUMBER() OVER (ORDER BY B.WORK_ORDER) AS SEQ, ' 'B.WORK_ORDER "Work Order",C.PART_NO "Product Name",B.TARGET_QTY "Target QTY",B.INPUT_QTY "Input QTY",B.WO_START_DATE "In Pdline Time", ' 'COUNT(DISTINCT A.SERIAL_NUMBER) "Assyt" ' 'FROM SAJET.G_SN_STATUS A, ' 'SAJET.G_WO_BASE B, ' 'SAJET.SYS_PART C ' 'WHERE A.WORK_ORDER = B.WORK_ORDER ' 'AND B.MODEL_ID = C.PART_ID ' 'AND B.WO_CLOSE_DATE IS NULL ' 'AND A.STAGE_ID <> ''100015'' ' 'AND A.WIP_PROCESS IN (''100020'',''100021'',''100029'',''100031'',''100045'',''100034'',''100036'',''100043'',''100033'',''100044'',''100048'') ' 'AND B.WO_STATUS = ''3'' ' 'AND B.WORK_ORDER not in (''51A00001'',''61A00001'') ' 'AND TO_CHAR(A.OUT_PROCESS_TIME,''YYYY'') = TO_CHAR(SYSDATE,''YYYY'') ' // 'AND ROUND(SYSDATE - A.OUT_PROCESS_TIME) < 40 ' 'AND TO_CHAR(SYSDATE,''YYYYMMDD'') = TO_CHAR(A.OUT_PROCESS_TIME,''YYYYMMDD'') ' //當月 'GROUP BY B.WORK_ORDER,C.PART_NO,B.TARGET_QTY,B.INPUT_QTY,B.WO_START_DATE ' 'ORDER BY B.WO_START_DATE DESC '; commandtext := w1; open; Label1.Caption := 'Last Update Time :' TimeToStr(Time); while not eof do BEGIN With AdvStringGrid1 do begin Params.Clear; Cells[0,RowCount-1] := Fieldbyname('SEQ').AsString; Cells[1,RowCount-1] := Fieldbyname('Work Order').AsString; Cells[2,RowCount-1] := Fieldbyname('Product Name').AsString; Cells[3,RowCount-1] := Fieldbyname('Target QTY').AsString; Cells[4,RowCount-1] := Fieldbyname('In Pdline Time').AsString; Cells[5,RowCount-1] := Fieldbyname('Input QTY').AsString; Cells[6,RowCount-1] := Fieldbyname('Assyt').AsString; RowCount := RowCount 1; END; NEXT; END; cLOSE; END; [/code]
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
解說
不同SQL 下好之後 放在同一各StringGrid裡面 然後每各SQL 都有一各固定值 第一各SQL SN NAME 1 ABC 2 DFG 3 ZZZ 第二各SQL SN MONEY 1 10000 4 999 5 0 當第二各SQL 跑出來的SN 跟第一各重複的時候就要貼再第一各SQL的後面 也就是變成 SN NAME MONEY 1 ABC 10000 2 DFG NULL 3 ZZZ NULL 4 NULL 999 5 NULL 0 如果我單單只是在SQL作ORDER 的話 那只會變成第一筆SQL的123 排序 第二筆SQL的145排序而已 我希望是 12345 作一起排序
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
可以直接在StringGrid 上面sort 我從這邊copy的 http://www.delphitricks.com/source-code/components/sort_a_stringgrid.html
[code delphi] procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer); const TheSeparator = '@'; var CountItem, I, J, K, ThePosition: integer; MyList: TStringList; MyString, TempString: string; begin CountItem := GenStrGrid.RowCount; MyList := TStringList.Create; MyList.Sorted := False; try begin for I := 1 to (CountItem - 1) do MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] TheSeparator GenStrGrid.Rows[I].Text); Mylist.Sort; for K := 1 to Mylist.Count do begin MyString := MyList.Strings[(K - 1)]; ThePosition := Pos(TheSeparator, MyString); TempString := ''; {Eliminate the Text of the column on which we have sorted the StringGrid} TempString := Copy(MyString, (ThePosition 1), Length(MyString)); MyList.Strings[(K - 1)] := ''; MyList.Strings[(K - 1)] := TempString; end; for J := 1 to (CountItem - 1) do GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)]; end; finally MyList.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin SortStringGrid(StringGrid1, 1); end; [/code]
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-05-07 18:36:52, 註解 無‧
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
那還是可以用一個 sql 解決才對 依您的例子 select a.sn, b.name, c.money from ( select sn from table1 union -- 注意 union 而不是 union all select sn from table2 ) a, table1 b, table2 c where a.sn=b.sn( ) and a.sn=c.sn( ) order by a.sn 抓出來的資料應該就是 SN NAME MONEY 1 ABC 10000 2 DFG NULL 3 ZZZ NULL 4 NULL 999 5 NULL 0 參考一下
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
因為我有七各SQL 像我開板那各範例一樣
都一大串的 如果要用union 我會眼花也不曉得能不能做的出來 才想用StringList 因為我也不知道怎樣把現有的SQL 填入StringList = = ===================引 用 st33chen 文 章=================== 您好, 那還是可以用一個 sql 解決才對 依您的例子 select a.sn, b.name, c.money from ( select sn from table1 union -- 注意 union 而不是 union all select sn from table2 ) a, table1 b, table2 c where a.sn=b.sn( ) and a.sn=c.sn( ) order by a.sn 抓出來的資料應該就是 SN NAME MONEY 1 ABC 10000 2 DFG NULL 3 ZZZ NULL 4 NULL 999 5 NULL 0 參考一下
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |