PDA

View Full Version : مشکل با تاریخ



akbarg64
جمعه 04 شهریور 1390, 22:08 عصر
سلام.من یه پروژه دارم.که تحویل دادم.اما متاسفانه مشتری از یه نرم افزاری استفاده میکنه که باید تاریخ رو دستکاری کنند تا تاریخ دقیق رو نشون بده.این وسط پروژه من به هم میرزه و متاسفانه خیلی از قسمت هاش با تاریخ سروکار داره.مثل قسمت بکاپ و ....راهی هست که خود پروژه تاریخ جدا داشته باشه و کاری به تاریخ سیستم نداشته باشه؟؟؟؟؟؟؟ممنون میشم کمک کنید

محسن واژدی
شنبه 05 شهریور 1390, 13:42 عصر
سلام علیکم
تا آنجایی که بنده اطلاع دارم این امکان وجود ندارد بدلیل آنکه همه توابع زمان و تاریخ وابسته به تغییرات زمان و تاریخ سیستم هستند

akbarg64
شنبه 05 شهریور 1390, 14:15 عصر
ممنون.میشه راهنمایی بکنید دقیقا الان چه راه هایی وجود داره به جز این راه؟؟؟؟؟یعنی باید همینجوری باشه؟؟؟؟؟؟؟؟ممنون

محسن واژدی
شنبه 05 شهریور 1390, 15:02 عصر
متاسفانه راه خاصی به ذهنم نمیرسه

setroyd
شنبه 05 شهریور 1390, 15:02 عصر
منم ندیدم فک نکنم بشه یه چنتا تءوری به ذهنم اومند ولی دیدم شدنی نیست اگرم بشه % خطا کردنش زیاده .

butterfly8528
شنبه 05 شهریور 1390, 18:13 عصر
سلام .
دوست عزیز شما میتونید تاریخ رو از یک برنامه تحت وب یا یک وب سایت بخونید .
موفق باشید .

akbarg64
شنبه 05 شهریور 1390, 18:50 عصر
سلام.میشه در این مورد بیشتر توضیح بدین.چطور باید این کار رو بکنم؟

butterfly8528
یک شنبه 06 شهریور 1390, 02:09 صبح
سلام دوست عزیز .
خواندن تاریخ و ساعت از یک سرور امر مهمی هست که علاوه بر این مورد شما در مواردی مثل ایجاد محدودیت های زمانی برای برنامه کاربرد زیادی داره .
انشاالله به زودی آموزش کامل انجام این کار رو به همراه سورس به صورت آموزش قرار میدم که همه استفاده بکنند .

ali reza mansoori 2
یک شنبه 06 شهریور 1390, 09:36 صبح
اگر تاریخ دستکاری شده ثابت باشه میشه کاری کرد
به عنوان مثال اگر تاریخ جاری با تاریخ سیستم طرف همیشه 100 روز تفاوت داشت اونوقت تو میتونی تاریخ های داخل برنامه تو با تفاضل این 100 روز حصاب کنی

akbarg64
یک شنبه 06 شهریور 1390, 13:03 عصر
سلام.نه متاسفانه ثابت نیست.یعنی امسال 5 سال تفاوت داره.یعنی نرم افزار من سال 85 رو نشون میده.اما سال بعد باید دوباره تاریخ دستکاری بشه تا اون نرم افزار بتونه تاریخ شمسی خودش رو درست نمایش بده و چون اون هم نرم افزار حسابداریشون هست و مهمه کاری نمیشه کرد.البته سیستم ها شبکه هستند و این مشکل فقط در بخش حسابداری وجود داره و اتفاقا این نرم افزار من هم برای قسمت حسابداری هست.بقیه بخش ها تاریخشون درست هست میشه تاریخ رو از روی یه سیستم دیگه بخونه؟؟؟؟؟؟؟چون بالاخره همیشه سایت ممکنه در دسترس نباشه یا اتصال به اینترنت.اما همیشه اتصال به شبکه داخلی وجود داره یعنی سستم ها همیشه با هم شبکه هستند.ممنون میشم در این مورد راهنمایی کنید.

setroyd
یک شنبه 06 شهریور 1390, 13:29 عصر
اگه سیستمشون خرابه و تاریخ جابجا میشه مشکل از برنامه نویسی شما نیست بگو باطری bios سیستمشون رو عوض کنن .

akbarg64
یک شنبه 06 شهریور 1390, 14:12 عصر
خوب منم میدونم مشکل از برنامه نویسی من نیست.چون دارن از یه نرم افزار حسابداری خیلی قدیمی استفاده میکنن.که تاریخ شمسی اون مشکل داره.واسه همین خود کاربر مجبوره تاریخ رو تغییر بده تا نرم افزار درست تاریخ رو نشون بده.البته به من اجازه مشاهده نرم افزار رو ندادن و گفتند حسابداریه.

ali reza mansoori 2
یک شنبه 06 شهریور 1390, 14:16 عصر
از روی شبکه فکر کنم بشه ولی یه پیشنهاد دیگه دارم
شما داخل برنامتون یه فرم مثل عکسی که ضمیمه کردم اضافه کنید تا خود کاربر بتونه تفاوت تاریخ سیستم با تاریخ جاری رو حساب کنه
بعد این تفاوت رو داخل بانک ذخیره کنید و در کل برنامه ازش استفاده کنید

setroyd
یک شنبه 06 شهریور 1390, 15:17 عصر
نه اینجوری که نمیشه هر دفه طرف اختلاف رو دست شمار کنه !!!! شما بگو هرجا که بری همینه و کسی نیست که بتونه این برنامه ای رو که میخواین براتون بنویسه اگه دیدی گفتن ما اینجوری میخوایم همونطور ali reza mansoori 2 (http://barnamenevis.org/member.php?70009-ali-reza-mansoori-2) گفت همون کارو بکن .

m2011kh
یک شنبه 06 شهریور 1390, 15:49 عصر
میشه شما یه کاری کنی که وقتی برنامه باز میشه ساعت رو از کاربر بپرسه و تا وقتی کامپیوتر خاموش میشه از اون ساعت استفاده کنید.
و به این علت یه فروم مخفی درست کنید که اون تاریخ رو که از کاربر دریافت کرده رو هر ثانیه یک ثانیه بهش اضافه کنه.
یا اینکه با استفاده از شبکه از سیستم هایی که ساعتشون درسته ساعت رو دریافت کنی که فکر کنم خیلی مشکل باشه.
اگه درباره شبکه راهنمایی خواستید بگید راهنماییتون کنم.

akbarg64
یک شنبه 06 شهریور 1390, 16:03 عصر
سلام.ممنون از همه جناب m2022kh میشه در این مورد شبکه کمکم کنید.ممنون میشم.

m2011kh
یک شنبه 06 شهریور 1390, 16:20 عصر
بین سیستم هایی که شبکه هستند یه پوشه مشترک هم وجود داره
شما تو سیستمی که ساعتش درسته یه برنامه درست میکنی که ساعت درست رو تو پوشته مشترک تو یه فایل کپی کنه بعد تو با برنامه اصلی اونو بردار و ازش استفاده کن.
راه های دیگری هم هست که باید فرصت باشه که تو اینجا نمیشه.
اگه خواستید میتونم تو چت یاهو میتونم راهنماییتون کنم.
اگه خواستید با هم چت کنیم در این مورد به ایمیلم جواب رو ارسال کنید:
M2011.m.kh@Gmail.com

butterfly8528
یک شنبه 06 شهریور 1390, 16:46 عصر
آموزش به دست آوردن تاریخ و ساعت سرور (http://barnamenevis.org/showthread.php?302508-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D9%87-%D8%AF%D8%B3%D8%AA-%D8%A2%D9%88%D8%B1%D8%AF%D9%86-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%88-%D8%B3%D8%A7%D8%B9%D8%AA-%D8%B3%D8%B1%D9%88%D8%B1&p=1327486#post1327486)

akbarg64
یک شنبه 06 شهریور 1390, 17:12 عصر
سلام.دانلود کردم عالی بود.جناب butterfly8528 از طریق سیستم هایی که با هم شبکه هستند چطور بدست بیارم.ممنون میشم در این زمینه بهم کمک کنید.چون بلاخره ممکنه به هر علت ارتباط برقرار نشه.برای محکم کاری میخوام اگه نشد از طریق سیستم هایی که شبکه هستند خود برنامه پیدا کنه.ممنون.

butterfly8528
یک شنبه 06 شهریور 1390, 18:07 عصر
سلام .
برای این کار باید دو برنامه جدا از هم به صورت سرور و کلاینت بنویسید .برنامه کلاینت بر روی سیستمی نصب میشه که تاریخ و ساعتش درست باشه.
برنامه ها باید طوری باشه که که سرور درخواست بده و کلاینت تاریخ و ساعت سیستم رو برای سرور ارسال کنه .
در مورد سرور،کلاینت و از این قبیل برنامه ها در قسمت برنامه نویسی شبکه همین بخش نمونه زیاده،جستجو کنید به نتیجه میرسید .
موفق باشید .

akbarg64
یک شنبه 06 شهریور 1390, 19:01 عصر
سلام.من یه کلاینت سرور اماده کردم و خوب هم کار میکنه.مشکل اینجاست که کاربر باید ادرس کلاینت رو وارد کنه.چون ای پی ها ممکنه تغییر کنه.میخوام خود برنامه بدون دخالت کاربر ای پی رو پیدا کنه.فرض کنید پورت مورد نظر 1000 است.یعنی اگه ای پی 192.168.1.12 باشه . روز بعد 192.168.1.10 شد مشکلی پیش نیاد.

setroyd
یک شنبه 06 شهریور 1390, 20:36 عصر
شما باید بخونی ip رو از سیستم خیلی کد در این رابطه هست یه سرچ کن اگه پیدا نکردی برات میزارم .

akbarg64
یک شنبه 06 شهریور 1390, 21:23 عصر
سلام.میشه برام بزارین؟؟؟؟؟؟ممنون میشم.

setroyd
یک شنبه 06 شهریور 1390, 22:10 عصر
Private Declare Function GetIpAddrTable_API Lib "IpHlpApi" Alias "GetIpAddrTable" (pIPAddrTable As Any, pdwSize As Long, ByVal bOrder As Long) As Long

' Returns an array with the local IP addresses (as strings).
' Author: Christian d'Heureuse, www.source-code.biz
Public Function GetIpAddrTable()
Dim Buf(0 To 511) As Byte
Dim BufSize As Long: BufSize = UBound(Buf) + 1
Dim rc As Long
rc = GetIpAddrTable_API(Buf(0), BufSize, 1)
If rc <> 0 Then Err.Raise vbObjectError, , "GetIpAddrTable failed with return value " & rc
Dim NrOfEntries As Integer: NrOfEntries = Buf(1) * 256 + Buf(0)
If NrOfEntries = 0 Then GetIpAddrTable = Array(): Exit Function
ReDim IpAddrs(0 To NrOfEntries - 1) As String
Dim i As Integer
For i = 0 To NrOfEntries - 1
Dim j As Integer, s As String: s = ""
For j = 0 To 3: s = s & IIf(j > 0, ".", "") & Buf(4 + i * 24 + j): Next
IpAddrs(i) = s
Next
GetIpAddrTable = IpAddrs
End Function



' Test program for GetIpAddrTable.
Public Sub Test()
Dim IpAddrs
IpAddrs = GetIpAddrTable
Debug.Print "Nr of IP addresses: " & UBound(IpAddrs) - LBound(IpAddrs) + 1
Dim i As Integer
For i = LBound(IpAddrs) To UBound(IpAddrs)
Print IpAddrs(i)
Next
End Sub

Private Sub Form_Load()
Me.AutoRedraw = True
Call Test
Me.Refresh
End Sub

butterfly8528
دوشنبه 07 شهریور 1390, 01:16 صبح
سلام .

سلام.من یه کلاینت سرور اماده کردم و خوب هم کار میکنه.مشکل اینجاست که کاربر باید ادرس کلاینت رو وارد کنه.چون ای پی ها ممکنه تغییر کنه.میخوام خود برنامه بدون دخالت کاربر ای پی رو پیدا کنه.فرض کنید پورت مورد نظر 1000 است.یعنی اگه ای پی 192.168.1.12 باشه . روز بعد 192.168.1.10 شد مشکلی پیش نیاد.
عزیز جان اصلا نیازی به پیدا کردن IP کلاینت نداری ، با فرض اینکه IP سرور ثابت هست :
1 - سرور بر روی پورت مورد نظر مثلا 5555 Listen میکنه .
2 - کلاینت به IP و Port سرور کانکت میشه .
3 - سرور درخواست اتصال رو قبول می کنه و ارتباط برقرار میشه.
4 - سرور با ارسال یک پکت (یک رشته، مثلا "SendDateTime") به کلاینت ، درخواست ارسال تاریخ و ساعت میکنه .
5 - کلاینت هم با دریافت این پکت ، تاریخ و ساعت جاری سیستم رو برای سرور میفرسته .
همین .
موفق باشید :لبخندساده:.

akbarg64
دوشنبه 07 شهریور 1390, 04:01 صبح
سلام.متوجه نشدم دقیقا منظورتون رو.نمونه ای که اینکار رو بکنه ندارین ؟؟؟؟؟ ممنون میشم.

butterfly8528
دوشنبه 07 شهریور 1390, 15:19 عصر
سلام .
دوست عزیز بنده تمام مراحل کار رو برای شما خیلی ساده توضیح دادم،دلیل اینکه متوجه نشدید این هست که با وینساک و کلا نحوه ایجاد ارتباط بین سرور-کلاینت آشنایی ندارید .
نوشتن این برنامه خیلی سادست،لطفا یکم خودتون رو درگیر کنید با مسئله ای که قرار هست حلش کنید . نمونه کد هم فراونه !
باز هم اگه سعیتون رو کردید و نتونستید حلش کنید بگید که نمونه کد بدم بهتون .
موفق باشید :چشمک:.

akbarg64
دوشنبه 07 شهریور 1390, 20:22 عصر
سلام.ممنون.مشکلم کار کردن با وینساک نیست اون قسمتش رو هم حتی تکمیل کردم.هم بدست اوردن تاریخ از طریق اینترنت و هم شبکه.مشکل اینجاست که شما فرمودین نیازی به بدست اوردن ای پی کلاینت نداری؟؟قصد من اینه که اصلا کاربر کاری به ای پی نداشته باشه.و خودش خودکار ای پی رو پیدا کنه.چون باید احتمال اینکه ای پی ها تغییر کنه رو بدم.مثلا بدست اوردن تاریخ از طریق اینترنت رو کاربر نمیفهمه چه اتفاقی میوفته اونم میخوام اینکار رو بکنم.البته یه فکری به ذهنم رسید که رنج ای پی رو اسکن کنم ولی خوب فکر کنم جواب گو نباشه و سرعت یه کم پایین بیاد درسته؟؟؟؟؟؟ممنون

butterfly8528
سه شنبه 08 شهریور 1390, 02:44 صبح
سلام .

عزیز جان اصلا نیازی به پیدا کردن IP کلاینت نداری ، با فرض اینکه IP سرور ثابت هست :
IP سیستمی که برنامه شما بر روی اون نصب میشه ثابته ؟

akbarg64
سه شنبه 08 شهریور 1390, 03:49 صبح
چند بار که من دیدم ثابت بود اما احتمال عوض شدن وجود داره چون ای پی ها خودکار ست میشن و دستی کار نمیکنه که بخواد هر سیستم یه ای پی مشخص داشته باشه.

butterfly8528
سه شنبه 08 شهریور 1390, 15:29 عصر
سلام .
به هر حال شما باید برای برقراری ارتباط بین سرور و کلاینت یک IP رو داشته باشید . البته اگر نام کامپیوتر ها هم غیر تکراری انتخاب شده باشه،میشه بجای IP از نام کامپیوتر سرور استفاده کنید .
به نظر من برای کارتون بهتره تاریخ رو از اینترنت بگیرید .
موفق باشید .

quiet_programmer
سه شنبه 08 شهریور 1390, 19:48 عصر
با عرض سلام و تبریک عید فطر و قبولی طاعات و عبادات.

برای دریافت IP یک سیستم کافیه فقط اسم اون کامپیوتر رو داشته باشی و از کد زیر استفاده کنی.

یه ماژول add کن و کد زیر رو داخلش پیست کن:

Private Const WS_VERSION_REQD = &H101
Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD = 1
Private Const SOCKET_ERROR = -1
Private Const WSADescription_Len = 256
Private Const WSASYS_Status_Len = 128

Private Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type

Private Type WSADATA
wversion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpszVendorInfo As Long
End Type

Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Integer, lpWSAData As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long

Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$, ByVal HostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname$) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)
Function hibyte(ByVal wParam As Integer)
hibyte = wParam \ &H100 And &HFF&
End Function

Function lobyte(ByVal wParam As Integer)
lobyte = wParam And &HFF&
End Function

Public Function GetLocalHostName() As String
Dim hostname As String * 256

If gethostname(hostname, 256) = SOCKET_ERROR Then
GetLocalHostName = "<Error>"
Else
GetLocalHostName = Trim$(hostname)
End If
End Function

Public Sub InitializeSockets()
Dim WSAD As WSADATA
Dim iReturn As Integer
Dim sLowByte As String, sHighByte As String, sMsg As String

iReturn = WSAStartup(WS_VERSION_REQD, WSAD)

If iReturn <> 0 Then
MsgBox "Winsock.dll is not responding."
End
End If

If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = _
WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then

sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
sMsg = "Windows Sockets version " & sLowByte & "." & sHighByte
sMsg = sMsg & " is not supported by winsock.dll "
MsgBox sMsg
End
End If

'iMaxSockets is not used in winsock 2. So the following check is only
'necessary for winsock 1. If winsock 2 is requested,
'the following check can be skipped.

If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
sMsg = "This application requires a minimum of "
sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets."
MsgBox sMsg
End
End If

End Sub

Private Sub CleanupSockets()
Dim lReturn As Long

lReturn = WSACleanup()

If lReturn <> 0 Then
MsgBox "Socket error " & Trim$(Str$(lReturn)) & " occurred in Cleanup "
End
End If

End Sub

Public Function GetIPAddressFromHostName(ByVal hostname As String) As String
Dim hostent_addr As Long
Dim host As HOSTENT
Dim hostip_addr As Long
Dim temp_ip_address() As Byte
Dim i As Integer
Dim ip_address As String
Dim result As String

hostent_addr = gethostbyname(hostname)
If hostent_addr = 0 Then
IPAddressFromHostName = ""
Exit Function
End If

RtlMoveMemory host, hostent_addr, LenB(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4

' Get multiple pieces of the IP address
' if machine is multi-homed.
Do
ReDim temp_ip_address(1 To host.hLength)
RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength

For i = 1 To host.hLength
ip_address = ip_address & temp_ip_address(i) & "."
Next

ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
result = result & ip_address & vbCrLf
ip_address = ""

host.hAddrList = host.hAddrList + LenB(host.hAddrList)
RtlMoveMemory hostip_addr, host.hAddrList, 4
Loop While (hostip_addr <> 0)

' Remove the last vbCrLf.
If Len(result) > 0 Then result = Left$(result, Len(result) - Len(vbCrLf))

GetIPAddressFromHostName = result
End Function

بعد داخل فرم تو اینت form load تابع InitializeSockets رو از ماژول بالا فراخوانی کن.
با استفاده از تابع GetIPAddressFromHostName میتونی آدرس IP اون سیستم رو بدست بیاری. مثلا اگه نام کامپیوتر Quiet_PC باشه از تابع به شکل زیر استفاده کن.

Me.Caption=Module1.GetIPAddressFromHostName("Quiet_PC")

یاحق.
موفق باشید.