מיון תאריכים המוצגים כחודש ושנה בסדר כרונולוגי
-
@dovid כתב במיון תאריכים המוצגים כחודש ושנה בסדר כרונולוגי:
תביא את דוגמת הקוד שלך.
string[] uniqueAncType = dt.AsEnumerable().Select(x => x.Field<string>("חודשושנה")).Distinct().ToArray(); DataTable pivot = new DataTable(); pivot.Columns.Add("שם מוצר", typeof(string)); pivot.Columns.Add("ברקוד", typeof(string)); pivot.Columns.Add("קבוצה", typeof(string)); pivot.Columns.Add("מלאי נוכחי", typeof(double)); foreach (string col in uniqueAncType) { pivot.Columns.Add(col, typeof(string)); } var groups = dt.AsEnumerable() .GroupBy(x => new { anc_region = x.Field<string>("שם מוצר"), opr_hr = x.Field<string>("ברקוד"), anc_grop = x.Field<string>("קבוצה"), opr_hr1 = x.Field<double>("מלאי נוכחי"), }).ToList(); foreach (var group in groups) { DataRow newRow = pivot.Rows.Add(); newRow["שם מוצר"] = group.Key.anc_region; newRow["ברקוד"] = group.Key.opr_hr; newRow["מלאי נוכחי"] = group.Key.opr_hr1; newRow["קבוצה"] = group.Key.anc_grop; foreach (DataRow ancType in group) { newRow[ancType.Field<string>("חודשושנה")] = ancType.Field<double>("כמות מכירות"); } } dataGridView1.DataSource = pivot;
-
CREATE TABLE Sales ([date] datetime, [Barcode] int, [product_name] varchar(50),[GGroup] varchar(50),[stock] int, [quantity] int) ; INSERT INTO Sales ([date] , [Barcode] , [product_name] ,[GGroup],[stock] , [quantity] ) VALUES ('2022-01-01 12:00:00', 2885, 'Cookware','microwave',25,1), ('2022-01-06 13:00:00', 2885, 'Cookware','microwave',25,2), ('2022-02-01 14:00:00', 2885, 'Cookware','microwave',25,3), ('2022-02-05 15:00:00', 2885, 'Cookware','microwave',25,4), ('2022-03-05 16:00:00', 2885, 'Cookware','microwave',25,5), ('2022-03-06 17:00:00', 2885, 'Cookware','microwave',25,6), ('2022-04-07 18:00:00', 2885, 'Cookware','microwave',25,7), ('2022-04-08 19:00:00', 2885, 'Cookware','microwave',25,8), ('2022-05-09 20:00:00', 2885, 'Cookware','microwave',25,9), ('2022-05-10 21:00:00', 2885, 'Cookware','microwave',25,10), ('2022-06-11 22:00:00', 2885, 'Cookware','microwave',25,11), ('2022-06-12 23:00:00', 2885, 'Cookware','microwave',25,12), ('2022-07-13 11:00:00', 2885, 'Cookware','microwave',25,13), ('2022-07-14 10:00:00', 2885, 'Cookware','microwave',25,14), ('2022-01-01 12:00:00', 3665, 'Appliances','refrigerator',12,15), ('2022-01-06 13:00:00', 3665, 'Appliances','refrigerator',12,16), ('2022-02-01 14:00:00', 3665, 'Appliances','refrigerator',12,17), ('2022-02-05 15:00:00', 3665, 'Appliances','refrigerator',12,18), ('2022-03-05 16:00:00', 3665, 'Appliances','refrigerator',12,19), ('2022-03-06 17:00:00', 3665, 'Appliances','refrigerator',12,20), ('2022-04-07 18:00:00', 3665, 'Appliances','refrigerator',12,21), ('2022-04-08 19:00:00', 3665, 'Appliances','refrigerator',12,22), ('2022-05-09 20:00:00', 3665, 'Appliances','refrigerator',12,23), ('2022-05-10 21:00:00', 3665, 'Appliances','refrigerator',12,24), ('2022-06-11 22:00:00', 3665, 'Appliances','refrigerator',12,25), ('2022-06-12 23:00:00', 3665, 'Appliances','refrigerator',12,26), ('2022-07-13 11:00:00', 3665, 'Appliances','refrigerator',12,27), ('2022-07-14 10:00:00', 3665, 'Appliances','refrigerator',12,28), ('2022-01-01 12:00:00', 2885, 'Cookware','microwave',25,1), ('2022-01-06 13:00:00', 2885, 'Cookware','microwave',25,2), ('2022-02-01 14:00:00', 2885, 'Cookware','microwave',25,3), ('2022-02-05 15:00:00', 2885, 'Cookware','microwave',25,4), ('2022-03-05 16:00:00', 2885, 'Cookware','microwave',25,5), ('2022-03-06 17:00:00', 2885, 'Cookware','microwave',25,6), ('2022-04-07 18:00:00', 2885, 'Cookware','microwave',25,7), ('2022-04-08 19:00:00', 2885, 'Cookware','microwave',25,8), ('2022-05-09 20:00:00', 2885, 'Cookware','microwave',25,9), ('2022-05-10 21:00:00', 2885, 'Cookware','microwave',25,10), ('2022-06-11 22:00:00', 2885, 'Cookware','microwave',25,11), ('2022-06-12 23:00:00', 2885, 'Cookware','microwave',25,12), ('2022-07-13 11:00:00', 2885, 'Cookware','microwave',25,13), ('2022-07-14 10:00:00', 2885, 'Cookware','microwave',25,14), ('2023-01-01 12:00:00', 3665, 'Appliances','refrigerator',12,15), ('2023-01-06 13:00:00', 3665, 'Appliances','refrigerator',12,16), ('2023-02-01 14:00:00', 3665, 'Appliances','refrigerator',12,17), ('2023-02-05 15:00:00', 3665, 'Appliances','refrigerator',12,18), ('2023-03-05 16:00:00', 3665, 'Appliances','refrigerator',12,19), ('2023-03-06 17:00:00', 3665, 'Appliances','refrigerator',12,20), ('2023-04-07 18:00:00', 3665, 'Appliances','refrigerator',12,21), ('2023-04-08 19:00:00', 3665, 'Appliances','refrigerator',12,22), ('2023-05-09 20:00:00', 3665, 'Appliances','refrigerator',12,23), ('2023-05-10 21:00:00', 3665, 'Appliances','refrigerator',12,24), ('2023-06-11 22:00:00', 3665, 'Appliances','refrigerator',12,25), ('2023-06-12 23:00:00', 3665, 'Appliances','refrigerator',12,26), ('2023-07-13 11:00:00', 3665, 'Appliances','refrigerator',12,27), ('2023-07-14 10:00:00', 3665, 'Appliances','refrigerator',12,28) ;
אפשרות א:
select year (s.date) as year ,month (s.date) as month ,s.product_name ,s.Barcode ,s.GGroup ,s.stock ,SUM (s.quantity) AS quantity from Sales s group by year(s.date),month(s.date) ,s.product_name ,s.Barcode ,s.GGroup ,s.stock
אפשרות ב:
select CONVERT( nvarchar,month(date)) + '/' +CONVERT( nvarchar, year(date)) as 'date' ,s.product_name ,s.Barcode ,s.GGroup ,s.stock ,SUM (s.quantity) AS quantity from Sales s group by year(s.date),month(s.date) ,s.product_name ,s.Barcode ,s.GGroup ,s.stock
התוצאה הרצויה:
(נ.ב. לא מצאתי עורך קוד אונליין להעלות דרכו את הדוגמא
sqlfiddle לא תומך בחלק מהפונקציות) -
@mekev יאהוו ממש השקעת, כל הכבוד.
אני התכוונתי שתביא לי את הSELECT שאיתו אתה שולף מהSQL בC# (אתה עובד עם DataSet.Fill?).
בכל אופן בדוגמאות שלך, אתה פשוט מצרף עמודה שמכילה את התאריך כתאריך:
אפשרות א'select MIN(s.date) as FullDate, year (s.date) as year ,month (s.date) as month ,s.product_name ,s.Barcode ,s.GGroup ,s.stock ,SUM (s.quantity) AS quantity from Sales s group by year(s.date),month(s.date) ,s.product_name ,s.Barcode ,s.GGroup ,s.stock
אפשרות ב' לא טובה. אם כבר ליצור מזה תאריך חדש של יום האחד בחודש תמיד:
select DATEFROMPARTS(year(date), month(date), 1) ,s.product_name ,s.Barcode ,s.GGroup ,s.stock ,SUM (s.quantity) AS quantity from Sales s group by DATEFROMPARTS(year(date), month(date), 1) ,s.product_name ,s.Barcode ,s.GGroup ,s.stock
אבל אני לא מבין איך כל זה יעזור לך לC#, ץתביא את הSQL שאיתו אתה שולף לDATATBLE עם החודשושנה.
-
@mekev אוקי,
אז קח את הקוד הזהselect DATEFROMPARTS(year(date), month(date), 1) as 'date' ,s.product_name ,s.Barcode ,s.GGroup ,s.stock ,SUM (s.quantity) AS quantity from Sales s group by year(s.date),month(s.date) ,s.product_name ,s.Barcode ,s.GGroup ,s.stock
בקוד שלך תשנה את זה:
var uniqueAncType = dt.AsEnumerable().Select(x => x.Field<DateTime>("date")).Distinct().OrderBy(x => x).Select(x => x.ToString("MM/yyyy"));
וגם את זה:
newRow[ancType.Field<DateTime>("date").ToString("MM/yyyy")] = ancType.Field<double>("כמות מכירות");
-
למי שנפשו יוצאת לדעת את פתרון החידה אני מעדכן ש@mekev ברוב טובו יצר עימי קשר והראה לי את התעלומה הגדולה במוחש.
עקבנו אחרי הקוד, הDataTable אכן בסדר נכון, כל העמודות בסדר בו יצרו אותם (אלא מה?!) אבל הDataGridView שעם ההגדרה של AutoGenerateColumns מציג סדר משונה בו 01/2023 קודם ל01/2022.
אחרי הרבה זמן פתאום עלה הרעיון במוחו של @mekev שהבעיה מתרחשת תמיד רק בטעינה נוספת לDGV כלומר אחרי שכבר היה לו מקור אחר בעבר. מה שפתאום הבנו שיש מנגנון של מחזור עמודות קיימות, ושבמקרה כזה הם לא רק נחסכות מלהיווצר אלא הם גם שומרים על מיקומם... הגדרה של DataSource = null לפני הטעינה החדשה פותר את הבעיה! -
קוד linqpad שממחיש את האבסורד (יש להקליק דבל קליק על הטבלה המוצגת כדי לטעון את זו שאחריה):
void Main() { var dt1 = new DataTable(); dt1.Columns.Add("B"); dt1.Columns.Add("C"); AddRow(dt1); var dt2 = new DataTable(); dt2.Columns.Add("A"); dt2.Columns.Add("B"); dt2.Columns.Add("C"); AddRow(dt2); var dgv = new DataGridView(); dgv.DataSource = dt1; dgv.Dump(); dgv.MouseDoubleClick += (s,e) => dgv.DataSource = dt2; } void AddRow(DataTable dt) { var row = dt.NewRow(); row[0] = 123; dt.Rows.Add(row); }
תוצאה:
-
ממש תודה ענקית על התמיכה באישי
(ועל ה...)לתועלת הציבור:
הפתרון לתעלומה הינו: שהפקד DataGridView
שומר את שמות העמודות
ולכן בטעינה חוזרת של טווח תאריכים שונה,
למרות שב DataTable זה ממוין נכון,
נותר מיקום העמודות המקוריות לא לפי הסדר הרצויולכן יש לאפס את מקור הנתונים לפני טעינה חוזרת
DataGridView1.DataSource = null
-
@mekev לא שמת לב שכבר הקדמתי אותך.
אנחנו לא היחידים ששמנו לב לזה:
הבעיה ב2008:
https://www.pcreview.co.uk/threads/3551798/פה מוזכר הפתרון
https://stackoverflow.com/a/38883973/1271037