• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Điều hành viên: tungblt, vuathongtin

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 587
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 12 time
Been thanked: 1 time

Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi dong » T.Hai 17/04/2017 9:38 am

Giả sử trong SQL Server 2005 Tôi có bảng dữ liệu TABTHUCHI có các trường vực sau:
IDSOPHIEUTHUCHI // Khóa chính
NGAY
...

IDSOPHIEUTHUCHI NGAY
PC-04/08/16-008 04/08/2016
PC-07/06/2016-006 07/06/2016
PC-08/10/2017-010 08/10/2017
PC-08/12/2017-012 08/12/2017
PC-10/01/2015-2 10/01/2015
PC-25/09/2017-009 25/09/2017
PT-01/02/2015-001 01/02/2015
PT-03/11/17-011 03/11/2017
PT-05/04/2015-004 05/04/2015
PT-15/07/2016-07 15/07/2016
PT-20/05/2016-005 20/05/2016
PT-31/03/2015-003 31/03/2015

Tại trường IDSOPHIEUTHUCHI, bạn sẽ thấy chữ "PT" hoặc "PC", năm sẽ là 2 ký tự hoặc 4 ký tự và chữ số cuối cùng phải là PT-(dd)/(MM)/(yyyy)-(***)
Sử dụng (*) là số gia tăng được tạo ra bởi hệ thống, độ dài được xác định bởi số dấu hoa thị, tối đa là 9.
Thí dụ:
HD (**) bao gồm 99 số chạy từ HD01, HD02 đến HD99.
HD (**) gồm 999 số chạy từ HD001, HD002 đến HD999.
Sử dụng (MM) để lấy tháng hiện tại.
Sử dụng (năm) để lấy năm hiện tại (hai chữ số cuối cùng của năm).
Sử dụng (yyyy) để lấy năm hiện tại (tất cả 4 số).
Sử dụng (dd) để nhận ngày hiện tại.

Theo dữ liệu trên, muốn lấy ID lớn nhất của năm 2015 "PT" thì tìm số cuối cùng của năm 2015: PT-05/04/2015-004, số ID lớn nhất năm 2015 sẽ là 005 và giả sử hôm nay lấy số ID lớn nhất của ngày này là 14/04/2015 sẽ là: PT-14/04/2015-005, khi lấy số lớn nhất bạn cũng phải chú ý Năm có thể là 2 chữ số hoặc 4 chữ số và định dạng đầu vào.
nếu đầu vào định dạng: PT-(dd)/(MM)/(yy)-(***) đầu ra: PT-14/04/15-005
Nếu đầu vào định dạng: PT-(dd)/(MM)/(yyyy)-(*****) xuất ra: PT-14/04/2015-00005
Nếu đầu vào định dạng: PT-(***) xuất ra: PT-005
Tương tự các năm khác đối với "PT" hoặc "PC" và ngày tứng ứng số ID lớn nhất.

Nếu đinh dạng "PT" của dữ liệu trên:
Nếu đầu vào định dạng: PT-(dd)/(MM)/(yyyy)-(***) và "14/04/2016" thì xuất ra: PT-14/04/2016-008
Nếu đầu vào định dạng: PT-(dd)/(MM)/(yyyy)-(***) và "14/04/2017" thì xuất ra: PT-14/04/2017-012
Nếu đầu vào định dạng: PT-(***) và "14/04/2017" thì xuất ra: PT-012

Nếu đinh dạng "PC" của dữ liệu trên:
Nếu đầu vào định dạng: PC-(dd)/(MM)/(yyyy)-(***) và "14/04/2015" thì xuất ra: PC-14/04/2015-003
Nếu đầu vào định dạng: PC-(dd)/(MM)/(yyyy)-(**) và "14/04/2016" thì xuất ra: PC-14/04/2016-09
Nếu đầu vào định dạng: PC-(dd)/(MM)/(yy)-(***) và "14/04/2017" thì xuất ra: PC-14/04/17-013

Hỏi cách vấn tin SQL Server để lấy ID lớn nhất ở dạng chuổi được được trình bày như ở trên không ?



FlyingFox
Guru
Guru
Bài viết: 762
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 308 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi FlyingFox » T.Hai 17/04/2017 6:27 pm

Có thể query như sau:
  1. SELECT TOP 1 CONVERT(INT,SUBSTRING(IDSOPHIEUTHUCHI, charindex('-', IDSOPHIEUTHUCHI, 4) + 1, 4))
  2.   FROM tabthuchi
  3.  WHERE IDSOPHIEUTHUCHI LIKE 'PC-%'
  4.  ORDER BY ngay DESC, CONVERT(INT,SUBSTRING(IDSOPHIEUTHUCHI, charindex('-', IDSOPHIEUTHUCHI, 4) + 1, 4)) DESC

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 587
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 12 time
Been thanked: 1 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi dong » T.Tư 19/04/2017 9:22 am

Vấn tin của bạn giống ý của mình nhưng vẫn còn lỗi như:
Nếu trường IDSOPHIEUTHUCHI có chuỗi sau sẽ không lấy được
PC009
PC00009
PC9
hoặc sẽ báo lỗi: Conversion failed when converting the nvarchar value 'PC-0' to data type int
PC-009
PC-9
PC-00009

mình sẽ tìm hiểu thêm vấn tin của bạn.

FlyingFox
Guru
Guru
Bài viết: 762
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 308 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi FlyingFox » T.Tư 19/04/2017 12:24 pm

Nếu vậy thì có thể viết như sau:
  1. DECLARE @pattern VARCHAR(100), @num_length INT
  2. SET @pattern = 'PT-(dd)/(MM)/(yy)-(***)'
  3. SET @num_length = len(@pattern) - len(REPLACE(@pattern, '*', ''))
  4.  
  5. SET @pattern = REPLACE(@pattern, '(dd)', '[0-9][0-9]')
  6. SET @pattern = REPLACE(@pattern, '(mm)', '[0-9][0-9]')
  7. SET @pattern = REPLACE(@pattern, 'yy', '[0-9][0-9]')
  8. --set @pattern = replace(@pattern, '*', '_')
  9. SET @pattern = REPLACE(@pattern, '*', '[0-9]')
  10. SET @pattern = REPLACE(@pattern, '(', '')
  11. SET @pattern = REPLACE(@pattern, ')', '')
  12.  
  13. SELECT TOP 1 CONVERT(INT,SUBSTRING(IDSOPHIEUTHUCHI, len(IDSOPHIEUTHUCHI) - @num_length + 1, @num_length))
  14.   FROM TABTHUCHI
  15.  WHERE IDSOPHIEUTHUCHI LIKE @pattern
  16.  ORDER BY ngay DESC, CONVERT(INT,SUBSTRING(IDSOPHIEUTHUCHI, len(IDSOPHIEUTHUCHI) - @num_length + 1, @num_length)) DESC

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 587
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 12 time
Been thanked: 1 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi dong » T.Năm 20/04/2017 8:21 am

Cách 2 của bạn tính ra không hay bằng cách một vì khi lấy chuổi ở trường IDSOPHIEUTHUCHI có 1 số trường hợp không lấy đúng vị trí dấu trừ thứ hai (là vùng số thứ tự tăng) và cũng bị lỗi kể trên của cách một, ngoài ra dòng lệnh từ số 5 đến số 11 thay thế chuổi này dư ra không có liên quan gì vào câu lệnh vấn tin

FlyingFox
Guru
Guru
Bài viết: 762
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 308 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi FlyingFox » T.Năm 20/04/2017 9:11 am

Với cách 2 thì bạn thử với pattern nào mà bị lổi vậy? Nếu muốn test với PC-009 thì phải set pattern là PC-(***). Còn mấy dòng lệnh từ 5 đến 11 thì dùng để chuyển đổi search cho pattern like đó.
Nếu như pattern là PC-(dd)/(MM)/(yyyy)-(***) thì like pattern tương ứng là PC-[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9] nghĩa là bắt đầu với PC-, chữ thứ 4,5,7,8,10,11,13,14 và 15 là cho chữ số từ 0 đến 9. Bạn có thể xem cách dùng LIKE trong câu lệnh ở đây https://technet.microsoft.com/en-us/lib ... (v=sql.105).aspx.

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 587
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 12 time
Been thanked: 1 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi dong » T.Năm 20/04/2017 4:16 pm

bạn tải file đính kèm của mình về và trong sp bạn thay điều kiện lấy theo phiếu "PT" hoặc "PC" ứng với @pattern và lấy theo năm bạn thay đổi các biến mình nói bạn sẽ thấy, mình lấy 1 ví dụ ở dưới, lấy số phiếu theo năm 2016 : nó cho kết quả: -7, như vậy nó tính sai vị trí dấu trừ thứ 2.

Mã: Chọn hết

@pattern = 'PT-(dd)/(MM)/(yy)-(***)'
...
WHERE (LEFT(IDPHIEUTHUCHI, 2) = 'PT') AND (YEAR(NGAY) = '2016')
...

http://www.mediafire.com/file/bk0xe1ld2 ... acbovb.rar
còn cái link bạn gửi cho mình mở ra bị bao lỗi không tìm thấy trang này.

FlyingFox
Guru
Guru
Bài viết: 762
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 308 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi FlyingFox » T.Năm 20/04/2017 6:55 pm

select * from TABTHUCHI WHERE YEAR(NGAY) = 2016 and IDPHIEUTHUCHI like 'pt%'
IDPHIEUTHUCHI NGAY
-------------------------------------------------- -----------------------
PT-15/07/2016-07 2016-07-15 00:00:00.000
PT-20/05/2016-005 2016-05-20 00:00:00.000

Nếu @pattern = 'PT-(dd)/(MM)/(yyyy)-(***)' ==> 5
Nếu @pattern = 'PT-(dd)/(MM)/(yyyy)-(**)' ==> 7

select * from TABTHUCHI WHERE YEAR(NGAY) = 2017 and IDPHIEUTHUCHI like 'pc%'
IDPHIEUTHUCHI NGAY
-------------------------------------------------- -----------------------
PC-08/10/2017-010 2017-10-08 00:00:00.000
PC-08/12/2017-012 2017-12-08 00:00:00.000
PC-25/09/2017-009 2017-09-25 00:00:00.000

Nếu @pattern = 'PC-(dd)/(MM)/(yyyy)-(***)' ==> 12

Để dể dàng so sánh kết quả có thể viết query như sau:
  1. DECLARE @pattern VARCHAR(100), @num_length INT, @YEAR INT
  2. SET @YEAR = 2016
  3. --select * from TABTHUCHI WHERE YEAR(NGAY) = @year and IDPHIEUTHUCHI like 'pc%'
  4.  
  5. SET @pattern = 'PC-(dd)/(MM)/(yy)-(***)'
  6. SET @num_length = len(@pattern) - len(REPLACE(@pattern, '*', ''))
  7. SET @pattern = REPLACE(@pattern, '(dd)', '[0-9][0-9]')
  8. SET @pattern = REPLACE(@pattern, '(mm)', '[0-9][0-9]')
  9. SET @pattern = REPLACE(@pattern, 'yy', '[0-9][0-9]')
  10. /*set @pattern = replace(@pattern, '*', '_')*/
  11. SET @pattern = REPLACE(@pattern, '*', '[0-9]')
  12. SET @pattern = REPLACE(@pattern, '(', '')
  13. SET @pattern = REPLACE(@pattern, ')', '')
  14.  
  15. SELECT IDPHIEUTHUCHI, CONVERT(INT, SUBSTRING(IDPHIEUTHUCHI, len(IDPHIEUTHUCHI) - @num_length + 1, @num_length))
  16.   FROM TABTHUCHI
  17.  WHERE YEAR(NGAY) = @YEAR AND IDPHIEUTHUCHI LIKE @pattern
  18. ORDER BY ngay DESC, CONVERT(INT, SUBSTRING(IDPHIEUTHUCHI, len(IDPHIEUTHUCHI) - @num_length + 1, @num_length)) DESC
  19.  


Tham khảo về pattern matching ở đây.

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 587
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 12 time
Been thanked: 1 time

Re: Vấn tin SQL Server lấy số ID lớn nhất của Phiếu thu chi ?

Gửi bàigửi bởi dong » T.Sáu 21/04/2017 9:16 am

Giờ thì Ok rồi, bạn có tư liệu về hướng dẫn sử dụng tập lệnh SQL và SP đầy đủ nhất, nếu có bạn share cho mình với, Mình gửi lời cám ơn bạn nhiều nhé.


Quay về “Visual Basic .NET và C# (VB.NET & C#)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách