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

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

قام بنشر

السلام عليكم 🙂 

 

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

 

احد المؤسسات تشتغل على برنامج يستخدمه حوالي 6 اشخاص ، ويتم ادخال حوالي 2000 سجل يوميا ، والجدول فيه حقل رقم تلقائي ، وحقل التاريخ/الوقت وفيه قيمة افتراضية Now ، طبعا بالاضافة الى بقية الحقول.

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

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

 

توصلت الى الاستعانة بالدوال التالية ، واستعملها اول ما افتح البرنامج (ولمرة واحدة فقط) ، و اضع في المتغير Diff_Sec فرق التاريخ/الوقت بالثواني ، بين السيرفر والكمبيوتر ، ولما اضيف السجل اضيف قيمة هذا المتغير الى Now الكمبيوتر ، مما يعطي السجل وقت السيرفر ، وعليه تكون جميع السجلات تعمل على نفس التوقيت 🙂

 

اقوم بمناداة الدالة هكذا:

call Get_Remote_PC_Time("\\192.168.100.88")

 

Option Compare Database
Option Explicit

'Fetch and display Net Remote Time Of Day from a
'remote Windows system.  Supply a UNC hostname
'(or a DNS name), or empty string for the local
'host's time and date.
'

Private Const NERR_SUCCESS As Long = 0

Private Type TIME_OF_DAY_INFO
  tod_elapsedt As Long
  tod_msecs As Long
  tod_hours As Long
  tod_mins As Long
  tod_secs As Long
  tod_hunds As Long
  tod_timezone As Long
  tod_tinterval As Long
  tod_day As Long
  tod_month As Long
  tod_year As Long
  tod_weekday As Long
End Type

#If Win64 Or VBA7 Then
    
    Dim lngBufPtr As LongPtr
    
    Private Declare PtrSafe Function NetApiBufferFree Lib "netapi32" _
        (ByVal lpBuffer As LongPtr) As Long

    Private Declare PtrSafe Function NetRemoteTOD Lib "netapi32" _
        (UncServerName As Byte, BufferPtr As LongPtr) As Long

    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (pTo As Any, uFrom As Any, ByVal lSize As LongPtr)

#Else
    Dim lngBufPtr As Long
    
    Private Declare Function NetApiBufferFree Lib "netapi32" _
        (ByVal lpBuffer As Long) As Long

    Private Declare Function NetRemoteTOD Lib "netapi32" _
        (UncServerName As Byte, BufferPtr As Long) As Long

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (pTo As Any, uFrom As Any, ByVal lSize As Long)
#End If
'


    Public Diff_Sec As Double
'

Public Function GetTOD(ByVal Server As String) As Date
    Dim bytServer() As Byte
    'Dim lngBufPtr As Long
    Dim todReturned As TIME_OF_DAY_INFO
    
    bytServer = Trim$(Server) & vbNullChar
    If NetRemoteTOD(bytServer(0), lngBufPtr) = NERR_SUCCESS Then
        CopyMemory todReturned, ByVal lngBufPtr, LenB(todReturned)
        NetApiBufferFree lngBufPtr
        With todReturned
            GetTOD = DateAdd("n", _
                             -.tod_timezone, _
                             DateSerial(.tod_year, .tod_month, .tod_day) _
                           + TimeSerial(.tod_hours, .tod_mins, .tod_secs))
        End With
    Else
        Err.Raise vbObjectError + 2000, _
                  "GetTOD", _
                  "Failed to obtain server time"
    End If
End Function

Public Function Get_Remote_PC_Time(txtServer As String)
    
'
' calling it:
'Get_Remote_PC_Time("\\192.168.100.88")
'

    Dim dtServerTime As Date
    'Dim Diff_Sec As Double
    
    On Error Resume Next
    
    dtServerTime = GetTOD(txtServer)
    
    Diff_Sec = DateDiff("s", Now, dtServerTime)
    Debug.Print "Diff=" & Diff_Sec
    
    Debug.Print "Server=" & dtServerTime
    Debug.Print "Local ok= " & DateAdd("s", Diff_Sec, Now)
    
     
'    If Err.Number <> 0 Then
'        Debug.Print Err.Description
'    Else
'        Debug.Print CStr(dtServerTime)
'    End If
'    On Error GoTo 0
''    txtServer.SetFocus
End Function

.

جعفر

  • Like 4
  • Thanks 2
قام بنشر

اولا تسلم ايدك على هذا العمل الرائع 

ثانيا لى سؤال اخر

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

قام بنشر
44 دقائق مضت, عمر ضاحى said:

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

المنتدى به الكثير من المواضيع لجلب الوقت من الانترنت ، ولكن لم ارى موضوع لتوحيد تاريخ/وقت كمبيوترات الشبكة ، وهذا هو صلب الموضوع 🙂

 

قمت بإضافة شرح لسبب استخدامي لهذا الموضوع 🙂

 

جعفر

  • Like 1
قام بنشر

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

ما جربت الكود، ولكن لفت نظري أنك تقوم بعد الحصول على وقت الخادم/السيرفر بعمليات حسابية لمعرفة الفرق.
وملاحظتي "إن كنت فهمت صح" لماذا لا تعتمد تاريخ الخادم مباشرة بعيدا عن المقارنات وحساب الفرق؟

قام بنشر

السلام عليكم اخوي ابو احمد 🙂

 

عندي سببين اللي ما خلوني استعمل تاريخ/وقت الخادم مباشرة:

  1. الشبكة ضعيفة ، وكل ثانية في البرنامج مهمة ، فمناداة وقت الخادم حوالي 1000 مرة خلال ساعة ، وبواسطة بين 2-3 مستخدمين ، كان بيشكل بطئ في البرنامج ،
  2. ايام زمان كنا نقدر وبكل بساطة تغيير وقت الكمبيوتر المحلي ، اما هذه الايام ، فيجب ان يكون عندك صلاحية مسؤول ، وبالتالي تجيك رسالة تسألك اذا اردت تغيير التاريخ/الوقت ، واذا نقرت على لا ، ضاع الشغل كله 😁

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

 

هل فيه شيء آخر ممكن اكون سهوت عنه ، ويمكنك تفيدني فيه 🙂

 

جعفر

  • Like 1
قام بنشر
44 دقائق مضت, jjafferr said:

هل فيه شيء آخر ممكن اكون سهوت عنه ، ويمكنك تفيدني فيه 🙂

ممتاز، إذا عرف السبب بطل العجب 🙂 
يبقى احتمال لو أن الموظف غير متعود على غلق البرنامج.

قام بنشر

صارت معانا😁

بس بوجه عام حتى في مثل الحالات، وقت الكمبيوتر المحلي ووقت السيرفر لن يتغيروا، إلا إذا بطارية motherboard الحاسبة المحليةخربانه، بس هذا كذلك يؤثر على الوقت عند تشغيل الكمبيوتر، فلما نفتح البرنامج يتصلح الوضع اثناء عمل البرنامج😊

 

جعفر

قام بنشر

السلام عليكم

ايضا من الحلول اذا كان الانترنت متاح في الاجهزة .. (( مع مراعاة كونه شرطا في تحرير البيانات .. ))

وكما نعلم وما هو حاصل الآن اذا تعطل الانترنت .. توقف كل شيء : الهواتف وغيرها ولما قرأتم تعليقي هذا

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

  • Like 1
قام بنشر

وعليكم السلام اخوي ابوخليل 🙂

 

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

 

جعفر

قام بنشر

فنااااااااااااان كنت ابحث عن الطريق من وقت طويل و عجزت اوصل لها 

شكرا شكرا شكرا من القلب على هذه الهدية الرائعة

  • 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