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

*كود* كود ينسخ القاعدة كاملة

مغلق
بدأه أشرف خليل في 31 يناير 2002 · 16 رد · 3,034 مشاهدة · في قسم الأرشيف و المواضيع المميزه
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذا الكود يقوم بنسخ قاعدة البيانات وعمل نسخه منها وهي مفتوحة أثناء العمل :ضع الكود فى وحدة نمطية مستقلة ثم انشء زر على نموذج وضع فى حدث عند النقر =fMakeBackup() ستجد أنه تم عمل نسخة من القاعدة على نفس الدليل التي به القاعدة الأصلية .

Private Type SHFILEOPSTRUCT
    hWnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Boolean
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Private Const FO_MOVE As Long = &H1
Private Const FO_COPY As Long = &H2
Private Const FO_DELETE As Long = &H3
Private Const FO_RENAME As Long = &H4

Private Const FOF_MULTIDESTFILES As Long = &H1
Private Const FOF_CONFIRMMOUSE As Long = &H2
Private Const FOF_SILENT As Long = &H4
Private Const FOF_RENAMEONCOLLISION As Long = &H8
Private Const FOF_NOCONFIRMATION As Long = &H10
Private Const FOF_WANTMAPPINGHANDLE As Long = &H20
Private Const FOF_CREATEPROGRESSDLG As Long = &H0
Private Const FOF_ALLOWUNDO As Long = &H40
Private Const FOF_FILESONLY As Long = &H80
Private Const FOF_SIMPLEPROGRESS As Long = &H100
Private Const FOF_NOCONFIRMMKDIR As Long = &H200

Private Declare Function apiSHFileOperation Lib "Shell32.dll" _
            Alias "SHFileOperationA" _
            (lpFileOp As SHFILEOPSTRUCT) _
            As Long

Function fMakeBackup() As Boolean
Dim strMsg As String
Dim tshFileOp As SHFILEOPSTRUCT
Dim lngRet As Long
Dim strSaveFile As String
Dim lngFlags As Long
Const cERR_USER_CANCEL = vbObjectError + 1
Const cERR_DB_EXCLUSIVE = vbObjectError + 2
    On Local Error GoTo fMakeBackup_Err

    If fDBExclusive = True Then Err.Raise cERR_DB_EXCLUSIVE

    strMsg = "هل أنت متأكد من أنك تريد عمل نسخة لهذه القاعدة ?"
    If MsgBox(strMsg, vbQuestion + vbYesNo, "Please confirm") = vbNo Then _
            Err.Raise cERR_USER_CANCEL

    lngFlags = FOF_SIMPLEPROGRESS Or _
                            FOF_FILESONLY Or _
                            FOF_RENAMEONCOLLISION
    strSaveFile = CurrentDb.Name
    With tshFileOp
        .wFunc = FO_COPY
        .hWnd = hWndAccessApp
        .pFrom = CurrentDb.Name & vbNullChar
        .pTo = strSaveFile & vbNullChar
        .fFlags = lngFlags
    End With
    lngRet = apiSHFileOperation(tshFileOp)
    fMakeBackup = (lngRet = 0)

fMakeBackup_End:
    Exit Function
fMakeBackup_Err:
    fMakeBackup = False
    Select Case Err.Number
        Case cERR_USER_CANCEL:
            'do nothing
        Case cERR_DB_EXCLUSIVE:
            MsgBox "The current database " & vbCrLf & CurrentDb.Name & vbCrLf & _
                    vbCrLf & "is opened exclusively.  Please reopen in shared mode" & _
                    " and try again.", vbCritical + vbOKOnly, "Database copy failed"
        Case Else:
            strMsg = "Error Information..." & vbCrLf & vbCrLf
            strMsg = strMsg & "Function: fMakeBackup" & vbCrLf
            strMsg = strMsg & "Description: " & Err.Description & vbCrLf
            strMsg = strMsg & "Error #: " & Format$(Err.Number) & vbCrLf
            MsgBox strMsg, vbInformation, "fMakeBackup"
    End Select
    Resume fMakeBackup_End
End Function

Private Function fCurrentDBDir() As String

Dim strDBPath As String
Dim strDBFile As String
    strDBPath = CurrentDb.Name
    strDBFile = Dir(strDBPath)
    fCurrentDBDir = Left(strDBPath, InStr(strDBPath, strDBFile) - 1)
End Function

Function fDBExclusive() As Integer
Dim db As Database
Dim hFile As Integer
    hFile = FreeFile
    Set db = CurrentDb
    On Error Resume Next
    Open db.Name For Binary Access Read Write Shared As hFile
    Select Case Err
        Case 0
            fDBExclusive = False
        Case 70
            fDBExclusive = True
        Case Else
            fDBExclusive = Err
    End Select
    Close hFile
    On Error GoTo 0
End Function

أشرف خليل

#2

ألف شكر يا أخ أشرف .

كود ممتاز وسريع جداً .

وفقك الله لكل خير .

ولك تحياتي

#3

تسلم يا اشرف على الكود

والله يعطيك العافية

عندي سؤال هل نستطيع تحديد موقع نسخ القاعدة الجديدة

#4

فعلاً كود مهم جداً للنسخ الاحتياطي .

#5

بعد إذن الأخ أشرف :

في الدالة fMakeBackup تجد السطر :

.pTo = strSaveFile & vbNullChar

غيره بعد علامة يساوي إلى المجلد المطلوب النسخ إليه مثال :

.pTo = "D:My Documents"

وللجميع تحياتي

#6

أخي أبو حمود :

أولا : إذنك معاك فى كل موضوع أكتبه

ثانيا : ما رأيك لو نحدد للمستخدم أين يريد وضع النسخة ؟

أشرف خليل

#7

السلام عليكم

هذا ماكان فعلا سؤالي ... ايش سيتم وضع النسخة من قاعدة البيانات وهل يمكن جعل المستخدم يحدد موقع النسخة ؟؟؟

:)

أشكركم كثيرا فمواضيعكم جدا رائعة

#8

أفضل طريقة لذلك استخدم مربع حوار استعراض واليكم الكود كاملاً :

Option Compare Database
Option Explicit
Private Type SHITEMID 'mkid
    cb As Long
    abID As Byte
End Type

Private Type ITEMIDLIST 'idl
    mkid As SHITEMID
End Type

Private Type BROWSEINFO 'bi
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long

Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _
(lpBrowseInfo As BROWSEINFO) As Long

Private Const BIF_RETURNONLYFSDIRS = &H1

Private Type SHFILEOPSTRUCT
    hWnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Boolean
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Private Const FO_MOVE As Long = &H1
Private Const FO_COPY As Long = &H2
Private Const FO_DELETE As Long = &H3
Private Const FO_RENAME As Long = &H4

Private Const FOF_MULTIDESTFILES As Long = &H1
Private Const FOF_CONFIRMMOUSE As Long = &H2
Private Const FOF_SILENT As Long = &H4
Private Const FOF_RENAMEONCOLLISION As Long = &H8
Private Const FOF_NOCONFIRMATION As Long = &H10
Private Const FOF_WANTMAPPINGHANDLE As Long = &H20
Private Const FOF_CREATEPROGRESSDLG As Long = &H0
Private Const FOF_ALLOWUNDO As Long = &H40
Private Const FOF_FILESONLY As Long = &H80
Private Const FOF_SIMPLEPROGRESS As Long = &H100
Private Const FOF_NOCONFIRMMKDIR As Long = &H200

Private Declare Function apiSHFileOperation Lib "shell32.dll" _
            Alias "SHFileOperationA" _
            (lpFileOp As SHFILEOPSTRUCT) _
            As Long

Function fMakeBackup() As Boolean
Dim strMsg As String
Dim tshFileOp As SHFILEOPSTRUCT
Dim lngRet As Long
Dim strSaveFile As String
Dim lngFlags As Long
Dim FolderToCopy
Const cERR_USER_CANCEL = vbObjectError + 1
Const cERR_DB_EXCLUSIVE = vbObjectError + 2
    On Local Error GoTo fMakeBackup_Err

    If fDBExclusive = True Then Err.Raise cERR_DB_EXCLUSIVE

    strMsg = "هل أنت متأكد من أنك تريد عمل نسخة لهذه القاعدة ؟"
 If MsgBox(strMsg, vbQuestion + vbYesNo + vbMsgBoxRight + _
    vbMsgBoxRtlReading, "تأكيد النسخ") = vbNo Then _
            Err.Raise cERR_USER_CANCEL

    lngFlags = FOF_SIMPLEPROGRESS Or _
                            FOF_FILESONLY Or _
                            FOF_RENAMEONCOLLISION
    strSaveFile = CurrentDb.Name
    With tshFileOp
        .wFunc = FO_COPY
        .hWnd = hWndAccessApp
        .pFrom = CurrentDb.Name & vbNullChar
        FolderToCopy = BrowseForFolder
        If Len(FolderToCopy & "") = 1 Then
        Exit Function
        Else
        .pTo = FolderToCopy
        End If
        .fFlags = lngFlags
    End With
    lngRet = apiSHFileOperation(tshFileOp)
    fMakeBackup = (lngRet = 0)

fMakeBackup_End:
    Exit Function
fMakeBackup_Err:
    fMakeBackup = False
    Select Case Err.Number
        Case cERR_USER_CANCEL:
            'do nothing
        Case cERR_DB_EXCLUSIVE:
 MsgBox "The current database " & vbCrLf & CurrentDb.Name & vbCrLf & _
 vbCrLf & "is opened exclusively.  Please reopen in shared mode" & _
  " and try again.", vbCritical + vbOKOnly, "Database copy failed"
        Case Else:
            strMsg = "Error Information..." & vbCrLf & vbCrLf
            strMsg = strMsg & "Function: fMakeBackup" & vbCrLf
            strMsg = strMsg & "Description: " & Err.Description & vbCrLf
            strMsg = strMsg & "Error #: " & Format$(Err.Number) & vbCrLf
            MsgBox strMsg, vbInformation, "fMakeBackup"
    End Select
    Resume fMakeBackup_End
End Function

Private Function fCurrentDBDir() As String

Dim strDBPath As String
Dim strDBFile As String
    strDBPath = CurrentDb.Name
    strDBFile = Dir(strDBPath)
    fCurrentDBDir = Left(strDBPath, InStr(strDBPath, strDBFile) - 1)
End Function

Function fDBExclusive() As Integer
Dim db As Database
Dim hFile As Integer
    hFile = FreeFile
    Set db = CurrentDb
    On Error Resume Next
    Open db.Name For Binary Access Read Write Shared As hFile
    Select Case Err
        Case 0
            fDBExclusive = False
        Case 70
            fDBExclusive = True
        Case Else
            fDBExclusive = Err
    End Select
    Close hFile
    On Error GoTo 0
End Function


Private Sub أمر0_Click()
Call fMakeBackup
End Sub

Private Function BrowseForFolder()
Dim bi As BROWSEINFO
Dim IDL As ITEMIDLIST
Dim pidl As Long
Dim r As Long
Dim pos As Integer
Dim spath As String
Dim lblSelected As String
bi.hOwner = Me.hWnd
bi.pidlRoot = 0&
bi.lpszTitle = "اختر المجلد الذي ترغب في النسخ إليه :"
bi.ulFlags = BIF_RETURNONLYFSDIRS
pidl& = SHBrowseForFolder(bi)
spath$ = Space$(512)
r = SHGetPathFromIDList(ByVal pidl&, ByVal spath$)
If r Then
pos = InStr(spath$, Chr$(0))
'pos = spath
lblSelected = Left(spath$, pos - 1)
Else: lblSelected = ""
End If
BrowseForFolder = lblSelected & ""
End Function

وللجميع التحية

#9

الأخ العبقري : أبو حمود

بارك الله فيك وجربت الكود وكان ممتاز ولكن أوقفت عمل هذا الأمر وقد اشتغل الكود بعدها تمام

bi.hOwner = Me.hWnd

أشرف خليل :)

#10

الأخ أشرف

هل وضعت الكود في وحدة نمطية عامة ؟

ولك تحياتي

#11

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

أشرف خليل

#12

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

ولك تحياتي

#13

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

#14

جزاكم الله الف خير (f)

#15

السلام عليكم

الأخ أشرف

والأخ أبو حمود

موضوع اشغل بال الكثير من الأخوة

لقد جربت الكود وهو بحق ممتاز جداً

ولكن لاحظت أن الكود ينسخ جميع محتويات العمل

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

اسمحولي بسؤال...

هل من الممكن أن يسنخ الجداول (DATA) فقط

ويكون هناك زر للنسخ (التصدير) وزر للفتح (الإستيراد)

ووفقك الله وجزاكم خيراً

#16

الأخ new

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

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

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

ولك تحياتي

#17

الأخ new

جرب هذا الرابط :

http://mypage.ayna.com/ashrafk/Z.zip

( فك القاعدة على الدليل التالي : c:zaka )

أشرف خليل

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

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