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

网络版中日期加序号的取得方式

答題得分者是:Fishman
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-16 10:19:43 IP:222.184.xxx.xxx 訂閱
在单机版中我是这样取的
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select max(流水号) from tb_gh where 日期=:date1 ');
ADOQuery1.Parameters.ParamByName('date1').Value:=datetostr(date);
ADOQuery1.Open;
lsh:=ADOQuery1.Fields[0].AsInteger 1;
label2.Caption:=format('%s%.3d',[formatdatetime('yymmdd',now),lsh]);
然后在写入票据号时就让票据号字段等于label2.Caption
取到的形式如今天第一个的话就是070416001
但在网络版中如果这样取的话就有可能取到相同的了,不知网络版中用何种方式较好
------
我的编程起步于ktop,我将永远支持ktop
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-16 13:43:03 IP:59.120.xxx.xxx 未訂閱
這算是老問題了,比較簡單的方式是把取"單號"的程式放在beforePost event中

這樣遇到重複單號的情形會比較小,如果真的遇到了,就在try exception中再取一次就好

不要一開始就先取單號,這樣在你編輯完要存檔時,非常容易重複單號
------
星期一,二...無窮迴圈@@
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-16 14:49:20 IP:222.184.xxx.xxx 訂閱
前辈的意思我完全理解了,其实这样的方法也能解决我的问题,因为我的网络版软件基本上就是几个站点而已,所以这种方法写入时重码的可能很小,几乎没有。但我在想假如有几十个站点时,这种可能就大了,有没有绝对取不到重号的方法呢?是不是写起来很复杂。(按流水号一直往下加我会写代码的,绝对不会重号的,但按每天的流水号取就不懂了。呵呵)
------
我的编程起步于ktop,我将永远支持ktop
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-16 17:14:03 IP:59.124.xxx.xxx 未訂閱
既然按流水號一直往下取你會,按每日取流水號就簡單了!
若沒有當日的單號,那當然是YYYYMMDD00001,也就是當日的第一筆,若已經有當日單號,即取最大值再加一即可。
再搭配先前 pgdennis 大大所言,於 Before post 再將值填入,避免跳號或重號產生



Fishman
------
Fishman
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-17 09:10:19 IP:222.184.xxx.xxx 訂閱
流水号一直往下取,我用的是另一个表,只存流水号,先加一后然后取出,在写入到单据表中去,而用日期加流水,流水号要在单据表中查询最大值,这样会不会有这种问题:单据表中的各个数据都在录入,最后在POST前等流水号,而流水号最大值要从本单据表中查询出,但在事务中一个表在写入时得到了X锁,不允许其它查询,这样就查不到了?
构思二:做一个中间表,写流水号加日期,在窗口打开时查询有没有今天的流水号,没有就写今天的流水号为0,并写入今天的日期。在单据表中POST前查询中间表中当前日期的值加一后取出。请问大大,这样行不行?
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-17 15:11:19 IP:222.184.xxx.xxx 訂閱
又遇到一个问题,我用的是ADOQUERY的语句来写入记录的,最终一句是 ADOQuery1.ExecSQL,那么就没有BEFORE POST事件发生了,是改为ADOTABLE来重写,还是有其它语句或都事件替代的?
------
我的编程起步于ktop,我将永远支持ktop
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-17 16:17:59 IP:59.124.xxx.xxx 未訂閱
將存序號的資料表更改一下,增加一個日期欄位,後面的欄位在放該日期欄位的最大序號

若要取最大直時,無資料,即 Insert 一筆資料進入該資料表,日期為你的2007/04/17,最大值為
1,前端程式自動定義為 2007041700001(假設要取得的日期為2007/04/17)

拐個彎,就到啦!


------
Fishman
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-04-17 17:30:50 IP:222.184.xxx.xxx 訂閱
现在就是没有before post事件发生,是不是一定要换ADOTAable来写呢?还是不一定要写在before post事件中,只要将代码写在紧靠ADOQuery1.ExecSQL前面就行
------
我的编程起步于ktop,我将永远支持ktop
Stallion
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-04-17 19:50:23 IP:211.22.xxx.xxx 未訂閱
插個花~
我有類似的CASE,提供我的作法參考!寫出程式碼太麻煩了,我大概敘述一下~
1.取得SQL SERVER中今天日期,並保存至一變數中 // Select GETDATE() AS TODAY
aDay = aFieldbyname('TODAY').AsString;
1.利用Connect的BeginTran開始交易
2. 利用Select敘述看看資料表中有無資料 // Select Count(*) as total from your_table where 1=1
3.如果 total = 0 表示沒有資料,那麼
aSerial = aDAY '000001';
4.如果有資料,找最大值 ,然後加1// Select MAX(aSerial) as MaxSerial form your_table
aSerial = IntToStr(StrToInt(aFieldbyname('MaxSerial ').AsString) 1);
5.開始做資料新增的工作
6.CommitTran //結束交易!
以上是我的大致作法,請參考!
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-04-17 22:07:33 IP:222.184.xxx.xxx 訂閱
结合几位大大的指点,查看了一些资料,自己初步完成的代码如下,刚刚写完,还没有进一步测试,估计有BUG存在,先写在这里请各位大大斧正不足之处:
分为两个表,表一是写入单据号等详细记录的的,表二是供取单据号用的。
begin
datamoduleform.ADOConnection1.BeginTrans;
try

ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Insert Into 表一(单据号,流水号,,姓名,日期)' ' Values (:单据号,:流水号,::姓名,日期)';
ADOQuery1.Parameters.ParamValues['姓名'] := edit1.Text;
ADOQuery1.Parameters.ParamValues['日期'] := date;
ADOQuery6.Close;
ADOQuery6.SQL.Clear;
ADOQuery6.SQL.Add('select 流水号 from 表二 where 日期=:date'); //因为事务一开始就将表一上X锁,那么另一个相同的事务就不能再进行了,也就不怕这地方查询到相同的流水号了。
ADOQuery6.Parameters.ParamValues['date'] :=date;
ADOQuery6.Open;
if ADOQuery6.IsEmpty then
begin
ADOQuery6.Close;
ADOQuery6.SQL.Text:='Insert Into 表二(流水号,日期) Values(:流水号,:日期)';
ADOQuery6.Parameters.ParamValues['流水号'] :=2; //好象一定要等于2,否则下次取出的还是1
ADOQuery6.Parameters.ParamValues['日期'] :=date;
ADOQuery6.ExecSQL;
ADOQuery1.Parameters.ParamValues['流水号'] := 1;
ADOQuery1.Parameters.ParamValues['挂号单据号'] :=format('%s%.3d',[formatdatetime('yymmdd',date),1]);
end
else
begin
ADOQuery1.Parameters.ParamValues['流水号'] := ADOQuery6.Fields[0].AsInteger;
ADOQuery1.Parameters.ParamValues['挂号单据号'] :=format('%s%.3d',[formatdatetime('yymmdd',date),ADOQuery6.Fields[0].AsInteger]);
ADOQuery6.Close;
ADOQuery6.SQL.Clear;
ADOQuery6.SQL.Add('update 表二 set 流水号=流水号 1 where 日期=:date');//取到后在这里加上1,以便下次再取。
ADOQuery6.Parameters.ParamValues['date'] :=date;
ADOQuery6.ExecSQL;
end;
ADOQuery1.ExecSQL;
datamoduleform.ADOConnection1.CommitTrans;
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-04-18 14:40:32 IP:222.184.xxx.xxx 訂閱
代码测试时是成功的,两台电脑同时取不会取到相同的号,不懂代码中有没有潜在的错误,或者说能不能再优化一下呢。
------
我的编程起步于ktop,我将永远支持ktop
系統時間:2024-05-19 15:24:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!