View Full Version : مبتدی: گرفتن مقدار فیلد یک Query
smh_5800
چهارشنبه 18 اسفند 1389, 10:07 صبح
سلام
من یک Query نوشتم که میاد از 3 تا جدول یک گزارش می گیره
یکی از فیلد هایی که نشون میده تاریخ است که البته میلادی است
من چطوری این تاریخ را بگیرم تا به شمسی تبدیلش کنم و بعد در یکی از ستون های gride نشون بدم
لطفا کمک کنید
ممنون
این هم کد من :
Dim dt As New DataTable()
Dim con As New SqlConnection(AppSettings("connString"))
con.Open()
Dim q1 As String
q1="SELECT dbo.table1.DocDate AS [تاریخ سند], dbo.table2.DocCode AS [کد سند], dbo.table3.DocTitle AS [عنوان سند]" & _
" FROM dbo.table1 INNER JOIN " & _
".............. ادامه " & _
"WHERE (dbo.table2.DocCode = 21) AND (dbo.table3.DocTitle ="
Dim da As New SqlDataAdapter(q1 + DropDownList_Select_DocTitle.SelectedValue + ")", con)
da.Fill(dt)
GridView_Report.DataSource = dt
GridView_Report.DataBind()
con.Close()
alonemm
چهارشنبه 18 اسفند 1389, 10:33 صبح
با سلام :
برای این کار شما باید در رویداد RowDataBound کد نویسی کنید:
if (e.Row.RowType == System.Web.UI.WebControls.DataControlRowType.DataR ow)
{
string dadeteor, miladis;
DateTime miladi;
System.Globalization.PersianCalendar pe = new System.Globalization.PersianCalendar();
miladis = e.Row.Cells[2].Text.ToString ();
miladi = Convert.ToDateTime(miladis);
dadeteor = pe.GetYear(miladi).ToString() + "/" + pe.GetMonth(miladi).ToString() + "/" + pe.GetDayOfMonth(miladi).ToString();
e.Row.Cells[2].Text = dadeteor;
}
soheila_1643
چهارشنبه 18 اسفند 1389, 10:35 صبح
در دیتابیست یک تابع شمسی به میلادی ایجاد کن و در کوءری ازش استفاده کن که تاریخ میلادی رو به شمسی تبدیل کنه و بده:
نمونه یکی از این توابع:
CREATE FUNCTION [dbo].[ShamsiDate](@MDate DateTime)
RETURNS Varchar(10)
AS
BEGIN
DECLARE @SYear as Integer
DECLARE @SMonth as Integer
DECLARE @SDay as Integer
DECLARE @AllDays as float
DECLARE @ShiftDays as float
DECLARE @OneYear as float
DECLARE @LeftDays as float
DECLARE @YearDay as Integer
DECLARE @Farsi_Date as Varchar(100)
SET @MDate=@MDate-CONVERT(char,@MDate,114)
SET @ShiftDays=466699 +2
SET @OneYear= 365.24199
SET @SYear = 0
SET @SMonth = 0
SET @SDay = 0
SET @AllDays = CAst(@Mdate as Real)
SET @AllDays = @AllDays + @ShiftDays
SET @SYear = (@AllDays / @OneYear) --trunc
SET @LeftDays = @AllDays - @SYear * @OneYear
if (@LeftDays < 0.5)
begin
SET @SYear=@SYear+1
SET @LeftDays = @AllDays - @SYear * @OneYear
end;
SET @YearDay = @LeftDays --trunc
if (@LeftDays - @YearDay) >= 0.5
SET @YearDay=@YearDay+1
if ((@YearDay / 31) > 6 )
begin
SET @SMonth = 6
SET @YearDay=@YearDay-(6 * 31)
SET @SMonth= @SMonth+( @YearDay / 30)
if (@YearDay % 30) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 7) * 30)
end
else
begin
SET @SMonth = @YearDay / 31
if (@YearDay % 31) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 1) * 31)
end
SET @SDay = @YearDay
SET @SYear=@SYear+1
SET @Farsi_Date = CAST (@SYear as VarChar(10)) + '/' + CAST (@SMonth as VarChar(10)) + '/' + CAST (@SDay as VarChar(10))
Return @Farsi_Date
END
بعد از ایجاد این تابع به صورت زیر در کوئریت استفاده کن:
SELECT dbo.shamsiDate(DocDate) AS [تاریخ سند]
alonemm
چهارشنبه 18 اسفند 1389, 10:36 صبح
درباره این کد:
در رویداد :
protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
کد رو مینویسیم.
بعد رشته متن تاریخ رو میگیریم و بعد اون رو به تاریخ شمسی تبدیل میکنیم و سپس در همون سلول نمایش میدیم.
(فکر کنم کد کاملا واضح است ).
موفق باشید.
HamidiFar
چهارشنبه 18 اسفند 1389, 10:37 صبح
از این function هنگامیکه تاریخ رو انتخاب میکنی استفاه کن
مثال : به جای
select id,date,quantity from .....
از این استفاده کن :
select id,dbo.fnToPersianDate(date),quantity from .....
CREATE FUNCTION [dbo].[fnToPersianDate]( @Date as SmallDateTime)
RETURNS varchar(10)
AS
BEGIN
DECLARE @Year as int, @Month as int, @Day as int
DECLARE @Year2 as int, @Month2 as int, @Day2 as int
DECLARE @Period as int
DECLARE @pIdx as int, @MonLen as int
DECLARE @n as int
SET @Year = DatePart( yyyy, @Date)
SET @Month = DatePart( m, @Date)
SET @Day = DatePart( d, @Date)
IF @Year < 1970
SET @Period = (@Year - 1897) / 32
ELSE
SET @Period = (@Year - 1897 - 4) / 32
SET @pIdx = (@Year - 1) - 4 * ((@Year - 1) / 4)
SET @Day2 = @Day + CASE
WHEN @Month in (1, 5, 6) THEN 10
WHEN @Month in (2, 4) THEN 11
WHEN @Month in (3, 7, 8, 9, 11, 12) THEN 9
WHEN @Month = 10 THEN 8 END
SET @Day2 = @Day2 - CASE
WHEN @Period < @pIdx - 1 THEN 1
WHEN @Period > @pIdx + 2 THEN -1
ELSE 0 END
SET @MonLen = CASE
WHEN @Month in (1, 2, 10, 11, 12) THEN 30
WHEN @Month = 3 THEN 29
ELSE 31 END
IF @Month > 2 AND @Year = 4 * (@Year / 4)
SET @Day2 = @Day2 + 1
SET @n = (@Year - 1899) - 33 * ( (@Year - 1899) / 33 )
IF @n in (3, 7, 11, 15, 19, 23, 27, 32)
BEGIN
IF @Month > 3
SET @Day2 = @Day2 - 1
IF @Month = 3
SET @MonLen = @MonLen + 1
END
SET @n = @Month
IF @Date < '1900/3/1'
SET @Day2 = @Day2 + 1
IF @Day2 > @MonLen
SET @Day2 = @Day2 - @MonLen
ELSE
SET @n = @n - 1
SET @Month2 = 1 + ( @n + 9 ) - 12 * (( @n + 9) / 12)
IF @Month2 > @Month
SET @Year2 = @Year - 622
ELSE
SET @Year2 = @Year - 621
RETURN (LTRIM( STR( @Year2)) + '/' + LTRIM( STR( @Month2)) + '/' + LTRIM( STR( @Day2)))
END
alonemm
چهارشنبه 18 اسفند 1389, 10:44 صبح
در دیتابیست یک تابع شمسی به میلادی ایجاد کن و در کوءری ازش استفاده کن که تاریخ میلادی رو به شمسی تبدیل کنه و بده:
نمونه یکی از این توابع:
CREATE FUNCTION [dbo].[ShamsiDate](@MDate DateTime)
RETURNS Varchar(10)
AS
BEGIN
DECLARE @SYear as Integer
DECLARE @SMonth as Integer
DECLARE @SDay as Integer
DECLARE @AllDays as float
DECLARE @ShiftDays as float
DECLARE @OneYear as float
DECLARE @LeftDays as float
DECLARE @YearDay as Integer
DECLARE @Farsi_Date as Varchar(100)
SET @MDate=@MDate-CONVERT(char,@MDate,114)
SET @ShiftDays=466699 +2
SET @OneYear= 365.24199
SET @SYear = 0
SET @SMonth = 0
SET @SDay = 0
SET @AllDays = CAst(@Mdate as Real)
SET @AllDays = @AllDays + @ShiftDays
SET @SYear = (@AllDays / @OneYear) --trunc
SET @LeftDays = @AllDays - @SYear * @OneYear
if (@LeftDays < 0.5)
begin
SET @SYear=@SYear+1
SET @LeftDays = @AllDays - @SYear * @OneYear
end;
SET @YearDay = @LeftDays --trunc
if (@LeftDays - @YearDay) >= 0.5
SET @YearDay=@YearDay+1
if ((@YearDay / 31) > 6 )
begin
SET @SMonth = 6
SET @YearDay=@YearDay-(6 * 31)
SET @SMonth= @SMonth+( @YearDay / 30)
if (@YearDay % 30) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 7) * 30)
end
else
begin
SET @SMonth = @YearDay / 31
if (@YearDay % 31) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 1) * 31)
end
SET @SDay = @YearDay
SET @SYear=@SYear+1
SET @Farsi_Date = CAST (@SYear as VarChar(10)) + '/' + CAST (@SMonth as VarChar(10)) + '/' + CAST (@SDay as VarChar(10))
Return @Farsi_Date
END
بعد از ایجاد این تابع به صورت زیر در کوئریت استفاده کن:
SELECT dbo.shamsiDate(DocDate) AS [تاریخ سند]
جسارتا روشی که دوستمون در بالا اشاره کردن باعث دیر لود شدن اطلاعات میشه و اصلا کاربردی نیست
باسلام خدمت شما کاربر عزیز:
درمورد سخن شما که این روش کاربردی نیست.....!
دوست من اولا که فانکشن در دریتابیس از پایین ترین روند لود برخوردار هستند.
اگه میخواید این روش رو پیاده کنید باید از SP استفاده کنید.
بعد شما در این کدی که نوشتید اگه تعداد رکورد ها بالا باشه بسته به اجرای هر رکورد این فانکشن روش اعمال میشه.
اما کدی که من نوشتم بسته به پیجینگ فقط اندازه رکوردهای نمایش داده شده اعمال میشه.
بعد سرعت لود C# بالاتر از قسمت دیتابیس هست.
(لطفا سخنانتون رو با دلیل بگید ......)
موفق باشید.
komeil64
چهارشنبه 18 اسفند 1389, 12:16 عصر
سلام
برای تاریخ
یه کلاس به اسم CalendarUtils.cs درست می کنی
محتواش اینه
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebApplication4.Classes
{
public class CalendarUtils
{
public static void SetCalendar()
{
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "yyyy/MM/dd";
info.LongDatePattern = "yyyy/MM/dd";
info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
System.Threading.Thread.CurrentThread.CurrentCultu re = calture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;
}
public static void SetCalendar2()
{
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
System.Globalization.Calendar cal = new System.Globalization.HijriCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
}
}
}
توی فایل global.aspx توی رویداد Application_BeginRequest این کد رو می نویسید:
Classes.CalendarUtils.SetCalendar();
حالا توی سایت شما هر جایی تاریخ رو نشون میده خود بخود و اتوماتیک شمسی نشونش میده
حالشو ببر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.