RV 以及 Query 操作 |
答題得分者是:eaglewolf
|
ttring
一般會員 發表:11 回覆:23 積分:16 註冊:2008-11-19 發送簡訊給我 |
我是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 發送簡訊給我 |
|
ttring
一般會員 發表:11 回覆:23 積分:16 註冊:2008-11-19 發送簡訊給我 |
程式大致上是
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 發送簡訊給我 |
您好,
不知道您計算 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 發送簡訊給我 |
感謝大大的回覆, 十分感謝你撥空看了簡略表達的流程
實際上, 還蠻複雜的, 其實是人事薪資的資料 除了要計算各種加給的金額, 甚至連假別, 他們都想要附上, 所以計算的部份, 其實有好幾段 再分別去撈相應欄位的資料 如依假別代碼加總去算當月份的時數等等 所以需要依條件, 每個人每個月的分別去抓 加給的金額, 再做一些合計金額的部份 而實際上, 這些合計金額, 時數的欄位, 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 發送簡訊給我 |
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 發送簡訊給我 |
^^||| 這只是簡略表達我程式的流程...
所以一些細節沒去打.. 至於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 發送簡訊給我 |
可以的
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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |