PDA

View Full Version : مبتدی: درج تاریخ خروج بر اساس تاریخ ورود در سیستم حضور و غیاب



پیام حیاتی
جمعه 08 مرداد 1395, 19:22 عصر
سلام عزیزان
این جدول من هست :
141741
کوئری برای دکمه حضور :

DateTime time = DateTime.Now;
string formatDate = "yyyy-MM-dd HH:MM:ss";
//time.ToString(formatDate)

string connectionString = "Data Source=(local);Initial Catalog=Attendance;Integrated Security=SSPI;";
SqlConnection conObj = new SqlConnection(connectionString);
//UPDATE hozor SET enter_date=CURDATE() where user_id = 1 and date(exit_date) = CURDATE()
string commandText = "UPDATE users SET u_enter_date= '" + time.ToString(formatDate) + "' Where u_user='" + username1 + "' ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
conObj.Close();


الآن برای دکمه خروج این کوئری رو میزنم :

DateTime time2 = DateTime.Now;
string formatDate2 = "yyyy-MM-dd HH:MM:ss";


string connectionString = "Data Source=(local);Initial Catalog=Attendance;Integrated Security=SSPI;";
SqlConnection conObj = new SqlConnection(connectionString);
string commandText = "UPDATE users SET u_exit_date= '" + time2.ToString(formatDate2) + "' Where u_user='" + username2 + "' and u_enter_date='" + time2.ToString(formatDate2) + "' ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
conObj.Close();

ولی هیچ چیز insert نمیشه در فیلد u_exit_date?

mrprestige
جمعه 08 مرداد 1395, 19:37 عصر
سلام دوست من وقتتون بخیر ، دوست من در مرحله اول بگم که ضمیمه ای که فرستادی آدرسش یا اشتباه یا حذف شده مسئله بعد اینه که اگه از DataCommand های پارامتر دار استفده میکردی بهتر بود . و اینکه میشه بگی فیلد exit_date رو از چه نوعی گرفتی ؟

reza_ali202000
جمعه 08 مرداد 1395, 19:47 عصر
سلام عزیزان
این جدول من هست :
141741
کوئری برای دکمه حضور :

DateTime time = DateTime.Now;
string formatDate = "yyyy-MM-dd HH:MM:ss";
//time.ToString(formatDate)

string connectionString = "Data Source=(local);Initial Catalog=Attendance;Integrated Security=SSPI;";
SqlConnection conObj = new SqlConnection(connectionString);
//UPDATE hozor SET enter_date=CURDATE() where user_id = 1 and date(exit_date) = CURDATE()
string commandText = "UPDATE users SET u_enter_date= '" + time.ToString(formatDate) + "' Where u_user='" + username1 + "' ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
conObj.Close();


الآن برای دکمه خروج این کوئری رو میزنم :

DateTime time2 = DateTime.Now;
string formatDate2 = "yyyy-MM-dd HH:MM:ss";


string connectionString = "Data Source=(local);Initial Catalog=Attendance;Integrated Security=SSPI;";
SqlConnection conObj = new SqlConnection(connectionString);
string commandText = "UPDATE users SET u_exit_date= '" + time2.ToString(formatDate2) + "' Where u_user='" + username2 + "' and u_enter_date='" + time2.ToString(formatDate2) + "' ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
conObj.Close();

ولی هیچ چیز insert نمیشه در فیلد u_exit_date?
سلام شرط دستور خروجتون رو یه بار دیگه بررسی کنید. شما گفتین که با مقدار تایم 2 پر بشه به شرطی که برابر تایم2 باشه.

پیام حیاتی
جمعه 08 مرداد 1395, 20:29 عصر
سلام دوست من وقتتون بخیر ، دوست من در مرحله اول بگم که ضمیمه ای که فرستادی آدرسش یا اشتباه یا حذف شده مسئله بعد اینه که اگه از DataCommand های پارامتر دار استفده میکردی بهتر بود . و اینکه میشه بگی فیلد exit_date رو از چه نوعی گرفتی ؟



141752

این جدول در بانک

پیام حیاتی
جمعه 08 مرداد 1395, 20:33 عصر
سلام شرط دستور خروجتون رو یه بار دیگه بررسی کنید. شما گفتین که با مقدار تایم 2 پر بشه به شرطی که برابر تایم2 باشه.
تایم ۲ زمان و تاریخ جاری هست که متفاوت با زمان و تاریخ ورود هست اگر where نزنم روی تاریخ روی رکورد قبلی بروزرسانی میشه

Mahmoud.Afrad
جمعه 08 مرداد 1395, 23:03 عصر
طبق شرطی که نوشتید رکوردی آپدیت می شود که تاریخ ورود با تاریخ خروج برابر باشد که در این سناریو ممکن نیست.
برای جلوگیری از افزونگی داده ها ، جدول User را از جدول ثبت ورود و خروج جدا کنید.
با فرض اینکه میخواهید در یک رکورد هم ورود و هم خروج را داشته باشید :
برای دکمه ورود ، یک رکورد جدید ایجاد میکنید
برای دکمه خروج ، بایست آخرین سطری که آیدی یوزر مورد نظر را دارد و زمان خروج آن null است زا بدست بیارید. اگر چنین سطری وجود داشت آن را آپدیت کنید و در صورت null بودن پیغام بدهید.

میتونید دکمه ورود و خروج را ترکیب کنید در این حالت کوئری را با شرط مناسب ترکیب میکنید.
و البته راه حلی هم برای ورود و خزوج متعدد در یک روز کاری بایست اندیشیده شود.

ژیار رحیمی
جمعه 08 مرداد 1395, 23:18 عصر
دوست گرامی شما در کویری ،تاریخ خروج رو در قسمت Where مورد مقایسه قرار دادی(باید تاریخ ورود رو قرار بدی).

string commandText = "UPDATE users SET u_exit_date= '" + time2.ToString(formatDate2) + "' Where u_user='" + username2 + "' and u_enter_date='" + time1.ToString(formatDate1) + "' ";


time2=تاریخ و ساعت خروج
time1=تاریخ و ساعت ورود

پیام حیاتی
جمعه 08 مرداد 1395, 23:55 عصر
دوست گرامی شما در کویری ،تاریخ خروج رو در قسمت Where مورد مقایسه قرار دادی(باید تاریخ ورود رو قرار بدی).

string commandText = "UPDATE users SET u_exit_date= '" + time2.ToString(formatDate2) + "' Where u_user='" + username2 + "' and u_enter_date='" + time1.ToString(formatDate1) + "' ";


time2=تاریخ و ساعت خروج
time1=تاریخ و ساعت ورود
time1 در دکمه خروج قابل شناسایی نیست چون در دکمه ورود تعریف شده ، به همین خاطر یک متغیر public به نام t1 ایجاد کردم و مقدارش رو در دکمه ورود برابر time1 قرار دادم ، اما باز در دکمه ثبت اطلاعات خروج قابل شناسایی نیست.

DateTime time1 = DateTime.Now;
t1 = time1.ToString();


خطا :
141765

این کل کدهای فرم :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Globalization;


namespace Attendance
{
public partial class User : Form
{
private string p;


public User()
{
InitializeComponent();

}


public string username1;
public string username2;


public string formatDate1 = "";
public string formatDate2 = "";


public string t1 = "";
public string t2 = "";




private void buttLogin_Click(object sender, EventArgs e)
{
Application.Exit();
}


private void User_Load(object sender, EventArgs e)
{
//textBox1.Text = "Hello" + Form1.quantity;
label1.Text = Form1.quantity + " ، سلام";

}


private void buttImport_Click(object sender, EventArgs e)
{
username1 = Form1.quantity;
PersianCalendar p = new PersianCalendar();
DateTime dmiladi = new DateTime();
dmiladi = DateTime.Now;
string persian_date = p.GetYear(dmiladi).ToString() + "/" + p.GetMonth(dmiladi).ToString() + "/" + p.GetDayOfMonth(dmiladi).ToString();

DateTime time1 = DateTime.Now;
t1 = time1.ToString();
formatDate1 = "yyyy-MM-dd HH:MM:ss";
//time.ToString(formatDate)

string connectionString = "Data Source=(local);Initial Catalog=Attendance;Integrated Security=SSPI;";
SqlConnection conObj = new SqlConnection(connectionString);
//UPDATE hozor SET enter_date=CURDATE() where user_id = 1 and date(exit_date) = CURDATE()
string commandText = "UPDATE users SET u_enter_date= '" + time1.ToString(formatDate1) + "' Where u_user='" + username1 + "' ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
conObj.Close();




MessageBox.Show("تاریخ و زمان ورد شما با موفقیت ثبت شد", "خوش آمدید", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();


}


private void buttExit_Click(object sender, EventArgs e)
{
username2 = Form1.quantity;
DateTime time2 = DateTime.Now;
formatDate2 = "yyyy-MM-dd HH:MM:ss";


string connectionString = "Data Source=(local);Initial Catalog=Attendance;Integrated Security=SSPI;";
SqlConnection conObj = new SqlConnection(connectionString);
string commandText = "UPDATE users SET u_exit_date= '" + time2.ToString(formatDate2) + "' Where u_user='" + username2 + "' and u_enter_date='" + t1.ToString(formatDate1) + "' ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
conObj.Close();




MessageBox.Show("تاریخ و زمان خروج شما با موفقیت ثبت شد", "خدا نگهدار", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}




}
}

ژیار رحیمی
شنبه 09 مرداد 1395, 01:24 صبح
دوست گرامی روش پیاده سازی شما کارامد نیست طبق فرمایشات جناب افراد عمل کنید.
دلیل خطای شما اینه که شما متغییر سراسری t1 رو که از نوع Date هست به string تبدیل کردی و در داخل کویری به این تاریخ که از نوع String هست متد FormatString رو روی آن پیاده سازی میکنی که اشتباه هست شما متغییر t1 رو از نوع Date داشته باش و در کویری به فرمت مورد نظر تبدیل کن

DateTime t1 = DateTime.Now;

پیام حیاتی
شنبه 09 مرداد 1395, 17:48 عصر
طبق شرطی که نوشتید رکوردی آپدیت می شود که تاریخ ورود با تاریخ خروج برابر باشد که در این سناریو ممکن نیست.
برای جلوگیری از افزونگی داده ها ، جدول User را از جدول ثبت ورود و خروج جدا کنید.
با فرض اینکه میخواهید در یک رکورد هم ورود و هم خروج را داشته باشید :
برای دکمه ورود ، یک رکورد جدید ایجاد میکنید
برای دکمه خروج ، بایست آخرین سطری که آیدی یوزر مورد نظر را دارد و زمان خروج آن null است زا بدست بیارید. اگر چنین سطری وجود داشت آن را آپدیت کنید و در صورت null بودن پیغام بدهید.

میتونید دکمه ورود و خروج را ترکیب کنید در این حالت کوئری را با شرط مناسب ترکیب میکنید.
و البته راه حلی هم برای ورود و خزوج متعدد در یک روز کاری بایست اندیشیده شود.

برای دکمه ورود رکورد مجزایی در نظر گرفتم که تاریخ و زمان ورود را دریافت می کند:

string commandText = "UPDATE users SET u_enter_date='" + dateing.ToString(formatDate1) + "' , u_enter_time='" + DateTime.Now.ToString("HH:mm:ss") + "' , u_persian_date='" + persian_date + "' , u_hour='" + time.ToString(format_hour) + "' ";

برای دکمه خروج این کوئری رو زدم :

string commandText = "UPDATE users SET u_exit_date='" + dateing.ToString(formatDate2) + "' , u_exit_time= '" + DateTime.Now.ToString("HH:mm:ss") + "' Where u_user='" + username + "' and u_enter_date IS NOT NULL ";

نتیجه :

141789

آیا این روش بدین شکل درست هست ؟

تشکر

Mahmoud.Afrad
شنبه 09 مرداد 1395, 21:26 عصر
من یک جدول به صورت زیر ایجاد کردم
CREATE TABLE [dbo].[EnterExitLog](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NULL,
[EnterDate] [datetime] NULL,
[ExitDate] [datetime] NULL,
CONSTRAINT [PK_EnterExitLog] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
UserId آیدی یوزر هست.
به صورت زیر میتونید انجام بدید(یک دکمه برای ثبت ورود و خروج)

declare @logId int;

select top(1) @logid=id
from EnterExitLog
where UserId = @userid and ExitDate is null
order by EnterDate desc;

if (@logId is not null)
update EnterExitLog
set ExitDate=GETDATE()
where Id=@logId
else
insert into EnterExitLog(UserId, EnterDate)
values (@userid, GETDATE())
@userid آیدی یوزر هست.
@logId آیدی روکوردی هست که در صورت وجود باید آپدیت بشه و در صورت عدم وجود رکورد جدید ثبت بشه.