اذهب الي المحتوي
أوفيسنا

jjafferr

أوفيسنا
  • Posts

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

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

  • Days Won

    406

مشاركات المكتوبه بواسطه jjafferr

  1. 1 ساعه مضت, ابوخليل said:

    ومسح الذاكرة  ما يحدث عادة ..

    في برنامج الصور ، وبسبب شح المعلومات ، كنت اشوف نجوم السماء في كل وقت !!

    كل شوي ويتوقف البرنامج ، او النتائج ما تكون صحيحة ، او ...

    فكان اعتمادي الكبير على نافذة immediate window لقراءة القيم ، فكان مهم ان تبقى القيم عند توقف البرنامج.

     

     

    2 ساعات مضت, ابوخليل said:

    استخدم في عملي الجدول والدوال ( جدول محلي يخص المستخدم )

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

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

    dim tbl_values as string, x() as string
    
    tbl_values = dLookup("Aspect_Ratio_Width & '|' &  Aspect_Ratio_Height & '|' & Lock_Aspect_Ratio & '|' & Save_On_Exit_Sides & '|' & IrfanView_Path & '|' & Employees_Pic_Folder & '|' & Others_Pic_Folder & '|' & Big_Pic_Folder & '|' & tmp_Pic_Folder & '|' & Pictures_BackUp_Folder & '|' & Left_Position & '|' & Top_Position & '|' & Save_On_Exit_Position & '|' & Percent_Smaller_Picture & '|' & EOS_or_Webcam & '|' & How_Many_EOS", "tbl_Settings")
        
        x = Split(tbl_values, "|")
        'x(0)*15   Aspect_Ratio_Width
        'x(1)*15   Aspect_Ratio_Height
        'x(2)   Lock_Aspect_Ratio
        'x(3)   Save_On_Exit_Sides
        'x(4)   IrfanView_Path
        'x(5)   Employees_Pic_Folder
        'x(6)   Others_Pic_Folder
        'x(7)   Big_Pic_Folder
        'x(8)   tmp_Pic_Folder
        'x(9)   Pictures_BackUp_Folder
        'x(10)   Left_Position
        'x(11)   Top_Position
        'x(12)   Save_On_Exit_Position
        'x(13)   Percent_Smaller_Picture
        'x(14)   EOS_or_Webcam
        'x(15)   How_Many_EOS
        'Debug.Print x(11)

    .

    ولكن ومع استعمال الجدول ذو السجلات الكثيرة ، فعندنا 3 طرق: 

    1. استعمال الدوال العادية ، وتكون هناك دالة خاصة لكل سجل (لأننا لا نعرف رقم السجل وانما قيمة في حقل) ،

    2. استعمال Recordset ،

    3. والطريقة الاخيرة هي TempVars.

    نعم لكل طريقة ميزة وعيوب ، وبعد ان القيت اقلامي ، اخترت الطريقة الثالثة 🙂

     

  2. 1 ساعه مضت, Moosak said:

    عندي سؤال خاطف :biggrin2:
    1. - ليش تحذف المتغير قبل تعيين قيمة جديدة له ؟
    وسؤال آخر ؟
    2. -  لو خزنا آلاف السجلات في TempVars بيكون عندنا عدد كبير منها ومساحة لا بأس بها في الذاكرة .. ألن يؤثر هذا على الأداء ؟
    🙂

    .

    1. هي عادة احاول التمسك بها ، مثل عند الانتهاء من عمل Recordset ، فلا يوجد داعي لإستعمال set rst=Nothing ، ولكنها عادة جيدة خصوصا لما يكون عندك مجموعة من Recordsets 🙂

    2.1. الحد الاقصى لـ TempVars هو 255 متغير فقط ،

    2.2. هذه الطريقة استعملها فقط لجدول اعدادات البرنامج ، ولا اعتقد انها ستتعدى 30-40 معلومة ، وكما قلت سابقا:

    في 27‏/5‏/2025 at 19:02, jjafferr said:

    ولا تنسى ان هذا الجدول لإعدادات البرنامج ، وليست بيانات للتداول بين المستخدمين

     

    • Thanks 1
  3. تم اضافة كود تحديث بيانات الجدول و TempVars ، واتضح انه اسهل مما كنت اتوقع 🙂

     

    Function Update_a_Field(New_Value As String, Field_Name As String)
    
        '
        ' usage from the Form, for example:
        ' Call Update_a_Field(Forms!frm_Main!BG_Pixel_Color, "Color_Reference")
        '
                
        '- update the field value in the table
        DoCmd.SetWarnings False
            'DoCmd.RunSQL ("UPDATE tbl_Settings SET sValue =" & Me.BG_Pixel_Tolerance & " WHERE sName='Color_Tolerance'")
            DoCmd.RunSQL ("UPDATE tbl_Settings SET sValue =" & New_Value & " WHERE sName='" & Field_Name & "'")
        DoCmd.SetWarnings True
        
        
        '- update the TempVar
        TempVars.Remove (Field_Name)            '- Remove the field
        TempVars.Add (Field_Name), New_Value    '- add the field with the new value
        
    End Function

    .

    اخوي موسى:

    عندي برنامج ، على حاسبتين او ثلاث ، يطبعون منه حوالي 1000 وصل خلال نصف ساعة ، وبه صورتين وبيانات اخرى ، والسيرفر بعيد حوالي كيلومتر او اثنين (اذا تحسب اطوال كيبلات الشبكة) ،

    تصور اذا كنا نطلب مسار الصور كلما اردنا طباعة وصل :blink:

    • Like 1
  4. وعليكم السلام ورحمة الله وبركاته

     

    على طاري الاولاد ، كنت اعمل على نموذج واكتب الكود لاصطياد جميع انواع الاخطاء ، وانتهيت من العمل.

    جاء احد الاحفاد ، وما اعرف شو عمل على الشاشة ، واذا يظهر لي خطأ جديد ، ولا عرفت كيفبة ظهوره !!

     

    فكرة جميلة ، شكرا للمشاركة 🙂

    • Like 1
  5. ولا تنسى ان هذا الجدول لإعدادات البرنامج ، وليست بيانات للتداول بين المستخدمين ،

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

     

    عند تحديث معلومة معينة (مثلا آخر مكان كان فيه كائن المربع Top و Left) :

    1. عند تشغيل البرنامج ، انا آخذ هذه المعلومة من الجدول ، ويقوم البرنامج بعرضها على النموذج ،

    2. اثناء عمل البرنامج ، واثناء تحريك المربع ، فانا آخذ هذه القيم من الكائن مباشرة ،

    3. وعند الخروج من البرنامج ، يتم حفظ هذه المعلومة في الجدول.

    نعم لم اتطرق لكود التحديث ، وان شاء الله اضعه هنا حين اكتماله

    • Like 2
  6. وعليكم السلام اخوي موسى

    شكرا على مرورك وملاحظاتك 🙂

     

    1. كلامك صحيح بالنسبة الى معظم البرامج ، ولكن البرنامج الذي اعمل عليه هو يعمل كبرنامج مستقل ، فالبيانات محتاج لقراءتها مرة واحدة عند فتح البرنامج.

    2. البرنامج لتصوير الموظفين (قريبا سأعمل موضوع خاص به ان شاء الله) ، فيجب ان اجعله يعمل مع اعدادات المؤسسة (المجلدات) ، ومكان حفظ الصور لا علاقة لها بمجلد البرنامج.

     

    وبما انني لم انتهي 100% من البرنامج ، فلن استغني عن افكاركم 🙂

    • Like 1
  7. 10 دقائق مضت, ابوخليل said:

    فتح موضوع جديد لمناقشة التالي :

    البحث عن أسهل طريقة ( وبأسهل الادوات المساعدة ) لتطبيق الانتقال بين دفعات الشراء آليا من دون تدخل المستخدم  ( ما يدخل اولا يخرج أولا )

    على بركة الله 

     

     

     

    فيه موضوع عمله اخونا ابو جودي ، ما ادري مدى ارتباطة بالموضوع الذي تريد عمله :

     

    • Thanks 3
  8. 1 ساعه مضت, ابوخليل said:

    والجزء الآخر هو إدارة التخزين لمراعاة نهاية الصلاحية الذي لا يقل أهمية

    FIFO = First in, First Out

    المادة الداخلة في البداية ، تخرج في البداية

     

    تماما كما تفضلت به اخوي ابوخليل 🙂

    • Like 1
    • Thanks 1
  9. السلام عليكم

     

    بالاشارة الى الموضوع التالي ، والطرق التي تمت الاشارة اليها :

     

     

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

    ولكن في احد مشاريعي ، هذه الاعدادات وصلت الى 21 ولا تزال في زيادة ، فعملت تغيير في الجدول ، واصبح هناك سجل خاص لكل واحدة من الاعدادات:

    image.png.f10eff787b531f13dab6c9b57f34a7d0.png

    .

    image.png.3fae47571aefc5c0e155b96634476d12.png

    .

    وهذا شكل النموذج المستمر للمستخدم:

    image.png.591605a0cc2ba0d99be8fd580b040bb8.png

    .

    وبياناته :

    image.png.26fe6b0a6d59928af2567b29bc2914c5.png

    .

    ونعرف انه في النموذج المستمر ، لا نستطيع التحكم بشكل حقل دون آخر (إلا عن طريق التنسيق الشرطي ، وعن طريق كود خاص يخص مربع الزر Command button) ، لذلك كان من المهم ان اكتب عبارة معين في اسم الحقل حتى اميزه عن الآخرين (او ان اعمل حقل اكتب فيه طريقة التعامل مع هذا السجل (استفيد منه في التنسيق الشرطي مثلا)) ، لذا نرى ان زر (command button) جميع الحقول التي بحاجة الى اختيار مجلد لها ، بدأ اسم الحقل بالكلمة Path (طبعا هذا مثال) ، وعليه استطعت ان اخفي الزر لبقية السجلات هكذا:

    Private Sub Detail_Paint()
    
        If Left(Me.sName, 4) <> "Path" Then
            Me.cmd_Path.Transparent = True
        Else
            Me.cmd_Path.Transparent = False
        End If
    End Sub

     

     

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

    Option Compare Database
    Option Explicit
    
    
    
        '
        '- tbl_Settings contain the defaults for this program,
        '- instead of having all these fields in one record,
        '- we have records of these fields sName, sValue, sDataType
        '- so here we deal with these values, read/write
        '
        '- jjafferr
        '- v1. 17/04/2025
        '
        
    Function tbl_Settings_Data()
    
        
        '- load the values for the table to TempVars, for each field
        
        Dim rstS As DAO.Recordset
        Dim RC As Long, i As Long
        
        Set rstS = CurrentDb.OpenRecordset("Select * From tbl_Settings")
        rstS.MoveLast: rstS.MoveFirst: RC = rstS.RecordCount
            
        
        For i = 1 To RC
        
            '- clean the old values of THIS record
            TempVars.Remove (rstS!sName)
    
            
            '- since TempVars is Variant, lets set the actual field values based on the field sDataType
            If rstS!sDataType = "Number" Or rstS!sDataType = "Yes/No" Then
            
                TempVars.Add (rstS!sName), CLng(rstS!sValue)
                
            ElseIf rstS!sDataType = "Text" Then
            
                TempVars.Add (rstS!sName), CStr(rstS!sValue)
                
            ElseIf rstS!sDataType = "Date/Time" Then
            
                TempVars.Add (rstS!sName), CDate(rstS!sValue)
                
            End If
        
        
            rstS.MoveNext
        Next i
        
        rstS.Close: Set rstS = Nothing
        
    End Function
    
    
    Function ListTempVars()
        
        '- list all TemVars values in this Database
        Dim i As Long
        
        For i = 0 To TempVars.Count - 1
            Debug.Print TempVars(i).Name, TempVars(i).Value, VarType(TempVars(i))
        Next i
        
    End Function
          
          
    Function Update_a_Field(New_Value As String, Field_Name As String)
    
        '
        ' usage from the Form, for example:
        ' Call Update_a_Field(Forms!frm_Main!BG_Pixel_Color, "Color_Reference")
        '
                
        '- update the field value in the table
        DoCmd.SetWarnings False
            'DoCmd.RunSQL ("UPDATE tbl_Settings SET sValue =" & Me.BG_Pixel_Tolerance & " WHERE sName='Color_Tolerance'")
            DoCmd.RunSQL ("UPDATE tbl_Settings SET sValue =" & New_Value & " WHERE sName='" & Field_Name & "'")
        DoCmd.SetWarnings True
        
        
        '- update the TempVar
        TempVars.Remove (Field_Name)            '- Remove the field
        TempVars.Add (Field_Name), New_Value    '- add the field with the new value
        
    End Function      

    .

    وعليه ، وعند طلب اي قيمة في البرنامج ، استعمل:

    اسم الحقل في الجدول
    Path_Employees_Pic_Folder
    
    طريقة طلب القيمة  
    TempVars!Path_Employees_Pic_Folder
    
    طريقة استعماله  
    Me.Picture = TempVars!Path_Employees_Pic_Folder & Me.Employee_ID & ".jpg"

    .

    السبب الذي جعلني استخدم TempVars يدلا عن الاكواد العامة او الدوال الخاصة هو ، اني اخذ البيانات من الجدول مرة واحدة فقط عند تشغيل البرنامج ، وهذه البيانات تبقى في ذاكرة البرنامج حتى عند استلام رسالة خطأ (عند ظهور رسالة الخطأ ، يقوم اكسس بحذف جميع المتغيرات التي بذاكرنه ، ما عدا بيانات TempVars) ، وبكل بساطة يمكننا قراءة قيمتها من نافذة immediate window في صفحة الكود هكذا:
    image.png.29dd21825faa737fabf608a2dbe3ea50.png

    .

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

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

    30-05-2025
    تم اضافة كود تحديث بيانات الجدول و TempVars ، واتضح انه اسهل مما كنت اتوقع 🙂

     

     

    جعفر

    • Like 3
    • Thanks 1
  10. وعليكم السلام

     

    اما طريقتي:

    1. اعمل مجلد للصور (مثلا اسمه Logo) في نفس مكان وجود قاعدة بياناتك (الكود المسار سيختلف اذا كانت قاعدة بياناتك هي الواجهة او جداول البيانات)،

    2. اعمل صورة لإسم الشركة (مثلا img_Company.jpg) ، وصورة اخرى لإسم الفرع ، القسم ، الشعبة ، وهكذا ، صورة لكل شيء تريد عرضه في البرنامج او طباعته)،

    3. فب النموذج او التقرير اعمل كائن للصورة (مثلا Company_img)،
    4. في حدث OnLoad للنموذج ، او حدث تنسيق قسم التفصيل في التقرير ، اكتب الكود التالي لكل صورة

    me.Company_img.picture= currentproject.path & "\Logo\img_Company.jpg"

    .

     

    • Like 4
  11. وعليكم السلام

     

    اهلا اخي فادي 🙂

    اهم شيء في هذا الموضوع، هو الرجوع الى تعليمات مايكروسوفت في التعامل مع دوال نواة 64 بت ، في الرابط التالي: https://www.microsoft.com/en-us/download/details.aspx?id=9970

    ملف النص في الرابط اعلاه يعطيك تفاصيل الدالة على نواة 64 بت.

     

    المثال الذي استعملته انت، وانا متأكد بأنك كنت حريص في انتقاء الدالة، توجد به 3 فروقات عن الدالة في ملف مايكروسوفت (السطر الثاني من ملف مايكروسوفت) :

    image.png.4de31c318332826e7f8f957994316034.png

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

     

     

    رجاء قراءة الموضوعين التاليين ، فطريقة العمل تختلفان ، وفيهما بعض الامثلة المختلفة:

    .

    .

     

     

    • Like 1
  12. وعليكم السلام

     

    رجاء اعمل نسخة احتياط من برنامجك ، واحفظها في مكان آمن بعيد عن ملفات عملك.

     

    هذا الموضوع يفيدك في تصدير المرفقات من الجدول الى مجلد في الكمبيوتر

    .

    وهذا الموضوع لحذف المرفقات من الجداول (ولكن يجب ان تتأكد ان جميع المرفقات تم تصديرها اولا)

     

    • Like 2
  13. يا اهلا وسهلا Jo

    نعم يمكن ، فقط اعمل مسار الصورة (img_path مثلا) كاملا في الاستعلام مصدر بيانات النموذج، ثم اجعل هذا الحقل مصدر بيانات الصورة.

    ومن واقع التجربة ، فستحتاج الى تكبير حجم الحقل (طولا وعرضا) حتى ترى الصورة بحجم مناسب، وتأكد ان احجام الصور لا تكون كبيرة (500x500 يعتبر حجم كبير ومناسب) حتى لا يصبح برنامجك بطيئ.

     

×
×
  • اضف...

Important Information