* * * * * * 我 不 信 1500分 問 不 出 一 個 結 果 來* * * * * * (300分)

  • 主题发起人 主题发起人 kycheung
  • 开始时间 开始时间
K

kycheung

Unregistered / Unconfirmed
GUEST, unregistred user!
問題一:主從表結構,從表設置lock type:ltBatchOptimistic ,用grid(cxGrid)進行編輯,我的問題是:在從表沒有保存之前,如何查找GRID中的數據.主要是查找記錄中數量是不是為負數?請大家指教!解決辦法要求不POST數據!
問題二:如何控制用戶端的數量.解決辦法要求可以用程序修改用戶端的數理!
問題三:用戶用程序安裝SQL的數據庫到服務器?
 
问题一:可以在编辑之前先将记录数量记录下来
问题二:是单个用户的程序线程限制还是多个用户使用系统的数量限制?
问题三:编个服务器程序让用户将数据库上传到指定目录即可。
 
用另一个Query执行Select count(*) from ~~ 。
 
数据已经保存在ADO控件中,可直接用于查找
 
问题笼统
 
我現在就面臨這個問題.用ExpressQuantumGrid,緩存方式打開.但我在新加時如何才能查詢GRID中是否有重復的記錄呢?(沒有提交數據時)
 
使用RX控件中的MemoryTable在内存中建表不就可以解决这个问题了吗?
 
關注樓主的問題,
知道答案后麻煩告訴一下,謝謝...
 
写入内存表,在内存中比较,然后提交
 
第一個問題可以用Filter可以解決吧,DataSet.filter:='數量>'+'0';
或者用內存表來查找。用TClientDataSet也可以
第二個問題不太明白什麼意思 ?請說明白一點
第三個問題在《SQL Server 2000技術內幕》那本書裡由遠程安裝的內容你可以參考以一下應按不困難,都是SQL Server 都考慮到這個方面
 
"但我在新加時如何才能查詢GRID中是否有重復的記錄呢?",这还不简单,在OnBeforePost
之前查找一下以前的记录不就可以了,最笨的方法就是将你要对比的字段记录放到一个临时
数据表或动态数组中,这样查找会更快一些。
第二个问题,在用户登陆时进行处理,如果是三层,则在中间层就可以进行限制。
第三个问题,你只要能够登陆到服务器,那建立数据库和数据表不是很简单的事情吗?无非
是sql语句的建立和传送问题。
 
TO:ing
第一個問題可以用Filter可以解決吧,DataSet.filter:='數量>'+'0';
或者用內存表來查找。用TClientDataSet也可以

/* 你會錯意了。我的意思是在從表中查尋一些記錄。比如新加從表記錄先檢查是否有相同的記錄存在。前提為:從表設置lock type:ltBatchOptimistic ,用grid(cxGrid)進行編輯,沒有POST數據


第二個問題不太明白什麼意思 ?請說明白一點
/* 意思是:開發一套軟件,報價是按每用戶多少錢算的。那我如果來控制客戶不會裝多幾套來使用!
第三個問題在《SQL Server 2000技術內幕》那本書裡由遠程安裝的內容你可以參考以一下應按不困難,都是SQL Server 都考慮到這個方面
/* 可以給這一段文章給我嗎。
 
TO:chnplzh
"但我在新加時如何才能查詢GRID中是否有重復的記錄呢?",这还不简单,在OnBeforePost
之前查找一下以前的记录不就可以了,最笨的方法就是将你要对比的字段记录放到一个临时
数据表或动态数组中,这样查找会更快一些。
第二个问题,在用户登陆时进行处理,如果是三层,则在中间层就可以进行限制。
第三个问题,你只要能够登陆到服务器,那建立数据库和数据表不是很简单的事情吗?无非
是sql语句的建立和传送问题。

第一:前提為:從表設置lock type:ltBatchOptimistic ,用grid(cxGrid)進行編輯,沒有POST數據。請問如何在OnBeforePost之時查詢沒有被POST的數據?
最笨的方法請給一個較為簡單的實列! kycheung@163.com
第二:我也知道用戶登陸時處理。問題是如何處理?(小子你放空炮沒用的)。我的是C/S結構
第三:我試過的,很慢!
 
to 楼主:
哎,又要源代码,你根据以下思路好好测试一下,实在不行,再给你写代码!
1、这里所谓OnBeforePost或对应字段的OnValidate事件,都可以实现你的操作。dev
express公司提供dbgrid3.22版本以前有一个TdxMemData控件(不知4.0以后的tcxdbgrid
是否有提供相类似的控件,如果没有,可以使用一个临时数据表代替),你可以将cxdbgrid
对应的数据集中的数据(包括你当前已经编辑好的),备份给TdxMemData(由于当你处于
编辑状态时,是无法在OnBeforePost或OnValidate事件中移动当前数据集的记录指针,使
用一个相对应的临时表),当你要检查数据时,只要对TdxMemData循环操作一下就可以了。
同理,你也可以使用动态数组来实现(你会灵活使用指针链表则更好了)。
2、以下代码是软件中的一部分,我也不解释了,你可以参考我以下帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2243199
其中,MainDataModule.ADOQuUserNum对应的sql是sp_who2系统存储过程
如果你使用的是自己用户数据表来控制登陆用户,那当然更简单(但用户没有正常退出时
不好处理)。至于什么时候执行InitDBServerUserNum(),我使用的方法比较简单,在每个
Form的OnActive或OnCreate和OnClose来调用,但是,笨的方法是使用定时器,好的方法是
使用网络通讯(用户一登陆或注销成功,就发送一个特定的消息给所有在线用户),当然,
你也可以专门开一个线程来处理。

function GetFileVersion(vFileName:string;vName_i:integer):string;
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright',
'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');

var
S: string;
n, Len, i: DWORD;
Buf: PChar;
Value: PChar;
vResult:PChar;
begin
S := vFileName;
n := GetFileVersionInfoSize(PChar(S), n);
vResult:='';
if n > 0 then
begin
Buf := AllocMem(n);
GetFileVersionInfo(PChar(S), 0, n, Pointer(Buf));
for i := 1 to InfoNum do
if VerQueryValue(Buf, pchar('StringFileInfo/040904E4/'+InfoStr), Pointer(Value),Len) then
if (i=DWORD(vName_i)) then vResult:=value;
FreeMem(Buf, n);
end
else vResult:='';
result:=vResult;
end;

function InitDBServerUserNum():integer;
var i:integer;
oldSQL:string;
vProductName,vProgramName,vDBName:string;
begin
i:=0;
vProductName:=trim(GetFileVersion(Application.ExeName,8));
vDBName:=lowercase(GetXtDBName());
//showmessage(vProductName);
try
try
oldSQL:=MainDataModule.ADOQuUserNum.SQL.Text ;
{
MainDataModule.ADOQuUserNum.SQL.Text:='select ActiveState from duser1 where ActiveState=1';
MainDataModule.ADOQuUserNum.Active:=true;
i:=MainDataModule.ADOQuUserNum.RecordCount;
}
if MainDataModule.ADOQuUserNum.Active then MainDataModule.ADOQuUserNum.Close;
MainDataModule.ADOQuUserNum.Open;
MainDataModule.ADOQuUserNum.First;
while not MainDataModule.ADOQuUserNum.Eof do
begin
vProgramName:=trim(MainDataModule.ADOQuUserNum.FieldByName('ProgramName').Value);
if (MainDataModule.ADOQuUserNum.FieldByName('spid').Value>50) and
(lowercase(MainDataModule.ADOQuUserNum.FieldByName('dbname').Value)=vDBName) and
(vProgramName=vProductName)
then i:=i+1;
MainDataModule.ADOQuUserNum.next;
end; // while
except
i:=0;
end;
finally
MainDataModule.ADOQuUserNum.SQL.Text:=oldSQL;
// MainDataModule.ADOQuUserNum.Active:=false;
end;
result:=i;
end;
3、如果只是数据库初始化的建立,你可以使用以下方法:你不是在编写软件吗,将你当前
sql server中对应的数据库备份出来(里面的调试记录当然要删除),然后编程将该文件
恢复到用户数据库中即可。使用是backup和restore sql命令,详细的请参见sql server
在线帮助文件(你也可以到 www.playicq.com 去找找类似的源代码)。

祝您好运!顺带说一句,我可不是小子,已经30出头了。

 
TO:chnplzh
原來是劉主任,高手。
現在第2,3題已處理得差不多了。
主要是第一題現在的處理方法還不完美。我用的是CXgrid,所以沒有TdxMemData。
能不能給我一段代碼呢。我用的是繁體。

無以言謝。唯有大分相送!
 
TO kycheung:
实在对不起,年底事情颇多,今天一上班就进行年终“述职报告”(干部末位淘汰制
中折腾人的一种方法),晚上带小孩又没空,看来是没办法帮您写代码了,其实您静下心
来,使用动态数组也完全可以解决您的问题。还有一种更好的办法,你可以在数据库中进
行控制,即在数据表中对应的字段建立unique索引,这样不但可以解决你的问题,而且万
一今后修改游戏规则也很方便。
 
先把以前的結了,希望大家能夠繼續!我會另開貼給分!
 
后退
顶部