Lọc dữ liệu trong bảng " Bean force" của Access

Liên hệ QC

Po_Pikachu

Po_pikachu@ymail.com
Tham gia
29/4/08
Bài viết
2,209
Được thích
3,572
Nghề nghiệp
#VALUE!
Mình không biết về chuyên ngành Access nên post ở đây! Nếu có sai chỗ thì mong MOD di chuyển dùm. Các bác xem có giùp gì được bạn ấy không? Nếu tiện thì liện hệ với bạn ấy qua địa chỉ mail: thang.xd@pecc3.netnam.vn
Chào anh! Anh ơi em là thành viên trên diễn đàn giaiphapexcel. Anh giúp em chuyện này với nhé: Em có một file access em muốn lọc dữ liệu trong bảng " Bean force" với điều kiện lọc như sau: -giữa lại những dòng mà " M3" là max nhất trong các dòng có cùng "Beam" -giữa lại những dòng mà " M3" là min nhất trong các dòng có cùng "Beam" -giữa lại những dòng mà " V2" có giá trị tuyệt đối lớn nhất trong các dòng có cùng "Beam" Em có gởi theo file đính kèm, Anh viết giúp em code đễ lọc theo điều kiện như vậy nha anh. Em cảm ơn anh rất nhiều. Chúc anh luôn thành công và vui vẽ trong cuộc sống.
File đính kèm: Nhoanhgiup.rar Thân.
 
Lần chỉnh sửa cuối:
File bạn gửi là file Access, nhưng trong file yêu cầu thì lại yêu cầu dùng Macro của Excel, khó quá. Vì File là File Access nên tôi tạm thời giải theo file Access. Bạn xem 4 cái Query trong File đính kèm. Có nhiều cách để viết Query thực hiện yêu cầu của bạn, nhưng tôi thấy cách này có vẻ tương đối nhanh cho dữ liệu tương đối lớn của bạn, bạn tham khảo thử nhé. Đây là nội dung của 4 câu Query:
1. Lọc ra những dòng Max(M3) của mỗi Beam
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam,MAX(M3) AS MaxM3 FROM
[Beam Forces]
GROUP BY Beam]. AS T2 ON T1.Beam = T2.Beam
WHERE T1.M3=T2.MaxM3;
2. Lọc ra những dòng Min(M3) của mỗi Beam
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT MIN(M3) AS MinM3, Beam
FROM [Beam Forces]
GROUP BY Beam]. AS T2 ON T1.Beam=T2.Beam
WHERE T1.M3=T2.MinM3;
3. Lọc ra những dòng có giá trị tuyệt đối V2 lớn nhất của mỗi Beam
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam, MAX(ABS(V2))AS MaxABSV2 FROM [Beam Forces] GROUP BY Beam]. AS T2 ON T1.Beam=T2.Beam
WHERE ABS(T1.V2)=T2.MaxABSV2;
4. Lọc ra những dòng thỏa mãn cả 3 điều kiện trên(Có thể dùng union của 3 câu trên nhưng sẽ hơi chậm)
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam,MAX(M3) AS MaxM3, MIN(M3) AS MinM3, MAX(ABS(V2)) AS MaxABSV2 FROM  [Beam Forces] GROUP BY Beam]. AS T2 ON T1.Beam=T2.Beam
WHERE T1.M3=T2.MaxM3 OR T1.M3=T2.MinM3 OR ABS(T1.V2)=T2.MaxABSV2;
 

File đính kèm

  • VD.rar
    849.3 KB · Đọc: 330
Thêm điều kiện lọc

Cảm ơn anh vể những thông tin rất bổ ít, anh ơi nếu em thêm một điều kiện là không những có cùng một "Beam" và còn phài cùng một "story" thì câu lệnh được viết như thế nào anh? Chúc các anh buổi sáng vui vẽ.
 
Cảm ơn anh vể những thông tin rất bổ ít, anh ơi nếu em thêm một điều kiện là không những có cùng một "Beam" và còn phài cùng một "story" thì câu lệnh được viết như thế nào anh? Chúc các anh buổi sáng vui vẽ.
Có vẻ yêu cầu này không thực tế lắm(hay do tôi chưa hiểu rõ nghiệp vụ của bài toán), nhưng bạn có thể làm tương tự thôi, ví dụ Max của mỗi Beam và Story thì bạn có thể viết như sau:
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam,[COLOR=Red]Story,[/COLOR]MAX(M3) AS MaxM3 FROM
[Beam Forces]
GROUP BY Beam,[COLOR=Red]Story[/COLOR]]. AS T2 ON T1.Beam = T2.Beam [COLOR=Red]AND T1.Story=T2.Story[/COLOR]
WHERE T1.M3=T2.MaxM3;
 
Cảm ơn anh

Bài toán trên dùng chọn lọc kết quả nội lực để thiết kế thép cho nhà cao tầng:
-Ví dụ dầm B1 có thể có ở Story 1 nhưng cũng có thể có ở Story 2, hoặc story 4 ,nhiệm vụ của đề bài là phải lọc ra được những dầm có cùng Story và cùng Bean và phải có M3 là Max( Min), abs(V2) là max.
Đoạn code trên của anh khi chạy thì bị báo lổi: "Syntax error in From clause".
Như vậy phải làm như thế nào anh, em đã copy code vào nhưng khi save lại thì bị báo lổi.
-Nếu như em tạo một nút lệnh để khi lick vào thì cho phép lọc dữ liệu theo yêu cầu trên, thì em viết như thế này. anh xem và sữa giúp em nhé"

Dim db DAO. Database
Private Sub Form_Load()
Set db = CurrentDb
End Sub

Private Sub Combo_Click()
Dim rs As DAO.Recordset
With Application.FileDialog(msoFileDialogOpen)
.Filters.Add "Microsoft Database File (*.mdb)", "*.MDB", 1
If .Show = -1 Then
MDBFile = .SelectedItems(1)
Else
GoTo kt:
End If
End With
Set DB = OpenDatabase(MDBFile)
Set rs = db.OpenRecordset( "SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam,MAX(M3) AS MaxM3 FROM
[Beam Forces]
GROUP BY Beam]. AS T2 ON T1.Beam = T2.Beam
WHERE T1.M3=T2.MaxM3;")
Set frm_formcon. Form.Recordset = rs
frm_formcon.Requery
End Sub
 
Bài toán trên dùng chọn lọc kết quả nội lực để thiết kế thép cho nhà cao tầng:
-Ví dụ dầm B1 có thể có ở Story 1 nhưng cũng có thể có ở Story 2, hoặc story 4 ,nhiệm vụ của đề bài là phải lọc ra được những dầm có cùng Story và cùng Bean và phải có M3 là Max( Min), abs(V2) là max.
Đoạn code trên của anh khi chạy thì bị báo lổi: "Syntax error in From clause".
Như vậy phải làm như thế nào anh, em đã copy code vào nhưng khi save lại thì bị báo lổi.
-Nếu như em tạo một nút lệnh để khi lick vào thì cho phép lọc dữ liệu theo yêu cầu trên, thì em viết như thế này. anh xem và sữa giúp em nhé"

Dim db DAO. Database
Private Sub Form_Load()
Set db = CurrentDb
End Sub

Private Sub Combo_Click()
Dim rs As DAO.Recordset
With Application.FileDialog(msoFileDialogOpen)
.Filters.Add "Microsoft Database File (*.mdb)", "*.MDB", 1
If .Show = -1 Then
MDBFile = .SelectedItems(1)
Else
GoTo kt:
End If
End With
Set DB = OpenDatabase(MDBFile)
Set rs = db.OpenRecordset( "SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam,MAX(M3) AS MaxM3 FROM
[Beam Forces]
GROUP BY Beam]. AS T2 ON T1.Beam = T2.Beam
WHERE T1.M3=T2.MaxM3;")
Set frm_formcon. Form.Recordset = rs
frm_formcon.Requery
End Sub
Đoạn của tôi post không phải là code mà là câu Query, khi lưu lại thành đối tượng Query của Access thì nó tự động đổi lại thành như vậy. Khi dùng dưới code bạn có thể dùng câu query như sau:
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN 
(
    SELECT Beam,MAX(M3) AS MaxM3 
    FROM [Beam Forces]
    GROUP BY Beam
) AS T2 ON T1.Beam = T2.Beam
WHERE T1.M3=T2.MaxM3
Tuy nhiên, với các câu query không có điều kiện động như câu này thì bạn nên sử dụng đối tượng Query của Access để tạo sẵn, dưới code chỉ việc gọi tới đối tượng Query này là xong.
 
Anh ơi

Anh ơi nếu em có một file khác có cấu trúc tương tự như vậy khi mỡ file đó lên để lọc dữ liệu thì mình làm thế nào sữ dụng cái mình đã tạo sẵn. Em không rành về chuyện này lắm, anh giúp em với nha, cảm ơn anh nhiều. Anh gởi cho em file luôn nha anh.
 
Có vẻ yêu cầu này không thực tế lắm(hay do tôi chưa hiểu rõ nghiệp vụ của bài toán), nhưng bạn có thể làm tương tự thôi, ví dụ Max của mỗi Beam và Story thì bạn có thể viết như sau:
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN [SELECT Beam,[COLOR=Red]Story,[/COLOR]MAX(M3) AS MaxM3 FROM
[Beam Forces]
GROUP BY Beam,[COLOR=Red]Story[/COLOR]]. AS T2 ON T1.Beam = T2.Beam [COLOR=Red]AND T1.Story=T2.Story[/COLOR]
WHERE T1.M3=T2.MaxM3;

Anh có thể vui lòng xem lại cái đoạn này được không.
Khi dán vào thì bị báo lỗi cú pháp.
Như vậy anh có thể chỉnh lại được không.
Vì nếu làm được và giải thích cú pháp rõ ràng về trình tự tạo query này thì nó sẽ giúp em được rất nhiều việc trong tính toán số liệu bê tông. vì trong cột thì mức độ lọc còn phức tạp hơn rất nhiều.
Xin cám ơn anh trước
 
Anh có thể vui lòng xem lại cái đoạn này được không.
Khi dán vào thì bị báo lỗi cú pháp.
Như vậy anh có thể chỉnh lại được không.
Vì nếu làm được và giải thích cú pháp rõ ràng về trình tự tạo query này thì nó sẽ giúp em được rất nhiều việc trong tính toán số liệu bê tông. vì trong cột thì mức độ lọc còn phức tạp hơn rất nhiều.
Xin cám ơn anh trước
Bạn xem lại nội dung trong bài số #6 tôi có nói rồi mà. Bạn thử với nội dung câu query trong bài số #6 xem có vấn đề gì ko nhé.
 
Bạn xem lại nội dung trong bài số #6 tôi có nói rồi mà. Bạn thử với nội dung câu query trong bài số #6 xem có vấn đề gì ko nhé.
Anh xem lại coi.
Em chỉnh lại đoạn code trong query cứ báo lỗi hoài. không thể khác được//**/
 

File đính kèm

  • untitled.JPG
    untitled.JPG
    32.1 KB · Đọc: 62
Anh xem lại coi.
Em chỉnh lại đoạn code trong query cứ báo lỗi hoài. không thể khác được//**/
Bạn có thể gửi file của bạn lên rồi xem cho chắc.
Tôi đã nói là bạn lấy lại nội dung query trong bài viết số #6 rồi mà, sao trong hình vẫn là câu query đó vậy?
 
Anh xem cái query tên "them"
Có thể thêm được rằng buộc là cùng Story, cùng Beam, cùng Loc thì giá lấy giá trị Max(M3) được không.
Em không hề biết tí gì về access chỉ thấy sao làm vậy thôi.
Xin cám ơn nhiều
Nếu có thể anh giới thiệu em tài liệu nào mà chuyên về access có mang tính kỹ thuật như bao gồm tính toán số liệu dựa trên record rồi tạo một trường mới chứa kết quả không?
 

File đính kèm

  • VD.rar
    846.3 KB · Đọc: 28
Lần chỉnh sửa cuối:
Anh xem cái query tên "them"
Có thể thêm được rằng buộc là cùng Story, cùng Beam, cùng Loc thì giá lấy giá trị Max(M3) được không.
Em không hề biết tí gì về access chỉ thấy sao làm vậy thôi.
Xin cám ơn nhiều
Nếu có thể anh giới thiệu em tài liệu nào mà chuyên về access có mang tính kỹ thuật như bao gồm tính toán số liệu dựa trên record rồi tạo một trường mới chứa kết quả không?
Có yêu cầu gì thì cũng phải có file cụ thể mới làm đc bạn ah, bạn đưa file dữ liệu của bạn lên thì mới biết bạn muốn gì chứ.
 
Mình có add lại file rồi bạn xem giúp.!$@!!
 
Bạn thử câu query này xem nhé.
Mã:
SELECT T1.*
FROM [Beam Forces] AS T1 INNER JOIN (SELECT Beam,Story, Loc, MAX(M3) AS MaxM3 
    FROM [Beam Forces]
    GROUP BY Beam , Story , Loc
) AS T2 ON T1.Beam = T2.Beam AND T1.Story=T2.Story AND T1.Loc=T2.Loc
WHERE T1.M3=T2.MaxM3;
 
Ok, chỉnh được rồi.
sao em vô lại thấy nó thay đổi. Và thay đổi lại hay đơn giản là xòa ròi nhập lại như củ thì nó lại báo lỗi. Chắc tại mình gà quá.-0-/.
 
Ok, chỉnh được rồi.
sao em vô lại thấy nó thay đổi. Và thay đổi lại hay đơn giản là xòa ròi nhập lại như củ thì nó lại báo lỗi. Chắc tại mình gà quá.-0-/.
Bạn chú ý cái dấu "[]" và dấu "()" trong câu của tôi, khi bạn mở nó ra trong môi trường QBE thì nó chuyển hết thành "[]", nếu bạn có sửa gì thì phải sửa lại cho đúng. Nguyên tắc là bao tên trường hoặc tên bảng thì bạn dùng "[]", còn lại thì dùng "()"
 
Web KT

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

Back
Top Bottom