ادراج الصور في النماذج او التقارير من مجلد منفصل عن القاعده اعزائي الكرام السلام عليكم ورحمة الله وبركاته سؤال : هل هناك فرق بين وضع الصور في قاعدة البيانات وخصوصا في الجداول مباشرة عن طريق عنصر التحكم OLE وبين وضع رابط نصي فقط يشير الى مكان وجود الصوره في اي محرك من محركات الاقراص على جهاز الكمبيوتر ؟ الاجابه : طبعا الفارق كبير جدا بين الوضعين بدلالة تضخم حجم قاعدة البيانات التي تحتوي على الصور لانها تكون مضمنه اذن دعونا نأخذ الميزات والعيوب لكل نوع من الانواع النوع الاول : في حالة وضع الصوره مياشرة في الجدول المميزات : 1. بما انه تم تضمين هذه الصور في الجدول اذن اصبحت جزء من قاعدة البيانات . وهذه الميزه مهما نقلت قاعدة البيانات الى اي مكان فستضل مرتبطه بالقاعده . 2. لا يمكن ازالتها بسهوله . او التحكم بها لانها اصبحت بيانات ثنائيه . العيوب : 1. تضخم قاعدة البيانات نظرا لما تحويه من صور مدمجه مع القاعدة 2. لا يقبل الا صيغة الصور من نوع BMP والكل يعلم ان هذا النوع كبير نسبيا مقارنة مع باقي الصيغ الخاصه بالصور . 3. مشكلة نقل قاعدة البيانات الى موقع اخر وهي بحجم كبير جدا قد يصل الى واحد قيقا بايت . 4. مشكلة فتح قاعدة البيانات المحملة بالصور فإذا انهارت لا يمكن اصلاحها ابدا نظرا لضخامتها . النوع الثاني : في حالة وضع الصور في مجلد منفصل او في اي مكان من الكمبيوتر . المميزات : 1. يعتبر هذا النوع من الانواع المفضلة لقواعد البيانات اكسيس نظرا لخفته وحجمة الصغير جدا . 2. الصور تكون على شكل مسار في جدول مثل C:\MyPhoto\za.jpg وهذا المسار لا يأخذ حيزا كبيرا من مساحة القاعدة فهو يشير فقط الى موقع الصوره 3. هذا النوع يقبل جميع صيغ الصور المعروفه مثل BMP و JPG و GIF و WMF و PSD 4. يتم التحكم بحجم الصوره من تكبير وتصغير تمدد او قطع . العيوب : 1. عند نقل القاعدة تفقد الارتباط بالصور المخزن مسارها في الجدول ولن تظهر الصور حتى يتم تعريف الارتباط مجددا . والان دعونا نقوم بعمل هذه القاعدة و ماذا نحتاج لذلك . كل ما نحتاجه هو جدول به حقلين وليكن اسمه مثلا Imagetable الحقل الاول : معرف او ImageID ..... ونوعه ترقيم تلقائي الحقل الثاني : مسار الصوره او ImagePath ونوعه تص وحجمه 255 حرف نموذج مبني على الجدول السابق وليكن اسم النموذج مثلا Imageform 1. نقوم بعرض النموذج في وضع التصميم ومن ثم نقوم بزيادة مساحته للاسفل بحيث يتسع لمكان صوره 2. نقوم بإدراج صوره في النموذج وذلك من خلال اشرطة الاداوت ومن ثم نختار ادراج ونختار صوره لتكون هي الاساس في حالة عدم وجود صورة او سجل جديد . وستكون هي بمثابة اطار وسوف نسمي هذا الاطار الخاص بالصوره ImageFrame 3. ننتقل الى مربع النص ImagePath ونختار خصائصه ومن ثم نضع هذا الكود في حدث الحالي وفي حدث بعد التحديث
Private Sub Form_Current()On Error Resume NextMe![ImageFrame].Picture = Me![ImagePath]End Sub
Private Sub ImagePath_AfterUpdate()On Error Resume NextMe![ImageFrame].Picture = Me![ImagePath]End Sub
Private Sub cmdAdd_Click()Dim strFilter As String Dim lngflags As Long Dim varFileName As Variant strFilter = "All Files (*.*)" & vbNullChar & "*.*" _ & vbNullChar & "All Files (*.*)" & vbNullChar & "*.*" lngflags = tscFNPathMustExist Or tscFNFileMustExist _ Or tscFNHideReadOnly varFileName = tsGetFileFromUser( _ fOpenFile:=True, _ strFilter:=strFilter, _ rlngflags:=lngflags, _ strDialogTitle:=" الرجاء اختيار ملف ") If IsNull(varFileName) Then Else Me![ImagePath] = varFileName End IfcmdAdd_End: On Error GoTo 0 Exit SubcmdAdd_Err: Beep MsgBox Err.Description, , "Error: " & Err.Number _ & " in file" Resume cmdAdd_EndEnd Sub
Option Compare DatabaseOption ExplicitPrivate Declare Function ts_apiGetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (tsFN As tsFileName) As BooleanPrivate Declare Function ts_apiGetSaveFileName Lib "comdlg32.dll" _ Alias "GetSaveFileNameA" (tsFN As tsFileName) As BooleanPrivate Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As LongPrivate Type tsFileName lStructSize As Long hwndOwner As Long hInstance As Long strFilter As String strCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long strFile As String nMaxFile As Long strFileTitle As String nMaxFileTitle As Long strInitialDir As String strTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer strDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As StringEnd Type' Flag ConstantsPublic Const tscFNAllowMultiSelect = &H200Public Const tscFNCreatePrompt = &H2000Public Const tscFNExplorer = &H80000Public Const tscFNExtensionDifferent = &H400Public Const tscFNFileMustExist = &H1000Public Const tscFNPathMustExist = &H800Public Const tscFNNoValidate = &H100Public Const tscFNHelpButton = &H10Public Const tscFNHideReadOnly = &H4Public Const tscFNLongNames = &H200000Public Const tscFNNoLongNames = &H40000Public Const tscFNNoChangeDir = &H8Public Const tscFNReadOnly = &H1Public Const tscFNOverwritePrompt = &H2Public Const tscFNShareAware = &H4000Public Const tscFNNoReadOnlyReturn = &H8000Public Const tscFNNoDereferenceLinks = &H100000Public Function tsGetFileFromUser( _ Optional ByRef rlngflags As Long = 0&, _ Optional ByVal strInitialDir As String = "", _ Optional ByVal strFilter As String = "All Files (*.*)" & vbNullChar & "*.*", _ Optional ByVal lngFilterIndex As Long = 1, _ Optional ByVal strDefaultExt As String = "", _ Optional ByVal strFileName As String = "", _ Optional ByVal strDialogTitle As String = "", _ Optional ByVal fOpenFile As Boolean = True) As Variant On Error GoTo tsGetFileFromUser_Err Dim tsFN As tsFileName Dim strFileTitle As String Dim fResult As Boolean ' Allocate string space for the returned strings. strFileName = Left(strFileName & String(256, 0), 256) strFileTitle = String(256, 0) ' Set up the data structure before you call the function With tsFN .lStructSize = Len(tsFN) .hwndOwner = Application.hWndAccessApp .strFilter = strFilter .nFilterIndex = lngFilterIndex .strFile = strFileName .nMaxFile = Len(strFileName) .strFileTitle = strFileTitle .nMaxFileTitle = Len(strFileTitle) .strTitle = strDialogTitle .flags = rlngflags .strDefExt = strDefaultExt .strInitialDir = strInitialDir .hInstance = 0 .strCustomFilter = String(255, 0) .nMaxCustFilter = 255 .lpfnHook = 0 End With ' Call the function in the windows API If fOpenFile Then fResult = ts_apiGetOpenFileName(tsFN) Else fResult = ts_apiGetSaveFileName(tsFN) End If ' If the function call was successful, return the FileName chosen ' by the user. Otherwise return null. Note, the CancelError property ' used by the ActiveX Common Dialog control is not needed. If the ' user presses Cancel, this function will return Null. If fResult Then rlngflags = tsFN.flags tsGetFileFromUser = tsTrimNull(tsFN.strFile) Else tsGetFileFromUser = Null End If tsGetFileFromUser_End: On Error GoTo 0 Exit FunctiontsGetFileFromUser_Err: Beep MsgBox Err.Description, , "Error: " & Err.Number _ & " in function basBrowseFiles.tsGetFileFromUser" Resume tsGetFileFromUser_EndEnd Function' Trim Nulls from a string returned by an API call.Private Function tsTrimNull(ByVal strItem As String) As String On Error GoTo tsTrimNull_Err Dim I As Integer I = InStr(strItem, vbNullChar) If I > 0 Then tsTrimNull = Left(strItem, I - 1) Else tsTrimNull = strItem End If tsTrimNull_End: On Error GoTo 0 Exit FunctiontsTrimNull_Err: Beep MsgBox Err.Description, , "Error: " & Err.Number _ & " in function basBrowseFiles.tsTrimNull" Resume tsTrimNull_EndEnd Function
Private Sub تفصيل_Format(Cancel As Integer, FormatCount As Integer)Me![ImageFrame].Picture = Me![ImagePath]End Sub
Private Sub ViewOne_Click()Dim strReportName As String Dim strCriteria As String If NewRecord Then MsgBox "الرجاء ادراج صوره جديده" _ , vbInformation, "Invalid Action" Exit Sub Else strReportName = "rptImage" strCriteria = "[ImageID]= " & Me![ImageID] DoCmd.OpenReport strReportName, acViewPreview, , strCriteria End IfEnd Sub