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

دعوة للتجربة : بخصوص تنسيق تاريخ الجهاز لحل مشكلة تنسيق التاريخ الامريكى


ابو جودي

الردود الموصى بها

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

الاكواد تعتمد على احد دوال ال API  للويندوز وتم مراعاة العمل على كلا من النسختين 32 , 64 بيت

الكود الاول فى راس الموديول وذلك لاحضار تنسيق تاريخ الجهاز

Private Const LOCALE_USER_DEFAULT = &H400
Private Const LOCALE_SSHORTDATE = &H1F ' short date format string
Private Const LOCALE_SLONGDATE = &H20 ' long date format string

Private Const strTblFormatDate = "tblDateFormatWindows"

#If VBA7 And Win64 Then
  Private Declare PtrSafe Function _
  GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _
  (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
#Else
  Private Declare Function _
  GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _
  (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
#End If


Public Function GetDateFormatMyWin()
    
Dim strLocale   As String
Dim lngRet      As Long
Dim strMsg      As String
    
  strLocale = Space(255)
  lngRet = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, strLocale, Len(strLocale))
    
  strLocale = Left(strLocale, lngRet - 1)
  GetDateFormatMyWin = strLocale
End Function

الكود الثانى التأكد من وجود جدول لحفظ تنسيق تاريخ الجهاز

Function ifTableExists(tblName As String) As Boolean
  If DCount("[Name]", "MSysObjects", "[Name] = '" & tblName & "'") = 1 Then ifTableExists = True
End Function

الكود الثالث جلب البيانات لتسيق تاريخ الجهاز الذى تم حفظه بالجدول

Public Function DateFormatwinSaved() As String
  DateFormatwinSaved = Nz(DLookup("DateFormatWindows", strTblFormatDate), "")
End Function

الكود الرابع تغيير تسيق التاريح لجهاز الحاسوب ولكن اولا تخزين القيم الاصلية لتنسيق تاريخ الحاسوب داخل جدول لمن يريد استرجاع التسيق الاصلى مرة اخرى

Public Function ChnageDateFormat(Optional dtDateFormat As String = "dd/MM/yyyy")

If GetDateFormatMyWin() = dtDateFormat Then
  Exit Function
Else

  Dim mySQL As String
  If ifTableExists(strTblFormatDate) = False Then
    DoCmd.SetWarnings False
    
    mySQL = "CREATE TABLE " & strTblFormatDate
    mySQL = mySQL & "([ID] counter," & "[DateFormatWindows] text," & "CONSTRAINT [Index1] PRIMARY KEY ([ID]));"
    
    DoCmd.SetWarnings False: DoCmd.RunSQL mySQL: DoCmd.SetWarnings True
    
    mySQL = "INSERT INTO " & strTblFormatDate
    mySQL = mySQL & "( DateFormatWindows )"
    mySQL = mySQL & " SELECT "
    mySQL = mySQL & " ('" & GetDateFormatMyWin() & "') "
    
    DoCmd.SetWarnings False: DoCmd.RunSQL mySQL: DoCmd.SetWarnings True

  ElseIf ifTableExists(strTblFormatDate) = True Then
      If DCount("*", strTblFormatDate) = 0 Then
        mySQL = "INSERT INTO " & strTblFormatDate
        mySQL = mySQL & "( DateFormatWindows )"
        mySQL = mySQL & " SELECT "
        mySQL = mySQL & " ('" & GetDateFormatMyWin() & "') "
      
        DoCmd.SetWarnings False: DoCmd.RunSQL mySQL: DoCmd.SetWarnings True
        
      ElseIf DCount("*", strTblFormatDate) > 0 Then
        mySQL = "UPDATE " & strTblFormatDate
        mySQL = mySQL & " SET " & strTblFormatDate
        mySQL = mySQL & ".DateFormatWindows = " & Chr(34) & GetDateFormatMyWin() & Chr(34) & ";"
        
        DoCmd.SetWarnings False: DoCmd.RunSQL mySQL: DoCmd.SetWarnings True
      End If
  End If
Shell "cmd.exe /c REG ADD ""HKEY_CURRENT_USER\Control Panel\International"" /v sShortDate /d """ & dtDateFormat & """ /F", vbHide
End If
  
End Function

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


Public Function ReturnOldDateFormatWin()
  
  If GetDateFormatMyWin() = DateFormatwinSaved() Then
  Exit Function
  Else
    Shell "cmd.exe /c REG ADD ""HKEY_CURRENT_USER\Control Panel\International"" /v sShortDate /d """ & DateFormatwinSaved & """ /F", vbHide
  End If
  
End Function

 

طيب فى النهاية يفضل استخدام ماكرو  AutoExec  والذى وظيفته تنفيذ إجراء او اجراءات معينة في كل مرة تبدأ فيها تشغيل قاعدة بيانات Access

وفى الماكرو من خلال RunCode
نكتب اسم الوظيفة التى نريد استدعاؤها وهى 

 ChnageDateFormat()

الان عند تشغيل القاعدة يتم فحص تنسيق تاريخ الجهاز وان كان مساويا للتنسيق الموجود فى الفانكشن ChnageDateFormat

والذى وضعته افتراضيا من خلال Optional dtDateFormat As String = "dd/MM/yyyy" 

يتم تجاهل الامر 

وفى حالة الاختلاف يتم تغيير تنسيق تاريخ الجهاز الى هذا النسيق الذى تم الاعلان عنه فى رأس الوظيفة  dd/MM/yyyy

ولاضفاء المرونة قمت بتعريف متغير التنسيق على انه اختيار ووضعت الاختيار المفضل  dd/MM/yyyy

 

فى حالة اردتم تغيير التنسيق الى تنسيق أخر مثلا  yyyy/MM/dd

كل ما عليكم هو استدعاء الوظيفة فى الماكرو بالشكل الاتى 

 ChnageDateFormat("yyyy/MM/dd")

ان شاء الله بهذا الكود

لن تواجهوا مستقبلا مشاكل اختلاف تنسيق التاريخ فى دوال المجال :wink2: 

ولا اخطاء فى تسجيل التواريخ .. بلا ..بلا ..بلا.................... الخ الخ

 

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

كل ما عليكم هو استدعاء الوظيفة الاتية عند الاغلاق لقاعدة البيانات

ReturnOldDateFormatWin()

 

انتهى الشرح ارجوا لكم تجربة الاستمتاع بتلك الافكار وهذه التجربة

الافكار والاكواد وطرح التصور حصرى من بنات افكارى وانا مجهد جدا جدا جدا قد يمكن اختصار الاكواد واختزالها ولم انتبه لذلك مثلا من شدة الارهاق فلا تؤاخذونى فى ذلك .. و ليدلوا كل بدلوه فى ذلك الامر ...

تم التجربة على ويندوز 10  -  64  بيت ولا ادرى هل يعمل على باقى واختلاف نسخ الويندور ام لا 
انتظر الرد من حضراتكم بنتائج تجاربكم ووضع اقتراحاتكم

  • Like 7
رابط هذا التعليق
شارك

بسم الله ما شاء الله 

عبقريه صراحتا 

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

وجعله فى ميزان حسناتك 

 

بصراحه ممتازه 

:fff::fff::fff::fff::fff::fff::fff::fff::fff:

  • Thanks 1
رابط هذا التعليق
شارك

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

مجهود رااااااااااااااائع من شخص تحفة .... بسم الله ما شاء الله :clapping:

ويبقى الأكسس معين لا ينضب ... وقدرة جبارة على حل جميع التحديات 😊💪

 

بس ناقصنا ملف التجربة (المثال) .. 😅

علشان زي منته عارف حضرتك .. المبتدئين أمثالنا 😁✌️

  • Haha 5
رابط هذا التعليق
شارك

 في البداية ...شكرا لمجهودك العظيم

وفي النهاية ..هو لا طويل ولا اقصير ..لاني حاولت اجربه ولم افلح

لاني حينما وجدت CREAT TABLE تصورت انه سيعمل جدول بالتغييرات

  • Haha 1
رابط هذا التعليق
شارك

  • 4 months later...

ارجو ان يكون الرد والتعليق بذكر نوع الافيس ونوع الويندوز لتأكد من عدم خلل يالاكواد كما ذكر عالمنا الجليل ابو جودى وارجو ان يكون هناك مثال للتجربة كل الاحترام لشخصكم الكريم

تم تعديل بواسطه حمدى الظابط
رابط هذا التعليق
شارك

8 ساعات مضت, مبرمج متقاعد said:

روعة استاذنا ابو احمد

جربت المرفق ويندوز 11 64 وافيس 21 64

ويعمل كما ينبغي

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

  • Thanks 1
رابط هذا التعليق
شارك

1 ساعه مضت, AbuuAhmed said:

ومشاركتي ليست لمزاحمة استاذنا @ابو جودي ،

هذا امر مؤكد وخصوصا بين اساتذة كبار وقامات ننظر اليها بكل تقدير واحترام

ومثل هذه المداخلات تثري الموضوع وتخدم الجميع بتقديم حلول وافكار متنوعة

اسأل الله لك وللاستاذ محمد عصام التوفيق والسداد

  • Thanks 1
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information