اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

السلام عليكم

الإخوة الكرام .. لدي جدول (TAB3) فيه حقل مرقم (HNO) وحقل مرقم آخر (SUB_ID)

والمفترض أنه حيث كان رقم (HNO) واحداً، يكون أيضاً رقم (SUB_ID) واحداً

وما كان سوى ذلك فهو خطأ

وللتوضيح فهذه نسخة مصغرة من الجدول، والأرقام التي فيها خطأ مميزة بالدائرة الحمراء، والمطلوب تمييز هذه الأرقام بوضع علامة في حقل (CHEK)، أو إظهارها في استعلام خاص

image.png.5147a4a668bd2ab61dbda36fee88e15d.png

TAB3.accdb

قام بنشر

شكراً على مشاركتك أخي الكريم .. لكن يبدو أني لم أشرح بشكل جيد

انظر هذه الصورة

 image.png.935d9f1bd1c822a7445ccf4b6f48cf2a.png

المفروض أنه إذا كان رقم (HNO) واحداً، يكون أيضاً رقم (SUB_ID) واحداً

لكن يوجد في الجدول خطأ في موضعين ميزتهما باللون الأحمر، ووضعت علامة يدوية في حقل (CHEK) للإشارة إلى أنه يوجد هنا خطأ

ففي الموضع الأول المفروض أن يكون رقم (SUB_ID) = (73) ، مثل الرقم الذي قبله لأن لهما نفس رقم (HNO) الذي هو (20)

وفي الموضع الثاني المفروض أن يكون رقم (SUB_ID) = (261) ، مثل الرقم الذي قبله لأن لهما نفس رقم (HNO) الذي هو (58)

أرجو أن أكون قد شرحت المطلوب بشكل أوضح

وأرجو أنه يمكن القيام بذلك باستعلام أو كود، لأن القيام بذلك يدويا سيأخذ وقتل طويلاً في الملف الأصلي

قام بنشر

أخي الكريم .. هذا الاستعلام عالج الموضعين الذين ذكرتُهما فقط، والمطلوب ليس معالجة الخطأ ، المطلوب معرفة أين مواضع الخطأ

فالمشكلة أني لا أعرف أين هذه الأخطاء في الملف الأصلي، وهذين الخطأين وضعتهما أنا يدويا للتوضيح

قام بنشر
7 ساعات مضت, nssj said:

أخي الكريم .. هذا الاستعلام عالج الموضعين الذين ذكرتُهما فقط، والمطلوب ليس معالجة الخطأ ، المطلوب معرفة أين مواضع الخطأ

فالمشكلة أني لا أعرف أين هذه الأخطاء في الملف الأصلي، وهذين الخطأين وضعتهما أنا يدويا للتوضيح

ممكن اخي مجموعة من تلك الاخطاء التي تتوقع حدوثها في جدول ... اضف امثلة اخرى وكثر منها لفهم الالية لعمل استعلام مناسب للحالة

  • Thanks 2
قام بنشر
6 ساعات مضت, kanory said:

ممكن اخي مجموعة من تلك الاخطاء التي تتوقع حدوثها في جدول ... اضف امثلة اخرى وكثر منها لفهم الالية لعمل استعلام مناسب للحالة

أخي الكريم .. سأشرح الخطوات التي كنت سأقوم بها يدويا للقيام بالمطلوب، لعلها توضح ماهية الاستعلام أو الكود المطلوب

البداية ستكون من (HNO)، مع ملاحظة أن كل الأرقام الموجودة فيه متكررة، وأبدأ بكل مجموعة وأنظر إلى المجموعة التي تقابلها من (SUB_ID) فإذا كان لها نفس الرقم فالعمل صحيح، وليس المقصود (بنفس الرقم) أن يكون لها نفس رقم (HNO)، بل المقصود أن يكون الرقم فيها موحداً لكل أفراد المجموعة، فإذا كان كذلك فالعمل صحيح وأنتقل للمجموعة التالية من (HNO) وهكذا

وفي الجدول المرفق أول أربع مجموعات لا خطأ فيها

 image.png.7530e60926f584a470a9a92ab7c6f13f.png

 أول خطأ في المجموعة التي تليها

 image.png.4a262a5a16efc6c7cda72940e0f8347d.png

فلا ينبغي أن يختلف الرقم في (SUB_ID) بل ينبغي أن يكون الرقم موحداً إما (73) أو (72) لذلك ينبغي تمييز هذه المواضع بعلامة في (CHEK) لمراجعتها وتصحيحها

وكذلك في موضع الخطأ الثاني

 image.png.52d0d019c6252c76e83c713f9578bf3d.png

كان ينبغي أن يكون رقم كل أفراد مجموعة (SUB_ID) هو (261) فالمطلوب تمييز هذا الموضع أيضاً لمراجعته ومعرفة سبب الخطأ

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

  • أفضل إجابة
قام بنشر
5 ساعات مضت, nssj said:

أخي الكريم .. سأشرح الخطوات التي كنت سأقوم بها يدويا للقيام بالمطلوب، لعلها توضح ماهية الاستعلام أو الكود المطلوب

البداية ستكون من (HNO)، مع ملاحظة أن كل الأرقام الموجودة فيه متكررة، وأبدأ بكل مجموعة وأنظر إلى المجموعة التي تقابلها من (SUB_ID) فإذا كان لها نفس الرقم فالعمل صحيح، وليس المقصود (بنفس الرقم) أن يكون لها نفس رقم (HNO)، بل المقصود أن يكون الرقم فيها موحداً لكل أفراد المجموعة، فإذا كان كذلك فالعمل صحيح وأنتقل للمجموعة التالية من (HNO) وهكذا

وفي الجدول المرفق أول أربع مجموعات لا خطأ فيها

 image.png.7530e60926f584a470a9a92ab7c6f13f.png

 أول خطأ في المجموعة التي تليها

 image.png.4a262a5a16efc6c7cda72940e0f8347d.png

فلا ينبغي أن يختلف الرقم في (SUB_ID) بل ينبغي أن يكون الرقم موحداً إما (73) أو (72) لذلك ينبغي تمييز هذه المواضع بعلامة في (CHEK) لمراجعتها وتصحيحها

وكذلك في موضع الخطأ الثاني

 image.png.52d0d019c6252c76e83c713f9578bf3d.png

كان ينبغي أن يكون رقم كل أفراد مجموعة (SUB_ID) هو (261) فالمطلوب تمييز هذا الموضع أيضاً لمراجعته ومعرفة سبب الخطأ

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

طيب اعمل مثلا زر امر وضع فيه هذه الشيفرة <<<<<<<<<>>>>>>>>

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb
Dim mov_st As String
Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset("SELECT TAB3.HNO, TAB3.SUB_ID, DCount(""ID"",""TAB3"",""[HNO] ="" & [HNO] & ""  and [SUB_ID] ="" & [SUB_ID] & """") AS Expr1, TAB3.CHEK, TAB3.ID, DCount(""ID"",""TAB3"",""[HNO] ="" & [HNO] & """") AS Expr2 " & _
              " FROM TAB3;")
    rst.MoveFirst
    mov_st = rst!ID
    Do While Not rst.EOF
       If rst!Expr2 > rst!Expr1 And rst!Expr1 = 1 And rst!Expr2 > 2 Then
            rst.Edit
            rst!CHEK = True
            rst.Update
       ElseIf rst!Expr2 > rst!Expr1 And rst!Expr1 = 1 And rst!ID > mov_st Then
            rst.Edit
            rst!CHEK = True
            rst.Update
       Else
       
       End If
        mov_st = rst!ID
        rst.MoveNext
    Loop
    rst.Close
    Me.Refresh
    
strSQL = "SELECT TAB3.ID, TAB3.MNO, TAB3.TNO, TAB3.HNO, TAB3.SUB_ID, TAB3.CHEK FROM TAB3 WHERE (((TAB3.CHEK)=True)) "
'db.QueryDefs.Delete "kanory"
Set qdf = db.CreateQueryDef("kanory", strSQL)
    MsgBox "يتم الان فتح استعلام الاخطاء ", vbInformation + vbMsgBoxRight + vbOKOnly, "ملاحظة"
DoCmd.OpenQuery "kanory", acNormal, acEdit

 

1.png

  • Like 2
قام بنشر

جزاك الله خيرا أخي الكريم وأحسن إليك

تم المطلوب بحمد الله

ولكن اسمح لي بسؤال لزيادة معلوماتي التراكمية 🙂

عندما نظرت في الكود (   Do While  ،،    Loop ) لاحظت أنه يشبه بعض الأكواد التي أحتفظ بها لعمليات الترقيم، وهي الأكواد التي فيها

(  For i = 1 To K    ،،  Next i)

فهل هذين النوعين يؤديان نفس الغرض ؟

قام بنشر

تابع هذه المشاركة لطرق وامثلة لحلقات التكرار

في 29‏/1‏/2017 at 00:07, صالح حمادي said:

الدرس الرابع: الحلقات التكرارية أو الدورانية  Looping

 

في كثير الأحيان يحتاج المبرمج أو المستخدم إلى تكرار تعليمة عدد من المرات حسب الحاجة. و هناك نوعان من الحلقات التكرارية , الأولى في حالة كان عدد مرات التكرار معروف و الثانية في حالة كان عدد التكرار مرتبط بشرط معين.

 

أولا: الحلقة (For … Next)

تستخدم الحلقة (For … Next) لتكرار عدد من المرات بحيث يكون عدد التكرارات معلوم.

For counter = start To end [step increment]
   Statement
Next counter

Counter: متغير يمثل عداد الحلقة

Start: القيمة الابتدائية للدوران

End: القيمة النهائية للدوران

Increment: مقدار الزيادة في كل حلقة من حلقات الدوران و إذا لم يوضع يأخذ القيمة 1 افتراضيا

 

مثال1:

 

 

 

For i = 1 To 10
   Me.y = Me.y + i
Next i

هذا البرنامج يقوم بحساب مجموع الأعداد من 1 إلى 10 .

بحيث i هو العداد و y مربع نص تظهر به النتيجة و القيمة الابتدائية له يجب أن تكون 0

مثال2:

 

For i = 0 To 10 Step 2
   Me.y = Me.y + i
Next i

في هذا البرنامج وضعنا قيمة الانتقال 2 يعني أن البرنامج سوف يحسب مجموع الأعداد الزوجية فقط (من 0 إلى 10)

 

ثانيا: الحلقة (For Each … Next)

 

تستخدم الحلقة (For  Each… Next) عندما نريد تنفيذ تعليمة أو مجموعة من التعليمات لكل عنصر في مصفوفة أو مجموعة. و رغم أنها تشبه (For … Next) كثير إلا أنها تقوم بتنفيذ حلقة لكل عنصر مما يعني أنه لا يوجد عداد في هذا النوع من الحلقات.

و يمكن استخدامها في المصفوفات أو مع الكائنات.

صيغتها:

For Each element In Group
  [statement 1]
  [statement 2]
  ....
  [statement n]
Next

مثال1:

Dim Array_n() as string

Array_n = Array(1, 2, 3, 5)
Dim sum As Integer
sum=0

For Each Item In Array_n
   sum = sum + Item
Next

Me.y = sum

 Array_n هي مصفوفة بها 4 عناصر.

هذا البرنامج يقوم بحساب مجموع هذه العناصر و يضعها في مربع النص y

Item : هي العنصر

i: هو العداد

 

مثال2:

Dim frm As Form
Dim fc As Control

Set frm = Me

For Each fc In frm.Controls
   Me.listbox.AddItem (fc.Name)
Next

هذا البرنامج يقوم بإضافة جميع أسماء عناصر النموذج الحالي إلى مربع قائمة listbox.

السطر الأول هو تعريف المتغير frm من Form (نموذج)

السطر الثاني تعريف المتغير fc من Control (عنصر تحكم)

السطر الثالث إسناد النموذج الحالي (Me)  للمتغير frm و ذلك باستعمال عبارة set لأن النموذج عبارة عن كائن (Object) .

السطر الرابع هو القيام بالدوران لكل عنصر من عناصر النموذج(frm.Controls) 

السطر الخامس إضافة اسم العنصر(fc.Name) Listbox إلى مربع القائمة   و ذلك بإستعمال التعليمة AddItem

 

ثالثا: الحلقة (Do Until  condition ... Loop)

 

تقوم هذه الحلقة بتفحص الشرط قبل الدخول للحلقة إذا كان الشرط محقق (True) فإن البرنامج يقفز إلى ما بعد حلقة التكرارية أي أنه لن يتم الدخول للحلقة. و إذا كان الشرط غير محقق (False) فسيتم تنفيذ التعليمات Statments, ثم يرجع للسطر Do until لاختبار الشرط ثانية. و هكذا.

يعني أنه سوف يتم تكرار الحلقة عدد من المرات حتى يتحقق الشرط. و لن ينفذه و لو مرة واحدة إذا كان الشرط صحيح من البداية.

صيغتها:

Do Until condition
  Statments
Loop

مثال:

Dim i As Integer
Dim sum As Integer
i = 1
sum = 0

Do Until i > 10
  sum = sum + i
  i = i + 1
Loop

Me.y = sum

يقوم هذا البرنامج بحساب مجموع الأعداد من 1 إلى 10 .

i متغير من نوع integer يمثل العداد بالنسبة للحلقة في كل حلقة يزداد 1 و فيمته الابتدائية هي 1.

sum متغير من نوع integer يمثل مجموع الأعداد قيمته الابتدائية هي 0.

 

مادام i<10 فإن البرنامج يبقى يكرر العملية حتى يصبح i>10 و بعد نهاية الدوران يضع القيمة النهائية في مربع النص y

رابعا: الحلقة (Do ... Loop Until condition )

 

هذا النوع من الحلقات يقوم بتنفيذ الدوران على الأقل مرة واحدة لأنه يختبر الشرط في نهاية الحلقة و بالتالي فإنه يتم الدخول للحلقة أولا ثم في نهاية الحلقة يتم تفحص الشرط.

صيغتها:

Do
  Statements
Loop Until condition

مثال:

Dim i As Integer
Dim sum As Integer
i = 1
sum = 0

Do 
  sum = sum + i
  i = i +2
Loop Until i > 10

Me.y = sum

هذا البرنامج يقوم بحساب مجموع الأعداد الفردية من 0 إلى 10

لأن القيمة الابتدائية للعداد هي 1 و مقدار الزيادة في كل حلقة (الخطوة) هو 2

خامسا: الحلقة (Do While condition ... Loop)

هذا النوع من الحلقات يقوم بتنفيذ الدوران مادام الشرط Condition محقق وإلا يتم التوقف عن الدوران في الحلقة و تقوم هذه الدالة بتفحص الشرط في بداية الحلقة.

صيغتها:

 

Do While Condition
  Statements
Loop 

مثال:

Dim i As Integer
Dim sum As Integer
i = 0
sum = 0

Do While i <= 10
  sum = sum + i
  i = i + 2
Loop
               
Me.y = sum

يقوم هذا البرنامج بحساب مجموع الأعداد الزوجية من 0 إلى 10

مادام i<=10 فإن البرنامج يعيد الدوران. في كل دورة يقوم بإضافة 2 للعداد  حتى يصبح i>10

سادسا: الحلقة (Do ... Loop While condition)

 

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

صيغتها:

Do 
  Statements
Loop While Condition

مثال:

Dim i As Integer
Dim mult As Long
i = 10
mult = 1

Do
  mult = mult * i
  i = i - 1
Loop While i > 0

Me.y = mult

هذا البرنامج يقوم بحساب جداء الأعداد من 10 إلى 1 و يضع النتيجة في me.y

هنا وضعنا العداد i تنازليا (i=i-1) في كل دورة ينقص 1 من العداد حتى يصل إلى 0

نلاحظ هنا بالنسبة للمتغير mult و الذي يمثل الناتج أنني وضعت نوعه  Long Integer بدلا من و السبب يرجع لأن النوع integer أقصى قيمة له هي 32767 و في هذه الحالة الناتج يفوق هذا العدد و بالتالي سوف يظهر لنا الخطأ رقم 6 (Overflow)

 

  • Like 1
  • Thanks 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information