اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

Amr Ashraf

الخبراء
  • Posts

    946
  • تاريخ الانضمام

  • تاريخ اخر زياره

  • Days Won

    10

كل منشورات العضو Amr Ashraf

  1. عامة تفضل الحل الذى تريده . الشرح : كما قلت لا يمكن فتح نفس العنصر مرتين ولذلك نحتاج لعمل نسخة طبق الاصل منه كما يلى : Dim x, s As String s = Me.Name x = Me.Name & "NCpy" DoCmd.CopyObject , x, acForm, s DoCmd.OpenForm x الامر السابق سيقوم بنسخ النموذج الذى تم ضغط الزر فيه واضافة NCpy بجوار اسمه . ومطلوب عند الانتهاء حذف النسخ الوهمية التى تم انشاؤها والتى يحتوى اسمها على NCpy ولذلك يتم وضع هذا الحدث عند غلق النموذج On Close Dim obj As AccessObject On Error Resume Next For Each obj In CurrentProject.AllForms If obj.Name Like "*NCpy*" Then Debug.Print "Deleting " & obj.Name DoCmd.Close acForm, obj.Name, acSaveNo DoCmd.DeleteObject acForm, obj.Name End If Next يمكن وضع حدث حذف النموذج فى زر بدلا من عند الغلق لأنه بيقفل كافة النسخ ويحذفها ,, وفى النهاية لا أفضل هذه الطريقة اكيد هناك حلول اخرى للوصول الى الهدف الاساسى . مرفق القاعدة بالتوفيق . so - Amr.accdb
  2. وعليكم السلام ورحمة الله وبركاته , مبدأ ثابت لا يمكن فتح اى عنصر فى القاعدة مرتين فى نفس الوقت , ولكن يمكن التحايل على الموضوع بعمل نسخ وهمية من النموذج وفتحها وعند الانتهاء حذفها من القاعدة ولكن لا ادرى ما يجعلك تحتاج لهذه الطريقة الغريبة ؟ هل يمكنك شرح هدفك يمكن هناك طرق افضل ؟
  3. يعنى مثلا النتيجة هتكون كالتالى : المخازن الغير مستخدمة طبقاً لبياناتك هى شوف القاعدة المرفقة بها استعلام اسمه Qry Database1-Amr.accdb
  4. وعليكم السلام ورحمة الله وبركاته , من وجهة نظرى هيكلة جدول العملاء وكتابة اسماء المخازن فى اعمدة هو خاطئ و الانسب هو عمل التالى : فصل الجدول الى جدولين , الأول فيه العملاء وكل ما يتعلق بهم (يعنى نحذف اعمدة المخازن A , B , C , D وهكذا ) الجدول الثانى هيكون المخازن التى يتعامل عليها كل عميل ويكون هيكلته كالتالى ( اسم العميل - المخزن ) وبالتالى ممكن يتكرر اسم العميل 3 مرات مثلا اذا كان يتعامل على اكثر من مخزن . وفى النهاية يمكن بسهولة معرفة أى المخازن ليس عليها تعامل عن طريق استعلام مقارنة بين جدول المخازن و الجدول الجديد الخاص باستخدام العملاء للمخازن . اعتقد بهذه الطريقة لن تسبب مشكلة لك .. جرب ولو واجهتك مشكلة اذكرها هنا .. بالتوفيق
  5. نتعلم منكم استاذنا الفاضل , هو موضوع متشعب جدا نستطيع عمل جدولة لما نريد , وطبعا نستطيع عمل باتشات و سكريبتات لاغراض مختلفة كثيرة وبنفس الطريقة . تشرفت بمرورك اضافة رائعة جزاكم الله خير .
  6. السلام عليكم .. اخوانى الكرام ,, بعد التحية موضوعنا اليوم عن النسخ الاحتياطى لمحتويات فولدر محدد فى وقت محدد من اليوم على اساس يومى او اسبوعى او شهرى كما تريد . قمت بتصميم نموذج فى القاعدة المرفقة يتم تحديد فيه الفولدر المطلوب نسخه و مكان حفظ النسخة والوقت الذى يتم فيه النسخ تلقائيا . كود النسخ المستخدم كالتالى : Public Sub Copy_Folder1() Dim FSO As Object Dim FromPath As String Dim ToPath As String FromPath = Forms!Frm!from 'ToPath = "D:\Old\test" '<< Change ToPath = Forms!Frm!To2 & Format(Now, "yyyy-mm-dd h-mm-ss") If Right(FromPath, 1) = "\" Then FromPath = Left(FromPath, Len(FromPath) - 1) End If If Right(ToPath, 1) = "\" Then ToPath = Left(ToPath, Len(ToPath) - 1) End If Set FSO = CreateObject("scripting.filesystemobject") If FSO.FolderExists(FromPath) = False Then MsgBox FromPath & "المسار المطلوب النسخ منه غير موجود" Exit Sub End If FSO.CopyFolder Source:=FromPath, Destination:=ToPath End Sub مميزات الكود : نسخ محتويات الفولدر بالكامل سواء ملفات او فولدرات فرعية . فى حالة عدم وجود المسار المطلوب وضع النسخة الاحتياطية فيه سيقوم بانشاءه تلقائياً. فى حالة وجود المسار وبه ملفات بنفس الاسم سيتم عمل Overwrite للملفات القديمة واستبدالها بالجديدة (وذلك فى حالة انك غيرت الاسم الذى يتم الحفظ به لأن الافتراضى يحفظ الاسم بالتاريخ ووقت الحفظ بالدقائق وبالتالى من الصعب تشابه الاسماء بين النسخ). شكل النموذج عند الضغط على تشغيل يقوم باستدعاء كود النسخ . فى حالة وصول وقت الجهاز الى الوقت المحدد بالنموذج يقوم باستدعاء كود النسخ . يمكنك كتابة المسار او اختياره عن طريق الازرار الموجودة بجوار الحقل النصى. لحد الآن موصلناش لجزئية التلقائى المذكورة فى العنوان 😅, من المعروف ان لازم تكون القاعدة مفتوحة حتى يعمل النسخ الاحتياطى وبالتالى فى حالة انك قمت بعمل استيراد للبرنامج ده داخل قاعدتك الاساسية المفتوحة طوال اليوم فلا مشكلة وعند وصول الوقت المحدد ستعمل بدون مشاكل .. ولكن ماذا لو اردت ان النسخ يتم حتى لو القاعدة مغلقة ؟ سنقوم بالاستفادة بخاصية مهمة موجودة فى الويندوز وبدون استخدام برامج خارجية تابع معى : فى قائمة Start ابحث عن Task Scheduler وهى خاصية تقوم بعمل مجموعة من الاوامر فى اوقات محددة مثل تشغيل برنامج او اغلاقه او ارسال ايميل مثلا الخ... هذه صورة الواجهة اضغط على Create Basic Task وستفتح لك الواجهة التالية : اكتب اسم المهمة المطلوبة ثم Next : هنا تكرار المهمة يوميا - اسبوعيا - شهريا - مرة واحدة - عند بداية التشغيل للجهاز - عندما اسجل دخول المستخدم - عند حدوث حدث معين . اختر ما يناسبك وفى حالتنا اخترت Daily يومياً . اختر تاريخ بداية العمل و الوقت المطلوب تشغيل المهمة فيه .التالى فى هذه الخطوة تختار ماهية المهمة فتح برنامج معين - ارسال ايميل - عرض رسالة محددة .. اختر Start Program فى حالتنا .. التالى فى هذه الخطوة تقوم باختيار مسار البرنامج المطلوب تشغيله وطبعا فى هذه الحالة البرنامج هو ميكروسوفت اكسس يتم تحديد مسار البرنامج من "C:" ثم تحديد القاعدة المطلوب تشغيلها فى Arguments بنفس الصيغة الموجودة بالصورة (بين علامتين تنصيص والمسار كامل بالامتداد ) #Program/Script "C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE" #Arguments "C:\Users\Amr\Access\Backup\Tasker.Accdb" ثم اضغط على Finish. وبهذا قمنا بعمل مهمة للويندوز انه يفتح القاعدة الخاصة بنا فى وقت معين يومياً ,, باقى العمل داخل القاعدة نفسها كالتالى : فى حدث عند الفتح للنموذج ستجد الكود التالى : Private Sub Form_Open(Cancel As Integer) DoCmd.GoToRecord , , acFirst Me.To2 = [to] & "\" & [newnm] & " " Call SixHatHideWindow(SW_SHOWMINIMIZED) 'Call Copy_Folder1 '''' نقوم بتفعيل الخيار بعد تحديد الخيارات فى النموذج اول مرة لتعمل بتلقائية فيما بعد 'DoCmd.Quit '''' نقوم بتفعيل الخيار بعد تحديد الخيارات فى النموذج اول مرة لتعمل بتلقائية فيما بعد End Sub السطرين الغير مفعلين يتم تفعليهم بعد تحديد الخيارات الخاصة بيك من النموذج اول مرة وعند تفعيلهم بمجرد تشغيل القاعدة ستقوم بعملية النسخ وتغلق تلقائياً .. وبالتالى ملخص الفكرة ان القاعدة هتكون مغلقة وهتقوم مهمة الويندوز بتشغيلها وعند تشغيلها ستقوم بعمل النسخ الاحتياطى بالبيانات التى تم تحديدها اول مرة ثم تغلق تلقائياً وذلك فى اقل من ثانية قد لا تلاحظها من الاساس . مرفق القاعدة .. جرب ووافنى بالنتيجة .. دمتم بخير. ملحوظة : يمكن عمل المهمة الخاصة بالويندوز عن طريق اسكريبت VBS اختصارا للخطوات ولكن اردت شرح الفكرة من أساسها ويكون هناك مساحة للتطوير فيما بعد . BackupManual+Auto+Timer-AmrAshraf.accdb
  7. حضرتك تابعتى المناقشات بالأعلى ؟ كلها لمنع اى احد من الحصول على النسخة المفتوحة ! والموضوع بقى اصعب مليون مرة بعد اضافة الاسكريبت اللى تفضل بيه استاذنا ابو عبدالله .. كيف سيحصل على النسخة المفتوحة من داخل ملف تنفيذى EXE ؟ شكرا على مشاركتك
  8. اختلف معك .. اسطب اتنين اوفيس على الجهاز ؟ واحد 32 والتانى 64 ؟ ولا هحولها على جهازين ؟ واعدل الاكواد مرتين عشان مرة تشتغل على 32 والمرة التانية على 64 ؟ ليه كل ده بأكواد وخطوات بسيطة ينفع برنامجك على اى جهاز واى اصدار بدون وجع راس 😅
  9. استاذنا يعجز اللسان عن الوصف جزاكم الله خير الجزاء وجعله فى ميزان حسناتكم .. مستوى عالى من الاحترافية قد لا أصل اليه بعد 100 سنة 😂. قمت بتغيير امتداد القاعدة الخاصة بى الى .DLL وقام الاسكريبت بتحويلها الى Accde ويعمل جيدا فكرة اكثر من رائعة . ملاحظة لحضرتك : يعمل بكفاءة فى كل شئ ما عدا جزئية الباسورد لا تعمل معى .. الملف الناتج مفتوح بدون باسورد وهو فى الاصل كان بدون باسورد . ملاحظات للقارئ : فى هذا الجزء يجب ان يكون اسم قاعدتك كامل + الامتداد الخاص به مثل MyProgram.Accdb و Result.Accde مثلا . TypeHere Accdb File name TypeHere Accde File name
  10. دائما نستفيد منكم استاذنا وشكرا على المعلومات القيمة .. بخصوص سؤالك بالفعل بيتم حذف القاعدة الاصلية وستجدها فى الكود هنا فى كود التحويل End With Kill sourcedb وياريت حضرتك ترفقلنا الاسكريبت حتى نستفيد .. جزاكم الله خير قدرك عالى استاذنا الفاضل اغلب ما تعلمناه كان منكم .. جزاكم الله خير تحت امرك
  11. السلام عليكم .. الاخوة الافاضل الموضوع حول فكرة سريعة لحماية البرنامج عند توزيعه وضمان توافقه مع جهاز العميل قد لا يعرفها الكثيرين , كما نعلم ان افضل طريقة لحماية البرنامج عن طريق تحويله الى ACCDE بالطبع لا يوجد حماية مثالية ولكنها الافضل حالياً , ولكن لكى تعمل نسخة ACCDE على جهاز العميل يجب ان تكون نواة اصدار الاوفيس الخاص به مثل الجهاز الذى قام بتحويل القاعدة الاساسية فإذا كان جهاز المصمم X64 يجب ان يكون جهاز العميل كذلك , الفكرة حول تخطى هذه العقبة . أولا اذا كان برنامج يحتوى على وحدات نمطية Modules يجب ان تتبع طريقة استاذنا @jjafferr فى جعل اكوادك تعمل على النواتين X64 & X86 من هنا : ننتقل للخطوة التالية وهى كيف نتأكد ان البرنامج سيعمل عند العميل ( يجب ان تكون نواة اصدار الاوفيس الخاص به مثل الجهاز الذى قام بتحويل القاعدة الاساسية فإذا كان جهاز المصمم X64 يجب ان يكون جهاز العميل كذلك , الفكرة حول تخطى هذه العقبة ) سنستفيد من جهاز العميل نفسه لتحويل القاعدة الى ACCDE وبالتالى ما سيتم اعطاؤه للعميل هى النسخة الAccdb وسيتم تحويلها على جهازه عن طريق قاعدة اخرى "Converter.Accdb" بها كود تحويل وهو كما يلى : Function Amr() Dim sourcedb, targetdb, nametargetdb As String Dim SDest, SFile, SFName As String SDest = CurrentProject.Path SFile = "MyProgram.Accdb" SFName = SDest & "\" & SFile sourcedb = SFName targetdb = SDest & "\" & "Ready.accde" nametargetdb = SDest & "\" & "Amr.accde" Dim accessApplication As Access.Application Set accessApplication = New Access.Application With accessApplication .SysCmd 603, sourcedb, targetdb End With Kill sourcedb Name targetdb As nametargetdb FollowHyperlink nametargetdb DoCmd.Quit End Function سنستفيد من برنامج Winrar لتحزيم البرنامج وتحويله الى EXE (ابحث فى المنتدى ستجد الكثير من المواضيع المتعلقة) وفى اعدادات التحزيم سنحدد القاعدة Converter.Accdb لتفتح بعد الانتهاء من فك الضغط وبالتالى عند الانتهاء من فك الضغط ستفتح القاعدة التى بها كود التحويل لتحويل برنامجك الى Accde , وفى الفورم الرئيسى لبرنامجك ضع هذا الكود لحذف قاعدة التحويل لمحو اثار الجريمة 😂 Public Function KillConverter() Dim SDest, SFile, SDlt As String SDest = CurrentProject.Path SFile = "Converter.Accdb" SDlt = SDest & "\" & SFile If Len(Dir$(SDlt)) > 0 Then Kill SDlt End Function استدعيها عن حدث فتح النموذج الرئيسى On Open KillConverter وبكده حولنا القاعدة الاساسية الى ACCDE ومسحنا قاعدة التحويل , قد يسأل البعض ماذا لو قام العميل بفك الضغط بدلا من تثبيت البرنامج 😅 فى هذه الحالة سيحصل على النسخة ACCDB وتفشل الخطة , فى هذه الحالة يمكن اضافة هذا الكود الى النموذج الرئيسى فى برنامجك Private Sub Form_Open(Cancel As Integer) Dim appPath, AppName, AppExt As String appPath = Application.CurrentDb.Name AppName = Application.CurrentProject.Name AppExt = Mid(AppName, InStrRev(AppName, ".") + 1) If AppExt = "Accdb" Then MsgBox ("لم يكتمل التثبيت , جارى الخروج"), vbCritical DoCmd.Quit Else DoCmd.OpenForm "Main" DoCmd.Close acForm, "FrmStart" End If End Sub وظيفة الكود هو التحقق من امتداد البرنامج ولن يعمل اذا كان ACCDB وبهذا ضمنت انه يمشى بالخطوات المحددة . ملاحظات عامة : يجب ان تكون قاعدة التحويل فى Trusted Location حتى تعمل بدون مشاكل وهذا هو الشئ الوحيد الذى سنطلبه من العميل وهو اضافة مسار ما الى الاماكن الموثوقة وليكن D:\. مرفق البرنامج المراد تحويله + أداة التحويل لتوضيح الفكرة اكثر. دمتم بخير MyProgram.accdb Converter.accdb
  12. التغيير هيتم فى السطر ده : FPath = CurrentProject.Path لو محتاج تسنده لمتغير هوا كمان ممكن يبقى بالشكل ده : FPath = Me.PathTxt مثلا حقل كمان فى النموذج وتكتب فيه المسار المطلوب . لو المسار ثابت ممكن يبقى بالشكل ده FPath = "C:\MyFiles" على حسب ما تريد . لو هتضيف كمان حقل نصى ممكن تتلاعب بمحتواه كما تريد . بالتوفيق مثلا كده :
  13. تأكد من اضافة المكتبات الموجودة فى الصورة ووافنى بالنتيجة
  14. أحسنت ولذلك قلت لك فيه مساحة كبيرة للتطوير على حسب احتياجك .. بالتوفيق
  15. يفضل ارفاق النموذج لتوضيح وشرح المطلوب بالضبط حتى نستطيع مساعدتك . بالتوفيق
  16. على بركة الله اولا يتم عمل هذا الموديول وظيفته فتح الملف المطلوب وطباعته Option Compare Database Option Explicit 'Written by Andrew Fergus 'set a reference to Windows Script Host Object Model ' ' agpuzon ' added x64 support ' Private Declare PtrSafe Sub Sleep Lib "kernel32" _ (ByVal dwMilliseconds As Long) Private Declare PtrSafe Function ShellExecute Lib _ "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As LongPtr, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As LongPtr Const SW_SHOWNORMAL = 1 Public Sub PrintAnyDocument(strPathAndFileNamePlusExtension As String) Dim dfltPrinter As String Dim newPrinter As Object ' Create a new WshNetwork object to access network properties. Set newPrinter = CreateObject("WScript.Network") 'Get the name of the default printer dfltPrinter = Printer.DeviceName 'Set the default to the new printer 'USE YOUR ACTUAL PRINTER NAME BELOW 'newPrinter.SetDefaultPrinter ("New Printer Name") 'Pause Sleep 100 'Print the pdf document 'USE YOUR ACTUAL DOCUMENT NAME & PATH BELOW Call ShellExecute(0, "print", strPathAndFileNamePlusExtension, "", 0, SW_SHOWNORMAL) 'Pause Sleep 2000 'wait for 2 seconds - increase this if the code doesn't appear to work 'Pause Sleep 100 'Set the printer back to the original default 'newPrinter.SetDefaultPrinter (dfltPrinter) End Sub ثانيا يتم استدعاء الكود بالطريقة التالية : PrintAnyDocument "D:\اسم الفولدر\FileName.pdf" قمت بعمل نموذج طباعة وفيه حقلين نصيين اولهم اسم الملف المطلوب طباعته + الامتداد وبالتالى يمكنك طباعة اى ملف بأى امتداد ليس حصرا على PDF فقط الحقل الثانى عدد مرات طباعة الملف كود الطباعة بالشكل التالى : Private Sub Command0_Click() Dim FPath, SFileName, x As String FPath = CurrentProject.Path SFileName = Me.XFileName x = FPath & "\" & SFileName If IsNull(Me.XFileName) Then MsgBox ("يجب اختيار ملف") Else Debug.Print x For i = 0 To Me.XTimes - 1 PrintAnyDocument x Next MsgBox ("تمت الطباعة" & SFileName) End If End Sub ملاحظات : يجب ان يكون الملف فى نفس المسار مع القاعدة . هذه مجرد بداية على عجالة على قدر معرفتى الضئيلة وبالتالى هناك مساحة للتطوير بأكثر من طريقة على حسب الاحتياج (ممكن اختيار ملف بدلا من كتابة اسمه - عمل قائمة تحتوى على الملفات فى المسار ليتم الاختيار منهم - الخ ... ) . القاعدة مرفقة .. جرب ووافنى بالنتيجة Print Any File.accdb
  17. السلام عليكم .. فى حالة ان مفيش احد من الاخوة ساعدك هشارك معك فى الموضوع بس فيه ملاحظة حتى لو ساعدتك , عشان تطبع ملف خارجى لازم الويندوز يفتحه والا الناتج هيكون لغة Binary واشياء غير مفهومة الا اذا كان الملف تيكست اساسا على ما اعتقد , وبالتالى من الممكن عمل وحدة نمطية تقوم بعمل اللازم ولكن الملفات المراد طباعتها هتتفتح ببرنامج الPDF الخاص بيك وهيتم الطباعة مباشرة على الطابعة الافتراضية اللى عندك طبعا الموضوع هيكون بلمح البصر بس الملف هيفضل مفتوح .. اذا مناسبة معاك الطريقة سيب رد وانا فى اقرب وقت هبدأ اصمملك نموذج جيد يقوم بالمطلوب الى حد كبير بإذن الله .
  18. ليس لدى القدرة على مشاهدة فيديوهات حالياً الافضل تحاول ترفق النموذج كامل اخى الكريم حتى نستطيع مساعدتك , غير ذلك انتظر من احد الاخوة مساعدتك بطريقة اخرى . الموديول يتم تحديثه مع فتح الاستعلام الجديد , وهو ما يتم عند فتح النموذج اذا كان مغلق او ضغط F5 لتحديث البيانات
  19. هل يمكنك ارفاق النموذج فقط بالجدول او الاستعلام المرتبط به ؟ المفترض ان الكود يقوم بالغاء الاختيارات وتحديث نتيجة البحث لاظهار كافة السجلات . الا اذا كانت الكومبوبوكس تسجل الاختيار فى حقل نصى آخر وهو ما يعتمد عليه عمليه البحث , بمعنى ان فلتر الاستعلام ليس الكومبوبوكس نفسه ولكن حقل نصى يساوى نتيجة الكومبوبوكس فى هذه الحالة يتم تعديل الكود كالتالى : Me.Combo1 = "" Me.Combo2 = "" Me.Combo3 = "" Me.Combo4 = "" Me.Combo5 = "" Me.Combo6 = "" Me.Txt1 = "" Me.Txt2 = "" Me.Txt3 = "" Me.Txt4 = "" Me.Txt5 = "" Me.Txt6 = "" Me.Requery
  20. وهذا طبيعى اخى الكريم لأنك طلبت ان النموذج يكون غير مرتبط بالجدول او الاستعلام الآخ وبالتالى عملناه يحضر بياناته برمجياً من الاستعلام وعندما تقوم انت بحذف البيانات من الجدول يجب عمل تحديث للاستعلام لتحميل النتائج الجديدة بعد الحذف , وبالتالى يجب غلق النموذج و اعادة فتحه وليس غلق القاعدة كلها وفتحها . هناك حلين لهذا الموضوع الاول انه عندما تحذف البيانات والنموذج مفتوح اضغط F5 هيتم تحديث النموذج اذا لم تريد غلق النموذج وفتحه . الحل الثانى حل برمجى هيتم وضح حدث On time بحيث يقوم بتحديث النموذج كل 10 ثوانى مثلا لتحميل النتائج الجديدة وهو حل لا أفضله لأنه هيؤدى الى بطء فى الاداء فى اغلب الاحوال.
  21. يمكن اخى الكريم , فى حدث زر اعادة البحث اكتب التالى : Me.Combo1 = "" Me.Combo2 = "" Me.Combo3 = "" Me.Combo4 = "" Me.Combo5 = "" Me.Combo6 = "" Me.Requery غير الاسماء الى اسماء كومبوبوكس نموذج البحث عندك جرب ووافنى بالنتيجة
  22. اذا كان المطلوب تقييمه رقم تكتب هكذا If PW <> 100 اذا كان نص تكتب هكذا If PW <> "The Password" اذا كان تاريخ If PW <> #1/1/2022#
  23. عليكم السلام ارفق القاعدة أخى الكريم , وهل المطلوب هو عند الضغط على الزر يقوم باخلاء الكومبوبوكس من الاختيارات السابقة ؟
×
×
  • اضف...

Important Information