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

منع حذف الجداول يدويا

بدأه Abo_Yossof في 25 يوليو 2010 · 16 رد · 1,947 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

هديتى اليكم اليوم هى وحدة نمطية لمنع حذف الجداول يدويا

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

و التى لو نجحت لوفرت حماية كبيرة للقاعدة و لو كان بالامكان منع الاستيراد من القاعدة لاكتملت منظومة الحماية

عموما هذا الكود يمنع الحذف اليدوى للجداول و حتى تقوم بالغاء جدول يجب ايقاف الكود أولا ثم الالغاء أو الالغاء عن طريق كود

مثال لكود حذف الجدول

currentproject.connection.execute "DROP TABLE YourtableName"

ملحوظات :-

يجب ان تكون الجداول بها حقل ترقيم تلقائى ( ليس من الضرورى ان يكون مفتاح اساسى )

تقسيم القاعدة الى جزئين ( واجهة و بيانات ) يلغى عمل الكود ------- يمكنك اعادة تشغيل الكود فى القاعدة الخلفية من جديد بعد نقل الوحدة النمطية اليها

استيراد الجداول الى قاعدة بيانات جديدة ------- يحتاج اعادة تشغيل الكود فى القاعدة الجديدة من جديد بعد نقل الوحدة النمطية اليها

تطبيق الكود :-

1- انسخ الكود الى وحدة نمطية جديدة ثم احفظها

2- اضغط CTL + G لفتح immediate window

3- اكتب الكود التالى

?StopManualTableDelete("Yes")

4- اضغط enter

حاول الان حذف اى جدول

لايقاف عمل الكود

كرر الخطوات من 2 الى 4

2- اضغط CTL + G لفتح immediate window

3- اكتب الكود التالى

?StopManualTableDelete("No")

4- اضغط enter

حاول الان حذف اى جدول '

الان

تبقى لنا الوحدة النمطية

Public Function StopManualTableDelete(YesOrNo As String)
Dim fld As DAO.Field
Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim SQL_CreateConstraint As String, SQL_DropConstraint As String
Dim strConstraint As String ' this variable holds the name of the constraint
Dim i As Integer
Dim tblNames As String, DeleteInfo As String
Set db = CurrentDb()

i = 0
For Each tbl In db.TableDefs
' Bypass system tables with autonumbers Also any hidden table that starts with "~"
If Mid(tbl.Name, 1, 4) <> "MSys" Then
If Left(tbl.Name, 1) <> "~" Then
For Each fld In db.TableDefs(tbl.Name).Fields
If dbAutoIncrField = (fld.Attributes And dbAutoIncrField) Then 'Find autonumber
DoCmd.Hourglass True
strConstraint = "con_" & fld.Name & "_" & tbl.Name 'Build constraint name
If YesOrNo = "YES" Then
i = i + 1
'Drop any existing autonumber field constraints if there is one.
If FindCheckConstraint(strConstraint) = True Then
SQL_DropConstraint = "ALTER TABLE " & tbl.Name & " DROP CONSTRAINT " & strConstraint
CurrentProject.Connection.Execute SQL_DropConstraint
End If

DoEvents ' await a while just in case

'create the new constraint to disallow the table from being deleted.
SQL_CreateConstraint = " ALTER TABLE " & tbl.Name & " ADD " & " CONSTRAINT " & strConstraint & " CHECK (" & fld.Name & " IS NOT NULL))"
'Debug.Print SQL_CreateConstraint
CurrentProject.Connection.Execute SQL_CreateConstraint
DeleteInfo = "CANNOT"

End If

If YesOrNo = "NO" Then
'Drop any existing autonumber field constraints.
If FindCheckConstraint(strConstraint) = True Then
i = i + 1
SQL_DropConstraint = "ALTER TABLE " & tbl.Name & " DROP CONSTRAINT " & strConstraint
CurrentProject.Connection.Execute SQL_DropConstraint
DeleteInfo = "CAN"
End If
End If

tblNames = tblNames & tbl.Name & vbNewLine
Exit For
End If
Next fld
End If
End If
Next tbl
db.Close
Set db = Nothing
DoCmd.Hourglass False

If i > 0 Then
MsgBox i & " tables have been set so they " & DeleteInfo & " be deleted manually. " & vbNewLine & "These tables are:" & vbNewLine & vbNewLine & tblNames
Else
MsgBox "There are no tables with Autonumber fields present in this database." & vbNewLine & "Therefore this code did not have any effect on this database."
End If

End Function
Public Function FindCheckConstraint(MyConstraint As String) As Boolean

'this function checks to see if a check constraint already exist on the autonumber field.
Dim fld As ADODB.Field
Dim rst As ADODB.Recordset
Set rst = CurrentProject.Connection.OpenSchema(adSchemaCheckConstraints)

Do Until rst.EOF
For Each fld In rst.Fields
If fld.Name = "CONSTRAINT_NAME" Then
If fld.Value = MyConstraint Then
'Debug.Print fld.Value
FindCheckConstraint = True
Exit For
End If
End If
Next fld
rst.MoveNext

Loop
End Function

و نسألكم الدعاء

مرفق مثال تم التطبيق عليه

New Microsoft Office Access Application.rar

تم تعديل هذه المشاركة بواسطة mrnooo2000 في 26 يوليو 2010 في 08:45

2

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#2

شكرا لك وجزاك الله خيرا

جاري التجربة وتستاهل نقاط الدرس

وأتمنى تضمين ذلك بمثال صغير بارك الله فيك

#3

بارك الله فيك أخى .. موضوع هام فعلا

اللهم لك الحمد كما ينبغى لجلال وجهك وعظيم سلطانك .. لا إله إلا أنت سبحانك أنى كنت من الظالمين

#4
اكسيرالحياة كتب:

شكرا لك وجزاك الله خيرا

جاري التجربة وتستاهل نقاط الدرس

وأتمنى تضمين ذلك بمثال صغير بارك الله فيك

و جزاكم الله مثله

تم ارفاق مثال

omar19-3 كتب:

بارك الله فيك أخى .. موضوع هام فعلا

و فيك اخى الكريم

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#5

مشكور أخي الكريم

فكرة رائعة

#6

الف شكر ويعطيك العافية

#7
jafar089 كتب:

مشكور أخي الكريم

فكرة رائعة

AL-YASEER-2007 كتب:

الف شكر ويعطيك العافية

الرائع مروركم

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#8

ماشاء الله

بارك الله فيك

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

سبحان الله وبحمده سبحان الله العظيم .. سبحان الله . الحمد لله . لا اله الا الله . الله اكبر .. استغفر الله . استغفر الله . استغفر الله

يارب احمى دينى وبلدى من كيد الاعداء والخائنين بحبك يا مصر بحبك يا مصر بحبك يا مصر

 


 


3.gif

#9
abo.ahmed كتب:

ماشاء الله

بارك الله فيك

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

و فيك بارك أخى

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#10

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

مشكور اخوي محمد علوش على المثال الرائع

جزاك الله الف خير +1

#11

بارك الله فيك

درس جيد

ملاحظة :

اذا كان اسم الجدول يحتوي على مسافة يتعطل الكود

انشأت 3 جداول

2

3

4

ثم طبقت الدرس في مثالك و كانت النتيجة ممتازة

ثم قمت بتغيير اسم الجدول الاول من 2 إلى 2 2 3 بوجود فراغات بين الارقام

نتج عنه الصورة التالية

post-5603-092395000 1280208646_thumb.png

===

المرفقات
999.png

صورة
صورة

حسابي في الفيس بوك
http://goo.gl/XIzwL

حسابي في تويتر
http://goo.gl/6p4e3

 

 
 
#12

أخي فيصل...

جرب وضع اسم الجدول بين أقواس مربعة هكذا...

[1 2 3]

طبتم واهتديتم :)

===================================

إقرأ معي

رابط متجدد لكتاب أقرؤه فشاركني فيه

======

فضائح الرافضة ومخازيهم حين يكتب عنها أحد خصومهم فهذا شيء متوقع ،فإن كتب عنها أحدهم فهو شيء غير مألوف ، وإن كان الكاتب أحد مراجعهم وأخص خواصهم فهذا شيء متناهي الغرابة ، وإن علمت أن الكاتب قد قتل بعد نشر الكتاب فقد حان وقت قراءة الكتاب

الكتاب :

حسين الموسوي - لله تم للتاريخ ، كشف الأسرار وتبرئة الأئمة الأطهار

اضغط على الصورة لتحميل الكتاب

%E1%E1%E5%20%CB%E3%20%E1%E1%CA%C7%D1%ED%CE.jpg

-----------

كتب سابقة

سعد الدين الشاذلي - مذكرات حرب أكنتوبر

#13

ملحوظة صحيحة أخ فيصل

و فى الحقيقة لم اتطرق لها لاننى لا استخدم المسافات فى التسمية

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

و هذه هى الوحدة النمطية بعد التعديل لامكانية تطبيقها على جداول باسمائها مسافات

Public Function StopManualTableDelete(YesOrNo As String)
Dim fld As DAO.Field
Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim SQL_CreateConstraint As String, SQL_DropConstraint As String
Dim strConstraint As String ' this variable holds the name of the constraint
Dim i As Integer
Dim tblNames As String, DeleteInfo As String
Set db = CurrentDb()

i = 0
For Each tbl In db.TableDefs
' Bypass system tables with autonumbers Also any hidden table that starts with "~"
If Mid(tbl.Name, 1, 4) <> "MSys" Then
If Left(tbl.Name, 1) <> "~" Then
For Each fld In db.TableDefs("[" & tbl.Name & "]").Fields
If dbAutoIncrField = (fld.Attributes And dbAutoIncrField) Then 'Find autonumber
DoCmd.Hourglass True
strConstraint = "con_" & fld.Name & "_" & tbl.Name  'Build constraint name
If YesOrNo = "YES" Then
i = i + 1
'Drop any existing autonumber field constraints if there is one.
If FindCheckConstraint(strConstraint) = True Then
SQL_DropConstraint = "ALTER TABLE [" & tbl.Name & "] DROP CONSTRAINT [" & strConstraint & "]"
CurrentProject.Connection.Execute SQL_DropConstraint
End If

DoEvents ' await a while just in case

'create the new constraint to disallow the table from being deleted.
SQL_CreateConstraint = " ALTER TABLE [" & tbl.Name & "] ADD " & " CONSTRAINT [" & strConstraint & "] CHECK (" & fld.Name & " IS NOT NULL))"
'Debug.Print SQL_CreateConstraint
CurrentProject.Connection.Execute SQL_CreateConstraint
DeleteInfo = "CANNOT"

End If

If YesOrNo = "NO" Then
'Drop any existing autonumber field constraints.
If FindCheckConstraint(strConstraint) = True Then
i = i + 1
SQL_DropConstraint = "ALTER TABLE [" & tbl.Name & "] DROP CONSTRAINT [" & strConstraint & "]"
CurrentProject.Connection.Execute SQL_DropConstraint
DeleteInfo = "CAN"
End If
End If

tblNames = tblNames & tbl.Name & vbNewLine
Exit For
End If
Next fld
End If
End If
Next tbl
db.Close
Set db = Nothing
DoCmd.Hourglass False

If i > 0 Then
MsgBox i & " tables have been set so they " & DeleteInfo & " be deleted manually. " & vbNewLine & "These tables are:" & vbNewLine & vbNewLine & tblNames
Else
MsgBox "There are no tables with Autonumber fields present in this database." & vbNewLine & "Therefore this code did not have any effect on this database."
End If

End Function
Public Function FindCheckConstraint(MyConstraint As String) As Boolean

'this function checks to see if a check constraint already exist on the autonumber field.
Dim fld As ADODB.Field
Dim rst As ADODB.Recordset
Set rst = CurrentProject.Connection.OpenSchema(adSchemaCheckConstraints)

Do Until rst.EOF
For Each fld In rst.Fields
If fld.Name = "CONSTRAINT_NAME" Then
If fld.Value = MyConstraint Then
'Debug.Print fld.Value
FindCheckConstraint = True
Exit For
End If
End If
Next fld
rst.MoveNext

Loop
End Function

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#14

اخى ابويوسف

بارك الله فيك وجزاك كل خير وسلمت يداك

#15

أخي الغالي

كل وانت بالف خير

ماء شاء الله ... شئ جميل جداً

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

أخيك المحب / كمال النحال

[يمين]

إذا كـان تـرك الـدين يعــنــي تقــدمــاً

فـيا نفــس مـوتــي قبــل أن تتقـدمــي

[/يمين]

#16

بارك الله فيك وجزاك الله خير

مثال رائع جدا ومهم لكل واحد

وفقك الله ونفع بعلمك

شكرا

اتق الله حيث ماكنت

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