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

DBGrid 顯示幾個資料

答題得分者是:adonis
charles9344
一般會員


發表:7
回覆:6
積分:2
註冊:2006-11-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-25 09:30:45 IP:202.175.xxx.xxx 訂閱
我想在  DBGrid 里顯示 幾個資料 ...
如果用 ADOQuery 在SQL 打 select carid as 品號
from wares
where carid =:carid


那麼 DBGrid 就會顯示一個 資料...有 什麼辦法可以保留上一筆顯示記錄


我一直想不明....救各位大大救命
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-25 10:05:19 IP:211.76.xxx.xxx 訂閱
請問你是用何種資料庫 ?
我記得好像目前沒有資料庫有此功能(以前是有一種資料庫有此功能, 但目前應該是消失了)

若要做到此功能可能要用暫存檔的方式, 也就是將 select 到的資料寫到暫存檔, 再用 DBGrid 顯示


===================引 用 charles9344 文 章===================
我想在? DBGrid? 里顯示 幾個資料 ...
如果用 ADOQuery 在SQL?? 打 select carid as 品號
from wares
where carid =:carid

?
那麼 DBGrid 就會顯示一個 資料...有 什麼辦法可以保留上一筆顯示記錄


我一直想不明....救各位大大救命
------
將問題盡快結案也是一種禮貌!
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-25 10:53:43 IP:210.201.xxx.xxx 訂閱
charles9344,您好

如果只是單純的想保留前次或管理先前的查詢資訊,建議你使用 ClientDataSet 。
將所查詢得到的結果寫入 ClientDataSet,讓 DBGrid 的所使用的 DataSource 連上該 ClientDataSet 好顯示你所要呈現的結果。
若想管理 DBGrid 所能呈現的資料筆數,只要再針對 ClientDataSet 來處理,應該就可達成你要的功能 ~~
這是我所能想到的,或許有其他前輩可提供更方便實用的方式 以供大家共同學習與成長。

我也在學習中,若有錯謬請見諒 ~
===================引 用 charles9344 文 章===================
我想在? DBGrid? 里顯示 幾個資料 ...
如果用 ADOQuery 在SQL?? 打 select carid as 品號
from wares
where carid =:carid

?
那麼 DBGrid 就會顯示一個 資料...有 什麼辦法可以保留上一筆顯示記錄


我一直想不明....救各位大大救命
------
我也在努力學習中,若有錯謬請見諒。
編輯記錄
adonis 重新編輯於 2007-05-25 10:55:18, 註解 無‧
ko
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-25 17:29:25 IP:220.142.xxx.xxx 訂閱
不難拉!!
先建立一個TEMP資料表
當下了的EVENT>>select carid as 品號 from wares where carid =:carid
就把他寫到TEMP>>insert into TEMP select carid as 品號 from wares where carid =:carid
然後DBGRID的顯示就指向TEMP就好了
------
======================
昏睡~
不昏睡~
不由昏睡~
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-25 18:13:29 IP:61.219.xxx.xxx 訂閱
    ==>這題好,腦力激蕩。

有 什麼辦法可以保留上一筆顯示記錄
==>不要用資料庫表格的方式,茲事體大,如果將來系統擴大到多人使用及須搭配後端資料庫時就會有問題。
==>我今天在寫公司裏新版的FastReport報表管理工具時也有遇到同樣問題。我要將編修留下歷史記錄,在編修時可看到歷次編修、拷貝編修、刪除、新建frf報表檔的記錄。這個歷史記錄我沒寫入資料庫,因為這是個人電腦上的作業,而公司裏別人是不會來開我的電腦的,所以我覺得沒必要寫一大堆多餘的程式碼以存入資料庫的必要。我用了個ListBox及不到兩百行的程式碼,就一切攪定了。如果寫到資料庫,那相關的碼沒個一兩千行是作不出來的。
==>加個ListBox
==>在編修、新建、拷貝新建、刪除時將日期/時間/應用系統代號/frf檔名等寫入ListBox
==>在ListBox.Click 刪此記錄,刪時限由最舊記錄刪之
==>FormOnClose將此ListBox寫入硬碟
==>FormOnCreate時將硬碟記錄檔抓回ListBox

==>你看,多簡單省事。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2007-05-25 18:14:59, 註解 無‧
kevin2004 重新編輯於 2007-05-25 18:16:13, 註解 無‧
kevin2004 重新編輯於 2007-05-25 18:16:49, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-25 18:22:21 IP:61.219.xxx.xxx 訂閱
題外話。

ko兄:
那Nod32真是可惡。你受委屈了。
吃了十幾年電腦飯,混過這麼多網站,碰到那般沒禮貌的,還真是第一次。小弟這兩天在公司裏想到件事,都氣的吃不下飯。
你受委屈了。
不要在意,有人喜歡七傷拳自己傷自己,就讓他自己玩好了。
------
Kevin
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-25 18:28:19 IP:211.75.xxx.xxx 未訂閱
受傷最重的好像是我耶, 

===================引 用 kevin2004 文 章===================
題外話。

ko兄:
??? 那Nod32真是可惡。你受委屈了。
??? 吃了十幾年電腦飯,混過這麼多網站,碰到那般沒禮貌的,還真是第一次。小弟這兩天在公司裏想到件事,都氣的吃不下飯。
??? 你受委屈了。
??? 不要在意,有人喜歡七傷拳自己傷自己,就讓他自己玩好了。
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-25 20:07:02 IP:211.22.xxx.xxx 未訂閱
沒到救命那麼嚴重吧!
按照你的需求,僅需要儲存一個RECORD的CARID,若是我要解決這個問題,我會儘量不要再去寫另一個SQL SERVER的TEMPDB,因為要花費連線以及UPDATE DB的時間與效能。
我會在本機寫入一個暫存檔或是REGISTRY的機碼,用以記錄上次查詢到的CARDID,如此不但速度快LOADING低,也可以知道上次的查詢的資料嘛!
===================引 用 charles9344 文 章===================
我想在 DBGrid 里顯示 幾個資料 ...
如果用 ADOQuery 在SQL 打 select carid as 品號
from wares
where carid =:carid

那麼 DBGrid 就會顯示一個 資料...有 什麼辦法可以保留上一筆顯示記錄我一直想不明....救各位大大救命
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-05-25 22:51:13 IP:203.73.xxx.xxx 訂閱
好吧..這時候只好建請站長撤銷我的積分以示正義(炸)

===================引 用 Jasonwong 文 章===================
受傷最重的好像是我耶,

===================引 用 kevin2004 文 章===================
題外話。

ko兄:
??? 那Nod32真是可惡。你受委屈了。
??? 吃了十幾年電腦飯,混過這麼多網站,碰到那般沒禮貌的,還真是第一次。小弟這兩天在公司裏想到件事,都氣的吃不下飯。
??? 你受委屈了。
??? 不要在意,有人喜歡七傷拳自己傷自己,就讓他自己玩好了。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
charles9344
一般會員


發表:7
回覆:6
積分:2
註冊:2006-11-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-05-26 17:21:37 IP:202.86.xxx.xxx 訂閱
 ClientDataSet  是怎樣用的...可以 簡單教我一下嗎?網頁 或 書上  我都有點看不明....


我本來是寫一個 超級市場收款用的功能...用編號 來查詢...資料庫 暫時用 access ...
照我現在的程式碼來看是 用戶者 用編號 查詢一次(例如 輸入01)....就會 顯示 01 這個商店相關的料....如果 第二次查詢是 02....那麼 就會顯示 02的資料...01的資料就沒有了....

還有一個問題 在 unit 打 哪個指令 可以 暫存一下 資料的

有點看不懂各位前輩說的...不好意思...剛自學delphi 一個月多...有點差勁
編輯記錄
charles9344 重新編輯於 2007-05-26 17:25:01, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-05-29 12:35:53 IP:220.141.xxx.xxx 訂閱
------
努力會更接近成功
charles9344
一般會員


發表:7
回覆:6
積分:2
註冊:2006-11-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-05-29 21:29:11 IP:202.86.xxx.xxx 訂閱
那不 用 ClientDataSet....用 ADOQuery 可不可以 做到 DBGrid 保留上一筆記錄
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-05-30 00:30:00 IP:218.18.xxx.xxx 訂閱
你要搞清楚一个基本概念:DBGrid 仅仅是显示用的,它本身并不保留数据。DBGrid 里的数据,实际上是在 DataSet 里。

假设你用 Delphi 最古老的 BDE,那么,那个 DataSet 就是 TTable 或者 TQuery。
假设你用 ADO,那么,就是 TADOTable 或者 TADOQuery 或者 TADODataSet

上面的几种 DataSet,都是和 DataBase Server 连接的。里面的数据都来自 Server,通过 Select * from YourTable 这样的方式得来的。

而一点你改变了 select 语句,就需要关闭这个 DataSet 然后重新打开。这时候这个 DataSet 里的数据当然就是新数据了。

根据上述概念,在 Delphi最正统的做法,应该是采用 ClientDataSet。 看这个 ClientDataSet 的名字就该知道,它是一个客户端的东西,和 DataBase Server 没关系。进入 TClientDataSet 的数据,可以直接保存到你的 Local Disk,可以和 server 无关。

大概是这样的: DB Server --- TADODataBase --- TADODataSet --- TDataSetProvider --- TClientDataSet --- DataSource --- DBGrid

按照你的做法,大概可以这样写:

ADODataSet.Close;
ADODataSet.CommandText := 'select * from YourTable where xxx=bbb';
ADODataSet.Open;

AData := DataSetProvider.Data;

ClientDataSet.AppendData(AData); //<---------------- 从 DataSetProvider 取得一个 OleVariant 类别的 Data ,这个 Data 就是你的 select 语句获得的,把它加入到 ClientDataset 里去,则 ClientDataSet 里以前的 Record 保存还在,新的 Record 追加进去了。
babyfish0226
一般會員


發表:9
回覆:82
積分:23
註冊:2002-06-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-05-30 09:54:01 IP:211.76.xxx.xxx 訂閱
我在想...您的需求是不是想要在DBGrid裡同時顯示"這一次"及"上一次"搜尋的紀錄?

如果是的話,那在DBGRID裡是辦不到的,因為DBGRID是依您的搜尋條件列出結果,因此在這樣的思考下您可以試試:
紀錄上一次的搜尋條件並加到新的搜尋指定中

private
lastSearch:integer;

~~~~ 略~~~~~~

procedure Tform1.Searchit(cardid:integer);
begin
//紀錄搜尋條件

adoquery1.sql.clear;
adoquery1.sql.add('select carid as 品號 from wares where carid =:carid or carid=' linttostr(lastSearch));
adoquery1.open;

lastSearch:=cardid;
end;

每次都記錄前一次的搜尋條件再加到下一次的查詢之中就可以了,不過這樣僅能記錄"上一次"而已.

其他大大的建議應該是認為您需要的是"額外保留上一次的查詢紀錄",因此會有用clientDataSet或是listbox配合ini或文字檔等方式來做紀錄暫存.
編輯記錄
babyfish0226 重新編輯於 2007-05-30 09:54:31, 註解 無‧
babyfish0226 重新編輯於 2007-05-30 09:55:23, 註解 無‧
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-05-30 15:12:53 IP:210.201.xxx.xxx 訂閱
charles9344, 您好
個人覺得依需求的不同 ClientDataSet 在使用上可以很複雜也可以很簡單..
若依你的需求而言,僅是用來保留上一筆的資訊,那只要將 ClientDataSet 當作是一個容器來看就好了,只是這個容器的使用和規劃必須由你自己來控制。
所以,你至少要做到底下幾件事:
01. 建欄位(就依你原先顯示在 DBGrid 上的即可)
02.當從Server查詢而來的資訊,自行增加至 ClientDataSet
03.因為要保留前一筆(不知你所謂的前一筆是單保留舊資料的一筆,還是有查詢過的都保留) 所以要自行刪除不想保留的資料

若想對 ClientDataSet 有更深的認識與學習,那就得您親自去下工夫了,印象中站裡不乏有對其詳盡的說明與使用心得,祝你一切順利。

我也在學習中,若有錯謬請見諒 ~
===================引 用 charles9344 文 章===================
那不 用 ClientDataSet....用 ADOQuery? 可不可以 做到 DBGrid? 保留上一筆記錄
------
我也在努力學習中,若有錯謬請見諒。
系統時間:2024-11-25 12:30:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!