الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

فكرة تحديث سجلات

مغلق
بدأه snmdody في 6 يوليو 2004 · 44 رد · 3,794 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته .. وبعد ،،

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

يوجد في القاعدة المرفقة نموذج بإسم (frmImportCarArabic) وبداخله مربع تحرير وسرد بإسم (رقم الرحلة Voyage) عند حدث بعد التحديث يوجد الكود التالي :

Dim Max As Integer
Dim Count As Integer
Max = DMax("[BillOFLading]", "ImportCars", "[VoyageNo] = '" & Forms!frmImportCarArabic![Voyage] & "'")
Count = DCount("[BillOFLading]", "ImportCars", "[VoyageNo] = '" & Forms!frmImportCarArabic![Voyage] & "'")
If Max > Count Then
DoCmd.OpenQuery "Update"
Else
Max = Max + 1
End If

وسأوجز طريقة عمل هذا الكود والمراد منه :

في البداية أقوم بحساب أعلى قيمة لحقل (BillOFLading) في الجدول (ImportCars) ومن ثم أقوم بحساب عدد السجلات في نفس الجدول ، فإذا كانت أعلى قيمة أكبر من عدد السجلات فيتم تنفيذ إستعلام تحديث المسمى (Update الذي هو أساس المشكلة) وإلا يتم حساب أعلى قيمة ويضاف إليها (1) والكود أعلاه يتم تنفيذه بطريقة سليمة وليست هناك أي مشكلة .

وتتمثل المشكلة في إستعلام التحديث (Update) وسأضرب مثالاً حتى تتضح الصورة فمثلاً قمت بإدخال عدد (5) سجلات حسب الآتي :

السجل الأول : قيمة الحقل BillOFLading تساوي (1)

السجل الثاني: قيمة الحقل BillOFLading تساوي (2)

السجل الثالث: قيمة الحقل BillOFLading تساوي (3)

السجل الرابع: قيمة الحقل BillOFLading تساوي (4)

السجل الخامس: قيمة الحقل BillOFLading تساوي (5)

فلو تم حذف السجل الرابع مثلاً ، فستكون النتيجة أن تكون قيم حقل BillOFLading في الجدول حسب الترتيب التالي : (1) (2) (3) (5) (حذف السجل الرابع)

ولو قمت بإضافة سجل جديد بعد عملية الحذف ، فستكون قيمة الحقل BillOFLading تساوي (5) ما يعني أن هناك تكرار في قيمة الحقل ، ولذلك قمت بعمل استعلام التحديث المسمى (Update) ليقوم بإنقاص القيمة (1) لجميع السجلات ما عدا الذي يبدأ بالرقم (1) وستكون النتيجة حسب المثال أعلاه حسب الآتي :

السجل الأول : قيمة الحقل BillOFLading تساوي (1) (حسب الشرط في استعلام التحديث).

السجل الثاني: قيمة الحقل BillOFLading تساوي (1)

السجل الثالث: قيمة الحقل BillOFLading تساوي (2)

السجل الرابع: ( تم حذفه)

السجل الخامس: قيمة الحقل BillOFLading تساوي (4)

وبملاحظة بسيطة في السجلات سيتضح أن هناك رقمين مكرريين الا وهما في السجل الأول والسجل الثاني ...

والمطلوب هو جعل الاستعلام يقوم بإنقاص القيمة (1) من جميع السجلات بشرط أن لا تكون قيمة الحقل تساوي (1) وبطريقة أدق أن يقوم بإعادة تسلسل قيم الحقل BillOFLading

وفق الله الجميع لما فيه الخير ،،

Update.rar

#2

وبإختصار شديد المطلوب هو أن يتم مساعدتي في إعداد إستعلام التحديث بطريقة صحيحة ليقوم بإنقاص القيمة (1) من جميع السجلات بشرط أن لا تكون قيمة الحقل (BillOFLading) تساوي (1) وبعد ذلك يتم إعداد الإستعلام ليقوم بعملية إعادة التسلسل من جديد

وكمثال ، السجلات قبل التحديث ..

1 ، 2 ، 3 ، 5

وبعد التحديث ..

1 ، 2 ، 3 ، 4 (وليس 1 ، 1 ، 2 ، 3)

أتمنى أن اكون قد أوصلت الفكرة والمطلوب ..

بارك الله فيكم وجعل ما تقومون به من خدمة الآخرين ومساعدتهم في ميزان حسناتكم

#3

Up

#4

Up

#5

السلام عليكم

بخصوص ما ذكرت لدى دالة تقوم بعمل اعادة ترقيم الحقل المحدد بناء على موقعه فى الجدول

يعنى السجل الاول رقم 1 والثانى 2 وهكذ

واليك الكود

Function Reorder()

Dim db As Database

Dim rs As Recordset

Set db = CurrentDb()

Set rs = db.OpenRecordset("ImportCars", dbOpenDynaset)

While Not rs.EOF

With rs

.Edit

!BillOFLading = rs.AbsolutePosition + 1

.Update

.MoveNext

End With

Wend

End Function

مرفق البرنامج اضغط الفورم test

Update.rar

#6

يعطيكم الف عافية

#7

لقد قمت بتجربة الطريقة التي قام الأخ الكريم simsimkj بوضعها مشكوراً رداً على موضوعي ، ولكن اواجه مشكلة بسيطة ولكنها في غاية الأهمية ، وتتمثل هذه المشكلة أن الدالة المسماة (ReOrders) في قاعدة البيانات المرفقة ، وهذه هي الدالة :

Function ReOrderExportCars()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("ExportCars", dbOpenDynaset)
While Not rs.EOF
With rs
    .Edit
     !BillOFLading = rs.AbsolutePosition + 1
   .Update
   .MoveNext
End With
Wend
End Function

ويتم إستخدام هذه الدالة في حدث بعد التحديث لقائمة التحرير والسرد المسماة (رقم الرحلة) في النموذج المسمى (frmExportCarsArabicEnglish) ، ومرفق الكود لهذا العنصر

Private Sub Voyage_AfterUpdate()
On Error Resume Next
Dim Count As Integer
VoyageDateH = DLookup("[SailingDateHegry]", "Voyages", "[VoyageNo] = '" & Me![Voyage] & "'")
VoyageDateM = DLookup("[SailingDateGorg]", "Voyages", "[VoyageNo] = '" & Me![Voyage] & "'")
DeparturePortCode = DLookup("[DeparturePortAr]", "Voyages", "[VoyageNo] = '" & Me![Voyage] & "'")
DeparturePort = DLookup("[PortArName]", "Ports", "[PortCode] = " & Me![DeparturePortCode])
ArraivalPortCode = DLookup("[ArraivalPortAr]", "Voyages", "[VoyageNo] = '" & Me![Voyage] & "'")
ArraivalPort = DLookup("[PortArName]", "Ports", "[PortCode] = " & Me![ArraivalPortCode])
Me.VoyageNo = Me.Voyage

' حساب عدد السجلات في الجدول ExportCars
Count = DCount("[BillOFLading]", "ExportCars", "[VoyageNo] = '" & Me![Voyage] & "'")
' تنفيذ الدالة
ReOrderExportCars
Count = Count + 1
Me.BillOFLading = Count
Me.ShipperAr.SetFocus
Me.Vissle.Enabled = False
Me.Voyage.Enabled = False
End Sub

والمطلوب هو تنفيذ الدالة (ReorderExportCars) للسجلات في جدول (ExportCars) بشرط أن تساوي قيمة حقل رقم الرحلة (VoyageNo) في الجدول (ExportCars) قيمة حقل (Voyage ) في النموذج (frmExportCarsArabicEnglish)

أتمنى أن أجد الحل لديكم وجزاكم الله عنا خير الجزاء

Reorder.rar

#8

الاخ الكريم لقد قمت ببعض التعديلات التى ارجو ان تلبى الطلب

فهى تقوم باعادة ترقيم الحقل لكل رحلة

مثلا الرحلة رقم 1 تبدا من 1,2 .. والرحلة رقم 2 تبدا من 1,2,.. وهكذا

والله من وراء القصد

Reorder.rar

#9

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

أشكرك مجدداً ولك خالص تحياتي

#10

عفوا عزيزى

ربما ذلك بسبب السرعة واليك تعديل الدالة اولا

Function ReOrderExportCars(FldName As String, Val As String) As Integer

Dim db As Database

Dim rs As Recordset

Set db = CurrentDb()

Dim str As String

str = "select * from ExportCars where " & FldName & "='" & Val & "'"

Set rs = db.OpenRecordset(str, dbOpenDynaset)

While Not rs.EOF

With rs

.Edit

!BillOFLading = rs.AbsolutePosition + 1

.Update

.MoveNext

End With

Wend

ReOrderExportCars = rs.RecordCount

End Function

التعديل فى ارسالك الحقل Fldname وقيمته

(رقم الرحلة)

اكرر اسفى

Reorder.rar

#11

لا ادري ماذا اقول ، فقد افحمني عملك الرائع ..

بارك الله فيك وجعله في ميزان حسناتك

#12

شكرا عزيزى

ارجو ان يوفقنى الله لافيد غيرى ببعض مما علمنى الله

وارجو ان نتعاون مستقبلا

sql server - access - delphi -asp

#13

أشكرك من أعماقي أخي الكريم simsimkj فقد افدتني جزاك الله كل خير وقد عمل الكود بطريقة صحيحة وممتازة وأهنئك على هذا العمل ..

ولو سمحت لي أخي الكريم ، فقد حاولت عمل نفس الدالة ولكن ليس على حقل واحد فقط ( حقل Voyage ) بل على حقلين ، وقد حاولت التعديل على الدالة ولكنه لم ينفع معي :

Function ReOrderPassengers(FldName As String, FldName1 As String, Val As String, Val1 As String) As Integer
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Dim str As String
str = "select * from Passengers where " & FldName & "='" & FldName1 & "='" & Val & "='" & Val1 & "'"
Set rs = db.OpenRecordset(str, dbOpenDynaset)
While Not rs.EOF
With rs
    .Edit
     !PManefestSerial = rs.AbsolutePosition + 1
   .Update
   .MoveNext
End With
Wend
ReOrderPassengers = rs.RecordCount
End Function

وكذلك قمت بتعديل الكود حسب الآتي ولكنه لم ينفع معي أيضا ..

Dim cnt
cnt = ReOrderPassengers("VoyageNo", Me.Voyage, "VisaCode", Me.VisaType)

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

مع العلم بأن الدالة التي قمت بعملها مشكوراً تقوم بإعادة وضع ترقيم الحقل BillOfLading بشرط أن يكون حقل VoyageNo في الجدول مساوي لحقل Voyage في النموذج فقط ، وأنا اريد كحل لمشكلة أخرى اعترضتني أن تنفذ الدالة بشرطين ، مثلاً Voyage وحقل أخر في النموذج .

مع خالص شكري وتقديري مقدما

#14

up

#15

up

#16

هذه هي الدالة التي تعمل بشكل صحيح ، وهي تقوم بإعادة وضع حقل BillOfLading في جدول ExportCars ..

Function ReOrderExportCars(FldName As String, Val As String) As Integer
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Dim str As String
str = "select * from ExportCars where " & FldName & "='" & Val & "'"
Set rs = db.OpenRecordset(str, dbOpenDynaset)
While Not rs.EOF
With rs
    .Edit
     !BillOFLading = rs.AbsolutePosition + 1
   .Update
   .MoveNext
End With
Wend
ReOrderExportCars = rs.RecordCount
End Function

وهذا الكود في النموذج الذي يقوم بتنفيذ الدالة بشرط أن يكون حقل VoayageNo في جدول ExportCars مطابقاً لمربع نص Voyage في النموذج ..

Dim cnt
cnt = ReOrderExportCars("VoyageNo", Me.Voyage)

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

#17

أما من مساعد لتعديل هذه الدالة

#18

up

#19

up

#20

up

للأهمية القصوى

#21

وين الأخوان عسى المانع خير

#22
Function ReOrderExportCars(FldName As String, Val As String , FldName1 As String, Val1 As String ) As Integer
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Dim str As String
str = "select * from ExportCars where " & FldName & "=' " & Val & " ' AND " & FldName1 & "=' " & Val1 & " ' "
Set rs = db.OpenRecordset(str, dbOpenDynaset)
While Not rs.EOF
With rs
   .Edit
    !BillOFLading = rs.AbsolutePosition + 1
  .Update
  .MoveNext
End With
Wend
ReOrderExportCars = rs.RecordCount
End Function
#23

اشكرك جزيل الشكر أخي مهند على المساعدة .. فقد قمت بتعديل كتابة الدالة حسب ما قمت بعمله مشكوراً ، وقد قمت بعمل الكود التالي لتنفيذ الدالة من داخل نموذج ..

Dim cnt
'cnt = ReOrderExportCars("VoyageNo", Me.Voyage, "VisaCode", Me.VisaType)

ولكن لم يتم أي شىء ، وهذا ممكن أن يكون من خطأ في كتابتي للكود أعلاه ، فأرجو ممن يعرف طريقة كتابة الكود بشكل صحيح(كود تنفيذ الدالة في النموذج) أن يقوم بتعديلها مشكوراً

#24

مع العلم بأن أحد الحقول هو نصي وأما الآخر فهو رقمي ..

ولا ادري إن اخذ في الحسبان ذلك عندما تم تعديل الدالة من قبل الأخ الكريم مهند عبادي

جزاكم الله كل خير

#25

up

هذا الموضوع مغلق.

مواضيع مشابهة