Truy vấn dữ liệu access (1 người xem)

Liên hệ QC

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

redevinte

Thành viên chính thức
Tham gia
27/10/10
Bài viết
65
Được thích
15
Xin được mọi người giúp đỡ. Mình gửi kèm theo file dữ liệu mẫu. Đề như sau:
Trong table "No" có trường "Code", dữ liệu của trường "code" có dạng như sau:
IW-00001
IW-00002
IW-00003
OW-00001
OW-00002
...
Mình muốn truy vấn để tìm record có ký tự "IW" hoặc "OW" đứng ở đầu thì phần đuôi đang có giá trị lớn nhất là bao nhiêu thì làm thế nào (Kết qua khi truy cập với record có "IW" đứng ở đầu trong ví dụ trên là 3, với "OW" là 2)
 

File đính kèm

Bạn dùng truy vấn sau
Mã:
SELECT Max(Val(Right([No].Code,6))) AS Max
FROM [No]
WHERE [No].Code Like "[COLOR=#ff0000][B]IW[/B][/COLOR]*"
Phần đỏ đỏ bạn thay bằng "OW" để lấy giá trị OW
 
Có bạn nào dùng VB6 xem giúp mình với, báo lỗi như sau:
Untitled.jpg
 

File đính kèm

Có bạn nào dùng VB6 xem giúp mình với, báo lỗi như sau:
View attachment 121513
Có 3 vấn đề như sau:
  1. Không nên đặt tên trường là tên đặc biệt ví dụ ở bài của bạn có trường tên là Max.
  2. Lấy tên cột là Code, mà trong đoạn truy vấn không có chọn cột Code thì có đâu mà chọn?
  3. Điều kiện truy vấn khi so sánh ở Access là dấu sao (*) nhưng ở ADO thì phải là phần trăm (%)
Tôi tạm chỉnh lại như sau:

[GPECODE=sql]Private Sub Form_Load()
Connect
Set rs = New ADODB.Recordset
strSQL = "SELECT Val(Right(
Mã:
,6)), [Code] " & _
             "From [tblNo] " & _
             "Where [Code] Like 'IW%' " & _
             "Order By Val(Right([Code],6)) Desc"
    rs.Open strSQL, cn, 3, 3
    Text1.Text = rs.Fields("Code")
    
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Gửi các bạn xem giúp với:
Mình làm với access thì không vấn đề gì (Các bạn xem mấy querry trong file access), nhưng trong VB thì mình mắc lỗi.
 

File đính kèm

File đính kèm

Cảm ơn bạn nhiều lắm, mình mày mò tự học, mới lên mắc nhiều chỗ. Nếu chỉ muốn lấy phần số ở phía sau thì mình làm như thế này đúng rồi chứ bạn.
Thử sửa lại như sau:

[GPECODE=sql]Private Sub Form_Load()
Connect
Set rs = New ADODB.Recordset
strSQL = "SELECT Max(Right([POCode],6)) as LaySo " & _
"From [tblNo] " & _
"Where [POCode] Like 'IW%' "
rs.Open strSQL, cn, 3, 3
Text1.Text = rs.Fields("LaySo")

End Sub

[/GPECODE]
 
Cái rs.Open strSQL, cn, 3, 3 tác dụng gì vậy bạn?
CursorTypENum và CursorLocationENum. Tương ứng như sau: 1. CursorType = CursorTypENum (adOpenUnspecified=-1, adOpenForwardOnly=0, adOpenKeyset=1, adOpenDynamic=2, adOpenStatic=3) 2. CursorLocation = CursorLocationENum (adUseNone=1, adUseServer=2, adUseClient=3). Dùng nó khác biệt thế nào bạn tìm hiểu nhé, mình cũng đang tự học thôi.
 
Xin được mọi người giúp câu SQL tính hàng tồn. Miêu tả đề như ở trong file excel, dữ liệu trong file access.
 

File đính kèm

Xin được mọi người giúp câu SQL tính hàng tồn. Miêu tả đề như ở trong file excel, dữ liệu trong file access.

Bạn thử Query như sau:

SELECT Hang.Hang, Hang.DienGiai, Nhap.Nhap, Xuat.Xuat, [Nhap]-[Xuat] AS Ton
FROM (Hang LEFT JOIN (SELECT NhapXuat.Hang, Sum(IIf(Left([Phieu],2)="NK",[Soluong],0)) AS Nhap
FROM NhapXuat
GROUP BY NhapXuat.Hang
HAVING (((Sum(IIf(Left([Phieu],2)="NK",[Soluong],0)))>0))) AS Nhap ON Hang.Hang = Nhap.Hang) LEFT JOIN (SELECT NhapXuat.Hang, Sum(IIf(Left([Phieu],2)="XK",[Soluong],0)) AS Xuat
FROM NhapXuat
GROUP BY NhapXuat.Hang
HAVING (((Sum(IIf(Left([Phieu],2)="XK",[Soluong],0)))>0))
) AS Xuat ON Hang.Hang = Xuat.Hang;
 
Thật sự phục bạn. Mình mới chỉ làm được những Query đơn giản. Bạn có thể hướng dẫn một chút về cách để phân tích để làm được chứ?
Nếu chưa quen thì bạn có thể tách ra từng phần để làm.
Cách 1:
  1. Tạo Query Tổng hợp Nhập.
  2. Tạo Query Tổng hợp Xuất.
  3. Join 2 Query đó vào bảng Hàng.
  4. Thực hiện phép tính.
Cách 2: Nếu quen rồi thì có thể dùng 1 Query như tôi làm ở trên.
 

File đính kèm

Thật sự phục bạn. Mình mới chỉ làm được những Query đơn giản. Bạn có thể hướng dẫn một chút về cách để phân tích để làm được chứ?

"Nịnh" vừa vừa cho dể nghe chút bạn ơi.
Có quá nhiêu hạn chế ở cái query trên. Dân chuyên nghiệp không ai viết như thế.
 
"Nịnh" vừa vừa cho dể nghe chút bạn ơi.
Có quá nhiêu hạn chế ở cái query trên. Dân chuyên nghiệp không ai viết như thế.
Mình tự học và cũng không biết mấy, như cũng đã nói ở trên, những câu truy vấn đơn giản trong bảng thì mình viết được còn những câu nối các bảng với nhau mình thấy rối tung. Rất mong được các bạn chỉ dẫn phương pháp để phân tích và thực hiện thế nào cho tốt.
 
Lần chỉnh sửa cuối:
Nếu có thêm trường ngày trong bảng "nhapxuat". Xin chỉ giúp cách tính tồn đầu, nhập, xuất, tồn cuối trong khoảng thời gian từ 03/01/2014 đến 05/01/2014.
 

File đính kèm

Nếu có thêm trường ngày trong bảng "nhapxuat". Xin chỉ giúp cách tính tồn đầu, nhập, xuất, tồn cuối trong khoảng thời gian từ 03/01/2014 đến 05/01/2014.

Bạn test thử với đoạn Query sau:

SELECT NhapXuat.Hang, Hang.DienGiai, Sum(IIf([Ngay]<#1/3/2014# And Left([Phieu],2)="NK",[Soluong],0)-IIf([Ngay]<#1/3/2014# And Left([Phieu],2)="XK",[Soluong],0)) AS TonDau, Sum(IIf([Ngay] Between #1/3/2014# And #1/5/2014# And Left([Phieu],2)="NK",[Soluong],0)) AS Nhap, Sum(IIf(Left([Phieu],2)="XK" And [Ngay] Between #1/3/2014# And #1/5/2014#,[Soluong],0)) AS Xuat, [TonDau]+[Nhap]-[Xuat] AS TonCuoi
FROM NhapXuat INNER JOIN Hang ON NhapXuat.Hang = Hang.Hang
GROUP BY NhapXuat.Hang, Hang.DienGiai;

Lưu ý trường Ngay phải thiết lập kiểu dữ liệu là Date/Time nhé.
 
Bạn test thử với đoạn Query sau:



Lưu ý trường Ngay phải thiết lập kiểu dữ liệu là Date/Time nhé.
Có thể liệt kê cả các hàng không có phát sinh xuất nhập trong thời gian đó được không bạn? (Liệt kê cả hàng D, hàng C)
(Code không vấn đề nhé bạn, do mình chưa suy nghĩ kỹ khi test)
 
Lần chỉnh sửa cuối:
Có thể liệt kê cả các hàng không có phát sinh xuất nhập trong thời gian đó được không bạn? (Liệt kê cả hàng D, hàng C)
(Code không vấn đề nhé bạn, do mình chưa suy nghĩ kỹ khi test)

Vậy thì bạn test với Query sau:

SELECT Hang.Hang, Hang.DienGiai, Sum(IIf([Ngay]<#1/3/2014# And Left([Phieu],2)="NK",[Soluong],0)-IIf([Ngay]<#1/3/2014# And Left([Phieu],2)="XK",[Soluong],0)) AS TonDau, Sum(IIf([Ngay] Between #1/3/2014# And #1/5/2014# And Left([Phieu],2)="NK",[Soluong],0)) AS Nhap, Sum(IIf(Left([Phieu],2)="XK" And [Ngay] Between #1/3/2014# And #1/5/2014#,[Soluong],0)) AS Xuat, [TonDau]+[Nhap]-[Xuat] AS TonCuoi
FROM NhapXuat RIGHT JOIN Hang ON NhapXuat.Hang = Hang.Hang
GROUP BY Hang.Hang, Hang.DienGiai;
 
Xin giúp đỡ "hiển thị dữ liệu tồn theo vị trí lên listview VB6"
Đề: Cho file dữ liệu có các bảng tblHang, tblVitri, tblNhapXuat (xin tham khảo file DATA.mdb trong file gửi kèm).
Yêu cầu:
- Lấy dữ liệu "MaViTri" từ "tblViTri" để tự động tạo các cột tương ứng của listview bằng code.
- Tính tồn dựa vào "tblNhapXuat" rồi điền dữ liệu tồn của từng vị trí tương ứng với từng loại hàng trong "tblHang" lên listview.
(Ghi chú: Nếu không làm được trên listview hoặc quá bất tiện thì có thể dùng Datagrid hay loại lưới dữ liệu khác)
 

File đính kèm

Xin giúp đỡ "hiển thị dữ liệu tồn theo vị trí lên listview VB6"
Đề: Cho file dữ liệu có các bảng tblHang, tblVitri, tblNhapXuat (xin tham khảo file DATA.mdb trong file gửi kèm).
Yêu cầu:
- Lấy dữ liệu "MaViTri" từ "tblViTri" để tự động tạo các cột tương ứng của listview bằng code.
- Tính tồn dựa vào "tblNhapXuat" rồi điền dữ liệu tồn của từng vị trí tương ứng với từng loại hàng trong "tblHang" lên listview.
(Ghi chú: Nếu không làm được trên listview hoặc quá bất tiện thì có thể dùng Datagrid hay loại lưới dữ liệu khác)

Tôi làm cho bạn như file đính kèm. Lần sau phải tự tạo form nhé.

1.jpg
 

File đính kèm

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn bạn, mình sẽ lưu ý tạo form khi hỏi.
Xin phép mượn lại form của bạn. Mình bổ sung một chút ở đề bài (trong file excel), và nếu vẫn muốn dùng listview thì có thể làm được không bạn?
Ban đầu không nói luôn để đỡ mất thời gian.
Tôi thấy bạn ghi
(Phiếu nhập có mã bắt đầu bằng "NK", Phiếu xuất có mã bắt đầu bằng "XK", không tính các phiếu "CK").
Vậy không tính chỉ phiếu xuất CK hay là tính? Tôi thấy kết quả bạn tính ra là tính luôn CK?
 
Ban đầu không nói luôn để đỡ mất thời gian.
Tôi thấy bạn ghi

Vậy không tính chỉ phiếu xuất CK hay là tính? Tôi thấy kết quả bạn tính ra là tính luôn CK?
Mình giải thích thêm một chút: Cột "Ton" chính là số lượng tồn kho tổng của các vị trí, phiếu nhập có mã bắt đầu bằng "NK" (phiếu xuất có mã bắt đầu bằng "XK") các phiếu này có nghĩa là mình nhập hàng (xuất hàng) từ bên ngoài vào kho. Các phiếu chuyển kho có mã bắt đầu bằng "CK" chỉ là chuyển từ vị trí này tới vị trí kia trong kho nên nó chỉ làm thay đổi số lượng tồn ở các vị trí mà không làm thay đổi số lượng tồn tổng (khi tính tồn ở từng vị trí thì tất nhiên là tính hết cả các phiếu "NK", "XK", "CK" vào vị trí đó).
Viết nghĩa đen thì nó thế này:
SELECT tblHang.MaHang, tblHang.TenHang, Sum(IIf(Left(tblNhapXuat.MaPhieu,2)='NK',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(Left(tblNhapXuat.MaPhieu,2)='XK',tblNhapXuat.SoLuongXuat,0)) AS Ton, Sum(IIf(tblNhapXuat.MaViTri='VT1',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(tblNhapXuat.MaVitri='VT1',tblNhapXuat.SoLuongXuat,0)) AS VT1, Sum(IIf(tblNhapXuat.MaViTri='VT2',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(tblNhapXuat.MaViTri='VT2',tblNhapXuat.SoLuongXuat,0)) AS VT2, Sum(IIf(tblNhapXuat.MaViTri='VT3',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(tblNhapXuat.MaViTri='VT3',tblNhapXuat.SoLuongXuat,0)) AS VT3
FROM tblNhapXuat RIGHT JOIN tblHang ON tblNhapXuat.MaHang = tblHang.MaHang
GROUP BY tblHang.MaHang, tblHang.TenHang;
 
Mình giải thích thêm một chút: Cột "Ton" chính là số lượng tồn kho tổng của các vị trí, phiếu nhập có mã bắt đầu bằng "NK" (phiếu xuất có mã bắt đầu bằng "XK") các phiếu này có nghĩa là mình nhập hàng (xuất hàng) từ bên ngoài vào kho. Các phiếu chuyển kho có mã bắt đầu bằng "CK" chỉ là chuyển từ vị trí này tới vị trí kia trong kho nên nó chỉ làm thay đổi số lượng tồn ở các vị trí mà không làm thay đổi số lượng tồn tổng (khi tính tồn ở từng vị trí thì tất nhiên là tính hết cả các phiếu "NK", "XK", "CK" vào vị trí đó).
Viết nghĩa đen thì nó thế này:
SELECT tblHang.MaHang, tblHang.TenHang, Sum(IIf(Left(tblNhapXuat.MaPhieu,2)='NK',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(Left(tblNhapXuat.MaPhieu,2)='XK',tblNhapXuat.SoLuongXuat,0)) AS Ton, Sum(IIf(tblNhapXuat.MaViTri='VT1',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(tblNhapXuat.MaVitri='VT1',tblNhapXuat.SoLuongXuat,0)) AS VT1, Sum(IIf(tblNhapXuat.MaViTri='VT2',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(tblNhapXuat.MaViTri='VT2',tblNhapXuat.SoLuongXuat,0)) AS VT2, Sum(IIf(tblNhapXuat.MaViTri='VT3',tblNhapXuat.SoLuongNhap,0))-Sum(IIf(tblNhapXuat.MaViTri='VT3',tblNhapXuat.SoLuongXuat,0)) AS VT3
FROM tblNhapXuat RIGHT JOIN tblHang ON tblNhapXuat.MaHang = tblHang.MaHang
GROUP BY tblHang.MaHang, tblHang.TenHang;
Code sẽ như sau:
Mã:
Private Sub Form_Load()
    Moketnoi
    Dim lrs As New ADODB.Recordset
    Dim objFields As ADODB.Fields
    Dim i As Integer
    Dim var1 As String
    var1 = ""
    var1 = var1 & "TRANSFORM Sum(Tong.Ton) AS SumOfTon " & vbCrLf
    var1 = var1 & "SELECT Tong.MaHang, " & vbCrLf
    var1 = var1 & "       Tong.TenHang, " & vbCrLf
    var1 = var1 & "       Sum(Tong.Ton) AS [Tong Ton] " & vbCrLf
    var1 = var1 & "FROM   (SELECT tblHang.MaHang, " & vbCrLf
    var1 = var1 & "               tblHang.TenHang, " & vbCrLf
    var1 = var1 & "               IIf(IsNull([MaViTri]), ""OPS"", [MaViTri])            AS MaVT, " & vbCrLf
    var1 = var1 & "               Sum(( IIf(IsNull([SoLuongNhap]), 0, [SoLuongNhap]) ) - ( " & vbCrLf
    var1 = var1 & "                   IIf(IsNull([SoLuongXuat]), 0, [SoLuongXuat]) )) AS Ton " & vbCrLf
    var1 = var1 & "        FROM   tblHang " & vbCrLf
    var1 = var1 & "               LEFT JOIN tblNhapXuat " & vbCrLf
    var1 = var1 & "                      ON tblHang.MaHang = tblNhapXuat.MaHang " & vbCrLf
    var1 = var1 & "        GROUP  BY tblHang.MaHang, " & vbCrLf
    var1 = var1 & "                  tblHang.TenHang, " & vbCrLf
    var1 = var1 & "                  IIf(IsNull([MaViTri]), ""OPS"", [MaViTri])) AS Tong " & vbCrLf
    var1 = var1 & "GROUP  BY Tong.MaHang, " & vbCrLf
    var1 = var1 & "          Tong.TenHang " & vbCrLf
    var1 = var1 & "PIVOT Tong.MaVT"
    lrs.Open var1, cnn, adOpenStatic, adLockReadOnly
    Set objFields = lrs.Fields
    For intLoop = 0 To (objFields.Count - 1)
         lvInventory.ColumnHeaders.Add , , objFields.Item(intLoop).Name
    Next
    While lrs.EOF = False
        Dim ListObj As ListItem
        Set ListObj = lvInventory.ListItems.Add(, , IIf(IsNull(lrs.Fields(0)), "", lrs.Fields(0)))
        For i = 1 To objFields.Count - 1
            ListObj.SubItems(i) = IIf(IsNull(lrs.Fields(i)), "", lrs.Fields(i))
        Next
        lrs.MoveNext
    Wend
    Set lrs = Nothing
    
End Sub
 
1. Báo lỗi như hình ảnh sau bạn ạ:
Error.jpg
Khi chọ debug thì tô mầu vàng ở dòng:
"Set ListObj = lvInventory.ListItems.Add(, , IIf(IsNull(lrs.Fields(0)), "", lrs.Fields(0)))"
2. Bạn hướng dẫn mình một chút về cách sử dụng TRANSFORM/PIVOT được chứ?
 
Lần chỉnh sửa cuối:
1. Báo lỗi như hình ảnh sau bạn ạ:
View attachment 127018
Khi chọ debug thì tô mầu vàng ở dòng:
"Set ListObj = lvInventory.ListItems.Add(, , IIf(IsNull(lrs.Fields(0)), "", lrs.Fields(0)))"
2. Bạn hướng dẫn mình một chút về cách sử dụng TRANSFORM/PIVOT được chứ?

1./ Bạn xem lại file đính kèm
2./ Đó là CrossTab Query, bạn tìm hiểu thêm với từ khóa đó nhé.
 

File đính kèm

Nếu mình muốn chuyển sang sử dụng cơ sở dữ liệu là SQL thì CrossTab Query này viết lại thế nào hả bạn?
 

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

Back
Top Bottom