PDA

View Full Version : بهترین روش برای ثبت تغییرات در رکورد



Mehr@ban
سه شنبه 27 شهریور 1397, 17:13 عصر
سلام

ماه عزای سیدالشهدا سلام الله علیه تسلیت
میخواستم بهترین راه به نظر دوستان برای ثبت تغییرات (ویرایش و حذف) یک رکورد که در فرمهای متصل صورت میگیره، چی هست؟!

میخوام به نوعی آرشیو تغییرات رکوردها رو داشته باشم
در حال حاضر از روشی ابتکاری استفاده میکنم که به نظر خودم استاندارد نیست و مشکلات ساختاری داره.
از دوستان کسی اگر راهی اصولی دارن ممنون میشم به اشتراک بذارند.

amirzazadeh
سه شنبه 27 شهریور 1397, 19:25 عصر
سلام
پيشنهاد من ايجاد يه جدول هست با حداقل سه فيلد. يك فيلد كد يا شناسه ركورد رو ذخيره مي كنه يك فيلد مقدار قبلي رو ذخيره مي كنه و فيلد سوم تاريخ تغيير رو .
..................
موفق باشيد

Mehr@ban
سه شنبه 27 شهریور 1397, 19:50 عصر
تشکر آقای میرزازاده

اینی که فرمودین از ملزومات کار هست!
من جدولی برای اینکار اختصاص دادم که اصلا کارش ثبت زمان ورود و خروج و بازدید از فرمهای مختلف توسط کاربر جاری سیستم هست.
ولی قصد دارم تا فعالیت دقیقتری از کاربر که شامل ویرایش و حذف رکوردها هست رو هم در این جدول ثبت کنم (قابلیت ثبت رکورد قبلا اجرا شده هست)

حالا برای این کار چه پیشنهادی دارین که بر اساس چه اصولی کدنویسی کنم و حتی کمی هم در نوشتن کدها کمک کنید
بازم از توجهتون ممنونم

amirzazadeh
سه شنبه 27 شهریور 1397, 23:15 عصر
اگر امكانش هست نمونه خودتون رو يا حداقل قسمتي از اون رو اپلود كنيد تا به كمك دوستان تكميلش كنيم.

Mehr@ban
چهارشنبه 28 شهریور 1397, 18:48 عصر
امکان قرار دادن نمونه فعلا برام نیست!

ولی یه توضیحی در موردش میدم
نحوه ثبت اطلاعات اصلی:
در یک فانکشن یک کوئری اپند برای جدول مذکور آماده شده که مقادیری رو به عنوان ارزش یا Value که شامل تاریخ و زمان و نام کاربر و موقعیت انجام عمل توسط کاربر رو به کوئری میده و در جدول ذخیره سازی میکنه!

برای ثبت ویرایش و حذف هم روی فرم یک تکست باکس ایجاد کردم که تمامی اطلاعات رکورد رو داخلش نمایش میده!
برای حذف رکورد هم کدنویسی جداگانه شده که قبل از حذف رکورد مقدار اون تکست باکس رو به کوئری ارسال میکنه و قبل از حذف اطلاعات مورد نظر در جدول مربوطه ثبت میشه!

ولی برای ثبت تغییرات یه مشکل کوچیک هست
اینکه در رویداد بیفور آپدیت، مجددا مقدار همین تکست باکس رو به کوئری ارسال میشه و ذخیره سازی انجام میشه، ولی چیزی که ذخیره میکنه همین اطلاعات جاری هست، به عبارتی چیزی که ذخیره میشه همین اطلاعات جدید هست نه اطلاعات ویرایش شده قبلی!

این مشکل رو میخوام حلش کنم
اگر راهی مدنظرتون هست بفرمایید

amirzazadeh
شنبه 31 شهریور 1397, 08:50 صبح
سلام
به جاي رويداد before update از رويداد On Dirty استفاده كنيد و نتيجه رو اعلام بفرماييد.در صورت امكان قطعه كد مورد استفاده رو اپلود كنيد.

mazoolagh
یک شنبه 01 مهر 1397, 14:12 عصر
بکارگیری data macro برای ساخت audit trail گزینه بهتری هست

Mehr@ban
یک شنبه 01 مهر 1397, 18:33 عصر
سلام
به جاي رويداد before update از رويداد On Dirty استفاده كنيد و نتيجه رو اعلام بفرماييد.در صورت امكان قطعه كد مورد استفاده رو اپلود كنيد.

یک فانکشن عمومی ایجاد شده
Function UserLogs(FormName As String, Activity As String, AfterEditing As String)
...
End Function
توی فرم و رویداد بیفور آپدیت اینجوری صداش میزنم
UserLogs Me.Form.Caption , "Open Form" , Me.txtAllFiled

ولی خب به دلیل اینکه تکست باکس txtAllFiled همزمان اطلاعات رو فیلدها میگیره، بازم چیزی که ذخیره میشه همین اطلاعات جاری هست!


بکارگیری data macro برای ساخت audit trail گزینه بهتری هست
سلام و خوش آمد به استاد عزیز
مدتی بود که از راهکارهای شما دور بودم (مخصوصا اون ریزه کاریها که مختص کدنویسی خودتونه! :لبخند:)
اینبار هم ممنون میشم یا زیر دیپلم تشریحش کنید تا حداقل نمونه ای بفرمایید تا مبحث به صورت آموزشی پیش بره.
بازم متشکرم

amirzazadeh
یک شنبه 01 مهر 1397, 23:31 عصر
سلام
يك مطلب اموزشي كوتاه بر اساس استفاده از ديتا ماكرو تو اين لينك اومده اميدوارم به دردتون بخوره:

https://scottgem.wordpress.com/2012/10/18/audit-trail-using-data-macros-2/


يك نمونه فايل هم در انتهاي مطلب قرار داده شده

mazoolagh
پنج شنبه 05 مهر 1397, 10:32 صبح
آقای مهربان
این نمونه که آقای میرزازاده گذاشتن خیلی خوبه - شما با همین فرمون برین جلو و insert و delete رو هم پیاده کنین.
فقط برای delete بهتره بجای اینکه رکورد رو فیزیکی حذف کنین و بجاش یک کپی در جدول تغییرات بسازین، اصلا حذفش نکنین - کافی هست یک فیلد boolean مثلا بنام IsDeleted داشته باشین و فقط اون رو true کنین.
البته اطلاعات مورد نیاز مثل اسم کاربر و اسم ماشین و timestamp و ... رو در جدول تغییرات بریزین.