c生成訂單號
『壹』 請問,在創建一個訂單時,提交了訂單信息和附件,還沒有訂單號產生,
C 語言程序,假定 訂單號 int order=1234;生成新訂單號含日期時間:
#include
#include
int main( )
{
time_t t;
int order,i;
char s[80];
order = 1234;
time(&t);
sprintf(s,"%s_%05d",ctime (&t),order);
for (i=0;iprintf("%s\n",s);
return 0;
}
輸出例子: Fri_Feb_17_14:59:24_2017__01234
『貳』 怎麼隨機生成的Id變成16位的訂單號
關於生成訂單號的解決方案
電子商務及類電子商務的系統越來越多,我相信訂單號問題是這類系統中最常見不過的一個問題了,但今天還是想談談。
這幾天由於工作需要接手了另外一同事前期開發的一個交易系統,原本使用的是uniqid()函數生成的。uniqid()是根據系統時間經過一定演算法得到的一個結果,關於uniqid()的詳情手冊上很清楚。
當時的生產方式是:
$order_sn = str_replace('.', '', uniqid('', true));
這種方式理論上說會重復,但是在實際應用中我相信這種重復可以認為是不可能事件。但是,如果這件事情到此就結束的話我也就不會再寫這篇文章。這幾天做支付接入,國內某大型網路支付機構只支持傳遞最多16位的訂單號,無奈我只得調整訂單號的生產規則。
其實關於生成訂單號的方式非常多,大致有以下幾個參數被用到:1、自增欄位,2、系統時間,3、隨機數,4、流水號。
一、資料庫自增欄位
二、簡單的使用系統時間
三、系統時間加隨機數
四、系統時間加流水號
先說說資料庫自增欄位,這種方式是最簡單有效的方式,但同時也存在很大的弊端:
1、以mysql為例的int類型最多存儲10位的數字,如果使用bigint則在使用php的mysql_insert_id()取上次插入id時會出現錯誤,當然這個錯誤是可以採用某些方法避免的。
2、很多時候業務邏輯需要在數據未插入系統之前就獲得訂單號以進行一系列的處理,這樣就容易出錯。比如當並發較高的時候系統獲取到下一次插入的ID應該是10000,可是當真正insert的時候發現10000已經被其他插入行使用。
3、很容易透露出系統的銷量,從商業層面說這種方式不太合適。
4、表現不夠直觀,不能通過訂單號簡表達訂單信息
簡單的使用系統時間也可以有多種方式比如直接使用time()生成10位數字,這種方式基本避免了資料庫自增欄位的大部分弊端,但同時也產生的一些新的問題,比如:並發量稍高(峰值每秒一次以上,相信這是個很小的值)就會產生相同訂單號,而這是業務邏輯所不允許的。為了解決重復訂單問題而使用隨機數或者流水號。
先說隨機數,這東西就跟看上去的字面意思一樣,總顯得不那麼可靠,我認為盡量不使用它參與唯一標識。
再說流水號,既然叫流水號,它的性質其實和自增欄位一樣,不同的是或許每天或者每月流水號又會重新計數。總得有個地方來保存下一個(或者當前使用過的最大)流水號的值,如果存在文件中那就需要考慮這個文件的讀寫鎖的問題,就這個問題估計足夠寫書了,在此不予討論。如果以自增方式存在DB中,那麼我們在程序生成訂單號之前需要多訪問(至少)一次DB,這也就降低了程序性能,要知道資料庫訪問對程序的性能影響是非常明顯的
上面是一大堆廢話,說說我的解決思路(PHP),當然同時別忘了大前提是:限制長度16位
第一步:
$order_sn = date('ymdHis').substr(microtime(),2,4);
其實這種方式基本已經滿足需求了,無需訪問DB無隨機數參與。但是如果兩次請求在相同的十萬分之一秒內產生,那麼相同訂單就產生了,看能否有辦法繼續提高。
date(『His』)所表達的結果其實就是000000到235959,而且其中很多數字不會被用到比如126998。一天86400秒,如果從一天的0:0:0算起直到23:59:59使用00000-86400就可以完全表示,這樣下來我們就完全可以把date(『His』)換成五位數字。既然time()函數就是按秒計數,那咱就取time()結果的後五位,同一天之內後五位不會重復出現,比如今天0:0:0後五位是98765,那麼到今天23:59:59後五位就應該是98765+86400去掉最高位,相信這個應該是很好理解的。
這就產生了第二步的結果:
$order_sn = date('ymd').substr(time(),-5).substr(microtime(),2,5);
這樣一來也導致無法直觀的表達出訂單生成的時分秒,但我認為(或者說從業務角度理解)這個屬於可接受范圍。同時這樣處理出現重復訂單的概率就降低到了第一步的1/10,我以為這應該不算一個小數字。還不滿意?OK,那繼續!
想要繼續降低重復可能性那就繼續提高時間精度,但是我們的長度限制只有16位,看來只有減少部分不長變動的字元。
date(『ymd』)產生6位字元,而前兩位在一年之內都不會變化,第三到第四位也就是01-12。
前兩位我們可以使用A-Z的字母來表示,系統開始運行的那一年用A,第二年用B,第三年用C……類推,我相信我寫的這程序運行不了10年。第三第四位完全可以使用一位16進制數表示,這樣咱就又節約了兩位字元,這就可以在末尾加上00-99的隨機數。
現在看第三步的結果
$year_code = array('A','B','C','D','E','F','G','H','I','J');
$order_sn = $year_code[intval(date('Y'))-2010].
strtoupper(dechex(date('m'))).date('d').
substr(time(),-5).substr(microtime(),2,5).sprintf('d',rand(0,99));
理論上說出現重復訂單號的概率又降到了第二步的1/100。
做個簡單測試,寫個php文件,連續10次echo出這三步結果得到的$order_sn,中間無任何多餘程序。
第一種方案基本得到10個相同的結果。
第二種方案基本得到10個不同的結果,主要是後兩位不同,一般末位差一。
第三種方案得到10個不同結果末四位不同
當然這個測試不具備多少說服力
優點:
1、不用操作資料庫,性能較高。
2、較為直觀,不難看出訂單產生的大致時間
3、訂單號重復的概率極小,只有程序在百萬分之一秒內同時處理一個以上的生成訂單號請求,而且同時生成的0-99的隨機數也一樣才會出現重復的訂單號。
『叄』 怎麼在一份C/O裡面填寫多份訂單號
你好,你這問題最後怎麼解決了?
『肆』 用c語言編一個訂單信息管理程序
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
int N;//////訂單數目
struct chanpin
{
long bianhao;
char mingcheng[30];
char cpmingcheng[30];
int cpdingjia;
int shuliang;
long jine;
};////訂單編號、公司名稱、產品名稱、產品訂價、訂購數量、訂單金額
void init(struct chanpin *p)
{
printf("輸入訂單編號:\t");
scanf("%d", &p->bianhao);
printf("\n輸入公司名稱:\t");
scanf("%s", p->mingcheng);
printf("\n輸入產品名稱:\t");
scanf("%s", p->cpmingcheng);
printf("\n輸入產品定價:\t");
scanf("%d", &p->cpdingjia);
printf("\n輸入訂購數量:\t");
scanf("%d", &p->shuliang);
p->jine=p->cpdingjia * p->shuliang;
}//初始化
void displaymingcheng(struct chanpin *p)
{
printf("\n");
printf("公司名稱:%s\n", p->mingcheng);
}
void display(struct chanpin *p)
{
displaymingcheng(p);
puts("-----------------------------------------------");//傳說中的分割線
printf("訂單編號:\t%ld", p->bianhao);
//printf("\n公司名稱:\t%s", p->mingcheng);
printf("\n產品名稱:\t%s", p->cpmingcheng);
printf("\n產品定價:\t%d", p->cpdingjia);
printf("\n訂購數目:\t%d", p->shuliang);
printf("\n總金額是:\t%ld", p->jine);
puts("-----------------------------------------------");
}//輸出一個產品的全部信息
void displaycompany(struct chanpin *p)
{
char temp[30];
int i;
printf("輸入公司名稱:\t");
gets(temp);
for(i=0;i<N;i++)
{
if(strcmp(temp, p[i].mingcheng)==0)
display(&p[i]);
}
puts("訂單信息輸出完畢!!!");
}///////////根據名稱輸出公司訂單信息
void findbianhao(struct chanpin *p)
{
long temp;
int i;
printf("輸入編號:\t");
scanf("%ld", &temp);
for(i=0;i<N;i++)
{
if(temp==p[i].bianhao)
display((p+i));
}
puts("根據編號查找完成!!!");
}//////根據編號查詢 ....其他的查找方法我沒寫,你可以補上
void findcpmingcheng(struct chanpin *p)
{}///////產品名稱查找
void findcpdingjia(struct chanpin *p)
{}////產品定價查找
int menu()
{
int x;
printf("根據公司名稱輸出訂單輸入 :\t c\n");
printf("根據編號查找輸入:\t b\n");
printf("根據產品名稱輸入:\t m \n");
printf("根據定價查找輸入:\t d \n");
printf("退出輸入:\t e \n");
x=getchar();
getchar();
return x;
}
void main()
{
struct chanpin *cp;
int choic;
int i;
printf("請輸入總書目:\t");
scanf("%d", &N);
cp=(struct chanpin *)malloc(N*sizeof(struct chanpin));
for(i=0;i<N;i++)
init(cp+i);//初始化所有產品
for(i=0;i<N;i++)
display(cp+i);///顯示所有產品信息
choic=menu();
while(choic!='e')
{
if(choic=='c')
displaycompany(cp);/////調用公司查找
else if(choic=='b')
findbianhao(cp);///調用編號查找
else if(choic=='m')
findcpmingcheng(cp);////調用名稱查找
else if(choic=='d')
findcpdingjia(cp);
else
printf("出入錯誤!\n");
choic=menu();
}
puts("感謝使用");
}
『伍』 如何生成一個這種形式的訂單號
DateTime dttime=DateTime.Now;
string str=dttime.Year.ToString()+dttime.Month+dttime.Day;
string sql="select top 1 訂單號 from 訂單表 order by 訂單號 desc";
執行該語句,返回現在資料庫中最近一次生成的訂單號.
然後對其進行操作:(比如最近一次生成訂單號為 str2 )
int ii=Convert.ToInt32(str2.SubString(str2.Lenght-4))+1;
int len=ii.ToString().Length;
string str3="";
switch (len){
case 1:
str3="000"+ii.ToString();
break;
case 2:
str3="00"+ii.ToString();
break;
case 3:
str3="0"+ii.ToString();
break;
}
最後.你當前的訂單號就是:
str+=str3;
---------------------
rebinglunlun - 高級魔法師 六級
願聽其詳~~
『陸』 怎樣將當前日期+訂單號生成一個訂單號
||C 語言程序,假定 訂單號 int order=1234;生成新訂單號含日期時間:
#include<stdio.h>
#include <time.h>
int main( )
{
time_t t;
int order,i;
char s[80];
order = 1234;
time(&t);
sprintf(s,"%s_%05d",ctime (&t),order);
for (i=0;i<strlen(s);i++) if (s[i]==' ' || s[i]=='\n') s[i]='_';
printf("%s\n",s);
return 0;
}
輸出例子: Fri_Feb_17_14:59:24_2017__01234
『柒』 Oracle 自動生成標識列, 比如訂單編號,學生ID
Oracle 自動生成標識列可以用序列。
a)創建序列:
create sequence 序列名
start with 起始位置
increment by 增量大小
maxValue 最大值(沒有這些nomaxValue)
[cycle/nocycle(是否循環)];
例如:
create sequence seq_stu increment by 1 start with 001 nomaxvalue nocycle;
b)序列中的兩個特殊屬性:
.nextVal :下一個序列的值
.currVal :當前序列的值;
特別注意:只要用戶使用了.nextVal 那麼序列值就會增加一個增量,
eg:select seq_stu.nextVal from DUAL;序列值依然會增加一個增量!
c)兩個特殊屬性的使用:
加入學生信息表的StuId列是主鍵列,需要自己增長:
insert into StuInfo values ('Stu'||to_char(Sysdate,'yyyymmdd')||seq_stu.nextVal,....);
最後錄入的學號就會是'Stu20111218001序列值' 。
『捌』 asp生成產品訂單號問題
你的定單應該記錄下在資料庫,或者記錄一個數據條目數字,使用資料庫或者文本文件,注意鎖定文件和資料庫表,防止並發連接/寫和讀
你可以資料庫查詢下 定單號以070522開頭的 數據中有多少記錄,就是已經有幾條了,之後就知道該用什麼ABCD了字母了
『玖』 c320650245275訂單號查詢
不知道沒說什麼快遞只有這個訂單號
『拾』 java怎麼自動生成訂單號
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class CopyContentToAnother extends JFrame implements ActionListener{
JButton button;
JTextArea jtx,jtx2;
Container c;
JPanel p;
public CopyContentToAnother(){
c=this.getContentPane();
p= new JPanel();
jtx = new JTextArea(12,12);
jtx2 = new JTextArea(12,12);
button = new JButton("確定");
button.addActionListener(this);
p.add(jtx);
p.add(jtx2);
p.add(button);
this.add(p);
this.setSize(500, 400);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button){
jtx2.setText(jtx.getText());
jtx.setText("");
}
}
public static void main(String args[]){
CopyContentToAnother m =new CopyContentToAnother();
}
}
上面已經回答了
編譯已經通過,運行正確,如果還有問題,請留言ITjob