PDA

View Full Version : شمارش فیلدها بر اساس شرط



anoor_h
پنج شنبه 28 اردیبهشت 1402, 00:09 صبح
سلام در جدول پایین من میخوام شمارش بشه هر نفر نعداد استعلاجی وتعداد غیبیت و استحقاقی بر اساس کل ماه نمیدونم چطور کوئری بنویسم
154639

mazoolagh
پنج شنبه 28 اردیبهشت 1402, 10:23 صبح
سلام و روز خوش
این جدولی که شما دارین برای نمایش طراحی شده، در واقع گزارش اینجوری باید باشه.

برای ذخبره دیتا باید به این شکل عمل کنین:
یک جدول اشخاص : کد شخص، نام، نام خانوادگی، ....
یک جدول وضعیت : کد وضعیت، وضعیت(استحقاقی/استعلاجی/غیبت)
یک جدول غیبت: تاریخ (یا در مثال شما روز ماه)، کد شخص، کد وضعیت
حالا کوئری گرفتن روی این خیلی راحته.

شما یک نمونه طبق همین چیزی که گفتم بسازین و پیوست کنین (حتما با دیتا نمونه باشه)،
روی همون براتون کوئری ها رو مینویسم.

mazoolagh
پنج شنبه 28 اردیبهشت 1402, 10:34 صبح
در ضمن:

دیتاهایی از این دست رو به این شکل در جدول ذخیره نمیکنیم (به دلیل فضای خالی زیاد).
به اینها ماتریس اسپارس گفته میشه Sparse Matrix - چون دیتا در اونها پراکنده است.

در مهندسی خیلی از مسائل هست که دیتا اونها به همین شکل پراکنده است؛ مثل مدارهای الکترونیکی.
در اونجا هم برای جلوگیری از اتلاف فضا و محاسبات بیهوده (فضای خالی 0 هست و در محاسبات تاثیری نداره) فقط node list و component list میسازیم.
به این صورت که برای هر گره مشخص میکنیم چه گره هایی از چه المانی متصل هست.

در این مساله هم هر روز مشابه یک گره مدار هست و وضعیت هر روز هم مشابه لیست سرهای المانهایی هست که روی اون گره قرار دارن.

anoor_h
پنج شنبه 28 اردیبهشت 1402, 22:53 عصر
ممنون جناب mazoolagh هدف من از طراحی این فرم صرفا شبیه بودن به اکسله چون کاربر معمولی با صفحه گسترده خیلی راحت تر دوست میشه برای همین من گفتم فقط با دبل کلیک وضعیت ها عوض بشه و دیگه نخواد هی کمبو باز کنه و دخیره و دنگ و فنگا فضای خالی هم برام مهم نیست چون نهایت یک ساله و پاکش میکنیم اگه اونو میشد ازش گزارش گرفت که هر نفر در ماه یا در بازه چقدر مرخصی و اینا داره خیلی عالی میشد

همونطوز که فرمودین برنامه رو پیوست می کنم برای کوئری

mazoolagh
شنبه 30 اردیبهشت 1402, 18:59 عصر
البته قرار بود که جدول ها با دیتا باشه،
ولی مهم نیست چون من همیشه دیتا تست دم دست دارم یا میسازم.

من یک برنامه کامل براتون آماده کردم که پیوست میکنم.
و بعد اگر فرصت شد امروز وگرنه شاید فردا یک سری توضیحات در مورد این که چرا روش درست همین هست (در اکسس و کلا دیتابیس)،
و چرا طراحی جدول نباید به شکل تصویر پیوست پست شماره 1 باشه - مطرح میکنم.

البته تا جایی که یادم هست پرسش مشابه داشتیم.

mazoolagh
شنبه 30 اردیبهشت 1402, 19:02 عصر
اول طراحی جدول ها:

کارمندان
154645

وضعیت ها
154646

وضعیت حضور کارمند بر اساس تاریخ
154647

mazoolagh
شنبه 30 اردیبهشت 1402, 19:06 عصر
جدول کارمندان با 100 اسم تستی پر شده:
154648

جدول وضعیت ها:
154649

mazoolagh
شنبه 30 اردیبهشت 1402, 19:10 عصر
حالا با کد زیر جدول مرخصی ها رو پر میکنیم:
Option Compare Database
Option Explicit


Sub Fill_Leaves()
Dim i, emp_id, stat_id, y, m, d As Long
Dim whr As String
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("Leaves")


For i = 1 To 30000
emp_id = RndX(1, 100)
stat_id = RndX(1, 3)
y = RndX(1400, 1402)
m = RndX(1, 12)
d = RndX(1, 30)
whr = "EmployeeID=" & emp_id & " AND StatusID=" & stat_id & " AND YYYYMMDD= " & (y * 10000 + m * 100 + d)
If DCount("ID", "Leaves", whr) = 0 Then
With rs
.AddNew
!EmployeeID = emp_id
!StatusID = stat_id
!yyyy = y
!mm = m
!dd = d
.Update
End With
End If
Next


rs.Close
Set rs = Nothing


MsgBox ("Leaves Table Filled!")
End Sub


Public Function RndX(MIN As Long, Max As Long) As Long
Randomize Timer
RndX = Int((Max - MIN + 1) * Rnd + MIN)
End Function

mazoolagh
شنبه 30 اردیبهشت 1402, 19:12 عصر
بعد از اجرای Fill_Leaves ، دیتا جدول مرخصی (Leaves) شبیه زیر خواهد بود:
154650

mazoolagh
شنبه 30 اردیبهشت 1402, 19:16 عصر
حالا یک CrossTab Query مینویسیم که از روی این جدول مرخصی تعداد انواع وضعیت ها در هر روز و جمع اون ها رو محاسبه کنه:
TRANSFORM Nz(Count(Leaves.ID),0) AS CountOfID
SELECT Leaves.YYYYMMDD, Count(Leaves.ID) AS جمع
FROM Leaves INNER JOIN Status ON Leaves.StatusID = Status.StatusID
GROUP BY Leaves.YYYYMMDD
PIVOT Status.Status

154651

mazoolagh
شنبه 30 اردیبهشت 1402, 19:18 عصر
و نتیجه کار:
154652

mazoolagh
شنبه 30 اردیبهشت 1402, 19:25 عصر
برنامه پیوست:

anoor_h
یک شنبه 31 اردیبهشت 1402, 02:17 صبح
ممنون مهندس نکات جدید قشنگی داشت فقط کاربر باید چطور دیتا جدید اضافه کنه

amirzazadeh
دوشنبه 01 خرداد 1402, 10:56 صبح
برنامه پیوست:

:تشویق::تشویق::تشویق:

mazoolagh
دوشنبه 01 خرداد 1402, 21:07 عصر
شما باید یک فرم روی همین جدول leaves بسازین.

در نظر داشته باشین تفاوت هست بین دیتابیس و صفحه گسترده،
برای همین هم دو برنامه اکسس و اکسل داریم که اینها هر کدوم در جای خودش استفاده میشه و جایگزین هم نیستن.

خیلی اصرار به همین شکل برای فرم داشته باشین، میتونین طراحی کنین ولی دیتابیس باید به همین شکل باشه تا بتونین جستجو کنین.

یا این که مستقیم در اکسل کدنویسی کنین.

anoor_h
دوشنبه 01 خرداد 1402, 21:25 عصر
و نتیجه کار:
154652
تشکر دوباره من یه row دیگه اضافه کردم که نشون بده هر کارمند وضعیتش چیه درسته ؟
فقط هر ماه و هر چند ماه چطور میشه فهمید هر کس چقدر مرخصی رفته
154664

mazoolagh
چهارشنبه 03 خرداد 1402, 12:13 عصر
1- شما باید فرم ثبت مرخصی ها رو روی جدول Leaves بسازین.

2- برای جستجو یا گزارشگیری هم از نمونه برنامه های تالار یا دیتابیس northwind کمک بگیرین.
و البته ویزاردهای خود اکسس هم هست.