PDA

View Full Version : حرفه ای: نحوه کوئری کردن آخرین تغییرات



mahdisk1
یک شنبه 25 شهریور 1397, 13:36 عصر
سلام و وقت بخیر خدمت دوستان و اساتید.
جدولی داریم شامل اطلاعات تغییراتی که بر روی یک فیلد ثبت میشه.
فیلد 1 تغییرات در تاریخ 01/01/1397 و رکوردهای دیگری هم برای همین فیلد در تاریخ های 01/03/1397 و 01/05/1397 ثبت شده
فیلد 2 تغییرات در تاریخ های 02/01/1397 و رکوردهای دیگری برای همین فیلد در تاریخ های 02/03/1397 و 02/05/1397 ثبت کردیم.
تمام موارد در جدول ثبت و ذخیره سازی میشه بهمراه ID،
حالا سوال اینجاست میخوام کوئری بسازم که توی اون هر دو فیلد 1 و 2 رو با مشخصات آخرین تغییراتی که براشون ثبت شده نمایش بده، دستورات پیش ساخته کوئری شامل last و max و... جوابگو نیستن و کاری انجام نمیدن. بانک اطلاعاتی بدلیل حجیم بودنش امکان ارسال نداشت وگرنه برای دوستان ارسال میکردم نظر بدن،
ضمن اینکه جداول بهم پیوسته ای هم داره که در واقع کوئری شامل فقط یه جدول نیست.

mahdisk1
یک شنبه 25 شهریور 1397, 13:38 عصر
یه مساله ای که باید بگم یکی از دوستان راهنمایی کردن که باید از were استفاده کنم ولی تو سرچ هام به نتیجه ای نرسیدم که چطور ازش استفاده کنم.

mahdisk1
دوشنبه 26 شهریور 1397, 07:31 صبح
فایل نمونه

mosaArabi
دوشنبه 26 شهریور 1397, 11:51 صبح
شما باید دستوری بنویسی که از رکورد مورد نظر قبل از ویرایش کپی تهیه بشه و در یک تیبل بشینه . بعد ویرایش را انجام بدین و بعد تکست ها قفل شوند .

mahdisk1
دوشنبه 26 شهریور 1397, 12:39 عصر
در کل این مساله و مشکل منه و نمیتونم حلش کنم، این دستوری که میگین رو میتونین راهنمایی کنین؟

mazoolagh
سه شنبه 27 شهریور 1397, 11:10 صبح
SELECT "1" AS Field_Name , MAX(date1) AS Last_Update FROM table1 WHERE field1="1"
UNION
SELECT "2" AS Field_Name , MAX(date1) AS Last_Update FROM table1 WHERE field1="2"

mazoolagh
سه شنبه 27 شهریور 1397, 11:16 صبح
شما باید دستوری بنویسی که از رکورد مورد نظر قبل از ویرایش کپی تهیه بشه و در یک تیبل بشینه . بعد ویرایش را انجام بدین و بعد تکست ها قفل شوند .

ایشون یک جور audit trail پیاده کردن و در اینحالت لازم نیست کل رکورد آرشیو بشه - معمولا فقط Id رکورد و old value فیلدهای مورد نظر همراه با Time-stamp نگهداری میشه

mahdisk1
چهارشنبه 28 شهریور 1397, 21:01 عصر
SELECT "1" AS Field_Name , MAX(date1) AS Last_Update FROM table1 WHERE field1="1"
UNION
SELECT "2" AS Field_Name , MAX(date1) AS Last_Update FROM table1 WHERE field1="2"


کد ها رو نه تو حالت دیزاین مود و نه تو حالت sql view نتونستم وارد کنم (وارد کوئری کنم)

Mehr@ban
پنج شنبه 29 شهریور 1397, 18:22 عصر
سلام کدی که استاد عزیز برای شما گذاشتن یک نمونه کد هست و شما باید با توجه به جداول خودتون این کد رو شخصی سازی کنید.
اگر میخواید بیشتر در مورد این نمونه کد بدونید به دنبال کلیدواژه کوئری یونیون بگردید

mahdisk1
یک شنبه 01 مهر 1397, 11:19 صبح
سلام کدی که استاد عزیز برای شما گذاشتن یک نمونه کد هست و شما باید با توجه به جداول خودتون این کد رو شخصی سازی کنید.
اگر میخواید بیشتر در مورد این نمونه کد بدونید به دنبال کلیدواژه کوئری یونیون بگردید

ممنونم از راهنمایی، ولی کدی که ارسال کردن با فیلدهای بانک نمونه همخوانی داره، مساله اینجاست که کلا تو شرط های کوئری نمیتونم select بذارم و کلا نمیپذیره، با فرمت in select تو شرط میشه استفاده کرد ولی خب اونوقت نحوه بکارگیری max یا last رو نمیدونم، خیلی سرچ کردم و مطالب زیادی مطالعه کردم ولی این مساله برام حل نشد و انگار تابحال کسی همچین کاری تو اکسس انجام نداده،

mazoolagh
یک شنبه 01 مهر 1397, 12:53 عصر
کدی که گذاشتم دقیقا بر اساس دیتا نمونه است و انتزاعی نیست.
نمیدونم مشکل شما کجاست برای همین کوئری رو بهش اضافه و دوباره براتون آپلود میکنم.
148932
148933

mahdisk1
دوشنبه 02 مهر 1397, 07:29 صبح
ممنونم استاد عزیز، مساله اینجا بود که من کد رو به کوئری اضافه میکردم ولی خب خود کوئری با همین کد اوکی بود، حالا یکم ماهیگیری یاد بگیرم بجای ماهی گرفتن :لبخند:
من فیلد کد اموال دارم که در واقع شامل صدتا لوازمه که ممکنه کم یا زیاد هم بشه، ممکنه برخی دستگاهها سرویس بشن و برخی دیگه هم نشن،
مشخصات هر کد اموال تو یه جدول نگهداری میشه و مشخصات تعمیر هر وسیله هم تو یه جدول دیگه، ترجیح من اینه که کوئری داشته باشم که لیست مشخصات رو از جدول 1 بگیره و تو جدول 2 بگرده و آخرین تعمیر اون وسیله رو بیاره،
ولی چیزی که تو این کوئری میخواستم این بود که بیاد تو همون جدول سرویس ها آخرین تاریخ تعمیر هر وسیله رو بیاره (اینجا یه ایرادی که داره اینه که یه کد اموال ممکنه سالها نیاز به تعمیر و سرویس پیدا نکنه و تو این کوئری نمیاد).
ممنونم از همه دوستان و اساتیدی که لطف میکنن پاسخ میدن

mazoolagh
پنج شنبه 05 مهر 1397, 09:58 صبح
این کد فقط برای همین حالت خاص که در پرسش نخست آمده (چند فیلد معین و محدود) مناسب هست وگرنه در حالت کلی نمیشه اینجوری با Union به نتیجه دلخواه رسید.

در حالت کلی باید اول یک فانکشن گلوبال (public) بنویسن که اسم جدول و فیلد رو بگیره و آخرین تاریخ آپدیت رو برگردونه.
بعد با کمک این فانکشن یک کوئری دیگه مینویسین که بازای هر فیلد مشخص آخرین تاریخ آپدیت رو برگردونه.

دیتا نمونه بسازین و اینجا پیوست کنین تا دقیقتر راهنمایی کنم.

mahdisk1
یک شنبه 08 مهر 1397, 11:35 صبح
148992
ضمن تشکر ، فایل نمونه با اطلاعات محدودتر که قابل ویرایش و بررسی باشه

mahdisk1
دوشنبه 09 مهر 1397, 13:15 عصر
با تشکر ،
فایل ضمیمه

mazoolagh
پنج شنبه 12 مهر 1397, 09:41 صبح
نمونه ای که گذاشتین مناسب نیست
نمونه دیگه ای میسازم و روی همون آموزش میدم

mazoolagh
دوشنبه 16 مهر 1397, 09:52 صبح
جدول کالاها:
149058
149059

mazoolagh
دوشنبه 16 مهر 1397, 09:58 صبح
جدول تغییرات:

149060
149061

mazoolagh
دوشنبه 16 مهر 1397, 10:00 صبح
توابع بدست آوردن آخرین تاریخ ویرایش و تعدا دفعات ویرایش یک فیلد معین از رکورد معین:


Public Function Last_Update(ProductID As Long, FieldName As String) As Variant
Last_Update = DMax("DateEdited", "ProductsAudit", "ProductID=" & ProductID & " AND FieldName='" & FieldName & "'")
End Function




Public Function Count_Of_Updates(ProductID As Long, FieldName As String) As Long
Count_Of_Updates = DCount("DateEdited", "ProductsAudit", "ProductID=" & ProductID & " AND FieldName='" & FieldName & "'")
End Function

mazoolagh
دوشنبه 16 مهر 1397, 10:04 صبح
طراحی کوئری:
SELECT Products.ProductID, Products.Product,
Products.DateCreated,
Last_Update([ProductID],'UnitPrice') AS [آخرین ویرایش (قیمت)],
Last_Update([ProductID],'Quantity') AS [آخرین ویرایش (مقدار)],
Last_Update([ProductID],'SupplierID') AS [آخرین ویرایش (تأمین کننده)],
Count_Of_Updates([ProductID],'UnitPrice') AS [تعداد ویرایش (قیمت)],
Count_Of_Updates([ProductID],'Quantity') AS [تعداد ویرایش (مقدار)],
Count_Of_Updates([ProductID],'SupplierID') AS [تعداد ویرایش (تأمین کننده)]
FROM Products

mazoolagh
دوشنبه 16 مهر 1397, 10:05 صبح
اجرای کوئری:
149062

mazoolagh
دوشنبه 16 مهر 1397, 10:06 صبح
فایل دیتابیس