Liên quan đến CSDL Access nhiều hơn Excel nhưng vẫn phải hỏi (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vietskynet

Thành viên mới
Tham gia
1/4/08
Bài viết
17
Được thích
1
Em đang tập làm phần thống kê xuất nhập tồn cho 1 công ty bán hàng tạp hóa , mỗi tháng phải đưa ra 4 dữ liệu sau đây

Tồn đầu kỳ, nhập trong kỳ, xuất trong kỳ và tồn cuối kỳ của từng mặt hàng

Về tồn cuối thì ko bàn vì chỉ là kết quả 3 cột kia thôi.
Em muốn hỏi cách thống kê 3 cột kia sao cho hay nhất

Cấu trúc chính trong CSDL là 1 bảng "Hóa Đơn Nhập" , "Hóa đơn xuất", "chi tiết hàng nhập" và chi tiết hàng xuất

Như vậy nếu em muốn truy vấn tồn đầu kỳ thì em sẽ tính Sum tất cả các đợt nhập hàng bắt đầu từ tháng trước, sau đó tính Sum hàng nhập và hàng xuất trong tháng
Vấn đề em đặt ra là
1- Có thể thống kê như vậy bằng Access ko (1 query truy vấn 3 dữ kiện đó), hay bắt buộc phải nhờ đến Excel
2- Doanh nghiệp hoạt đống mới vài tháng thì việc quét dữ liệu tồn đầu kỳ không khó nhưng hoạt động 6-7 năm mà truy vấn kiều này thì hơi phí tài nguyên, không có giải pháp gì ko
3- Cuối cùng nhưng không kém quan trọng, em chia ra nhập và xuất hàng thành 2 mảng khách nhau, như vậy có hợp lý không, hay chỉ nên gom chung vào 1 bảng

Em cám ơn, mới bước chân vào thống kê em đã gặp bài toán mệt bão nên phải hỏi các trùm
 
Lần chỉnh sửa cuối:
1. Query của Access thực tế không được lưu như 1 bảng tính toán. Nó chỉ được lưu như 1 câu lệnh SQL, không phí tài nguyên. Khi nào gọi đến nó, Access mới tính toán và hiện lên màn hình. Tuy vậy, với dữ liệu nhiều, sẽ tính toán hơi chậm, đương nhiên.

2. Nếu em đã học Access, thì tất phải biết sơ bộ về CSDL, vậy thì nhập xuất nên để chung. Thậm chí số lượng, thành tiền cũng chung. Để phân biệt chúng trong bảng dữ liệu chính, sẽ cần 1 field Loại chứng tử.

3. Nhất thiết nên có bảng Danh mục hàng hoá, kết hợp số dư đầu kỳ luôn (có thể bằng không toàn bộ). Số dư đầu kỳ (giả sử tháng 4) không chỉ Sum nhập từ đầu (giả sử đầu năm) đến hết kỳ tháng
3, mà là sum nhập trừ sum xuất từ đầu năm đến hết tháng 3. Kết quả có thể lưu như 1 query 3 tháng. Nếu chịu khó thì làm từng query như vậy cho mỗi tháng, cuối tháng này làm đầu tháng sau.
Làm từ đầu năm cũng có điểm lợi là có thể tuỳ chọn lập báo cáo cho kỳ không cố định thí dụ chỉ tính trong khoảng thời gian từ 16/02 đến 20/03 với 2 mốc thời gian tuỳ ý.
Chọn cách nào là theo yêu cầu riêng của doanh nghiệp và cả yêu cầu của sếp.

Nói không hết được, chỉ bấy nhiêu, em cố làm nhé.
 
Tại vì em thấy có nhiều chương trình quản lý kho chia thành 2 mảng nhập và xuất khác nhau
Có 1 bảng dành cho phiếu nhập và 1 bảng dành cho phiếu xuất
Nhưng em ko biết có nên làm vậy ko hay là phiếu nhập xuất cứ gộp chung 1 bảng là được

Vậy giờ em thử làm báo cáo theo hướng này
Vì dụ thống kê cho tháng 3 vừa rồi
- Truy vấn lấy dữ liệu hàng tồn = tổng nhập - tổng xuất (tính từ đầu tới năm tới cuối tháng 2)
- Export ra Excel thành 1 cột số liệu
- Truy vấn tổng nhập, tổng xuất trong tháng 3 --> Export thành cột tổng nhập trong excel
-Sau đó dùng các phép toán trong Excel tính tồn cuối tháng 3
 
Lần chỉnh sửa cuối:
Vậy em cứ thử đi, rồi thắc mắc gì thì hỏi nhé. Còn cái sổ chi tiết vật tư từng mặt hàng nữa đó. Sổ này làm report trong Access hay hơn, vì Excel đòi mỗi sổ 1 trang, không như Access lưu như 1 report duy nhất.
 
1. Query của Access thực tế không được lưu như 1 bảng tính toán. Nó chỉ được lưu như 1 câu lệnh SQL, không phí tài nguyên. Khi nào gọi đến nó, Access mới tính toán và hiện lên màn hình. Tuy vậy, với dữ liệu nhiều, sẽ tính toán hơi chậm, đương nhiên.

2. Nếu em đã học Access, thì tất phải biết sơ bộ về CSDL, vậy thì nhập xuất nên để chung. Thậm chí số lượng, thành tiền cũng chung. Để phân biệt chúng trong bảng dữ liệu chính, sẽ cần 1 field Loại chứng tử.

Đồng ý quan điểm này của bác

3. Nhất thiết nên có bảng Danh mục hàng hoá, kết hợp số dư đầu kỳ luôn (có thể bằng không toàn bộ).

Làm như vậy thì khi lập query lại phải tốn thêm một query nữa. Thường thì tôi làm theo cách nhập tồn đầu kỳ như một phiếu nhập thông thường với thời gian là ngày cuối cùng của kỳ niên hạn trước(ngày trước, tháng trước, qúy trước, năm trước). Như vậy query tính số dư đầu kỳ sẽ nhẹ hơn => tính toán nhanh hơn. [/quote]

Làm từ đầu năm cũng có điểm lợi là có thể tuỳ chọn lập báo cáo cho kỳ không cố định thí dụ chỉ tính trong khoảng thời gian từ 16/02 đến 20/03 với 2 mốc thời gian tuỳ ý.
Chọn cách nào là theo yêu cầu riêng của doanh nghiệp và cả yêu cầu của sếp.

Ok với bác điều này nhưng nên làm theo kiểu báo cáo với thởi gian bất kỳ thì áp dụng vào kiểu báo cáo nào cũng xài được
 
Trong tờ thống kê mẫu mà boss kiu làm theo em thấy có 1 cột đơn giá. hình như là họ lấy tổng tiền chia cho tổng hàng
VD:
Mahang Tenhang soluong giatri dongia
HUT Hu tieu 05 25000 5000
MAL Mi an lien 02 36000 18000

Nhưng khi xem lại hóa đơn thì đơn giá có thể tăng hoặc vài đợt trong cùng kỳ, cho nên nếu lấy tổng giái trị chia cho tổng hàng thì sai, không biết trong trường hợp này thì lấy đơn giá kiểu nào, vẫn lấy trung bình hay chọn cái cao nhất trong kỳ
 
Rõ ràng là khi nhập thì phải chính xác theo chứng từ nhập, nhưng xuất là tính theo cách của đơn vị mình: NTXT, NSXT, BQgia quyền. . . tất cả là theo yêu cầu riêng của đơn vị. Em cứ làm theo yêu cầu của Boss.
 
Em có 1 mainform để nhập thông tin về hóa đơn
1 subform lưu thông tin về các mặt hàng của hóa đơn

và ở phần footer của subform em có 1 text box với source là
=Sum((dongia-dongia*Forms!mainform!chietkhau/100)*soluong) - Cột chiết khấu nằm ở Main Form

Nhưng báo lỗi là #Error

Em đã thử cách thứ 2 là cho 1 textbox vào datasheet của subform với giá trị
[Chiết khấu hàng] : (dongia-dongia*Forms!mainform!chietkhau/100)*soluong
Cái này hiển thị OK -=09=
Nhưng khi quay xuống footer tính sum của [Chiết khấu hàng] thì lại ra #error
---------------
Bắt đầu nghiên cứu
Em tạo 1 textbox trong Datasheet - Giá trị là 2
Sau đó xuống footer tính Sum xủa textbox ==> #Error
Nhưng nếu tính sum của 1 cột VD ; Sum (soluong) thì ko Error

Em nghĩ em đã hiểu sai gì đó chỗ này
 
Nếu textbox là [Chiết khấu hàng] : (dongia-dongia*Forms!mainform!chietkhau/100)*soluong
Thi sum ở footer là =sum((dongia-dongia*Forms!mainform!chietkhau/100)*soluong)
[Chiết khấu hàng] không phải là 1 field dữ liệu, không tính trực tiếp được.

Nói thêm để sau này có dịp dùng:
Giả sử em muốn lấy 1 giá trị sum nào đó của subform (trong textboxA) vào 1 field của main form (tức là ngược với cái em đang làm), thì cấu trúc sẽ không giống bình thường:
=subform.Form!textboxA
 
Thật trớ trêu
Em không thể gán giá trị
Forms!hoadon!chietkhau vào hàm sum ở footer được (hoadon là tên Form chính)
Tuy nhiên ở vùng Datasheet gán vào thì nó hiện ra tốt
=Sum(([dongia]-[dongia]*Forms!hoadon!chietkhau/100)*[sotien]) --> Error
=Sum(([dongia]-[dongia]*2/100)*[sotien]) ---> Good

Cái CSDL của em đang làm dạng như trong Attachment
Vì cái kia lớn quá em ko post được
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Lỗi to đùng:
- dữ liệu soluong và dongia trong table chitietbanhang là kiểu text. --> không tính toán được
- textbox có tên sotien, lại có data source là số lượng
- Khi subform tính sum không ra (tính text không được) sẽ error --> làm sao mainform lấy giá trị đó mà không error?

Nói thêm:
-sau khi sửa loại dữ liệu thành number, các textbox bị lỗi nên delete và làm lại, không nên cố sửa vì một số thuộc tính của nó bị đặt theo dữ liệu kiểu text
- tốt hơn nên có 1 textbox tính thành tiền trong subform, tính luôn sum(thanhtien) ở subform footer, rồi gán thành tiền của mainform với giá trị này.
 
Em đã sữa lại thuộc tính
Del hết dữ liệu và textbox , sau đó nhập lại data khác
Kết quả vẫn bị

Em nhận thấy chi tiết mới về lỗi

=Sum(dongia*soluong*Forms!hoadon!chietkhau) --> Error
=Sum(dongia*soluong)*Forms!hoadon!chietkhau --> OK
=Sum(dongia*soluong) --> OK
=Sum(dongia*soluong*2) --> OK

Vậy em nghĩ có thể loại trừ được trường hợp sai kiểu dữ liệu sai và viết tên textbox sai
Em đã chỉnh lại và đơn giản hóa như file đính kèm, ai tốt bụng thử chạy trên máy xem có bị giống em ko hay là office của em có vấn đề
 

File đính kèm

Chả tốt bụng gì đâu. Thực ra nghe cái câu tốt bụng hết muốn trả lời.
Coi như nhắc nhở chú em 1 lần .
Xem file.
Tuy ra kết quả trên form nhưng nếu không có 1 field nào của master hay detail lưu kết quả thì cũng chỉ để lâu lâu buồn mở form lên ngó chơi.
Thêm nút Refresh, nếu không, thay đổi tỷ lệ chiết khấu nó cũng trơ trơ.
 

File đính kèm

Sorry, em lỡ lời
Thật ra em nói vậy vì lúc nhiều lúc em post file mà ko ai tải về vì sợ virus (nếu nói câu No Virus thì lại càng đáng nghi hơn nên đàn cầu xin lòng thương xót của mọi người :-= )

Qua Form mà Mod gửi lại thì chắc em chỉ còn 1 biện pháp là thêm 1 cột chiết khấu cho mặt hàng mà thôi (chịu dư thừa dữ liệu nhưng chính xác)

Vì công thức là trog ô tổng của Mod là = Sum(soluong*dongia)*chietkhau
Là tính sum rồi mới nhân, nhưng ngặt cái là nhà cung cấp nhân chietkhau vào đơn giá rồi làm tròn sau đó mới sum
Có 1 lần em thử tính như vậy thì bảng tính và hóa đơn bị sai lệch
Hóa đơn : 512,660
Bảng tính : 512,658.5 (có làm tròn cũng chỉ ra 59)
Lý do là từ đơn giá đã được nhân và làm tròn cùng chiết khấu, cho nên em mới phải tìm cho bằng được cách nhân từ ngay đơn giá hoặc thành tiền
Bây giờ thì chắc đành thêm 1 cột chiết khấu vào kế bên mặt hàng !$@!!!$@!!!$@!!
 
Bây giờ thì chắc đành thêm 1 cột chiết khấu vào kế bên mặt hàng
Lẽ ra phải như vậy từ đầu. Tưởng em biết rồi nhưng lược bớt để up file lên nên không nói.
Xem thêm về form, nút lệnh, cấu trúc dữ liệu ở đây: http://www.giaiphapexcel.com/forum/showthread.php?p=55076#post55076 bài số #3. Xem form nhập liệu nhập xuất kho, chỗ VAT và tỷ lệ VAT, sửa lại ra chiết khấu.
Nếu còn lúng túng chỗ nào, thì cứ hỏi, với điều kiện:
- Không cầu xin thương xót
- Không gọi là Mod
- Phãi nhấn thanks
Nếu không thì bo xịt, nghỉ chơi.
 
Nếu không thì bo xịt, nghỉ chơi.
^_^ Chết em,
Thật ra em ko biết gì về kế toán, chỉ tập tành viết chương trình access nên nghĩ đơn giản, để có tính ràng buộc cao ta chỉ cần làm chiết khấu ở hóa đơn là đủ

Khó nhất trong bài tập thực tế em đang làm là vấn đề làm tròn, mỗi hóa đơn có cách làm tròn đa dạng khác nhau
VD
Cty A : 569.396,1 = 569.397
Cty B : 569.396,1 = 569.396
Em định chọn giải pháp tiêu cực là nhập y hóa đơn nhưng như thế thì bảng tính của mình sẽ bị mất đi mối liên hệ chặt chẽ giữa các cột và công thức, không biết em có nên thêm 1 cột là cách thức làm tròn riêng cho mỗi đối tượng công ty ko

P/S : cái phần nhấn thanks lâu nay em ko thấy vì em đọc bài lúc ko đăng nhập sau đó nhấn trả lời thì mới đăng nhập, giờ nhấn bù !!!!
 
Mối quan hệ chỉ cần chặt chẽ giữa các table với nhau để có những ràng buộc về dữ liệu. Còn giữa các field đâu có ràng buộc gì ghê gớm?
Gợi ý:
Khi đã có các field cần thiết và có các textbox trên form, thì hãy làm như sau:

PHP:
Sub Soluong_AfterUpdate
Thanhtien = Round(Soluong*Dongia*Form!hoadon.chietkhau/100,0)
End sub

PHP:
Sub Dongia_AfterUpdate
Thanhtien = Round(Soluong*Dongia*Form!hoadon.chietkhau/100,0)
End Sub

Để cho Access làm tròn tương đối trước, nếu số này chênh lệch với số trên hoá đơn 1 vài đồng thì sửa, không thì thôi.

Nhất là phải nhớ có nút Refresh tổng số trên form hoadon mới cập nhật. Số này có thể dùng để lập report phiếu nhận, phiếu xuất in ra tại chỗ, không cần lưu vì ta có thể tính tổng bất cứ lúc nào bằng query cho các báo cáo khác.
 
Bạn có thể dùng thêm phương thức Requery cho Form để khi có sự thay đổi về dữ liệu thì nó tự động hiển thị lên luôn khỏi làm nút Refresh.

Con cọp con
 
concop đã viết:
Bạn có thể dùng thêm phương thức Requery cho Form để khi có sự thay đổi về dữ liệu thì nó tự động hiển thị lên luôn khỏi làm nút Refresh.

Trong file cụ thể này, nếu 1 textbox không là dữ liệu của bất kỳ 1 field nào dù của Master hay của Child, hoặc Data source của form là table, không phải query, thì ReQuery không có tác dụng. Nút Refresh thực tế là sử dụng phương thức Recalc hoặc Refresh:

Forms!hoadon.Recalc
hoặc
Forms!hoadon.Refresh

Nhưng khi đưa method Recalc hoặc ReQuery vào các sự kiện AfterUpdate, thì sau đó Focus sẽ nhảy về control mặc định, phải dời focus về lại chỗ muốn nhập liệu tiếp.
Nếu dùng nút thì khi nào xong xuôi mới refresh 1 lần.
 
Lúc mình thay đổi ở Subform thì hình như mainform cũng tự thay đổi. Tuy nhiên vài trường hợp phép tính lớn, các đối tượng sẽ tính với các tốc độ khác nhau nên có vài lần tổng tiền em ra 0 vì các chiết khấu này nọ chưa tính xong, trong CSDL thật có em có 1 nút Tính tiền (công dụng như anh nói ), ngoài ra em cũng phải sửa lại thứ tự các phép tính như tổng tiền hàng --> Khuyến mãi --> chiết khấu ....-> Tổng tiền để chắc ăn tổng tiền ra kết quả đúng
Nhưng có 1 vấn đề là việc thay đổi dữ liệu ở mainform. vì phát sinh chiết khấu cho từng mặt hàng nên khi em thay đổi chiết khấu ở Main thì các record tại Sub cũng phải thay đổi. Nếu mình chỉ gán "subform!field = value" thì em chỉ thấy record đang được focus mới thay đổi. Lúc trước em hay giải quyết bằng cách dùng lệnh query update khi biến cố AfterUpdate. Không biết đây có phải là cách duy nhất ko

Hình như Access ko làm tròn theo kiếu từ 0.5 trở lên là tròn lên
Nhưng cái hóa đơn em đang làm hình như là tròn xuống (chả hiểu quy các làm tròn chính thức của nó là sao -=09=-=09=)

Như vậy thì cần viết hàm mới hay là có thể tùy chỉnh hàm Round trong Access lại bây giờ

Nếu viết hàm mới thì anh check dùm em xem như vậy có lỗi gì ko, hàm này dùng đến bây giờ vẫn ổn nhưng nếu dùng hàm gốc do Access thì vẫn hay hơn

Function lamtron(so As Double) As Double
Dim sodu As Double
Dim num As Double
num = Int(so)
sodu = so - num
If sodu > 0.5 Then
num = num + 1
Else
num = num
End If
lamtron = num
End Function
Ban đầu em gán cho biến Num là Integer, bị lỗi Overflow (sau mới phát hiện là đang tính toán với tiền VND nên đâu có dùng Interger được), tuy nhiên em ko biết gán cho nó là Double có phí ko
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT

Bài viết mới nhất

Back
Top Bottom