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

مرة أخرى ال RowID

مغلق
بدأه أبو هادي في 7 أكتوبر 2001 · 10 رد · 811 مشاهدة · في مراجعة المواضيع
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الأخوة الأفاضل

بعد التحية

من المعروف أنك تستطيع أن تصل إلى أول سجل وآخر سجل في السجلات باستخدام الدالتين First و Last

السؤال :

كيف تستطيع الأكسس معرفة أول سجل وآخر سجل ؟

- هل تقوم الأكسس بتخزين أول سجل وآخر سجل لكل جدول ?

- أو هل تقوم الأكسس بتخزين كود أو ID لكل سجل كما في قاعدة البيانات أوراكل ونستطيع الحصول عليه باستخدام الدالة RowID ?

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

وشكرا سلفا

#2

اعتقد أنه يتم تخزين السجلات حسب التاريخ والوقت .

وهل ما تقصده بسؤالك هو معرفة رقم السجل الحالي في ترتيب السجلات ؟

ولك تحياتي

#3

الأخ أبوحمود

بعد التحية :

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

شكرا لجهودك

#4

استخدم دوال DAO وهي MoveFirst و MoveLast .

#5

لقد طرحت في سؤالي احتمالين وسوف أجيب على نفسي حيث لم أتلقى أي إجابة على هذا السؤال

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

أما ما تفضل به الأخ ابوحمود فهو كذلك غير منطقي حيث أنه يمكن تغيير التاريخ والوقت للجهاز مما سيتسبب في "لخبطة" البيانات .

أما ما تفضل به الأخ سين جيم فهو ليس بالضبط المطلوب من السؤال وما وضحه هو فقط الوصول إلى أول وآخر سجل لأي بيانات حسب ترتيبها "القسري" إن صح التعبير يعني الترتيب بواسطة المستخدم أي كان شكله .. والمطلوب هو معرفة ترتيب أي سجل بالنسبة للسجلات الأخرى حسب إدخالها .

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

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

تحياتي

#6

حرام كسر الخواطر :)

#7

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

في Microsoft Access و Microsoft SQL Server يتم حفظ الجداول و بياناتها في النهاية في ملف قاعدة البيانات و هي بالطبع لا تحفظ بصورة مرتبة، فملف قاعدة البيانات مبني بطريقة ما تسمح بالاضافة و الحذف و التعديل على البيانات بداخله ، ربما تحفظ الف سجل دفعة واحدة فتحفظ بصورة متتالية ، الا انها سرعان ما ستتبعثر بداخل الملف بعد العمل عليها بعد فترة ما.

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

و بامكاننا في Oracle و في SQL Server على ما اظن القيام بعملية Defrag لقاعدة البيانات من الداخل تشبه عملية ال Defrag التي نقوم بها للقرص الصلب (انهاء تجزئة الملفات كم تسمى بالعربي) و في Access يحدث هذا عند اصلاح و ضغط قاعدة البيانات حيث تجمع كل السجلات معا بصورة متتالية و تحذف الفراغات من ملف قاعدة البيانات

هذا ما يحدث بداخل الملف نفسه و هو شيئ منفصل تماما عن المستخدم النهائي

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

و لكني اعرف قصدك هنا ، انت بحاجة الى ان تصل الى الرقم الفعلي التي ترتب به البيانات بداخل ملف قاعدة البيانات :) ، و هذا يمكن الوصول اليه عن طريق ADO على ما اعتقد و لكن لا يوجد الان امامي Access لافحص الاوامر ، ساحاول البحث عنها

مع ان هذا الرقم عرضة للتغير في اية لحظة ، وذلك في Microsoft Access او Microsoft SQL Server و هو ايضا عرضو للتغير في Oracle بمجرد عمل Database Defrag على ما اعتقد

السبب في ذلك هو ان قاعدة البيانات تعامل البيانات في كل سجل (سطر بيانات) على انها وحدة فيزيائية واحدة متكاملة يجب الحفاظ عليها مترابطة ، ولكنها لا تعتقد الشيئ نفسه بالنسبة للسجل السابق و السجل التالي ، حيث ذلك تحدده عبارة SQL فعلى سبيل المثال يمكننا توجيه عبارتين SQL مختلفتين الى قاعدة البيانات تاتي بالبيانات مرتبه بطريقتين مختلفتين كليا و في كل الطريقتين ستكون هناك ارقام مختلفة للسجلات ، بل ربما عدد سجلات مختلف

#8

اضافة الى السابق في حان انك اردت ان تاخذ رقم السجل او ان تحصل على سجل ما عن طريق رقم ترتيبه من السجلات التي قمت باستدعائها عن طريق امر SQL فيمكنك استخدام مجموعة من الاوامر اهمها GetRows و الذي يلي شرحه من المساعدة المقدمة في Access XP

----------------------------------------------------------

GetRows Method

Retrieves multiple records of a Recordset object into an array.

Syntax

array = recordset.GetRows( Rows, Start, Fields )

Return Value

Returns a two-dimensional array.

Parameters

Rows Optional. A Long expression indicating the number of records to retrieve. Default is adGetRowsRest (-1).

Start Optional. A String or Variant that evaluates to the bookmark for the record from which the GetRows operation should begin. You can also use one of the following BookmarkEnum values.

Constant Description

adBookmarkCurrent Start at the current record.

adBookmarkFirst Start at the first record.

adBookmarkLast Start at the last record.

Fields Optional. A Variant representing a single field name or ordinal position or an array of field names or ordinal position numbers. ADO returns only the data in these fields.

Remarks

Use the GetRows method to copy records from a Recordset into a two-dimensional array. The first subscript identifies the field and the second identifies the record number. The array variable is automatically dimensioned to the correct size when the GetRows method returns the data.

If you do not specify a value for the Rows argument, the GetRows method automatically retrieves all the records in the Recordset object. If you request more records than are available, GetRows returns only the number of available records.

If the Recordset object supports bookmarks, you can specify at which record the GetRows method should begin retrieving data by passing the value of that record's Bookmark property.

If you want to restrict the fields that the GetRows call returns, you can pass either a single field name/number or an array of field names/numbers in the Fields argument.

After you call GetRows, the next unread record becomes the current record, or the EOF property is set to True if there are no more records.

----------------------------------------------------------

#9

الأخ خضر ترزي

بعد التحية

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

تحياتي

#10

الأخ خضر ترزي

بعد التحية :

لا زلت أقوم باختباراتي على GetRows وأعتقد أن العملية ستطول بعض الوقت .

تحياتي

#11

الأخ خضر ترزي

بعد التحية

لقد جربت أمر GetRows والحقيقة أنها تفي بالغرض في حالة ما أستعملت للحصول على رقم ترتيب السجل ولكن السؤال ماذا لو أردنا الوصول إلى سجل معين في جدول بيانات يحتوي على مليون سجل مثلا ؟

عموما لقد توصلت بعد البحث والفحص على الآتي :

للحصول على رقم السجل المطلوب حسب ترتيب إدخاله استخدم فقط أنواع المصدر "Source types" للـ Recordset التالية :

1 - Table-type

2 - Snapshot-type

مع ملاحظة أنه لا يمكن للمصدر أن يكون إسم query أو جملة SQL للنوع الأول .

مثال للإجراء :

Sub GetRowNo()

Dim dbs As Database

Dim rst As Recordset

Dim RowNo As Long

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Tablename", dbOpenSnapshot)

With rst

.MoveLast

'....

'بعد الوصول إلى السجل المطلوب

RowNo = CLng(.RecordCount * .PercentPosition / 100)

End With

rst.Close

Set dbs = Nothing

End Sub

تحياتي واحترامي

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

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