Đánh giá chủ đề:
  • 1 Votes - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Làm thế nào để dùng SQL trong lập trình?
#21
Mục 3. Tiên đã làm được rồi.
Thanks./.
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#22
1. Da ta mình để trên 1 PC riêng (Chỉ phần table).
2. Các PC (Dự kiến khoản 5 PC) khác mình dùng để chạy chương trình Bán hàng được Thiết kế gồm các đầy đủ các thành phần những table chỉ là các table tạm dùng để thao tác.
Khi xuất hàng bán thì ghi các nội dung xuất trong table tạm, khi lưu --> Ghi và table ở da ta.

Trong môi trường nhiều người dùng, cách tổ chức như của Tiên là ổn rồi. Nói ngắn gọn là trong giao dịch với data chung thì cần hình thành khái niệm gọi là giao dịch.
Chỉ kết nối khi cần sau đó ngắt kết nối để tránh tình trạng xung đột cũng như tăng lưu lượng mạng.
Với môi trường đòi hỏi kết nối đồng thời thì có 3 dạng xử lý:
1. Sử dụng SQL Server để quản lý truy cập > cách tối ưu
2. Sử dụng phân quyền hệ thống theo người dùng với tập tin dạng *.mdw (cái này tốt nhưng phức tạp)
3. Áp dụng nguyên tắc cung cấp dịch vụ, xếp hàng về trao đổi dữ liệu
Máy A cần cập nhập - xin một quyền và đợi khi giao dịch của máy B kết thúc thì tiến hành (dùng một tập tin Manifest để thể hiện ai đang kết nối dùng cái gì ..vv) hoặc đánh giá tình trạng của bảng, bản ghi trước khi thực hiện điều chỉnh số liệu và kèm theo lưu vết tránh tình trạng 1 bản ghi có 2 ông cùng sửa.

Điểm yếu của LinkTable là nó tạo kết nối thường trực. Nhưng nếu không có LinkTable thì sẽ không thực hiện được một số query như tình huống bài trước của Tiên.
Vì vậy ta dùng cách sau:
Khi cần cập nhập database chung thì mới tạo Link, sau khi xong thì xóa đi (nếu phải dùng các query dạng UPDATE). Còn nếu chỉ là thêm bản ghi/ nhiều bản ghi hoặc tạo bảng mới thì dạng sau là đủ, không cần LinkTable
Mã:
INSERT INTO tblTest IN 'E:\Users\Paulsteigel\Desktop\GPE\QbNHNhan\test.mdb'
SELECT tblDanhsach_Hanghoa.*
FROM tblDanhsach_Hanghoa;

3. À mình có đoạn code dùng SQL để Insert vào table (chỉ thêm mới):
Với đoạn code của Tiên thì cần cung cấp cả thông điệp lỗi mình mới biết là lỗi gì.

Những thứ hay gặp trong lỗi truy vấn là:
+ Khác kiểu số liệu, trường A chuyến vào trường B không cùng kiểu số liệu
+ Sai cú pháp lệnh, thiếu dấu nháy, dấu phẩy, dấu phân cách trường. Nhiều khi ta viết xong câu lệnh trên nhiều dòng, chỉ cần thiếu khoảng trống để phân cách từ khóa giữa dòng trên và dòng dưới cũng có thể gây lỗi.
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Che_Guevara , Minh Tiên , maidinhdan
#23
Cảm ơn Pau đã rất nhiệt tình hướng dẫn !
Lợi ích của SQL thật to lớn.
Mình mời chuyển sang học ADO nên còn nhiều quả bí. Việc phân quyền truy cập da ta mình chưa ngâm cứu. Dự kiến sẽ ngâm cứu sau khi hoàn thành cơ bản khung PM theo ADO.
Xin còn làm phiên các AC Pro nhiều.

À ở bài trước Tiên có nhờ Pau cùng ACE giúp:
"4. Mình muốn Insert thêm 1 Field vào tblNhaphang_Muavao_Chitiet mà không lấy từ tblNhaphang_Muavao_Chitiet_Tam mà lấy từ Form thì code như thế nào ?"
(Nghĩa là: Ngoài các Field Insert .... Select như Pau HD mình muốn thêm 1 Field nữa vào Insert ( ....,...., FieldAdd) thì code như thế nào sau đoạn Select ..., ??
Cảm ơn nhiều !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#24
(12-05-16, 08:19 AM)Minh Tiên Đã viết: .....

Tiên nói không rõ...
1. Thêm dữ liệu từ form vào trường chưa có trong bảng đó hay
2. Thêm dữ liệu từ form vào trường đã có sẵn.

Với tình huống 1 phải dùng đến ALTER TABLE ... ADD COLUMN

Với tình huống 2 - đơn giản chỉ cần kiểm soát cùng kiểu số liệu
INSERT INTO abc(Trường 1, trường 2...) SELECT FROM Trường 1, [Dữ liệu từ form] as Trường 2 From ...
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Minh Tiên
#25
Nội dung mình nhờ giúp là ở Ý 2 của bạn đó. Cụ thể:
Mình muốn Insert vào table 1 có 5 trường gồm: Stt,Mahang,Tenhang,Donvitinh,MaNCC trong đó 4 trường gồm Stt,Mahang,Tenhang,Donvitinh được lấy từ table1, còn 1 trường MaNCC được lấy từ Form.
Bạn giúp mình đoạn code nhé !
Thanks !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#26
(12-05-16, 05:56 PM)Minh Tiên Đã viết: Nội dung mình nhờ giúp là ở Ý 2 của bạn đó. Cụ thể:
Mình muốn Insert vào table 1 có 5 trường gồm: Stt,Mahang,Tenhang,Donvitinh,MaNCC trong đó 4 trường gồm Stt,Mahang,Tenhang,Donvitinh được lấy từ table1, còn 1 trường MaNCC được lấy từ Form.
Bạn giúp mình đoạn code nhé !
Thanks !

Đây query ví dụ của bạn đây... mình coi ví dụ giá trị trên form là 5 và muốn cập nhập vào Đơn giá bán lẻ, mình để SQL thế này
Mã:
INSERT INTO tblTest ( Mahang, Tenhang, Donvitinh, Nhomhang, Dongiabanle ) IN 'E:\Users\Paulsteigel\Desktop\gpE\qbNHNhan\test.mdb'
SELECT a.Mahang, a.Tenhang, a.Donvitinh, a.Nhomhang, 5 AS DGBL
FROM strTableNameTam AS a;

Còn lấy từ form thì thay 5 bằng điều khiển trên form. ví dụ

Mã:
SqlTxt = "INSERT INTO tblTest ( Mahang, Tenhang, Donvitinh, Nhomhang, Dongiabanle ) "
"IN 'E:\Users\Paulsteigel\Desktop\gpE\qbNHNhan\test.mdb' " & _
"SELECT a.Mahang, a.Tenhang, a.Donvitinh, a.Nhomhang, " & txtDongia & " AS DGBL " & _
"FROM strTableNameTam AS a;"
Lưu ý là cái này thực hiện trong code của form nhé. còn nếu muốn dùng ngay tại Query ngoài thì phải sửa tham chiếu txtDongia dạng Form!Tenform!txtDongia
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Che_Guevara , Minh Tiên , maidinhdan
#27
T đã làm đc rồi. Thank pau nhiều.
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#28
Chủ đề này hay quá, đọc và nghiền ngẫm các Q&A của 2 bạn Tiên và Ngọc thật sự sáng ra rất nhiều điều để áp dụng vào SQL và Access.

Mình cũng xin 1 chút lạm bàn trong thớt nhé.

Hiện mình đang quản lý 1 hệ thống quản trị dữ liệu, xây dựng theo cơ chế Access-Frontend, SQL-Backend, kết nối Linked Table qua ODBC.

Cơ sở dữ liệu của mình vào khoảng 40-50 bảng, khoảng gần 10 bảng là có trên 100,000 records, có bảng đã đạt tới 500,000 records.

Tất cả các nghiệp vụ truy xuất, nhập liệu, chỉnh sửa mình đều được viết trên Access-FE. 

Cơ sở dữ liệu SQL đặt trên 1 máy chủ server có cấu hình tạm ổn (32GB, Intel Xeon, 64 bit). Cùng 1 thời điểm có khoảng 35-40 người dùng truy cập, Access-FE đặt trên PC của mỗi người dùng.

Tuy nhiên, biết được yếu điểm của việc linked table là tốc độ xử lý và bảo mật thông tin nên mình đang cố gắng tìm hiểu về giao thức DAO để liên kết giữa SQL và Access.

Mình hiểu rằng bằng giao thức DAO, có thể triển khai việc  đưa hết toàn bộ lệnh truy vấn vào SQL, sử dụng Module trong Access để gọi các câu lệnh lên và gán giá trị vào các Form, Report ở Access. Như vậy sẽ hạn chế tối đa việc sử dụng querry (ở Access), nâng cao tốc độ xử lý (vì lệnh được thực thi ở SQL) và tính bảo mật thông tin. Mình hiểu như vậy không biết có đúng không?

Lấy minh họa 1 yêu cầu hiện tại của mình:

  1. tblInventory lưu các dữ liệu liên quan tới hàng hóa gồm các trường chính: Mahang, Tenhang, Loaihang, Donvitinh, Giaban, Giamua, và khoảng 50 trường khác.
  2. tblObject lưu các dữ liệu liên quan tới đối tượng gồm các trường chính: Madoituong, Tendoituong, Loaidoituong, Diachi, Masothue, Nguoiphutrach, Hantienno, Hanngayno và khoảng 30 trường khác.
  3. tblSalesOrderMaster lưu các dữ liệu chung về 1 đơn hàng: Madonhang, Tendonhang, Ngayban, Madoituong, Nguoiban, Loaitien, Tonggiatriban, Loaithanhtoan và khoảng 30 trường khác.
  4. tblSalesOrderDetail lưu các dữ liệu chi tiết của 1 đơn hàng: Magiaodich, Madonhang, Mahang, Soluong, Dongia, Tonggia, Mathue, Giatrithue, và khoảng 20 trường khác.
  5. tblLedger lưu toàn bộ các giao dịch của kế toán: Magiaodich, Machungtu, Loaichungtu, Mabang, Madonvihachtoan, Madoituong, Maloaitien, Ngaygiaodich, Mahang, Soluong, Dongia, Tonggia, Ghino, Ghico, MagiaodichSO, Madonhang (kế thừa từ records ở tblSalesOderDetail khi nhập liệu) và khoảng 80 trường khác.

Yêu cầu trong công tác quản trị sẽ cần 1 báo cáo giải quyết câu hỏi:

Đã có những đơn hàng nào đã lên mà chưa được xuất hóa đơn? (vì nhiều nguyên do như hàng chưa về-chưa giao, khách gom đơn hàng xuất 1 lần hóa đơn cuối tháng, hoặc đơn giản, kinh doanh quên laughing )

Để giải quyết truy vấn trên, báo cáo này sẽ cần có tối thiểu các trường: [Tên trường và STT của bảng - trong ngoặc đơn]

Madonhang(3), Tendonhang(3), Ngayban(3), Tonggiatriban(3), TonggiatriHD[da xuat hoa don](5), Madoituong(3), Tendoituong(2), Mahang(4), Tenhang(1), Soluong(4), SoluongHD[da xuat hoa don](5), Dongia(4), DongiaHD[xuat hoa don](5)



Querry làm source cho báo cáo này được thiết kế  sẽ phải chạy liên kết giữa 5 bảng này, với Bảng chính là tblSalesOrderDetails, các khóa chính như Magiaodich, Mahang, Madoituong, ...

1 Form Unbound ở Access cho phép người dùng nhập liệu các giá trị như Kỳ đơn hàng (Từ ... Đến), Mã người bán, Tên đối tượng, Tên Hàng, ... Querry sẽ tham chiếu trên các giá trị lọc đó để cho báo cáo tương ứng, nếu null hết thì (Thường thì mình hạn chế vùng truy vấn là trong 1 năm) chạy toàn bộ giá trị.

Querry này thực sự chạy không nhanh, ở Lan sẽ mất khoảng 7-10s để ra báo cáo, ở Wan thì mất lâu hơn từ gấp đôi tới gấp 4 lần tùy thuộc vào mạng.

-------
Câu hỏi của mình là:

Liệu cơ chế này có hiệu quả, xử lý nhanh hơn nếu chuyển querry (ở Access) thành câu lệnh truy vấn ở SQL, xong dùng Module - lệnh ở VBA để gọi ra giá trị trên báo cáo ở Access không?

Cơ chế trên có phải là phương thức tối ưu nhất cho việc truy xuất dữ liệu không khi sử dụng liên kết SQL và Access không?

Nếu đúng như vậy, bạn Ngọc và các ACE có thể giúp mình demo phương thức này với minh họa trên không?
Chữ ký của ckno1no Xin chào, mình là ckno1no, Tham gia http://thuthuataccess.com/forum từ ngày 10-11 -12.
Reply
Những người đã cảm ơn paulsteigel , Che_Guevara
#29
Xin có vài câu nói chuyện một tẹo....
Trích dẫn:Tuy nhiên, biết được yếu điểm của việc linked table là tốc độ xử lý và bảo mật thông tin nên mình đang cố gắng tìm hiểu về giao thức DAO để liên kết giữa SQL và Access.

Cần hiểu đúng một chút::: Link table là một dạng kết nối ADO.. nó không phải là cái gì khác đâu bạn nhé. Không có khái niệm tốc độ và xử lý gì cả. Khi bạn nhấn chuột để mở một link tới một bảng thì thứ tự các việc sẽ thế này:
1. Access thiết lập một Kết nối (Connection) tới Bảng được Link
Nếu thông số trong kết nối đó sai (sai mật khẩu, sai đường dẫn chẳng hạn), Access sẽ thông báo là nỏ thấy tập tin chứa bảng để liên kết đâu cả.
2. Nếu thành công, Access sẽ thiết lập một Recorset và mở bảng theo thông số trong chuỗi kết nối của Link.

Trích dẫn:Mình hiểu rằng bằng giao thức DAO, có thể triển khai việc  đưa hết toàn bộ lệnh truy vấn vào SQL, sử dụng Module trong Access để gọi các câu lệnh lên và gán giá trị vào các Form, Report ở Access. Như vậy sẽ hạn chế tối đa việc sử dụng querry (ở Access), nâng cao tốc độ xử lý (vì lệnh được thực thi ở SQL) và tính bảo mật thông tin. Mình hiểu như vậy không biết có đúng không?

Việc đưa SQL vào Mã (code) hay không là do người dùng tự làm. Trên thực tế, việc Hard-Code (viết mã của những thứ cần thay đổi) trong code là một tác phong chằng tốt đẹp mấy đâu các bạn ạ.
Làm thế khi có gì cần sửa nhỏ, cần theo dõi, can thiệp sẽ không hề tốt tí tẹo nào.
Query và SQL cũng giống nhau chỉ có khác với SQL trong các đối tượng khi code thì nó chạy ẩn, còn Query trong môi trường access (với tên gọi trong mục Query) thì nó còn giúp ta hiển thị data cũng như các phép toán khác mà thông thường SQL trong code không thể hiện được.

Hãy xem một ví dụ tôi gửi kèm đây - nó có cả những thứ Hardcode, những thứ khác thì tùy nghi...
http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
Lúc nào rỗi mình sẽ giả nhời tiếp...

Còn về cơ chế giao tiếp, xử lý tính toán số liệu, người ta phân ra 2 loại:
1. Những thứ phải thường xuyên xử lý online (xử lý đơn hàng liên tục)
+ Dùng SQL Server và các Store procedure (Các chương trình chạy trên máy chủ để ra kết quả cho người dùng lấy về) >> Tối ưu
+ Dùng quy trình cập nhập số liệu theo khung thời gian: Cứ vài phút sẽ lấy số liệu về và để trên máy trạm khai thác và xử lý, không sử dụng Query số liệu trực tiếp.

2. Với những thứ có tốc độ xử lý chậm theo chu kỳ thì người ta hay làm thế này:
+ Một database tại máy trạm chứa số liệu làm việc và cứ một khoảng thời gian nhất định phần FE (ứng dụng) sẽ liên kết với máy chủ gửi cập nhập và tải về số liệu;
+ Một database tại máy chủ để chứa các số liệu dùng chung cần chia sẻ chung.

Tùy theo công việc mà ta chọn cách tiếp cận nào!
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Che_Guevara , maidinhdan , Minh Tiên
#30
(29-07-16, 03:12 PM)paulsteigel Đã viết: ...
Theo yêu cầu của bạn, với điều kiện ta không có SQL Server, tôi đề xuất một tiếp cận như sau:
Vấn đề: Do số lượng tính toán trong truy vấn để ra được danh sách các đơn hàng chưa xuất hóa đơn có thể là rất nhiều do đó người ta thường tránh thực hiện truy vấn mà không có phát sinh số liệu.
Trong CSDL vì thế nên có 1 bảng quản lý việc tính toán và cập nhập những phát sinh trong các giao dịch hàng ngày, đồng thời, quy định thời gian cho việc cập nhập (cách càc ngân hàng hay làm).
A. Cách tiếp cận 1
Ở đây, với các đơn hàng đã xuất được hóa đơn - người ta sẽ không quan tâm do đó, khi thiết kế chươg trình, bạn nên làm một việc này:
1. Áp dụng chiến lược "tích tiểu thành đại" - có phát sinh thì xử lý ngay trong từng lần giao dịch.
2. Thiết kế 1 bảng phục vụ cho báo cáo về tình trạng xuất hóa đơn.
Mỗi khi thay đổi, xuất hóa đơn thì lưu cập nhập đó vào bảng 2.
3. Việc lấy thông tin báo cáo bây giờ chỉ còn là việc lọc những giao dịch chưa được xuất hóa đơn (trạng thái - Xuất hóa đơn = sai).

Cách làm này sẽ giúp giải tỏa lưu lượng;

B. Cách tiếp cận 2
Viết một chương trình nhỏ chạy dạng dịch vụ (SERVICE) tại máy chủ theo đó. Hoặc tạo một Schedule để yêu cầu Access chạy tập lệnh dạng CommandLine.
Chương trình này sẽ thực thi lệnh cập nhập Query mỗi khi xuất hiện một "đơn hàng" trong một thư mục "đặt hàng". Nôm na thế này:
Chương trình dịch vụ đó đơn giản chỉ là một ứng dụng viết bằng Access/ hoặc VB chạy trực tiếp trên máy chủ và định kỳ 1 phút sẽ kiểm tra tại một thư mục làm việc ví dụ A:\Yeucauxuly, thư mục này sẽ được chia sẻ Full cho các máy chạm có quyền ghi file.
Mỗi khi thấy một yêu cầu xử lý xuất hiện tại thư mục này do các máy chủ gửi lên, nó sẽ thực hiện lệnh chạy một số lệnh nào đó với Cơ sở dữ liệu Access chung để tạo ra dữ liệu sẵn sàng cho khai thác.

Cách này cũng là một dạng mô phỏng SQL Server đấy.
Trước đây tôi cũng đã làm việc này - rất đơn giản, trên máy chủ cần phải cài Access
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Che_Guevara , maidinhdan , Minh Tiên


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Xin giúp đỡ về sử dụng hàm Dlookup với nhiều điều kiện dangh5 1 73 30-11-16, 10:44 PM
Bài mới nhất: dangh5
  [Hỏi] Sự khác nhau của Like và "=" trong các hàm D toancvp 6 203 10-11-16, 12:01 AM
Bài mới nhất: toancvp
  Thay thế giá trị từ cột này sang cột khác trong 1 query trungminh 6 139 08-11-16, 03:24 PM
Bài mới nhất: ongke0711
  [Help] Gộp nhiều dòng có cùng điều kiện lên chung một dòng trong query tronghieu9792 4 181 03-11-16, 09:58 AM
Bài mới nhất: tronghieu9792
  [Hỏi] Cách lọc trong query trungdv007 10 355 11-10-16, 08:30 AM
Bài mới nhất: trungdv007

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ