网络版中日期加序号的取得方式 |
答題得分者是:Fishman
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
在单机版中我是这样取的
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 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
流水号一直往下取,我用的是另一个表,只存流水号,先加一后然后取出,在写入到单据表中去,而用日期加流水,流水号要在单据表中查询最大值,这样会不会有这种问题:单据表中的各个数据都在录入,最后在POST前等流水号,而流水号最大值要从本单据表中查询出,但在事务中一个表在写入时得到了X锁,不允许其它查询,这样就查不到了?
构思二:做一个中间表,写流水号加日期,在窗口打开时查询有没有今天的流水号,没有就写今天的流水号为0,并写入今天的日期。在单据表中POST前查询中间表中当前日期的值加一后取出。请问大大,这样行不行?
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
插個花~
我有類似的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 發送簡訊給我 |
结合几位大大的指点,查看了一些资料,自己初步完成的代码如下,刚刚写完,还没有进一步测试,估计有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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |