01/10/2018, 00:56

Tự sinh mã hóa đơn đặt hàng

mình đang làm bài toán có một hóa đơn mà mỗi hóa đơn thì cần mã hóa đơn để ghi vào cơ sở dữ liệu .Mình có thử vài gải pháp nhưng chưa có cái nào ưng lắm mong các bạn có thể gợi ý cho mình được ko vd có một form đăng ký đặt hàng thì mỗi lần ấn nút đặt hàng thì nó sẽ tự sinh mã cho hóa đơn cho nó và các mã ko được trùng nhau

pvt-streampow viết 03:01 ngày 01/10/2018

Bạn tạo một trường order_id với thuộc tính auto_increment { tự động tăng } - làm khóa chính là được [khi insert dữ liệu vào table, dữ liệu sẽ tự tăng cho trường này - không trùng nhau]
Ví dụ : create table order(
order_id int unsigned not null primary key auto_increment,
customer,

);
Khi insert dữ liệu vào bảng thì không cần insert cho trường này, câu truy vấn:
insert into order (customer,…) values(‘Nguyễn Văn A’,…);
Đây là cách cơ bản - vì quy tắc cho mã hóa đơn có thể phụ thuộc vào từng “project” nên không thể có ‘một cách cố định’. Ví dụ: ASN0001-15 = “Áo sơ mi nam - đơn số 1, năm 2015”. Trong đó, ASN có thể lấy quy tắc từ sản phẩm, đơn số 1 thì lấy từ order_id, 15 thì sử dụng code lấy năm từ 2000 trở về sau…vv

Đỗ Nhiên viết 03:13 ngày 01/10/2018

muốn thêm chũ đằng sau thì làm thế nào bạn vd như là P1 chả han tiếp theo là P2 bạn và P3 vd thế

pvt-streampow viết 02:59 ngày 01/10/2018

Do quy tắc tính mã hóa đơn có thể thay đổi => nếu có vấn đề cần truy xuất ngược trở lại để lấy dữ liệu có thể không chính xác [giữa mã hóa đơn có quy tắc cũ hoặc mã hóa đơn có quy tắc mới] => thống nhất sd thêm 1 trường hóa đơn [sd để xuất cho khách hàng] gọi là order_code, kiểu dữ liệu: varchar(50) - khi insert dữ liệu vào bảng => bạn lấy dữ liệu max order_id từ bảng hóa đơn được max_order_id , sd hàm nối chuỗi để được order_code => câu truy vấn:
//
order_code = “P”.(phép toán nối chuỗi).(max_order_id+1)
insert into order (customer, order_code) values(‘Nguyễn Văn A’, ‘P2’);
Hoặc nếu không thì lưu lịch sử quy tắc tính mã hóa đơn, thêm 1 trường cho version của công thức:
vd:
v1 = P(id) //P1…ETC
v2 = S(id) //S1 …etc
khi truy xuất từ mã hóa đơn dạng P1 => dựa vào version của công thức để lấy ra được order_id, từ đó thao tác dữ liệu theo order_id.

Đỗ Nhiên viết 03:12 ngày 01/10/2018

bạn tao một bảng mẫu cho mình được ko mình vẫn chưa hiểu lắm

pvt-streampow viết 03:10 ngày 01/10/2018

Tạo bảng order:
CREATE TABLE order(
order_id int unsigned not null primary key auto_increment,
order_code varchar(50),
customer varchar(120),
email varchar(120),
phone varchar(15),
add_time datetime,
last_update datetime
product_id int unsigned not null);
Sử dụng code php:
Tham khảo thao tác cơ sở dữ liệu bằng php:

streampow sức mạnh tự học - php mysql html css

Thao tác với cơ sở dữ liệu - kết hợp php và mysql

Tìm hiểu quy trình làm việc giữa php và mysql: kết nối tới cơ sở dữ liệu, thực thi truy vấn, xử lý kết quả...

<?php //triệu gọi file connect_db.php include "connect_db.php"; //chuẩn bị câu truy vấn $sql = "SELECT MAX('order_id') as max_order_id FROM order"; $max_order_id = 0; //nếu câu truy vấn thành công if($result = $link->query($sql)) { while($order_info =mysqli_fetch_array($result)) { $max_order_id = isset($order_info['max_order_id']) ? (int)($order_info['max_order_id'] : 0; } mysqli_free_result($result); $max_order_id++; $order_code = "P".$max_order_id; $user_name = "Tran Van B"; $user_email = 'tranvanb@gmail.com'; $user_phone = '0168168168'; $product_id = 1; $time = date("Y-m-d H:i:s"); //chuẩn bị câu truy vấn $sql = sprintf("INSERT INTO order(order_code, customer, email, phone, add_time, last_update, product_id) values ('%s','%s', '%s', '%s', ' %s', '%s', '%d');",$order_code, $user_name,$user_email, $user_phone, $time, $time, $product_id); //thực thi câu truy vấn if($result = $link->query($sql)) { printf("Đã thêm: %d đơn hàng",mysqli_affected_rows($link)); } else { echo 'Lỗi: ',mysqli_error($link); } } else { echo 'Lỗi: ',mysqli_error($link); } mysqli_close($link); ?>
Đỗ Trung Quân viết 02:57 ngày 01/10/2018

Mình nghĩ bảng này của bạn nên tách thành 2 bảng Order và Order_Detail, thiếu trường Created_By và Updated_By. Không nên đưa product_id vào order, nếu có thì bạn thiếu trường số lượng.

@Do_Nhien Bạn có thể tham khảo 4 bảng này

Bài liên quan
0