ADO và ConnectionString (1 người xem)

Liên hệ QC

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

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,443
Nghề nghiệp
Bác sĩ
Hai 2 Hai​

Đối với ADO thì sau khi tạo connection, ta làm việc trên Connection đó với các đối tượng OLE DB Recordset như bình thường, có gì khác biệt hả anh? ADO thao tác với file text còn được mà, anh cứ coi dbf files là text file đi . Làm việc với database nói chung quanh quẩn chỉ là CRUD thôi mà (Create, Retrieve, Update, Delete).

P/S: Đừng dùng Bound control trong VB để làm việc với Database nhé, nó ko chuyên nghiệp tý nào đâu

ODBC Driver For Visual FoxPro

With a database container:
oConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBC;" & _
"SourceDB=c : \somepath\mySourceDb.dbc;" & _
"Exclusive=No;"

Without a database container (Free Table Directory):
oConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBF;" & _
"SourceDB=c : \somepath\mySourceDbFolder;" & _
"Exclusive=No;"


For more information, see: Visual FoxPro ODBC Driver and Q165492

OLE DB Data Link Connections
Data Link File (UDL)

For Absolute Path:
oConn.Open "File Name=c: \ somepath\myDatabaseName.udl;"

For Relative Path:
oConn.Open "File Name=myDatabaseName.udl;"

For more information, see: HOWTO: Use Data Link Files With ADO
Note: Windows 2000 no longer contains the "New | Microsoft Data Link"
menu anymore. You can add the Data Link menu back in the menu list
by running the "C: \ Program Files\Common Files\System\Ole DB\newudl.reg"
reg file, Then right-click on the desktop and Select "New | Microsoft Data
Link " menu."
Or you can also create a Data Link file by creating a text file and change
It 's file extension To ".udl", Then double-click the file.

OLE DB Provider For Visual FoxPro
oConn.Open "Provider=vfpoledb;" & _
"Data Source=.\MyDB.dbc;"


For more information, see: Microsoft OLE DB Provider for Visual FoxPro
 
TuanVNUI​

Function GetConnDBF(ByVal cFileName As String) As ADODB.Connection
On Error GoTo loi:
'Open the ADO connection to the Excel workbook
Dim oconn As ADODB.Connection
Set oconn = New ADODB.Connection

oconn.Open "Provider=MSDASQL;" & _
"SourceDB=" & cFileName & ";" & _
"SourceType=DBF;Exclusive=No"
loi:
Set GetConnDBF = oconn
Set oconn = Nothing
If err.Number <> 0 Then Set GetConnDBF = Nothing
End Function
================================================== ==
Sub Xuly()
Dim oconn As ADODB.Connection
Dim oRS As ADODB.Recordset

Set oconn = GetConnDBF("d: \ DATA")
cSQL = "Select * from Dmhang"
Set oRS = GetRS(cSQL, oconn)
End Sub


Khi đã nhận được Connection thì không khó gì cả.

Chỉ cần kết nối được:
oConn: Kết nối với các Database khác nhau (Access, VFP, Excel, SQL,...)
oRS=GetRS(oConn,...)
If oRS is Nothing then
Exit Sub
Endif

Thực hiện các lệnh với oRS bình thường.
 
Lần chỉnh sửa cuối:
Em có dòng code như thế này :

With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=Excel Files;DBQ=D:\Data\DATA.xls;DefaultDir=D:\Data;DriverId=790;MaxBuffe" _
), Array("rSize=2048;PageTimeout=5;")), Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Data_Link.Ngay, Data_Link.LoaiCT, Data_Link.SoCT, Data_Link.NguoiGiaoNhan, Data_Link.TenKhachHang, Data_Link.MaVT, Data_Link.No, Data_Link.Co, Data_Link.SoLuong, Data_Link.DonGia, Data_Link.Gia" _
, _
"ChuaThue, Data_Link.ThueVAT, Data_Link.ThanhTien, Data_Link.SoHoaDon, Data_Link.NgayHoaDon, Data_Link.NgayTT, Data_Link.BaoCao" & Chr(13) & "" & Chr(10) & "FROM `D:\Data\DATA`.Data_Link Data_Link" & Chr(13) & "" & Chr(10) & "WH" _
, _
"ERE (Data_Link.Ngay Is Not Null) AND (Data_Link.No Is Not Null) AND (Data_Link.Co Is Not Null)" _
)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With

Em muốn lúc nào nó cũng link từ file Data.xls ở thư muc hiện hành (hiện tại đang là D:\Data\DATA)
Liệu có cách đặt biến sao cho dù chép thư mục Data vào bất cứ đâu thì đường dẫn sẽ tự thay đổi theo không ạ ?
 
Dear MrHieu,
------------
Mr có thể sử dụng thuộc tính Path của ThisWorkbook để tham chiếu tới thông số này.
Để linh hoạt anh có thể lưu trữ thông tin này trên Worksheet và cho phép người dùng chỉnh sửa khi cần thiết.
Sử dụng hàm =CELL("filename") để tuỳ chỉnh thư mục mặc định trực tiếp trên cell dựa vào thư mục của Workbook hiện hành.
Chúc anh thành công!
 
To MrHieu!
Cách xử lý của mình như thế này không biết có phù hợp không?
Mở file Data.xls, vào VBA, nhấn đúp vào ThisWorkbook rồi thêm đoạn code sau:
Mã:
Private Sub Workbook_Open()
SaveSetting "GiaiPhapExcel", "Setting", "Pathname", ThisWorkbook.Path
SaveSetting "GiaiPhapExcel", "Setting", "Filename_Full", ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Sub
Đóng file Data.xls (dĩ nhiên là phải Save rồi!!)
Trong file muốn lấy dữ liệu bạn thêm đoạn code sau vào trước code của bạn:
Mã:
Public Sub Xy_Ly_Pathname()
Dim Pathname As String
Dim Filename_Full As String
Pathname = GetSetting("GiaiPhapExcel", "Setting", "Pathname", "0")
Filename_Full = GetSetting("GiaiPhapExcel", "Setting", "Filename_Full", "0")
'.....
'Code cua ban
End Sub
Dĩ nhiên là trong phần code của bạn, bạn thay đổi D:\Data bằng Pathname, D:\Data\Data.xls bằng Filename_Full
Cách update:
Khi nào bạn copy file Data.xls (nói chung là file chứa sự kiện Open) sang thư mục khác thì sau khi đã copy, vào Excel mở file đó ra rồi đóng lại để chương trình lưu đường dẫn và tên file....
 
nvson đã viết:
To MrHieu!
Cách xử lý của mình như thế này không biết có phù hợp không?
Mở file Data.xls, vào VBA, nhấn đúp vào ThisWorkbook rồi thêm đoạn code sau:
Mã:
Private Sub Workbook_Open()
SaveSetting "GiaiPhapExcel", "Setting", "Pathname", ThisWorkbook.Path
SaveSetting "GiaiPhapExcel", "Setting", "Filename_Full", ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Sub
Đóng file Data.xls (dĩ nhiên là phải Save rồi!!)
Trong file muốn lấy dữ liệu bạn thêm đoạn code sau vào trước code của bạn:
Mã:
Public Sub Xy_Ly_Pathname()
Dim Pathname As String
Dim Filename_Full As String
Pathname = GetSetting("GiaiPhapExcel", "Setting", "Pathname", "0")
Filename_Full = GetSetting("GiaiPhapExcel", "Setting", "Filename_Full", "0")
'.....
'Code cua ban
End Sub
Dĩ nhiên là trong phần code của bạn, bạn thay đổi D:\Data bằng Pathname, D:\Data\Data.xls bằng Filename_Full
Cách update:
Khi nào bạn copy file Data.xls (nói chung là file chứa sự kiện Open) sang thư mục khác thì sau khi đã copy, vào Excel mở file đó ra rồi đóng lại để chương trình lưu đường dẫn và tên file....

Nếu không đụng chạm đến File nguồn thì làm cách nào vậy ????
Cảm ơn nhiều !!!!!!!!!!
 
Nếu không đụng chạm đến file nguồn thì bạn thử sử dụng add-ins sau.
Thuật toán vẫn là lưu tên file, đường dẫn vào một "nơi nào đó" rồi lại "lấy ra".
Cách sử dụng:
Add-Ins file SelectFile.xla
Khi bạn thay đổi đường dẫn tới file nguồn thì bấm vào nút "Select a file" hình mặt người (cạnh nút Format Painter) để thay đổi đường dẫn trước khi mở file lấy dữ liệu.
Bạn cần chú ý là file mà bạn chọn chính là file nguồn (không nhất thiết tên là Data.xls).
(Nếu bạn mchỉ muốn file nguồn tên là Data.xls thì bạn có thể sửa Code)
Trong file muốn lấy dữ liệu bạn thêm đoạn code sau vào trước code của bạn:
Mã:
Public Sub Xy_Ly_Pathname()
Dim Pathname As String
Dim Filename_Full As String
Pathname = GetSetting("GiaiPhapExcel", "Setting", "Pathname", "0")
Filename_Full = GetSetting("GiaiPhapExcel", "Setting", "Filename_Full", "0")
'.....
'Code cua ban
End Sub
Dĩ nhiên là trong phần code của bạn, bạn thay đổi D:\Data bằng Pathname, D:\Data\Data.xls bằng Filename_Full
........
 

File đính kèm

Cứ phải chạy addin mới được à bác. Không có cách VD như :

Dim a as string
Dim b as string
Dim c as string

a = "D:\KeToan\DATA.xls" hay = range("A1")
b = "D:\KeToan" ...................................
c = "D:\KeToan\DATA"............................


With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=Excel Files;DBQ=a;DefaultDir=b;DriverId=790;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Data.Ngay, Data.ChungTu, Data.NguoiGiaoNhan, Data.MaKhachHang, Data.NguoiPhuTrach, Data.NoiDung, Data.MaVTHH, Data.No, Data.Co, Data.ThueSuat, Data.SoLuong, Data.DonGia, Data.GiaChuaThue, Data." _
, _
"Thue, Data.GiaCoThue, Data.HachToan, Data.CongNo, Data.SoHoaDon, Data.NgayHoaDon, Data.NgayTT" & Chr(13) & "" & Chr(10) & "FROM c.Data Data" & Chr(13) & "" & Chr(10) & "WHERE (Data.ChungTu Is Not Null)" & Chr(13) & "" & Chr(10) & "ORDER BY Data.Ngay" _
)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With

Ý của mình là như thế, để khi thay đổi thư mục thì nó tự động chạy thôi.
Cảm ơn nhiều.
 
Lần chỉnh sửa cuối:
Mình làm thử nhưng lại bị báo lỗi :

Dim A As String
Dim B As String
Dim C As String

A = ThisWorkbook.Path & "\Data.xls"
B = ThisWorkbook.Path
C = ThisWorkbook.Path & "\Data"


With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=Excel Files;DBQ=A;DefaultDir=B;DriverId=790;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Data.Ngay, Data.ChungTu, Data.NguoiGiaoNhan, Data.MaKhachHang, Data.NguoiPhuTrach, Data.NoiDung, Data.MaVTHH, Data.No, Data.Co, Data.ThueSuat, Data.SoLuong, Data.DonGia, Data.GiaChuaThue, Data." _
, _
"Thue, Data.GiaCoThue, Data.HachToan, Data.CongNo, Data.SoHoaDon, Data.NgayHoaDon, Data.NgayTT" & Chr(13) & "" & Chr(10) & "FROM C.Data Data" & Chr(13) & "" & Chr(10) & "WHERE (Data.ChungTu Is Not Null)" & Chr(13) & "" & Chr(10) & "ORDER BY Data.Ngay" _
)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub


1585205578311.png


02.jpg



03.jpg




Mong được giải đáp.
Cảm ơn nhiều.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Khi kết nối được thực hiện thì chương trình luôn tạo ra một name là ExternalData1; ExternalData2. . . .
Có cách nào không cho nó tạo ra được không vậy ????
 
Lần chỉnh sửa cuối:
Dear Mr???
-----------
Anh khai báo một biết strConnectString As String rồi gán vào Connection, làm như thế anh sẽ Debug được A và B có thực sự có giá trị (valid path) hay không.
 
Em có một bài toán như sau:

Để kết nối vào ORACLE có Username và Pass! Khi tạo Macro thì bảng dữ liệu trong oracle quá lớn >>>65538! Nên em muốn kết nối thì có form hiện ra để đặt điều kiện ngày = hoặc trong khoảng nào đó (có 2 textbox)

Các bác giúp em với! Em nghĩ đây cũng là vấn đề nhiều người quan tâm!
 
Đào Việt Cường đã viết:
Dear Mr???
-----------
Anh khai báo một biết strConnectString As String rồi gán vào Connection, làm như thế anh sẽ Debug được A và B có thực sự có giá trị (valid path) hay không.

Cậu làm giúp luôn đi, mình đâu biết về VBA đâu.
Cảm ơn nhiều.
 
Dear all,
--------
Em có đoạn code này chuyên dùng để kết xuất in sổ. Nó chạy thì rất tốt, không va vấp gì, tuy nhiên em gặp phải vấn đề là nếu CSDL khá lớn thì quá Refesh chậm chạp, phải mất nhiều giây dữ liệu mới Update được. Trong khi đó Excel vẫn cứ thực hiện các lệnh bên dưới dẫn đến việc copy dữ liệu không còn chính xác nữa...:=\+ .
Làm sao để bắt chương trình Refresh xong thì mới thực hiện lệnh copy bên dưới?
Em vẫn chưa có giải pháp gì, nhân tiện nhờ anh chị giải quyết. Sau đây là code của em và file minh hoạ kèm theo. Vì file Data.xls đã được rút gọn nên quá trình Refresh rất nhanh chúng ta không nhận thấy lỗi như đã đề cập. Để test lỗi này, hãy bổ sung dữ liệu vào Data.xls vài 10.0000 rồi bổ sung lệnh copy bên dưới dòng lệnh Table_Query.REFRESH xem sao.


Mã:
Option Explicit
Function Table_Query(strTableName As String, _
                        shDestinationSheet As Worksheet, _
           Optional strDestinationRange As String = "A1", _
           Optional strProvider As String = "ODBC", _
           Optional strDataSource As String, _
           Optional strSQL As String, _
           Optional strUserID As String, _
           Optional strPassword As String) As Object
[COLOR=darkgreen]' [B]CÁC THAM SỐ:[/B][/COLOR]
[COLOR=darkgreen]'-  [B]strTableName As String[/B]: chuỗi biểu diễn Name nguồn cơ sở dữ liệu, chúng ta nên đặt một Name trong[/COLOR]
[COLOR=darkgreen]'        Database để tiện quản lý và truy xuất dữ liệu[/COLOR]
[COLOR=darkgreen]'       (Mở file Data.xls để xem Name này)[/COLOR]
[COLOR=darkgreen]'-  [B]shDestinationSheet As Worksheet[/B]: Bảng tính đích, chỉ ra rằng dữ liệu kết xuất sẽ được đổ xuống đó.[/COLOR]
[COLOR=darkgreen]'-  [B]strDestinationRange As Range[/B]: Ô bắt đầu để dữ liệu được đưa xuống từ đó[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strProvider As String = "ODBC"[/B]: Cơ sở dữ liệu được kết xuất bởi "Nhà Cung cấp" nào, mặc định là ODBC[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strDataSource As String[/B]: Cái mà Mr OkeBiladen đang thắc mắc, để có đường dẫn thay đổi theo thư mục của file [/COLOR]
[COLOR=darkgreen]'        [/COLOR][COLOR=darkgreen]chứa module này[/COLOR]
[COLOR=darkgreen]'        sử dụng thuộc tính [B]Path [/B]của ThisWorkbook (xem ví dụ bên dưới)[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strSQL As String[/B]: Chuỗi SQL[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strUserID As String[/B]: (Optional)[/COLOR]
[COLOR=darkgreen]'   [B]Optional strPassword As String[/B]: (Optional)[/COLOR]
If strUserID = "" Then strUserID = "ADMIN"
If strDataSource = "" Then strDataSource = ThisWorkbook.Path & "\" & ThisWorkbook.NAME
Dim strConnection As String
[COLOR=darkgreen]'Neu su dung trinh ket noi ODBC, Table_Queryle se duoc cung cap CommanText la mot SQL[/COLOR]
If strProvider = "ODBC" Then
    strConnection = "ODBC;DBQ=" & strDataSource
    strConnection = strConnection & ";Driver={Microsoft Excel Driver (*.xls)}"
Else
    strConnection = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;"
    strConnection = strConnection & "Password=" & strPassword & ";"
    strConnection = strConnection & "User ID=" & strUserID & ";"
    strConnection = strConnection & "Data Source=" & strDataSource
    Table_Query.CommandType = xlCmdTable & "$"
    Table_Query.AdjustColumnWidth = False
End If
[COLOR=darkgreen]' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:[/COLOR]
If shDestinationSheet.QueryTables.Count > 0 Then
    shDestinationSheet.QueryTables(1).Delete
End If
On Error GoTo TRY [COLOR=darkgreen]' Cố gắng thử lại, có thể shDestinationSheet chưa  được [/COLOR][COLOR=darkgreen]Activate (mã lỗi: -2147024809)[/COLOR]
REFRESH_NOW:
Set Table_Query = shDestinationSheet.QueryTables.Add(strConnection, shDestinationSheet.Range(strDestinationRange))
Table_Query.NAME = strTableName
Application.DisplayAlerts = False
Table_Query.RefreshStyle = xlOverwriteCells
Table_Query.SourceDataFile = strDataSource
Table_Query.CommandText = IIf(strProvider = "ODBC", strSQL, strTableName & "$")
Table_Query.REFRESH
Application.DisplayAlerts = True
Exit Function
TRY:
Select Case ERR.Number
Case -2147024809
    shDestinationSheet.Activate
    GoTo REFRESH_NOW
Case Else [COLOR=darkgreen]' Không được rồi, xem lại chuỗi kết nối đã chuẩn chưa:[/COLOR]
    MsgBox ERR.Number & "-" & ERR.Description & ":" & vbNewLine & _
    "Connect string:" & vbNewLine & strConnection & vbNewLine & _
    "SQL string:" & vbNewLine & strSQL
End Select
End Function
 
[COLOR=silver]'________________________________[/COLOR]
Private Sub CommandButton1_Click()
Table_Query "NHATKY", TEMP, "A1", "ODBC", [B]ThisWorkbook[/B].[B]Path[/B] & _
"\Data.xls", "Select * From `DATA$` "
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:

Mr Okebab đã viết:
Mã:
 [COLOR=DarkGreen]' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:[/COLOR]
If shDestinationSheet.QueryTables.Count > 0 Then
       shDestinationSheet.QueryTables(1).Delete
End If

Dear Mr,
--------
Chứng tỏ anh chưa thử code của em, đoạn chương trình trên kiểm tra xem nếu Sheet TEMP đã có bảng truy vấn rồi thì xóa đi để tiến hành QueryTables.Add lại (với quan điểm thiết kế: chỉ sử dụng 1 QueryTable trên một Sheet cho dễ quản lý).
 
Thiết lập đường dẫn cho file Database

Theo tôi thì việc dùng file *.ini (hoặc file *.txt) để lưu trữ đường dẫn là tốt nhất.
Việc lưu trữ đường dẫn chỉ là một phần trong file *.ini.

Mỗi khi mở Workbook lên thì sẽ đọc các thông tin này vào để giải quyết các vấn đề như: Setting, các đường dẫn file cần thao tác,....
Mã:
;-------------------------------------------
; DO NOT EDIT THIS FILE BY HAND !
; -------------------------------------------
[OPTIONS]
Username=
DateFormat=
ProcedureHeaderBelowDeclaration=0
Language=2
XSLFileName=sample.xsl
OpenXMLFileAfterCreation=2
MaxNumberOfCharactersPerLine=80
UseUniqueLineNumbersInProject=0
KeepActiveWindowOpenWhenClosingWindows=0
LineNumberIncrement=10

[TOOLBAR_BUTTONS_VISIBILITY]
ButtonCopyControlWithCodeVisible=1
ButtonPasteControlWithCodeVisible=1
ButtonFindVisible=1
ButtonProcedureCallersVisible=1
ButtonAddProcedureVisible=1
ButtonAddCodeTemplateVisible=1
ButtonAddModuleHeaderVisible=1
ButtonAddProcedureHeaderVisible=1
ButtonAddErrorHandlerVisible=1
ButtonAddProcedureHeaderAndErrorHandlerVisible=1
ButtonAddLineNumberVisible=1
ButtonRemoveLineNumberVisible=1
ButtonSplitLinesVisible=1
ButtonCombineLinesVisible=1
ButtonAddProcedureToFavoritesVisible=1
ButtonGoToFavoriteProcedureVisible=1
ButtonSelectCaseAssistantVisible=1
ButtonClearImmediateWindowVisible=1
ButtonCloseWindowsVisible=1
ButtonCollapseProjectsVisible=1
ButtonOptionsVisible=1

[SUFFIX]
ResultVariableSuffix=Result
Trên đây là một ví dụ về việc dùng file*.ini để lưu dữ liệu của MZToolvba

Lê Văn Duyệt
 
Đào Việt Cường đã viết:
Mã:
 [COLOR=DarkGreen]' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:[/COLOR]
If shDestinationSheet.QueryTables.Count > 0 Then
       shDestinationSheet.QueryTables(1).Delete
End If
Dear Mr,
--------
Chứng tỏ anh chưa thử code của em, đoạn chương trình trên kiểm tra xem nếu Sheet TEMP đã có bảng truy vấn rồi thì xóa đi để tiến hành QueryTables.Add lại (với quan điểm thiết kế: chỉ sử dụng 1 QueryTable trên một Sheet cho dễ quản lý).

Oan cho mình quá, mình đang xem xét rất kỹ nhưng lại hiểu rất ít (do trình độ) vì xưa nay mình quen làm VBA dựa vào Macro rồi, vì thế quen đọc VBA theo ngôn ngữ macro. Nếu mà cái code của cậu viết theo macro (như ví dụ mình đưa ra) thì sẽ hiểu được. Đằng này nó lại khác nên hơi khó hiểu. Tuy nhiên mình vẫn đang áp dụng nó đấy. Cảm ơn cậu nhiều.

Xóa name : Cách xóa name thì hay rồi, nhưng mình không hiểu tại sao đã bỏ dòng .Name = "Query from DanhMuc"
thế mà nó vẫn tạo ra name. Không có cách cho nó không tạo ra sao ?
 
Mr Okebab đã viết:
xưa nay mình quen làm VBA dựa vào Macro rồi, vì thế quen đọc VBA theo ngôn ngữ macro. Nếu mà cái code của cậu viết theo macro (như ví dụ mình đưa ra) thì sẽ hiểu được. Đằng này nó lại khác nên hơi khó hiểu. Tuy nhiên mình vẫn đang áp dụng nó đấy.

Dear Mr,
--------
Cũng không thể nói VBA và Macro có sự khác biệt đến vậy, nói đúng hơn khi chúng ta dùng Macro để giải quyết một vấn đề thì chúng ta mượn ngôn ngữ của "nó" để diễn đạt cho "nó" hiểu và làm theo ý chúng ta mà thôi.
Đoạn code trên: em muốn Macro thi hành và tạo ra một Table Query (kiểu Object) dựa vào các tham số mà em truyền vào. Chắc có lẽ hàm có nhiều tham số nên anh bị rối? Thực ra chỉ có 2 tham số là bắt buộc strTableNameshDestinationSheet, các tham số khác là tuỳ ý.
Chắc những kiến thức về VBA Funtions không quá xa lạ với anh. Vấn đề là:
Mr Okebab đã viết:
Xóa name : Cách xóa name thì hay rồi, nhưng mình không hiểu tại sao đã bỏ dòng .Name = "Query from DanhMuc"
thế mà nó vẫn tạo ra name.
Trong thủ tục, chúng ta yêu cầu Macro thực hiện thêm mới TableQuery thông qua phương thức Add. Việc tạo ra một name khác chứng tỏ Macro vẫn rất ngoan ngoãn vâng lời. Mỗi lần thủ tục kết thúc đương nhiên sẽ có một TableQuery phát sinh (ra đời). Và quy tắc là nếu Table đó đã được đặt tên trùng với tên mà ta chỉ định thì Macro tự động đặt tên cho Table đó theo chỉ số. Để hạn chế việc này thì cần kiểm tra xem trên Sheet được chỉ định đổ dữ liệu xuống đã tồn tại TableQuery nào chưa, nếu đã có thì xoá đi. Theo em đây là cách ngắn nhất để tiết kiệm việc tính toán và khỏi phải xác định Name đó là gì.
Mr Okebab đã viết:
Không có cách cho nó không tạo ra sao ?
Dĩ nhiên là có, nếu như anh không sử dụng phương thức Add nhằm tạo ra TableQuery mới toanh. Theo cách này anh chỉ cần truyền tham số strSQL cho TableQrery đã có rồi Refresh lại (việc kết nối và tạo ra một TableQuery được thực hiện ở một thủ tục khác).
 
Bạn nào biết chỉ giúp!!!
Trên diễn đàn mình có down load về 1 tập tin nén. Khi mở ra nó có dạng .frm (hình như của anh Lê Văn Duyệt đưa lên thì phải). Làm thế nào mình xem được file dạng form .frm?

--=0
Mã:
[B][COLOR="Navy"]From Sa_DQ:[/COLOR][/B]
 Hãy thử nhắn tin trực tiếp cho Anh Lê Văn Duyệt xem sao!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn nào biết chỉ giúp!!!
Trên diễn đàn mình có down load về 1 tập tin nén. Khi mở ra nó có dạng .frm (hình như của anh Lê Văn Duyệt đưa lên thì phải). Làm thế nào mình xem được file dạng form .frm?
Chào bạn,
Theo mình biết, khi bạn Export 1 Form nào đó trong VBA ra để lưu trữ thì nó sẽ có đuôi .FRM ; Vì vậy để xem những Form này, bạn chỉ cần vào VBA và Import trở lại là OK.

TDN
 
Chào Xuan_Uyen,
Xin bạn cho biết tập tin nào? Nếu được upload file lên.
xuan_uyen đã viết:
(hình như của anh Lê Văn Duyệt đưa lên thì phải)
Chứ bạn nói như vầy thì làm sao ai biết mà giúp.

Lê Văn Duyệt
 
Mình đang có 1 chương trình viết bằng Ms access nhưng do có nhiều người dùng và số lượng bản ghi cũng tương đối nhiều ( >10.000 record) nên chương trình hoạt động khá chậm.
Bây giờ mình muốn chuyển CSDL lên SQL Server (Cái này mình đã làm được) còn phần giao diện thì vẫn chạy trên Access (Query, Form, Report, macro, Module). Nhưng mình đang loay hoay không biết viết lệnh để Link đến Table trong SQL như thế nào để tạo ra được các Table Link trong access. Nếu phải cấu hình bằng tay vào Start-> Control Panel... rồi cấu hình DSN song link thủ công như vậy thì mình nghĩ sẽ không ổn vì làm như thế tức là mình phải cấu hình bằng tay cho hơn 50 máy ở trong cơ quan.
Rất mong sự giúp đỡ của các cao thủ trong diễn đàn.
 
Các bác có thể giúp mình có thể connect trực tiếp dữ liệu từ 1 file access khác tên là data lên 1 file access chính được không. Có nghĩa là mỗi lần mình khởi động lên nó tự động lấy tất cả dữ liệu từ file access data lên file access chính. Bạn nào giúp mình với mình Cảm ơn Nhiều
 
Bạn cho ví dụ đi tôi sẽ load bằng ADO hay DAO đều được (Chỉ để Table cho nhẹ dễ upload lên GPE)
 
Lần chỉnh sửa cuối:
bạn có thể cho nó load dữ liệu từ form F_NhanVienCTy từ các table T_nhanviencty, T_NPTnhanviencty, T_Thunhapchiuthue. Bạn load dùm mình sao dữ liệu người phụ thuộc phải theo tên nhân viên công ty nhé bạn mình cảm ơn bạn nhiều lắm !
 

File đính kèm

Lần chỉnh sửa cuối:
Xin lỗi, hôm nay mới đọc được bài của bạn. Xin có 1 số ý kiến trả lời bạn như sau:
1/Các Form bạn thiết theo dạng flying table nên trường hợp của bạn nhiều người thường vẫn có table trong file và cho Table này Link với table trong CSDL dùng chung. Thường người ta chép file chính , xoá hết dữ liệu. Rồi link các Table trắng này vào Table tren CSDL dùng chung. Hoac xóa hết Table rồi dùng link Table là có đủ các table link
2/Nếu không dùng Table link thì có thể dùng DAO hay ADO kết nối nhưng Form nên thiết kế lại cho phù hợp. Mình sẽ tranh thủ để có ví dụ bằng file của bạn trong trường hợp này.
 
Lần chỉnh sửa cuối:
Mình gửi ví dụ về form tên Cty và danh sách CNV mình làm mới cho nhanh vì xem lại form của bạn lâu lắm.
Trong ví dụ mình sử dụng link table bạn xem nha
 

File đính kèm

Mình cảm ơn bạn rất nhiều bạn có thể chỉ cho mình nếu như mình nhập 1 người phụ thuộc vào trong thì tự động mã số sẽ lấy mã số của nhân viên rồi thêm vào đuôi 001, 002...
Ví dụ : MST Nhan Vien 180099999, thì người phụ thuộc thứ 1 nhân viên này là 180099999-001, người phụ thuộc thứ 2 là 180099999-002 ... được không bạn. NHưng bạn ơi mình không muốn làm bằng phương pháp link table mà mình muốn làm bằng DAO hay ADO.
 
Cái việc lấy mã số chính thêm vào mã phụ thuộc bạn nghĩ đi, nó không thể đơn giản hơn.
Còn đây là ví dụ dùng DAO, chỉ cần Form và khỏi cần table nào cả.
Mình là dân Excel nên sử dụng sheet để liệt kê chi tiết cho thân thuộc.
Đã dùng DAO,ADO thì phải tải về và có địa chỉ rõ ràng mới kết nối được (Phải chép vào ổ đĩa, chạy ngay trên mạng sẽ lỗi ngay)
 

File đính kèm

Lần chỉnh sửa cuối:
Mình cảm ơn bạn rất nhiều. Mình đã làm xong 1 form khác theo điều kiện như thế nhưng mà sao nó hiện thị không đúng bạn ơi !. Nó ko hiểu các mối liên kết giữa các table. Bạn xem có gì sữa giúp dùm mình với. Và khi mình nhấn nút kê tiếp thì nó vẫn nhảy qua mà nó vẫn báo lỗi.
 

File đính kèm

Lần chỉnh sửa cuối:
xin các bạn chỉ giúp.Tôi có 1 đoạn code như sau:

Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.Open "driver={Microsoft dBase Driver (*.dbf)};" & "driverid=277;dbq=" & ";"
FileName="F:\KHoa_07\DG2433KH.DBF"
rs.Open "Select * from " & FileName, cnn, , , adCmdText
khi chạy thì kết nối thành công. Nhưng khi thay chuỗi FileName="F:\DUTOAN2010\Viettel Ninh Hoa\gia thong bao 05 2010.DBF" (chú ý: tên file dài hơn 8 ký tự và có khoảng trắng) thì nó báo lỗi như sau:
[Microsoft][ODBC dBase Driver] Syntax error in FROM clause.(-2147217900)
Tôi không biết lỗi này có phải do tên file dài không?
 
Có một vướng mắc liên quan dđến kết nối Excel với Oracle. muốn nhờ mọi người giúp. Vướng mắc này đã hỏi trên giaiphapexcel vài lần. Cũng đã được anh Nguyễn Duy Tuấn giúp đỡ nhưng vẫn chưa giải quyết được.
Mọi người xem qua và giúp minh với!
Thank!
Bài đã được tự động gộp:

Xin bổ xung các connection string từ http://www.connectionstring.com đã được đóng gói để các bạn tham khảo offline.

Lê Văn Duyệt
Rất thích file ConnectionString.chm của anh. Cảm ơn anh đã chia sẻ!
Nhân tiện, nhờ anh tư vấn giải quyết vướng mắc này giúp tui với. >
Có một vướng mắc liên quan dđến kết nối Excel với Oracle. muốn nhờ mọi người giúp. Vướng mắc này đã hỏi trên giaiphapexcel vài lần. Cũng đã được anh Nguyễn Duy Tuấn giúp đỡ nhưng vẫn chưa giải quyết được.
Mọi người xem qua và giúp minh với!
Thank!
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom