Lỗi Record new trong share csdl nhiều người dùng

  • Thread starter chihienphuco
  • Ngày gửi
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
Mình tạo cdsl cho nhiều người dùng, nhưng khi nhiều máy cùng click vào record new để nhập liệu thì trong table nó bị trùng nhau và chỉ một người nhập được.

Có cách nào khắc phục tình trạng trên? mong giúp đở gấp!
 
Khóa học Quản trị dòng tiền
B

BiDIT

Trung cấp
16/5/09
87
1
8
Hanoi
Đ

ĐỖ SƠN HẢI

Guest
10/10/06
130
0
0
47
Phan Thiết
Gửi chihienphuco
Cái vụ này phải nhờ bác hai2hai thôi

Truong hop 1:

Nếu đặt khóa chính không phụ thuộc vào số liên tục nên ai cập nhật trước thì được lưu trước.

VD: thiết kế cơ sở dữ liệu quản lý bán phòng khách sạn
checkin( ma, ngayin, ngayout, tenkhach, hopdong, giaban, sophong, soriansang, makhach ...)
Voi khóa chính là ma kieu du lieu text (ma.value = ngayin&phong&tenkhach)

Truong hop 2: nếu đặt khóa chính liên tục

VD : Thiết kế nhập liệu cho bảng phiếu thu
Phieuthu(maphieu, makhach, nguoinhan, .......)
Maphieu : phải liên tục

Nếu chuyên nghiệp thì Hải không biết chứ dùng kiểu chửa cháy thì như sau :

Tạo thêm một listbox trên form nhập liệu nhiệm vụ của listbox báo cho chủ nhân biết là mã phiếu cuối cùng là số mấy sau đó chủ nhân chỉ việc nhập tiếp .

Trường hợp 3

Mà chihienphuco sau lại phải cho nhiều người quyền update vậy ?


Mong là bác hai2hai chỉ cách giúp !
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
Ở nút phiếu mới mình dùng lệnh gán các field có khóa, sau đó dùng lệnh:

DoCmd.RunCommand acCmdSaveRecord

Để save Record thêm mới mà không bị lỗi chờ save nữa.

Topic xong.
 
T

tung1999

Sơ cấp
9/2/09
41
0
0
can gio
Mình tạo cdsl cho nhiều người dùng, nhưng khi nhiều máy cùng click vào record new để nhập liệu thì trong table nó bị trùng nhau và chỉ một người nhập được.

Có cách nào khắc phục tình trạng trên? mong giúp đở gấp!
Chào bạn.
Theo cách bạn nói mình đoán là do trùng khoá chính. Khi máy nầy đang tạo 1 record mới và mã (thí dụ MAHH chẳn hạn) đã được thiết lập (thí dụ: me.MAHH=Count([MAHH])&day(date).
Trong thời gian máy nầy chưa lưu record mà máy khác cũng vào và tạo mới thì MAHH sẽ bị trùng.
Có thể sẽ có cao thủ khác giải quyết hay hơn, nhưng mình gợi ý bạn 1 cách tham khảo: Trong form nhập của bạn tạo nút add new record, tại on got focus bạn đặt đoạn code sau:
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
me.MAHH=Count([MAHH])&day(date).
 
Sửa lần cuối bởi điều hành viên:
T

tung1999

Sơ cấp
9/2/09
41
0
0
can gio
Chào bạn Chihienphuco.
Theo cách bạn nói mình đoán là do trùng khoá chính. Khi máy nầy đang tạo 1 record mới và mã (thí dụ MAHH chẳn hạn) đã được thiết lập (thí dụ: me.MAHH=Count([MAHH])&day(date).
Trong thời gian máy nầy chưa lưu record mà máy khác cũng vào và tạo mới thì MAHH sẽ bị trùng.
Có thể sẽ có cao thủ khác giải quyết hay hơn, nhưng mình gợi ý bạn 1 cách tham khảo: Trong form nhập của bạn tạo nút add new record, tại on got focus bạn đặt đoạn code sau:
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
me.MAHH=Count([MAHH])&day(date).
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
đây là đoạn mã của nút thêm hóa đơn mới, đã chạy ổn:

Private Sub Command30_Click()
DoCmd.GoToRecord , , acNewRec
Dim CSDL As Database, TBL As Recordset
Set CSDL = CurrentDb
Set TBL = CSDL.OpenRecordset("T12 TCMAIN", dbOpenSnapshot)
If TBL.RecordCount <> 0 Then
TBL.MoveLast
MAQLTC = Format(Val(TBL!MAQLTC) + 1, "000000")
Else
MAQLTC = "000001"
End If
MANV = "A"
MADV = "B"
DoCmd.RunCommand acCmdSaveRecord
TBL.Close
CSDL.Close
MANV.SetFocus
MANV.Dropdown
End Sub

Nhờ dòng tô đậm nên khi nhấn nút tạo mới hóa đơn nó save luôn vào Table, và người kế tiếp tạo hóa đơn mới vẫn nhập vô tư. ( công đoạn nhập còn lại là Edit record vừa tạo )

Trong đó MANV,MADV là field bắt buộc phải nhập.

Topic xong.
 
Sửa lần cuối:
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,030
125
63
52
Hà nội
vnuni.net
Có 2 cách:

Cách 1: Tạo ID theo Session (session: mỗi user context được coi là 1 Session). Như thế, mỗi khi login vào thì ta có 1 Session nào đó (có thể là 1 tổ hợp hoặc kết hợp với date như các bạn nói ở trên). Lý thuyết là như vậy, còn nôm na thì như các bạn đã nói ở trên rồi đó.

Cách 2: Tăng ID khi save cho trường hợp đang nhập mới (Dĩ nhiên là ko dùng Bound rồi, nhưng mà các bạn làm Access thì toàn tận dụng Save dạng Bound thôi)

Mình thường dùng cách 2

Chú ý: ID luôn luôn nên đặt là kiểu Long (đối với Access)

Ví dụ:

tb_Transation
ID (PK)
----------
TransNo (Số chứng từ - Unique Index, Not Null)
TransDate (Ngày chứng từ, Not Null)
.....

Ví dụ về cách 2

Mã:
    If mIsDirty Then
      If SaveData Then
        InitNewForm
        
        '// Check if print report here before add new
        If objPreferences.INVTransaction_Receipt_SaveAndPrint Then
          Call PrintReport(objPreferences.INVTransaction_Receipt_PrintDestination)
        End If
        
        If Mode = fEditFormOnEditing Then
          ID = NextID
          If Not Parent Is Nothing Then Parent.Grid_UpdateCurrentRow Val(Me.Tag), mRecordString  '// Me.Tag = Parent list's current row (In edit mode)
[COLOR="Red"]        ElseIf Mode = fEditFormOnAdding Then
          If blnMultiUsers Then
            ID = NextID  '// Đoạn này chính là tăng ID lên 1 khi save ở trạng thái Adding
          Else
            ID = ID + 1
          End If
[/COLOR]          If Not Parent Is Nothing Then Parent.Grid_AddNewRow mRecordString
        End If
        
        Mode = fEditFormOnAdding
        ProcessMode
        MakeDirty enuBothMasterAndDetail, False
        If xptFields(CST_FLD_MASTER_TRANSNO).Enabled And xptFields(CST_FLD_MASTER_TRANSNO).Visible Then xptFields(CST_FLD_MASTER_TRANSNO).SetFocus
      End If
    Else
      If Mode = fEditFormOnEditing Then
        InitNewForm
        ID = NextID
        Mode = fEditFormOnAdding
        ProcessMode
        MakeDirty enuBothMasterAndDetail, False
      End If
      If xptFields(CST_FLD_MASTER_TRANSNO).Enabled And xptFields(CST_FLD_MASTER_TRANSNO).Visible Then xptFields(CST_FLD_MASTER_TRANSNO).SetFocus
    End If
    xptFields(CST_FLD_MASTER_TRANSNO).Tag = "1"
    xptFields(CST_FLD_MASTER_TRANSNO).Text = CST_TRANSTYPE_RECEIPT & Format$(m_ID, fmtTRANSNO)
    xptFields(CST_FLD_MASTER_TRANSNO).Tag = ""
 
Sửa lần cuối:

Xem nhiều