Chào mừng, Khách
Bạn cần phải đăng ký trước khi bạn có thể đăng trên trang web của chúng tôi.

Tên người dùng
  

Mật khẩu
  





Diễn đàn Tìm kiếm

(Tìm kiếm nâng cao)

Diễn đàn Thống kê
» Thành viên: 164
» Thành viên mới nhất: newbee30
» Các chủ đề diễn đàn: 131
» Các bài viết diễn: 1,094

Thống kê đầy đủ

Thành viên online
Hiện đang có 27 người dùng trực tuyến.
» 0 Thành viên | 27 Khách

Chủ đề Mới nhất
Demo Tính tồn kho ( rất c...
Chuyên mục: Query
Đăng bởi lần cuối: mytho
1 Giờ trước
» Bài trả lời: 57
» Lượt xem: 7,986
Dữ liệu trong mainForm và...
Chuyên mục: Thủ thuật VBA
Đăng bởi lần cuối: tranthanhan1962
5 Giờ trước
» Bài trả lời: 1
» Lượt xem: 25
Demo Import/Export Excel ...
Chuyên mục: Tương tác Chương trình ngoài
Đăng bởi lần cuối: maidinhdan
6 Giờ trước
» Bài trả lời: 51
» Lượt xem: 3,207
[Góc thơ] THAO THỨC
Chuyên mục: Góc Thơ
Đăng bởi lần cuối: Nguyễn Thành Sáng
9 Giờ trước
» Bài trả lời: 485
» Lượt xem: 18,449
Làm sao để Form nhập dữ l...
Chuyên mục: Forms
Đăng bởi lần cuối: ongke0711
16-11-17, 11:14 PM
» Bài trả lời: 3
» Lượt xem: 86
Thiết lập tự động Windows...
Chuyên mục: Thủ thuật VBA
Đăng bởi lần cuối: vuthaiha90
16-11-17, 02:42 PM
» Bài trả lời: 1
» Lượt xem: 97
Nên khởi động ứng dụng nh...
Chuyên mục: Vấn đề chung
Đăng bởi lần cuối: lehongduc
16-11-17, 10:01 AM
» Bài trả lời: 0
» Lượt xem: 38
Code VBA không chạy trong...
Chuyên mục: Forms
Đăng bởi lần cuối: tranthanhan1962
15-11-17, 03:47 PM
» Bài trả lời: 5
» Lượt xem: 226
Câu lệnh nào ẩn button...
Chuyên mục: Forms
Đăng bởi lần cuối: cpucloi
15-11-17, 11:30 AM
» Bài trả lời: 3
» Lượt xem: 238
Định dạng dd/mm/yyyy và 1...
Chuyên mục: Thủ thuật VBA
Đăng bởi lần cuối: ongke0711
15-11-17, 12:17 AM
» Bài trả lời: 2
» Lượt xem: 143

 
  Dữ liệu trong mainForm và subForm
Viết bởi: pherotao - Hôm qua, 01:37 PM - Chuyên mục: Thủ thuật VBA - Bài trả lời (1)

Xin chào các bạn trên diễn đàn!
Tôi có 2 yêu cầu nhỏ nhờ các bạn xem xét giúp đỡ:
1. Tôi có 1 mainform và 1  subform dữ liệu. Tôi muốn ngăn mainform lưu dữ liệu khi subform bị rỗng (vd: mainform Hóa Đơn (khóa chính: MAHD, subform Nhập Hàng (khóa phụ: MAHD)).
2. Tôi muốn in hóa đơn với các dữ liệu mà tôi vừa nhập (bất kể dữ liệu đó ở trước, ở sau, ở giữa...).
Xin chân thành cảm ơn!

In mục này

  Làm sao để Form nhập dữ liệu cho bảng mở ra, luôn ở dòng hiện hành (mới)?
Viết bởi: pvhung76 - 16-11-17, 10:47 PM - Chuyên mục: Forms - Bài trả lời (3)

Các bác, các anh-chị chỉ giúp làm thế nào để khi mở form nhập liệu cho bảng thì luôn mở cái mới (không hiện dữ liệu đã nhập trước đó)????

In mục này

  Thiết lập tự động Windows Regional ngày/tháng, định dạng tiền, số
Viết bởi: ongke0711 - 15-11-17, 09:27 PM - Chuyên mục: Thủ thuật VBA - Bài trả lời (1)

Thiết lập tự động định dạng ngày/tháng, phân cách hàng ngàn của tiền tệ, số cho hệ thống Windows từ VBA. 
—————————————————————————————————————

Demo sau đây giúp bạn thiết lập lại các kiểu định dạng ngày/tháng/năm cũng như kiểu tiền tệ, kiểu số cho hệ thống máy tính để phù hợp với định dạng trong ứng dụng Access của bạn. Thiết lập này chạy tự động khi mở ứng dụng, bạn không cần phải đi thiết lập thủ công cho từng máy tính - thay đổi trong Control Panel - Region and Language Setting.
Để thiết lại thông tin của hệ thống Windows, bạn phải dùng tới các hàm API như: SetLocaleInfo (), GetLocaleInfo ()
Dưới đây là code cho hàm ChangeSysDatNumCur(). Copy đoạn code này vào module.

Mã PHP:
Option Explicit
Public Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As LongByVal LCType As LongByVal lpLCData As String) As Boolean
Public Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As LongByVal LCType As LongByVal lpLCData As StringByVal cchData As Long) As Long
Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongByVal wMsg As LongByVal wParam As LongByVal lParam As Long) As Long

Public Const LOCALE_ICENTURY = &H24
Public Const LOCALE_ICOUNTRY = &H5
Public Const LOCALE_ICURRDIGITS = &H19
Public Const LOCALE_ICURRENCY = &H1B
Public Const LOCALE_IDATE = &H21
Public Const LOCALE_IDAYLZERO = &H26
Public Const LOCALE_IDEFAULTCODEPAGE = &HB
Public Const LOCALE_IDEFAULTCOUNTRY = &HA
Public Const LOCALE_IDEFAULTLANGUAGE = &H9
Public Const LOCALE_IDIGITS = &H11
Public Const LOCALE_IINTLCURRDIGITS = &H1A
Public Const LOCALE_ILANGUAGE = &H1
Public Const LOCALE_ILDATE = &H22
Public Const LOCALE_ILZERO = &H12
Public Const LOCALE_IMEASURE = &HD
Public Const LOCALE_IMONLZERO = &H27
Public Const LOCALE_INEGCURR = &H1C
Public Const LOCALE_INEGSEPBYSPACE = &H57
Public Const LOCALE_INEGSIGNPOSN = &H53
Public Const LOCALE_INEGSYMPRECEDES = &H56
Public Const LOCALE_IPOSSEPBYSPACE = &H55
Public Const LOCALE_IPOSSIGNPOSN = &H52
Public Const LOCALE_IPOSSYMPRECEDES = &H54
Public Const LOCALE_ITIME = &H23
Public Const LOCALE_ITLZERO = &H25
Public Const LOCALE_NOUSEROVERRIDE = &H80000000
Public Const LOCALE_S1159 = &H28
Public Const LOCALE_S2359 = &H29
Public Const LOCALE_SABBREVCTRYNAME = &H7
Public Const LOCALE_SABBREVDAYNAME1 = &H31
Public Const LOCALE_SABBREVDAYNAME2 = &H32
Public Const LOCALE_SABBREVDAYNAME3 = &H33
Public Const LOCALE_SABBREVDAYNAME4 = &H34
Public Const LOCALE_SABBREVDAYNAME5 = &H35
Public Const LOCALE_SABBREVDAYNAME6 = &H36
Public Const LOCALE_SABBREVDAYNAME7 = &H37
Public Const LOCALE_SABBREVLANGNAME = &H3
Public Const LOCALE_SABBREVMONTHNAME1 = &H44
Public Const LOCALE_SCOUNTRY = &H6
Public Const LOCALE_SCURRENCY = &H14
Public Const LOCALE_SDATE = &H1D
Public Const LOCALE_SDECIMAL = &HE
Public Const LOCALE_SENGCOUNTRY = &H1002
Public Const LOCALE_SENGLANGUAGE = &H1001
Public Const LOCALE_SGROUPING = &H10
Public Const LOCALE_SINTLSYMBOL = &H15
Public Const LOCALE_SLANGUAGE = &H2
Public Const LOCALE_SLIST = &HC
Public Const LOCALE_SLONGDATE = &H20
Public Const LOCALE_SMONDECIMALSEP = &H16
Public Const LOCALE_SMONTHOUSANDSEP = &H17
Public Const LOCALE_SNATIVECTRYNAME = &H8
Public Const LOCALE_SNATIVEDIGITS = &H13
Public Const LOCALE_SNATIVELANGNAME = &H4
Public Const LOCALE_SNEGATIVESIGN = &H51
Public Const LOCALE_SPOSITIVESIGN = &H50
Public Const LOCALE_SSHORTDATE = &H1F
Public Const LOCALE_STHOUSAND = &HF
Public Const LOCALE_STIME = &H1E
Public Const LOCALE_STIMEFORMAT = &H1003

Public Const WM_SETTINGCHANGE = &H1A
Public Const HWND_BROADCAST = &HFFFF&

'Nhap kieu dinh dang Ngay, So
Public Const FormatCurrSymb = "Vnd "             '
Ky tu dau cua dang Currency
Public Const FormatDec ","                  'Phan cach so thap phan
Public Const FormatThou = "."                 '
Phan cach hang ngan
Public Const FormatSDate "dd-MM-yyyy"       'Kieu Short Date
Public Const FormatLDate = "dd MMMM yyyy"     '
Kieu Long Date

Public Sub ChangeSysDatNumCur()
   Dim lLocal As Long
   Dim LenDate 
As LongLenCur As LongLenNum As Long
   Dim dwLCID 
As Long
   Dim BufDate 
As String 1024BufCur As String 1024BufNum As String 1024

   On Error 
GoTo ChangeSysDatNumCur_Error

   lLocal 
GetSystemDefaultLCID()
   LenDate GetLocaleInfo(lLocalLOCALE_SSHORTDATEBufDateLen(BufDate))
   LenCur GetLocaleInfo(lLocalLOCALE_SMONTHOUSANDSEPBufCurLen(BufCur))
   LenNum GetLocaleInfo(lLocalLOCALE_STHOUSANDBufNumLen(BufNum))
   If Not Left$(BufDateLenDate 1) = FormatSDate Or Not Left$(BufCurLenCur 1) = FormatThou Or Not Left$(BufNumLenNum 1) = FormatThou Then   'Kiem tra ngay he thong co cung dinh dang mong muon ko?
       dwLCID = GetSystemDefaultLCID()
       If SetLocaleInfo(dwLCID, LOCALE_SSHORTDATE, FormatSDate) = False Then  '
Thiet lap thu xem co loi ko?
           MsgBox "Khong doi duoc dinh dang ngay, so cua he thong."64"Lien he nhan vien Quan tri he thong"
           Exit Sub
       Else
           Change_LocaleInfo
           MsgBox 
"Ung dung se tu khoi dong lai de cac thiet lap co hieu luc."vbInformation"Thông báo"
           RestartAccessApp.Restart
       End 
If
   Else
       MsgBox 
"Dinh dang Ngay/Thang, kieu Tiên te, kieu So phu hop voi ung dung, khong can thiet lap lai." vbCrLf _
              
"- Kieu ngày: " FormatSDate vbCrLf _
              
"- Kieu so  : 1" FormatThou "000" FormatDec "00"vbInformation"Chuc mung!"
       DoCmd.OpenForm "frmMain"
       DoCmd.Close acForm"frmSplash"
       Exit Sub
   End 
If


ChangeSysDatNumCur_Error:
   MsgBox "Loi khong xac dinh No. " Err.Number _
          
" trong thu tuc [ChangeSysDatNumCur] cua form khoi dong. " _
          
vbCrLf vbCrLf Err.Description64"Ung dung Access"
End Sub

Sub Change_LocaleInfo
()

   Dim LCID As Long
   LCID 
GetSystemDefaultLCID()

   'Thiet lap kieu Ngay/Thang
   SetLocaleInfo LCID, LOCALE_SLONGDATE, FormatLDate
   SetLocaleInfo LCID, LOCALE_SSHORTDATE, FormatSDate
   
   '
Thiet lap kieu tien Currency
   SetLocaleInfo LCID
LOCALE_SCURRENCYFormatCurrSymb
   SetLocaleInfo LCID
LOCALE_SMONDECIMALSEPFormatDec
   SetLocaleInfo LCID
LOCALE_SMONTHOUSANDSEPFormatThou
   
   
'Thiet lap kieu so Number
   SetLocaleInfo LCID, LOCALE_SDECIMAL, FormatDec
   SetLocaleInfo LCID, LOCALE_STHOUSAND, FormatThou
   
   PostMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0

End Sub 

- Bạn muốn thay đổi kiểu định dạng thì thay đổi ở phần khai báo Hằng: FormatSDate, FormatDec...
[Hình: 38404423752_3015dfdfe3_o.png]

- Để thay đổi hệ thống có hiệu lực thì buộc phải khởi động lại ứng dụng Access của bạn. Bản thân code VBA Access không thể khởi động lại chính nó vì khi ứng dụng nó đóng (Application.Quit) thì làm sao chạy các code kế tiếp để khởi động lại chính nó. Do vậy phải thông qua một công cụ khác là lệnh Shell  để chạy file .bat của DOS. Tác giả Renaud Bompuis đã có đoạn code rất hay thực hiện việc vừa Compact và khởi động lại chính ứng dụng Access nó đang chạy. Tôi có sử dụng code này trong demo.
- Chú ý để đoạn code khởi động lại ứng dụng Access chạy thì bạn phải "bỏ chọn" tính năng "Compact On Close" của Access.

Sau đây là đoạn code để khởi động và nén ứng dụng Access. Copy vào module đặt tên là "RestartAccessApp". 

Mã PHP:
'-----------------------------------------------------------------------------
Utilities from http://blog.nkadesign.com/microsoft-access/
' (c) Renaud Bompuis, 2008-2009
Licensed under the Creative Commons Attribution License
' http://creativecommons.org/licenses/by/3.0/
http://creativecommons.org/licenses/by/3.0/legalcode
'-----------------------------------------------------------------------------

Option Compare Database
Option Explicit

Time out set to 60 iterationsafter which the batch file should delete itself
Private Const TIMEOUT 60

Public Sub Restart(Optional Compact As Boolean False)
   Dim scriptpath As String
   
   
' Construct the full path of our temporary batch file
   scriptpath = Application.CurrentProject.FullName & ".dbrestart.bat"
   
   ' 
if the script already existsthen check it isn't an old remnant
   ' 
that has passed it's timeout.
   If Dir(scriptpath, vbNormal) <> "" Then
       If DateAdd("s", TIMEOUT * 2, FileDateTime(scriptpath)) < Date Then
           ' 
We've passed twice the batch file timeout, giving ample time for
           ' 
it to exectuteso if it's still there, it's most probably a dud
           Kill scriptpath
       Else
           
' Timeout hasn't expired beyond the acceptable limitso it's probably
           ' 
still activejust try to close the application again
           Application
.Quit acQuitSaveAll
           Exit Sub
       End 
If
   End If
   
   
' Construct the batch file
   ' 
Note that the TIMEOUT value is only used as a loop counter and
   ' we do not really count elapsed time in the batch file.
   ' 
The ping command takes some time to load and start and even though
   
' we set its timeout to 100ms, it will take much longer than that to
   ' 
execute.
   ' If we've been asked to comnpact the databasewe launch the database
   
' using the /compact command line switch
   Dim s As String
   s = s & "SETLOCAL ENABLEDELAYEDEXPANSION" & vbCrLf
   s = s & "SET /a counter=0" & vbCrLf
   s = s & ":CHECKLOCKFILE" & vbCrLf
   s = s & "ping 0.0.0.255 -n 1 -w 100 > nul" & vbCrLf
   s = s & "SET /a counter+=1" & vbCrLf
   s = s & "IF ""!counter!""==""" & TIMEOUT & """ GOTO CLEANUP" & vbCrLf
   s = s & "IF EXIST ""%~f2.%4"" GOTO CHECKLOCKFILE" & vbCrLf
   If Compact Then
       s = s & """%~f1"" ""%~f2.%3"" /compact" & vbCrLf
   End If
   s = s & "start "" "" ""%~f2.%3""" & vbCrLf
   s = s & ":CLEANUP" & vbCrLf
   s = s & "del %0"
   
   ' 
Write batch file
   Dim intFile 
As Integer
   intFile 
FreeFile()
   Open scriptpath For Output As #intFile
   Print #intFile, s
   Close #intFile
   
       
   
' Create the arguments to be passed to the script
   ' 
Here we pass it the full path to the database minus the extension which we pass separately
   
' this is done so that we can reconstruct the path to the lock file easily in the script.
   ' 
The extension to the lock file is also passed as a third argument.
   Dim dbname As Stringext As Stringlockext As Stringaccesspath As String
   Dim idx 
As Integer
   
   
' Get the path to the msaccess executable, wherever that is
   accesspath = SysCmd(acSysCmdAccessDir) & "msaccess.exe"
   
   ' 
Find the extensionstarting from the end
   For idx 
Len(CurrentProject.FullNameTo 1 Step -1
       If Mid
(CurrentProject.FullNameidx1) = "." Then Exit For
   Next idx
   dbname 
Left(CurrentProject.FullNameidx 1)
   ext Mid(CurrentProject.FullNameidx 1)
   
   
' Depending on the database extension, determine its lock file extension
   If Left(ext, 2) = "ac" Then
       lockext = "laccdb"
   Else
       lockext = "ldb"
   End If
   
   ' 
Call the batch file
   s 
"""" scriptpath """ """ accesspath """ """ dbname """ " ext " " lockext
   Shell s
vbHide
   
   
' Close our application
  Application.Quit acQuitSaveAll
End Sub 

- Để sử dụng hàm này, trong Form bạn dùng code: RestartAccessApp.Restart True

------------------------------------------------------------------------------------------------------------------
Kết quả:

[Hình: 38403832322_c16bedfa1d_o.png]  [Hình: 38403832452_3f66c5503f_o.png]

[Hình: 38403832642_9bcfe9f8e3_o.png]

Bạn thay đổi các kiểu định dạng trong Windows để test thử đi nhé. Chạy Form frmSplash trong demo.

Link file demo: http://www.mediafire.com/file/0s2hvcu4fl...NumCur.mdb



File đính kèm
.zip   ChangeSysDateNumCur.zip (Kích cỡ: 37.26 KB / Tải về: 9)
In mục này

  Định dạng dd/mm/yyyy và 123.456.789,00 trong vba
Viết bởi: vuthaiha90 - 14-11-17, 05:46 PM - Chuyên mục: Thủ thuật VBA - Bài trả lời (2)

Em chào các bác, chả là em có 1 chương trình access nhỏ để nhập liệu rồi chuyển những thông tin nhập liệu ấy vào file word cố định (Doc.Formfield). Chương trình làm trên máy em thì ok rồi, nhưng khi đưa sang các máy khác để sử dụng, nếu như máy ấy vừa mới cài win xong thì mặc định theo nước ngoài (mm/dd/yyyy và 123,456,789.00), lại phải vào "Control Panel" thiết lập lại mới chạy được chương trình của em (mà chỗ em có nhiều máy và nhiều phòng giao dịch, cứ phải teamview sửa từng máy, người trẻ thì còn biết vào chỉnh lại, những người lớn tuổi rồi không làm được). Vậy cho em hỏi có code VBA nào set mặc định 2 loại định dạng này mà không dựa theo ngày giờ định dạng của máy tính không ạ? Em cảm ơn các bác trước ạ

In mục này

  Nên chuyển đổi dùng Field dạng Yes/No sang dạng Number
Viết bởi: ongke0711 - 14-11-17, 12:24 AM - Chuyên mục: Table - Không có hồi đáp

Nên chuyển đổi dùng Field dạng Yes/No sang dạng Number
—————————————————————————————————
(Trích lượt từ bài viết của Allen Browne)

Sau đây là lý do chúng ta nên hạn chế (hoặc không) sử dụng field dạng Yes/No trong table Ms Access.
1. Khi Microsoft thiết kế Field dạng Yes/No cho Access, họ mặc định field này sẽ không có giá trị Null và bộ máy quản lý dữ liệu (JET) cũng xử lý Field này như vậy. Trong thực tế ứng dụng, có các query truy vấn table có field dạng Yes/No đã bị báo lỗi “No current record” mà người lập trình không tìm ra lý do tại sao. Query sẽ bị báo lỗi là query có sử dụng “Outer join” vì tất cả các Field bên nhánh Outer table có thể chứa giá trị Null mà field Yes/No thì không có Null. Một trong những cách khác phục lỗi của “Outer Join” là dùng hàm Int() chuyển đổi field Yes/No sang dạng số trong câu lệnh truy vấn. Ví dụ:

[Hình: 24511259528_0d0cf4f9a0_z.jpg]

[Hình: 37667797064_9d54eff8cc_o.png]

- Khi dùng hàm Int() để chuyển đổi Yes/No sang Integer thì Access nó chấp nhận giá trị Null cho dạng Number và sẽ không báo lỗi nữa nhưng đổi lại việc tốc độ truy vấn sẽ bị ảnh hưởng (đối với dữ liệu cỡ chục ngàn dòng) vì không còn sử dụng được Index của field Yes/No này.

2. Nếu sau này chúng ta muốn nâng cấp CSDL lên SQL Server thì Field dạng Yes/No của Access dễ gặp lỗi trong SQL Server. Trong Access, nếu bạn không cung cấp giá trị cho Yes/No field thì nó sẽ mặc định “hiển thị” là False (No). Nhưng khi trong SQL (dạng Bit) nó chưa 3 giá trị phân biệt là True, False và Null, khi đó bạn truy vấn giá trị False trong SQL server nó sẽ không hiển thị hết nhưng record mà bạn thấy là False trong Access. Một trong nhưng các khắc phục trường hợp này là: kiểm tra các giá trị Null trong field Yes/No của table Access trước rồi chuyển đổi nó thành giá trị mặc định (ví dụ là False) trước khi nâng cấp
lên SQL server.

-----------------------------------------------------------------------------------------------------------------------------------------

Giải pháp:

Một giải pháp thay thế tốt đó là đổi field Yes/No sang dạng Number để vượt qua các lỗi đã đề cập ở trên và linh động sử dụng được giá trị Null. Bạn sẽ không đánh đổi tốc độ truy vấn vì vẫn dùng được Index của field Number, và không bị lỗi “No current record”. Với Field type dạng Number, để giống như Yes/No mà bạn quen dùng, bạn chọn Field size: Integer, bạn dùng số -1 cho TRUE (Yes) và 0 cho FALSE (No). Nếu muốn loại bỏ giá trị NULL luôn thì thiết lập Default Value: 0Validation Rule: 0 Or -1, Required: Yes. Nếu muốn dùng giá trị NULL thì thiết lập “Validation Rule: Is Null Or 0 Or -1”. 

[Hình: 38327953596_7aac2415bc.jpg]   [Hình: 38383111211_7a2127748e.jpg]

* Bạn vẫn có thể sử dụng "Check Box" cho Field dạng Number
- Dùng Check box trong trường hợp bạn không muốn lưu giá trị Null. Mặc định trong Table, đối với Field dạng Number -> Tab Lookup -> Display Control: sẽ không có tùy chọn "Check box", chỉ có Textbox hoặc Combobox. Để có thêm tùy chọn "Check box" bạn dùng hàm SetPropertyDAO() dưới đây để thêm nó. Copy đoạn code này vào module đặt tên modSetPropertyDAO:

Mã PHP:
Option Compare Database
Option Explicit

Function SetPropertyDAO(obj As ObjectstrPropertyName As StringintType As Integer_
   varValue 
As VariantOptional strErrMsg As String) As Boolean
On Error 
GoTo ErrHandler

   If HasProperty
(objstrPropertyNameThen
       obj
.Properties(strPropertyName) = varValue
   Else
       obj
.Properties.Append obj.CreateProperty(strPropertyNameintTypevarValue)
   End If
   SetPropertyDAO True

ExitHandler
:
   Exit Function

ErrHandler:
   strErrMsg strErrMsg obj.Name "." strPropertyName " not set to " _
       varValue 
". Error " Err.Number " - " Err.Description vbCrLf
   Resume ExitHandler
End 
Function
Public Function 
HasProperty(obj As ObjectstrPropName As String) As Boolean
   
'Purpose: Return true if the object has the property.
   Dim varDummy As Variant

   On Error Resume Next
   varDummy = obj.Properties(strPropName)
   HasProperty = (Err.Number = 0)
End Function 

- Mở cửa số Immediate (Ctr-G), paste dòng code này vô -> Enter.

Call SetPropertyDAO(CurrentDb.TableDefs("TenTable").Fields("TenFieldYesNo"), "DisplayControl", dbInteger, CInt(acCheckbox))

[Hình: 37678426734_7e4c7b6d20_o.png]

Sau khi chạy dòng code trên thì Field vừa chọn sẽ hiển thị dạng "Check box" (Display Control: 106), bạn có thể sử dụng như Yes/No field nhưng sẽ không  gặp lỗi "Outer join" nữa.

Nếu bạn muốn lưu giá trị Null thì không dùng "Check Box" được mà phải đổi sang "ComboBox". Dùng Check Box thì không hiển thị được giá trị Null nhưng đối với Combo box, nếu để trống thì nó là Null rồi.

[Hình: 24520436588_8fe7a0c2f6_o.png]

Nói tóm lại, việc chuyển đổi từ Yes/No field sang dạng Number không có phức tạp nhưng khắc phục được nhiều vấn đề thì bạn cũng nên tham khảo thêm giải pháp này trong ứng dụng Access của bạn.  :007:

Link file demo: http://www.mediafire.com/file/8d5hkccktx...cement.mdb

In mục này

Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ