Code lấy số dư đầu kỳ từ Access. Xin giúp đỡ (2 người xem)

  • Thread starter Thread starter anhthuan
  • Ngày gửi Ngày gửi
Liên hệ QC

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

anhthuan

Thành viên hoạt động
Tham gia
10/12/06
Bài viết
106
Được thích
264
Chào các bạn.
Mình có dòng code để lấy số dư đầu kỳ từ CSDL là Acces như sau:
Mã:
Sub soquy()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim dieukien, ketqua As Double

[COLOR=cyan]'Lấy định dạng ngày tháng cho phù hợp với Access[/COLOR]
bdate = Mid(Usersoquy.TextBox3.value, 4, 2) & "/" & Left(Me.TextBox3.value, 2) & "/" & Right(Me.TextBox3.value, 2)
edate = Mid(Me.TextBox4.value, 4, 2) & "/" & Left(Me.TextBox4.value, 2) & "/" & Right(Me.TextBox4.value, 2)
 
[COLOR=cyan]'Lấy số dư của 111 theo số dư đầu kỳ tại ngày 1/1[/COLOR]
Set rst = New ADODB.Recordset
dieukien = "ma='" & CStr(me.ComboBox1.value) & "'"
With rst
   ql = "select[ma],[no],[co]from[mtk]"        [COLOR=blue]'Trong CSDL có table: mtk[/COLOR]
   .Open ql, cnn, , adLockOptimistic
   .Find dieukien, , , adBookmarkFirst
   If Not .EOF Then
      ketqua = CDbl(.Fields(1).value) - CDbl(.Fields(2).value)
   End If
End With
 
[COLOR=cyan]'Lấy số dư trong phát sinh
[/COLOR]Set rst = New ADODB.Recordset
With rst
    ql = "select[no],[co],[ps]from[data]" & _            [COLOR=blue]'Table data chứa dữ liệu
[/COLOR]         [COLOR=red]"where [ngay]<#" & bdate & "#"                   'Các bạn chú ý chỗ này
[/COLOR]    .Open ql, cnn
        .MoveFirst
        Do While Not .EOF
            If Val(Left(.Fields(0).value, Len(Me.ComboBox1.value))) = Val(Me.ComboBox1.value) Then
                ketqua = ketqua + CDbl(.Fields(2).value)
            ElseIf Val(Left(.Fields(1).value, Len(Me.ComboBox1.value))) = Val(Me.ComboBox1.value) Then
                ketqua = ketqua - CDbl(.Fields(2).value)
            End If
            .MoveNext
        Loop
End With
 
[COLOR=cyan]'Đưa số dư ra ô H10 của Excel[/COLOR]
ActiveSheet.Cells(10, 8).value = ketqua
Đoạn code trên không bị sai đoạn nào cả. Vấn để ở chỗ, nếu ngày tháng mình nhập vào (bdate) là ngày 1/1/2008 thì dòng code không chạy được, nếu đưa ngày tháng (bdate) là ngày 2/1/2008 thì dòng code lại chạy ngon lành. Còn nếu mình thêm dấu "=" vào "where [ngay]<=#" & bdate & "#" thì ngày tháng nhập liệu như thế nào cũng chạy ngon, nhưng như thế thì sai kết quả tính toán (Dữ liệu tại table bên Access được bắt đầu từ ngày 1/1/2008). Nguyên nhân của vấn đề này là khi nhập ngày 1/1/2008 khi thực thi câu lệnh Open thì biến kết nối rst sẽ có giá trị rỗng.

Mình chưa biết cách xử lý như thế nào cho đúng, các bạn giúp mình nhé
Thanks,
 
Chỉnh sửa lần cuối bởi điều hành viên:
Chào các bạn.
Mình có dòng code để lấy số dư đầu kỳ từ CSDL là Acces như sau:

Sub soquy()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim dieukien, ketqua As Double

'Lấy định dạng ngày tháng cho phù hợp với Access
bdate = Mid(Usersoquy.TextBox3.value, 4, 2) & "/" & Left(Me.TextBox3.value, 2) & "/" & Right(Me.TextBox3.value, 2)
edate = Mid(Me.TextBox4.value, 4, 2) & "/" & Left(Me.TextBox4.value, 2) & "/" & Right(Me.TextBox4.value, 2)

'Lấy số dư của 111 theo số dư đầu kỳ tại ngày 1/1
Set rst = New ADODB.Recordset
dieukien = "ma='" & CStr(me.ComboBox1.value) & "'"
With rst
ql = "select[ma],[no],[co]from[mtk]" 'Trong CSDL có table: mtk
.Open ql, cnn, , adLockOptimistic
.Find dieukien, , , adBookmarkFirst
If Not .EOF Then
ketqua = CDbl(.Fields(1).value) - CDbl(.Fields(2).value)
End If
End With

'Lấy số dư trong phát sinh
Set rst = New ADODB.Recordset
With rst
ql = "select[no],[co],[ps]from[data]" & _ 'Table data chứa dữ liệu
"where [ngay]<#" & bdate & "#" 'Các bạn chú ý chỗ này
.Open ql, cnn
.MoveFirst
Do While Not .EOF
If Val(Left(.Fields(0).value, Len(Me.ComboBox1.value))) = Val(Me.ComboBox1.value) Then
ketqua = ketqua + CDbl(.Fields(2).value)
ElseIf Val(Left(.Fields(1).value, Len(Me.ComboBox1.value))) = Val(Me.ComboBox1.value) Then
ketqua = ketqua - CDbl(.Fields(2).value)
End If
.MoveNext
Loop
End With

'Đưa số dư ra ô H10 của Excel
ActiveSheet.Cells(10, 8).value = ketqua

Đoạn code trên không bị sai đoạn nào cả. Vấn để ở chỗ, nếu ngày tháng mình nhập vào (bdate) là ngày 1/1/2008 thì dòng code không chạy được, nếu đưa ngày tháng (bdate) là ngày 2/1/2008 thì dòng code lại chạy ngon lành. Còn nếu mình thêm dấu "=" vào "where [ngay]<=#" & bdate & "#" thì ngày tháng nhập liệu như thế nào cũng chạy ngon, nhưng như thế thì sai kết quả tính toán (Dữ liệu tại table bên Access được bắt đầu từ ngày 1/1/2008). Nguyên nhân của vấn đề này là khi nhập ngày 1/1/2008 khi thực thi câu lệnh Open thì biến kết nối rst sẽ có giá trị rỗng.

Mình chưa biết cách xử lý như thế nào cho đúng, các bạn giúp mình nhé
Thanks,

Chào bạn,
Mình gửi hai file lên để bạn tham khảo cách mình lấy số dư vào sổ chi tiết tài khoản.
File access, bạn vào Control panel/Administration Tools/Data Source(ODBC) để đăng ký 1 user DSN có tên AMGACCT. Trước đó bạn tạo một ổ đĩa ảo đặt tên là T:\ chứa file access này.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom