線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1242
推到 Plurk!
推到 Facebook!

如何將T-SQL文放入ADOQuery中執行。

答題得分者是:ko
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-06-15 15:29:58 IP:60.248.xxx.xxx 訂閱
Dear 各位大大。

因為使用者提出一個需求是將多筆資料塞入同一欄位(在網上的例子,如下)
COPZI
ZI001(YM) ZI002(ID) ZI003(PID)
---------------------------------
200801 97006 4LO
200801 97006 4OM
200801 97006 4BQ

希望變成

ZI001 ZI002 ZI003
-----------------------------
200801 97006 4LO,4OM,4BQ

以T-SQL寫的,
第一部份
create function Concat (@Col1 varchar(10) , @Col2 varchar(10) )
returns varchar(1000)
as
begin
declare @resultStr varchar(1000)
select @resultStr = coalesce(@resultStr,'') ',' ZI003 from COPZI where ZI001 = @Col1 AND ZI002 = @Col2
return stuff(@resultStr,1,1,'')
end

第二部份 call FUNCTION 的語法跟結果
Select ZI001 , ZI002 ,dbo.Concat(ZI001 , ZI002 ) AS ZI003
from COPZI
group by ZI001 , ZI002
order by ZI001 , ZI002

第三部份 刪除FUNCTION -> 請問是否要作刪除動作
DROP FUNCTION Concat

我們公司資料庫是MS-SQL2000,我在SQL Query Analyzer測試都ok,
可是當我將文放入ADOQUery中就run可以都有錯誤訊息,無法建立FUNCTION。
我在程式中也是分成三個部份是使用同一個ADOQuery,另外是否跟我table(ERP.B01.dbo.COPZI)寫法有關呢。
比如下例。

with DM1.adoqSELE do begin
Close;
第一部份
Execsql;
end;

with DM1.adoqSELE do begin
Close;
第二部份
Execsql;
end;

with DM1.adoqSELE do begin
Close;
第三部份
Open;
end;

麻煩各位大大,THKS。






ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-06-15 16:53:32 IP:61.66.xxx.xxx 訂閱
請問一定要用T-SQL來處理不可嘛!?
我倒是有一個用元件來處理的方式~請參考
元件是>>ListView1
方式:
1.先搜尋明細並解決定PK
2.利用 ListView1.FindCaption(0,TMP,false,true,false);
3.範例:

VAR
L1,L2:TListItem;
TMP:STRING;

==================
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select .......');
Query1.Open;
Query1.First;
ListView1.Clear;
WHILE NOT Query1.Eof DO
BEGIN

TMP := Query1.FieldByName('ZI001').AsString ; //這是你的PK
L2:= ListView2.FindCaption(0,TMP,false,true,false);
if L2=nil then
begin
L1 := ListView1.Items.Add;
L1.Caption := TMP;
L1.SubItems.Add(Query1.FieldByName('ZI002').AsString ); //0
L1.SubItems.Add(Query1.FieldByName('ZI003').AsString ); //1
............
..........
.....
end else
begin
L2.SubItems[1]:= L2.SubItems[1] Query1.FieldByName('ZI002').AsString;
end;
Query1.Next;
END;

這邊要呈現出來請將 ListView1 的ViewStyle 改成 vsReport
===================引 用 t0288542 文 章===================
Dear 各位大大。

因為使用者提出一個需求是將多筆資料塞入同一欄位(在網上的例子,如下)
COPZI
ZI001(YM)? ZI002(ID) ZI003(PID)
---------------------------------
200801 97006? ?4LO
200801 97006?4OM
200801 97006?4BQ

希望變成

ZI001?ZI002?ZI003
-----------------------------
200801?97006?4LO,4OM,4BQ?
恕刪~
------
======================
昏睡~
不昏睡~
不由昏睡~
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-06-16 13:45:31 IP:60.248.xxx.xxx 訂閱
Dear ko大大:

以目前需求用listview不太適合,原因是原本就有一段SQL文是丟至DBGrid中,
所以必需從原本SQL文作加入,謝謝您。

您所提供方式,讓我學到另一方式,謝謝。
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-06-17 14:51:46 IP:61.66.xxx.xxx 訂閱
要執行你的SQL必須採用PROC(預存程序)的方式
先必須再MSSQL上面建立一個PROC
然後再依據您敘述的程序將參數帶入
所以在程式寫的時候只需要再QRY裡面寫
Qry1.SQL.add('exec proc_001 @參數一,@參數二,.....');
Qry1.Execsql;
------
======================
昏睡~
不昏睡~
不由昏睡~
系統時間:2017-12-17 23:30:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!