• 0
sweety78

عدم تكرار قيمة بشروط Dcount

سؤال

السلام عليكم

 

في قاعدة البيانات المرفقة.. في حدث (Before Update) الخاص بالحقل IDDox، أريد عدم تكرار IDDox في نفس رقم Job_ID مع كون Receipt_No فارغ، أي السماح بالتكرار اذا كان Receipt_No غير فارغ.

 

أرجو أن يكون المطلوب مختصراً وواضح.

 

أرجو التعديل على الكود أو استبداله اذا كان غير صالح بالمرة.

 

تحيااااتي

DCount.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

15 إجابة على هذا السؤال .

  • 0

الرد على أولاً :)

 


Private Sub IDDox_R_AfterUpdate()

'save the Record
DoCmd.RunCommand acCmdSaveRecord

'requery the ComboBox, to avoid getting empty cells
Me.IDDox_R.Requery
End Sub

 

'========================================================


Private Sub IDDox_R_GotFocus()

'requery the ComboBox, to account for new entered data in the Table by others
Me.IDDox_R.Requery
End Sub

 

'========================================================

 

Public Function Test_Data(iJob_id, iDoxID)
On Error GoTo err_Test_Data

    'we need certain data to process the Formula's and compare data,
    'so we will make the Row Source query, of the ComboBox IDDox_R, send us these data,
    '1st data to receive is Job_ID, which the query takes from the Sub Form's Parent Form, [Forms]![DoxR_O]![Job_ID]
    '  it's easier to take the data from the Main Form, to avoid getting into The Main Form calling the Sub Form Controls
    '  The following link gives ALL the required code for callings between:
    '  The Main Form A, Sub Form B, and Sub Form C inside Sub Form B
    '  http://access.mvps.org/access/forms/frm0031.htm
    '2nd data DoxID, from the query itself
    
    'the Row Source query:
    'Get_Data: Test_Data([Forms]![DoxR_O]![Job_ID],[DoxID])
    '  we made an Alias name (Dummy name) in the query named it Get_Data,
    '  asked it to call the Function Test_Data (which we are in it now),
    '  send 2 pieces of data to the Function (because the Function is asking for 2 pieces of data)
    
    'Although we can call the 2 pieces of data any names we like, to make it easy on me, I usually add an "i" to the name,
    '  so I don't have to go back and Form and table to get the right names :)
    
    'How it works:
    'The query will generate the list of ALL data of the selected field IDDox_R,
    '  but we need to loop through the Table DocumentR_O to compare the IDDox_R, Job_ID, and Reference_No
    '  so each data we get from the query, it will be formulated, and compared with Table DocumentR_O fields.
    '  the best way to loop through Table DocumentR_O, is to do it through Recordset
    
    
    Dim rst As DAO.Recordset
    
    'open the Recordset, constraining the data to Job_ID
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM DocumentR_O WHERE [Job_ID]= '" & iJob_id & "'")
    'to reset the Recordset cursor, we have to move to the end of the Recordset, then move back to the begining
    rst.MoveLast: rst.MoveFirst

    'Loop through the Recordset, fro the 1st Record to its last RecordCount
    For i = 1 To rst.RecordCount
        'initialize the variable Use_This to nothing,
        'as we will assign the unique Record to it
        Use_This = ""
        
        'check and intercept the data that don't match our need,
        'IF Receipt_No is Empty, and DoxID from the query is matching IDDox_R in the Table
        If IsNull(rst!Receipt_No) = True And DoxID = rst!IDDox_R Then
        
            'we cannot use this DoxID, so keep Use_This variable empty
            Use_This = ""
            
            'and we don't need this DoxID, so don't continue checking with the rest of Table data,
            'move to the next query data by bypassing the rest of the data checking,
            'so we use GoTo the line the bypasses this checking,
            'which if after rst.MoveNext, which moves to the next table Record
            ' Debug.Print iJob_id & ">" & rst!SR & " - we CAN'T use: " & iDoxID
            GoTo Move_to_Next_Record
        End If
            
            'since the un-wanted DoxID are intercepted and not assigned to Use_This variable
            'the data the gets here is the correct required data
            Use_This = iDoxID
            
        'move to the next Record in Table DocumentR_O
        rst.MoveNext
        
Move_to_Next_Record:
    'move to the next Record in the Query
    Next i
    
    ' just make sure that USe_This is NOT empty
    If Len(Use_This & "") <> 0 Then
        
        'now we send back the correct DoxID to the Combobox Row Source query, one at a time
        'Debug.Print iJob_id & " - we CAN use: " & Use_This & "> Len=" & Len(Use_This)
        Test_Data = Use_This
    End If
    
'NOTE:
    '  since the Combobox Row Source query will list ALL the data from Table Documents,
    '  and this Function will NOT send the unqualified DoxID,
    '  this will leave an Empty Record in the Get_Data field in the quey:
    'Get_Data: Test_Data([Forms]![DoxR_O]![Job_ID],[DoxID])
    '  so to remove these Empty cells, we have to put in the Criteria: IS NOT NULL
    '  this way Get_Data will hide the Empty Records, and ONLY show DoxID we sent from this Function
    
    
    'clean up, to release the Recordset from the memory
    rst.Close
    Set rst = Nothing
    
Exit Function

err_Test_Data:

    MsgBox Err.Number & vbCrLf & Err.Description
    
End Function


 

وللحديث بقية :)

 

جعفر

10.Dcounter.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تعديل بسيط على المرفق..



تعديل بسيط على المرفق..

DCount.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وعليكم السلام

 

انا عادةً لا اترك الاختيار للمستخدم لكي يقبل او لايقبل شروط البرنامج (حدث BeforeUpdate المقترح ، ينبه المستخدم) ،

لذلك فاحاول جعل البرنامج يضيق الاختيارات برمجياً ، ثم يسمح للمستخدم الاختيار من القائمة (مثلا) فقط.

 

هناك عدة طرق لتصفية الاختيارات ، ولكني هنا إخترت ان استخدم fTest_Data module

حيث ان الـ module يعطيني كامل التحكم.

 

ارسلت من استعلام Row Source - IDDox_R ، معلومتين الى fTest_Data Function لكي نقوم بالمعادلات وتتم المقارنة ، والمعلومتين هما [Job_ID],[DoxID] .

ومن ثم ، نرجع للإستعلام الاختيارات الصحيحة فقط :)

 

 

تركت fTest_Data Function بدون تنظيف ، حتى يمكن معرفة بقية الطرق التي كانت على بالي ، والتي جربتها :)

 

وبالتوفيق :)

جعفر

10.Dcounter.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

 

الاستاذ جعفر.. شكراً لتجاوبك وعطاءك...

 

إن ما أريده هو أن لا يسمح للمستخدم بالتكرار في شروط معينه:

يقبل التكرار في حال كون Receipt No فارغاً، أما في حال كونه غير فارغ، اي تم إصدار وصل الاستلام له.. فإن التكرار مسموح... كذلك أنا افضل الطريقة الأولى كما في المثال اللذي وضعته، لأنه يعرض جميع البيانات ولا ينتقص منها.

 

إن أمكن التعديل في الكود أو استبداله.. سأكون لك من الشاكرين وكذلك للأعضاء الكرام في المنتدى

 

تحيااااتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المطلوب سابقا كان:

>أريد عدم تكرار IDDox في نفس رقم Job_ID مع كون Receipt_No فارغ، أي السماح بالتكرار اذا كان Receipt_No غير فارغ.

فهل في تغيير في الطلب؟

جعفر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا

 

قد يكون خانني التعبير في طرح السؤال..

 

السؤال كما يلي:

 

المطلوب عدم تكرار IDDox في نفس رقم Job_ID في حال كون الـ Receipt_No فارغ، فلا مانع من أي يتكرر الـ IDDox في نفس رقم Job_ID في حال كون الـ Receipt_No غير فارغ (أي قد تم تحديثه).

 

كون الـ Receipt_No غير فارغ، يعني أنه قد تم إصدار وصل إستلام.

 

تحيااااتي

تم تعديل بواسطه sweety78
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم هذا الذي تم العمل على أساسه :)

فهل هناك خطأ في البيانات؟

جعفر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

 

استاذي جعفر...

العمل كفكرة أكثر من رائع ولكن هناك امران يعيقان:

- الأول (يمكن حله على ما اعتقد) وهو عند تحديث Receipt_No (غير فارغ)، يستلزم الخروج من النموذج وإعادة الدخول كي تتحدث بيانات IDDox ليتمكن المستخدم من إدخال نفس القيمة...

وعندما يكون البرنامج مثبت لدى أكثر من مستخدم، ستكون هناك امكانية لورود الخطأ حيث أن احد المستخدمين قد يحدث Receipt (غير فارغ)، لن يتمكن من إدخال ذات القيمة IDDox الا بعد خروجه من النموذج... ولن يصعب على من مثلك ايجاد حل لهذه المشكلة.

 

- الثاني: هو أنني بالكاد اتمكن من فهم كود معين، وبالنسبة لي ان المثال الذي قمت انا بإرفاقه والذي يحتاج الى تعديل أقرب للفهم، خصوصاً أن بعض الاعضاء سبق لهم طرح امثله عديدة مشابهة للكود في المنتدى، ولديّ نية في تطبيق مثل هذا الكود في قاعدة بيانات مع بعض التعديل.

وبخصوص طريقة الحل الذي تفضلتم بطرحها، لا أخفي عليك بأنها كانت فكرة مميزة، إلا أنني لم استطع استيعاب طريقة عمل الكود، لانها اكبر من امكانياتي كوني احاول التعلم من خلال هذا المنتدى وهو الأهم عندي وحتى لو كان التعلم متدرج وبطيء.

 

تحيااااتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ولا يهمك ، إن شاء الله سأحاول اللعب بالكود BeforeUpdate ، مثل ما كان طلبك سابقاً ، واوافيك بالنتيجة غداً إن شاء الله :)

 

جعفر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فإنتظار البقية  :rolleyes: 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وهذه البقية :)

 


Private Sub IDDox_R_BeforeUpdate(Cancel As Integer)
On Error Resume Next

'Count the number of occurances for this Job_ID, and IDDox_R:
'count it for number of Receipt_No
a = DCount("[Receipt_No]", "DocumentR_O", "[iDDox_R]='" & Me.IDDox_R & "'" & _
" AND [Job_ID]= '" & Me.Job_ID & "'")
'now count it for IDDox_R
b = DCount("[iDDox_R]", "DocumentR_O", "[iDDox_R]='" & Me.IDDox_R & "'" & _
" AND [Job_ID]= '" & Me.Job_ID & "'")

If a < b Then
'we have more IDDox_R than Receipt_No
MsgBox "Douplicate R"
DoCmd.CancelEvent

Else
'we have less IDDox_R than Receipt_No, or equal
MsgBox "Go Ahead"
End If

End Sub

 

الطريقة الاولى موجودة في النموذج DoxR_O

بينما الطريقة الثانية موجودة في النموذج DoxR_O2

 

وبالتوفيق :)

 

جعفر



واذا في ملاحظة ، فسأراها غدا إن شاء الله ، بطاريتي مال اليوم خلصت :)

10.Dcounter.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

على فكرة

النموذج ظاهر عليه علامات Corruption :(

لذا انصح الانتباه لهذا ومعالجته ، او إعادة عمل النموذج من اول وجديد وبدون نسخ/لصق المكونات ، وإنما عملها من جديد.

 

جعفر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

 

الاستاذ جعفر شكراً لك

 

الكود شغال مافيه مشكلة وسلمت يداك ولم تظهر عندي عيوب في النموذج!!!

 

لديّ طلبين بعد اذنك:

1- هل ممكن تشرح الكود  :rolleyes: 

 2- اين الخطأ في الكود الذي وضعته (انا) في سؤالي؟  :)

 

تحيااااتي لك وللأعضاء

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كتبت طويلا واختفى كل شئ بسبب مشكلة في المتصفح :(

إختصاراً

 

حسبت عدد الحقول المملوءة في Receipt_No=a وعدد الحقول المملوءة في الحقل b=IDDox_R

ثم عملت المقارنه

اذا الحقول المملوءة في a  اقل من المملوءة في b

فهذا معناه ان هناك حقل Receipt_No فارغ ، فاذاً يجب وقف عملية الحفظ

وإلا ، فيمكن الاستمرار بعملية الحفظ

 

ولكنني اكرر واقول: النموذج ظاهر عليه علامات Corruption :(

 

جعفر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اما الخطأ في الكود الذي تم إرساله لي:

1.

[Job_ID]=" & Me.Job_ID

هذا معناه ان Job_ID رقم ، بينما هو Text

 

2.

IsNull(Receipt_No)

لم تخبري الكود في اي السجلات يبحث ، اي كان البحث غير مشروط ، اي ابحث لي عن اول خانه لـ Receipt_No

 

فالشرط كان يجب ان يكون في كل معادلة:

"[iDDox_R]='" & Me.IDDox_R & "'" & _
" AND [Job_ID]= '" & Me.Job_ID & "'"

 

جعفر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .