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

RV 以及 Query 操作

答題得分者是:eaglewolf
ttring
一般會員


發表:11
回覆:23
積分:16
註冊:2008-11-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-19 17:41:10 IP:60.248.xxx.xxx 訂閱
我是Delphi 的新手, 但因工作需要.....

最近在用 Rave report 工具
而因為丟給他的dataset 需要較複雜的計算

所以 sql 中有些假欄位, 0 as data1 , 0 as data2
用AdoQuery 一筆一筆撈出資料, 再運算後 丟入 data1 , data2
用另一個 adoquery2 append 後, 接 adoquery 的值

原本一筆的話都OK, 但二筆以上會發現假欄位的值都清空了
想請問我的作法, 是不是那裡有問題??
煩請大大們解惑? 不勝感激

因為比較不清楚delphi 的資料庫物件操作, 和方法
如果那裡有資料庫物件, 較詳細的各方法, 和屬性介紹, 範例
還煩請提供 能介紹書也好, 相信高手籨我的問題 能知道我欠缺什麼^^||




st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-25 10:58:46 IP:122.116.xxx.xxx 未訂閱
請提供您的程式
可能比較清楚您的問題所在
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
ttring
一般會員


發表:11
回覆:23
積分:16
註冊:2008-11-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-27 09:59:53 IP:60.248.xxx.xxx 訂閱
程式大致上是

for kk =1 to aa.recordcount do
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 '
sql.text = l_sql
open
edit
cou := var1
cou2 := var2 a01
end ;

with adoquery2 do
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
end;

end;

RvDataSetConnection1.DataSet := adoquery2 ;

大致如此, 會先撈出符合的 aa 資料
針對每一筆aa資料, 去撈相關資料後, 計算假欄位後 丟給 adoquery2
adoquery2 第一筆 OK, 但append 第二筆時, adoquery2的第一筆的假欄位值就清空了 , 如cou cou2
是不是那些屬性沒注意到?.?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-27 11:00:20 IP:122.116.xxx.xxx 未訂閱
您好,

不知道您計算 cou, cou2 有多複雜, 如果不複雜可以考慮用
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01=''' aa.fieldbyname('aa01').asstring '''';
或甚至
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
一個 sql 完成所有動作.
或根本不必 insert, 直接把 ' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
設好後, 再把這個 adoquery1 設給 RvDataSetConnection1.DataSet 就可以了.

假如 follow 您的解法, 請考一下 紅字部份
===================引 用 ttring 文 章===================
程式大致上是

for kk =1 to aa.recordcount do
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
end;

end;

RvDataSetConnection1.DataSet := adoquery2 ;

大致如此, 會先撈出符合的 aa 資料
針對每一筆aa資料, 去撈相關資料後, 計算假欄位後 丟給 adoquery2
adoquery2 第一筆 OK, 但append 第二筆時, adoquery2的第一筆的假欄位值就清空了 , 如cou cou2
是不是那些屬性沒注意到?.?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
ttring
一般會員


發表:11
回覆:23
積分:16
註冊:2008-11-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-27 18:46:11 IP:60.248.xxx.xxx 訂閱
感謝大大的回覆, 十分感謝你撥空看了簡略表達的流程

實際上, 還蠻複雜的, 其實是人事薪資的資料
除了要計算各種加給的金額, 甚至連假別, 他們都想要附上, 所以計算的部份, 其實有好幾段 再分別去撈相應欄位的資料
如依假別代碼加總去算當月份的時數等等
所以需要依條件, 每個人每個月的分別去抓 加給的金額, 再做一些合計金額的部份

而實際上, 這些合計金額, 時數的欄位, table 裡其實是沒有的, ex: 特休的總時數
所以我才在想, 是不是append 之後, 沒對應到實體table 的假欄位, 值都會被清空嗎 ??
因接觸 Delphi 不久, 有些觀念可能有所欠缺 ^^||

目前我使用的方式是rvsystem 只有第一筆, 讓user 選擇要列印或預覽
若選擇列印, 後面不論幾筆, 都直接丟印表機
但實在不是真正解決的方式

當然我還想過建一個table 去存 :P


===================引 用 st33chen 文 章===================
您好,

不知道您計算 cou, cou2 有多複雜, 如果不複雜可以考慮用
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01=''' aa.fieldbyname('aa01').asstring '''';
或甚至
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
一個 sql 完成所有動作.
或根本不必 insert, 直接把 ' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
設好後, 再把這個 adoquery1 設給 RvDataSetConnection1.DataSet 就可以了.

假如 follow 您的解法, 請考一下 紅字部份
===================引 用 ttring 文 章===================
程式大致上是

for kk =1 to aa.recordcount do
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
end;

end;

RvDataSetConnection1.DataSet := adoquery2 ;

大致如此, 會先撈出符合的 aa 資料
針對每一筆aa資料, 去撈相關資料後, 計算假欄位後 丟給 adoquery2
adoquery2 第一筆 OK, 但append 第二筆時, adoquery2的第一筆的假欄位值就清空了 , 如cou cou2
是不是那些屬性沒注意到?.?
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-27 22:55:11 IP:122.116.xxx.xxx 訂閱
for   kk =1 to  aa.recordcount  do
begin <--- 漏掉?
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
begin <--- 漏掉?
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
post; <--- 漏掉?
end;
end;
RvDataSetConnection1.DataSet := adoquery2 ;


===================引 用 ttring 文 章===================
感謝大大的回覆, 十分感謝你撥空看了簡略表達的流程

實際上, 還蠻複雜的, 其實是人事薪資的資料
除了要計算各種加給的金額, 甚至連假別, 他們都想要附上, 所以計算的部份, 其實有好幾段 再分別去撈相應欄位的資料
如依假別代碼加總去算當月份的時數等等
所以需要依條件, 每個人每個月的分別去抓 加給的金額, 再做一些合計金額的部份

而實際上, 這些合計金額, 時數的欄位, table 裡其實是沒有的, ex: 特休的總時數
所以我才在想, 是不是append 之後, 沒對應到實體table 的假欄位, 值都會被清空嗎 ??
因接觸 Delphi 不久, 有些觀念可能有所欠缺 ^^||

目前我使用的方式是rvsystem 只有第一筆, 讓user 選擇要列印或預覽
若選擇列印, 後面不論幾筆, 都直接丟印表機
但實在不是真正解決的方式

當然我還想過建一個table 去存 :P


===================引 用 st33chen 文 章===================
您好,

不知道您計算 cou, cou2 有多複雜, 如果不複雜可以考慮用
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01=''' aa.fieldbyname('aa01').asstring '''';
或甚至
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
一個 sql 完成所有動作.
或根本不必 insert, 直接把 ' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
設好後, 再把這個 adoquery1 設給 RvDataSetConnection1.DataSet 就可以了.

假如 follow 您的解法, 請考一下 紅字部份
===================引 用 ttring 文 章===================
程式大致上是

for kk =1 to aa.recordcount do
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
end;

end;

RvDataSetConnection1.DataSet := adoquery2 ;

大致如此, 會先撈出符合的 aa 資料
針對每一筆aa資料, 去撈相關資料後, 計算假欄位後 丟給 adoquery2
adoquery2 第一筆 OK, 但append 第二筆時, adoquery2的第一筆的假欄位值就清空了 , 如cou cou2
是不是那些屬性沒注意到?.?
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
ttring
一般會員


發表:11
回覆:23
積分:16
註冊:2008-11-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-28 09:08:18 IP:60.248.xxx.xxx 訂閱
^^|||  這只是簡略表達我程式的流程...
所以一些細節沒去打..

至於post 我也試過..一post..假欄位的值就清空了..

所以, 嗯, 換個問法, adoquery出來的結果, 可以存多筆數含假欄位的資料嗎?


===================引 用 eaglewolf 文 章===================
for kk =1 to aa.recordcount do
begin <--- 漏掉?
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
begin <--- 漏掉?
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
post; <--- 漏掉?
end;
end;
RvDataSetConnection1.DataSet := adoquery2 ;


===================引 用 ttring 文 章===================
感謝大大的回覆, 十分感謝你撥空看了簡略表達的流程

實際上, 還蠻複雜的, 其實是人事薪資的資料
除了要計算各種加給的金額, 甚至連假別, 他們都想要附上, 所以計算的部份, 其實有好幾段 再分別去撈相應欄位的資料
如依假別代碼加總去算當月份的時數等等
所以需要依條件, 每個人每個月的分別去抓 加給的金額, 再做一些合計金額的部份

而實際上, 這些合計金額, 時數的欄位, table 裡其實是沒有的, ex: 特休的總時數
所以我才在想, 是不是append 之後, 沒對應到實體table 的假欄位, 值都會被清空嗎 ??
因接觸 Delphi 不久, 有些觀念可能有所欠缺 ^^||

目前我使用的方式是rvsystem 只有第一筆, 讓user 選擇要列印或預覽
若選擇列印, 後面不論幾筆, 都直接丟印表機
但實在不是真正解決的方式

當然我還想過建一個table 去存 :P


===================引 用 st33chen 文 章===================
您好,

不知道您計算 cou, cou2 有多複雜, 如果不複雜可以考慮用
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01=''' aa.fieldbyname('aa01').asstring '''';
或甚至
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
一個 sql 完成所有動作.
或根本不必 insert, 直接把 ' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
設好後, 再把這個 adoquery1 設給 RvDataSetConnection1.DataSet 就可以了.

假如 follow 您的解法, 請考一下 紅字部份
===================引 用 ttring 文 章===================
程式大致上是

for kk =1 to aa.recordcount do
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
end;

end;

RvDataSetConnection1.DataSet := adoquery2 ;

大致如此, 會先撈出符合的 aa 資料
針對每一筆aa資料, 去撈相關資料後, 計算假欄位後 丟給 adoquery2
adoquery2 第一筆 OK, 但append 第二筆時, adoquery2的第一筆的假欄位值就清空了 , 如cou cou2
是不是那些屬性沒注意到?.?
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-28 09:58:38 IP:211.75.xxx.xxx 訂閱
可以的
SQL Command 改一下
select a01 , a02, a03 as cou, a04 as cou2 from a where a01 = aa.aa01 //也就是不要直接用0 而是用其它實體欄位來代替
然後將adoquery1及 adoquery2的Lock Type 屬性 設為ltBatchOptimistic 試試看
以下提供 我們家的部份程式供參考
[code delphi]
with rpSalary do
begin
cnReport.ConnectionString := strConnectString;
qyReport.SQL.Clear;
qyReport.SQL.Add('Select S.*, E.Emp_Name,');
qyReport.SQL.Add('S.Pay as Allowance, S.Notes as ANote,'); //這兩行就是假欄位
qyReport.SQL.Add('S.Pay as Deduction, S.Notes as DNote');
qyReport.SQL.Add('From Employee E ,Salary S');
qyReport.SQL.Add('Where S.SalaryMonth = :pSalaryMonth');
qyReport.SQL.Add('And E.Emp_No = S.Emp_No');
qyReport.SQL.Add('Order By S.EmployeeNo asc');
qyReport.Parameters.ParamByName('pSalaryMonth').Value
:= strSalaryMonth;

qyReport.Open;
qyReport.First;
while not rpSalaryDetail.qyReport.Eof do
begin
qyReport.Edit;
qyReport.FieldByName('Allowance').Asinteger := 0;
qyReport.FieldByName('Deduction').Asinteger := 0;
qyReport.FieldByName('ANote').AsString := '';
qyReport.FieldByName('DNote').AsString := '';
qyReport.Post;
qyReport.Next;
end;
PreviewModal;
qyReport.Close;
end;
[/code]

------------------------------------------------------------------------------------------------------------


===================引 用 ttring 文 章===================
^^||| 這只是簡略表達我程式的流程...
所以一些細節沒去打..

至於post 我也試過..一post..假欄位的值就清空了..

所以, 嗯, 換個問法, adoquery出來的結果, 可以存多筆數含假欄位的資料嗎?


===================引 用 eaglewolf 文 章===================
for kk =1 to aa.recordcount do
begin <--- 漏掉?
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
begin <--- 漏掉?
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
post; <--- 漏掉?
end;
end;
RvDataSetConnection1.DataSet := adoquery2 ;


===================引 用 ttring 文 章===================
感謝大大的回覆, 十分感謝你撥空看了簡略表達的流程

實際上, 還蠻複雜的, 其實是人事薪資的資料
除了要計算各種加給的金額, 甚至連假別, 他們都想要附上, 所以計算的部份, 其實有好幾段 再分別去撈相應欄位的資料
如依假別代碼加總去算當月份的時數等等
所以需要依條件, 每個人每個月的分別去抓 加給的金額, 再做一些合計金額的部份

而實際上, 這些合計金額, 時數的欄位, table 裡其實是沒有的, ex: 特休的總時數
所以我才在想, 是不是append 之後, 沒對應到實體table 的假欄位, 值都會被清空嗎 ??
因接觸 Delphi 不久, 有些觀念可能有所欠缺 ^^||

目前我使用的方式是rvsystem 只有第一筆, 讓user 選擇要列印或預覽
若選擇列印, 後面不論幾筆, 都直接丟印表機
但實在不是真正解決的方式

當然我還想過建一個table 去存 :P


===================引 用 st33chen 文 章===================
您好,

不知道您計算 cou, cou2 有多複雜, 如果不複雜可以考慮用
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01=''' aa.fieldbyname('aa01').asstring '''';
或甚至
'insert into query2的table '
' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
一個 sql 完成所有動作.
或根本不必 insert, 直接把 ' select a01, a02, cou的算式 as cou, cou2的算式 as cou2 from a where a01 in ( select aa01 from aa where .... )';
設好後, 再把這個 adoquery1 設給 RvDataSetConnection1.DataSet 就可以了.

假如 follow 您的解法, 請考一下 紅字部份
===================引 用 ttring 文 章===================
程式大致上是

for kk =1 to aa.recordcount do
with adoquery1 do
begin
l_sql := 'select a01 , a02, 0 as cou, 0 as cou2 from a where a01 = aa.aa01 ' <-- aa.aa01 在這句應該會出錯, 您真正的寫法應該不是這樣
sql.text = l_sql
open
edit
cou := var1 <-- 應該是 fieldbyname('cou').asfloat 或類似語句
cou2 := var2 a01
post; <-- 新增看看
end ;

with adoquery2 do
append;
for i=0 to adoquery1.fieldcount then
adoquery2.Fields.Fields[i].AsString := adoquery1.Fields.Fields[i].AsString;
end;

end;

RvDataSetConnection1.DataSet := adoquery2 ;

大致如此, 會先撈出符合的 aa 資料
針對每一筆aa資料, 去撈相關資料後, 計算假欄位後 丟給 adoquery2
adoquery2 第一筆 OK, 但append 第二筆時, adoquery2的第一筆的假欄位值就清空了 , 如cou cou2
是不是那些屬性沒注意到?.?
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2008-11-28 09:59:38, 註解 無‧
系統時間:2024-05-15 21:25:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!