-
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
hieuvn > 17-01-18, 05:02 PM
Đồng bộ qua mạng Lan thì hơi chuối, thực ra form_timer chỉ làm nhiệm vụ Refresh thôi. nếu là tôi thì sẽ xử lý như sau: tạo 1 nút bấm: chấm điểm: khi ông giám khảo nhập điểm vào textbox và bấm vào nút chấm điểm thì nó sẽ làm 2 nhiệm vụ:
1, lưu điểm lên vào be
2, refresh lại function lấy câu hỏi.
không cần phải dùng timer, vì sao? vì khi giám khảo chấm điểm xong mới sang câu khác chứ, nếu một trong những giám khảo chưa chấm điểm thì ông ngồi máy chính cũng chuyển câu hỏi luôn sao?
chắc gạo hơn thì thiết kế thêm 1 nút refresh. -
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
tranthanhan1962 > 20-01-18, 11:28 PM
(17-01-18, 04:08 PM)ongke0711 Đã viết: Không biết anh lưu thông số ID1 -> ID2 vào biến hay vào table nhưng em nghĩ lưu vào table sẽ ổn định hơn biến. Biến có nhiều rủi ro mất khi bộ nhớ máy bị trục trặc gì dó. Lưu vào table và máy con chạy timer check cái trường ID này để đồng bộ.
Thế này nhé. Trên table chính ngoài field ID còn có field IDhienhanh (ID hiện hành). Trên form chính có record source table chính tạo code cho Form_Current. Khi form chính của máy chính thay đổi record sẽ update giá trị tất cả các record của field IDhienhanh = giá trị field ID (có nghĩa dù trên form chính của máy con đang nằm trên record nào thì thì khi refresh giá trị của field IDhienhanh vẫn là giá trị của form ID trên form chính của máy chính).
Để refresh cho form chính của máy con máy con sử dụng một subform có Timer Interval, Nhiệm vụ Form_Timer của subform này là chạy code Table chínnh.FindFirst của field ID theo field IDhienhanh. Sử dụng Form_Timer trên subform vì nếu để Form_Timer trên form chính của máy con thì form sẽ bị gật giám khảo không chấm điểm được.
Lý thuyết như vậy là đúng và thực tế nó cũng xử lý được việc này. Nhưng vấn đề là có lúc nó chuyển được theo form chính có lúc lại nằm ỳ ra không chịu chuyển, giám khảo này chấm được còn giám khảo kia thì ngồi chờ rụng râu mà nó vẫn chưa chịu chuyển đến record hiện hành. Chấm thi trước bàn dân thiên hạ mà như thế này thì cùi bắp quá đi. Hiện giờ tôi phải cho máy con thêm dàn nút navigation. Nếu nó không tự chuyển thì giám khảo chuyển nên phần mềm có biệt danh là <phần mềm cùi bắp>
Nói chung thì ngoài giám khảo, tôi và ban tổ chức thì không ai biết vụ này vì máy chiếu chỉ hiện thị form chính của máy chính chứ không hiển thị form chính của máy con. Nhưng mà vẫn thấy quê quê vì không xử lý được.
-
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
ongke0711 > 21-01-18, 12:23 PM
Nếu vậy có thể vấn đề nằm ở FindFirst. Anh có thử đổi qua DLookup chưa? Tốc độ DLookup cũng nhanh hơn recordset. -
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
maidinhdan > 21-01-18, 02:10 PM
(20-01-18, 11:28 PM)tranthanhan1962 Đã viết: Thế này nhé. Trên table chính ngoài field ID còn có field IDhienhanh (ID hiện hành). Trên form chính có record source table chính tạo code cho Form_Current. Khi form chính của máy chính thay đổi record sẽ update giá trị tất cả các record của field IDhienhanh = giá trị field ID (có nghĩa dù trên form chính của máy con đang nằm trên record nào thì thì khi refresh giá trị của field IDhienhanh vẫn là giá trị của form ID trên form chính của máy chính).
Để refresh cho form chính của máy con máy con sử dụng một subform có Timer Interval, Nhiệm vụ Form_Timer của subform này là chạy code Table chínnh.FindFirst của field ID theo field IDhienhanh. Sử dụng Form_Timer trên subform vì nếu để Form_Timer trên form chính của máy con thì form sẽ bị gật giám khảo không chấm điểm được.
Lý thuyết như vậy là đúng và thực tế nó cũng xử lý được việc này. Nhưng vấn đề là có lúc nó chuyển được theo form chính có lúc lại nằm ỳ ra không chịu chuyển, giám khảo này chấm được còn giám khảo kia thì ngồi chờ rụng râu mà nó vẫn chưa chịu chuyển đến record hiện hành. Chấm thi trước bàn dân thiên hạ mà như thế này thì cùi bắp quá đi. Hiện giờ tôi phải cho máy con thêm dàn nút navigation. Nếu nó không tự chuyển thì giám khảo chuyển nên phần mềm có biệt danh là <phần mềm cùi bắp>
Nói chung thì ngoài giám khảo, tôi và ban tổ chức thì không ai biết vụ này vì máy chiếu chỉ hiện thị form chính của máy chính chứ không hiển thị form chính của máy con. Nhưng mà vẫn thấy quê quê vì không xử lý được.
Anh áp dụng WithEvents xem
* Mở form máy chủ trước,rồi mở form máy con.
* Áp dụng RaiseEvent ThaydoiThongbao("Noi dung thon bao") để cho giámk khảo biết là có câu hỏi mơới để giámkhảo tự nhấn nút chuyển câu hỏi, tránh tình trạng, máy chủ chuyển câu hỏi mà giámkhảo chưa chấm bài thì không hay.
* Về load câu hỏi mới, nên dùng ADO để load ID câu hỏi về bằng các hàm sau:
1. Kết nối .
Mã PHP:Option Compare Database
Option Explicit
' Khai bao bien Toan cuc
Public Cnn As ADODB.Connection 'hoac Global cnn As ADODB.Connection
Public Rst As ADODB.Recordset 'hoac Global Rst As ADODB.Recordset
' Viet den 22/11/2017
Private Const PassData As String = ";Jet OLEDB:Database Password=111444;"
'---------------------------------------------------------------------------------------
' Procedure/ Ten thu tuc : KetnoiCnn
' Tao tren may tinh User : DAN_WIN10PRO
' Author/ Nguoi khoi tao : maidinhdan@gmail.com
' Date/Ngay tao : 18/11/2017
' Purpos/Mo ta :
'---------------------------------------------------------------------------------------
Function KetnoiCnn() As Boolean
On Error GoTo Loi
Set Cnn = New ADODB.Connection
Dim LinkFileData As String
LinkFileData = CurrentProject.path & "\Danh_muc_ho_so\Data\DataTest.mdb"
Dim ChuoiKetNoi As String
Dim Link As String: Link = LinkFileData & PassData
'ChuoiKetNoi dung cho Access co pass
ChuoiKetNoi = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Link
'On Error Resume Next Su dung cai nay neu khong dung On Error Goto Loi
Cnn.ConnectionString = ChuoiKetNoi
Cnn.CursorLocation = adUseClient ' Khong khai bao cai nay thi khi chay: Set .ActiveConnection = Nothing se loi
Cnn.Open
' Thuoc tinh cnn.State: 1 Doi tuong mo
Do While Cnn.State <> 1
DoEvents
If Cnn.State = 0 Then Exit Function
Loop
' Debug.Print "___Ket noi thanh cong_____________________________"
KetnoiCnn = True
Exit_Loi:
Exit Function
Loi:
MsgBox "Ket noi that bai, Vui long kiem tra Server va thong tin ket noi", vbInformation, "Thong bao"
KetnoiCnn = False
Set Cnn = Nothing
Call DemSoLoiDeThoat
Resume Exit_Loi
End Function
'---------------------------------------------------------------------------------------
' Procedure : TatKetnoiCnn
' Author : Hen Dan
' Date : 18/04/2017
' Purpose : Dung cho SQL Server/Access
'---------------------------------------------------------------------------------------
'
Sub TatKetnoiCnn()
On Error Resume Next
Set Cnn = Nothing
' Debug.Print "_________________________Dong ket noi Connect_____________"
End Sub
'---------------------------------------------------------------------------------------
' Procedure/ Ten thu tuc : TatKetnoiRst
' Tao tren may tinh User : DAN_WIN10PRO
' Author/ Nguoi khoi tao : maidinhdan@gmail.com
' Date/Ngay tao : 18/11/2017
' Purpos/Mo ta :
'---------------------------------------------------------------------------------------
Sub TatKetnoiRst()
On Error Resume Next
Rst.Close
Set Rst = Nothing
' Debug.Print "_________________________Dong ket noi Rst_____________"
End Sub
Function KetnoiADORst(ChuoiSQL As String, Optional ChiXem As Boolean = True) As ADODB.Recordset
On Error GoTo Loi
If KetnoiCnn = True Then
Set Rst = New ADODB.Recordset
With Rst
Set .ActiveConnection = Cnn
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Source = ChuoiSQL 'Voi ADODB, Like '*abc*' phai la '%abc%'
.Open
' Trien khai ham Them/Sua/Xoa khong the dung Set .ActiveConnection = Nothing
If ChiXem = True Then
Set .ActiveConnection = Nothing 'Luu y: Bo dong nay neu la ThemXoaSua. Neu them dong nay chay loi thi trong Ham KetNoiSerVer phai them cnn.CursorLocation = adUseClient
End If
End With
Set KetnoiADORst = Rst
End If
Exit_Loi:
TatKetnoiCnn
Exit Function
Loi:
DoCmd.RunMacro "mcthongbao.15" 'MsgBox "Ket noi RST that bai, Vui long kiem tra String SQL", vbInformation, "Thong bao"
Resume Exit_Loi
End Function
2. Load ID câu hỏi cho máy con nên dùng Class load
* Lý do:
+ Load ID về;
+ Giám khảo chấm xong, dùng class này để lưu
+ Lấy được dữ liệu là ngắt kêết nối ngay, để cho nhiêều máy truy xuất nhanh.
* Code:
1. Dưa vao code kết nối trên Tạo hàm xem máy chủ đang mở ID mấy
2. Load ID đó về máy con
Mã PHP:Function HienThiLenFormChamdiem(Tenform As Form, IDCanHienThi As String)
Set Tenform.Recordset = KetnoiADORst("SELECT * FROM tblBangdiem WHERE SoTT=" & Val(IDCanHienThi)) 'Hien Thi de ThemXoaSua
End Function
3. Sự kiện nhấn nút lưu của máy con khi đã chấm xong.
* Rât nhiêều công việc để làm... em chỉ xin đến đây thôi. -
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
tranthanhan1962 > 21-01-18, 03:18 PM
(21-01-18, 02:10 PM)maidinhdan Đã viết: Anh áp dụng WithEvents xem...
Thank maidinhdan. Giám khảo ngồi đối diện với màn hình máy chiếu nên khi máy chính đổi record chấm thi thì giám khảo cũng biết chuyển đến record nào nên cũng không cần phải thông báo. Trên form máy chính có lệnh refresh liên tục đến khi nào tất cả các ô điểm của GK xuất hiện điểm đầy đủ mới chuyển record mới nên vấn đề làm thủ công thì rất OK. Vấn đề là mình muốn xử lý Automatic -
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
tranthanhan1962 > 21-01-18, 03:23 PM
(21-01-18, 12:23 PM)ongke0711 Đã viết: Nếu vậy có thể vấn đề nằm ở FindFirst. Anh có thử đổi qua DLookup chưa? Tốc độ DLookup cũng nhanh hơn recordset.
DLookup chỉ lấy giá trị để hiển thị lên máy con. Còn FindFirst thì máy con chuyển đến đúng record trên máy chính (máy chiếu). Khi GK chấm điểm sẽ refresh vào table, máy chính refresh sẽ hiện thị điểm từ table lên form trên máy chiếu -
RE: [S.O.S] Điều khiển hiển thị record trên form qua mạng LAN
tranthanhan1962 > 21-01-18, 05:31 PM
Đã xử lý xong. Hóa ra vấn đề trục trặc kỹ thuật không phải do phần mềm mà là do phần cứng. Đổi wifi router mới chạy OK. Cám ơn các bạn đã hỗ trợ.