افزونه 1 زیر مجموعه در پلاگینSQLite

aryana2500

Active Member
سلام به همه اساتید
یه سوال داشتم آیا پلاگینSQLite این قابلیت رو داره که برای رکوردهای ثبت شده بتوان زیرمجموعه تعریف کرد یعنی اگر رکورد ما ویرایش یا حذف شد روی زیر مجموعه آن هم تغییرات اعمال شود.
برای روشنتر شدن بحث یه مثال میزنم: مثلا رکورد ثبتی ما مشخصات عمومی یه کابینته (پهنا،ارتفاع،عمق). این کابینت رکورد اصلی ما محسوب میشه. زیرمجموعه این رکورد میشه کفی،دیواره ،سقف،طبقه و درب کابینت . بین این دو(رکورد اصلی و زیرمجموعه) باید ارتباط مستقیم برقرار باشه یعنی با ویرایش هر کدام تغییراتی که تعریف کرده ایم رو طرف مقابل اعمال شود
امیدوارم متوجه منظورم شده باشید
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
در دیتابیس شما قابلیتی دارید بنام Trigger.


A trigger is an event-driven rule on a database, where an operation is initiated when some other transaction (event) takes place. Triggers may be set to fire on any DELETE, INSERT, or UPDATE on a particular table, or on an UPDATE OF particular columns within a table.
توضیحات در مورد سینتکس رو اینجا میتونید بخونید: http://www.sqlite.org/lang_createtrigger.html

درکل چون trigger در خود دیتابیس تعریف میشه، پلاگین هم نباید مشکلی باهاش داشته باشه و اجرای triggerها در هسته ی SQLite تعبیه شده.

این رو تست کنید و لطفاً نتیجه رو هم اعلام بفرمایید.
 

aryana2500

Active Member
آقای مدیر سلام به آدرسی که فرموده بودین رفتم اما سطح دانش من تا اونجایی نیست که بتونم جوابمو از منابع دست اول بگیرم .
اگه شما و دیگر دوستان لطف کنید و یه کم بیشتر به این مبحث بپردازید فکر کنم برای بقیه هم مفید باشه . تا اونجایی که من میدونم جای این مبحث تو انجمن خالیست(اگه اشتباه میکنم لطفا بگید)
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
همونطور که عرض کردم، Trigger در دیتابیس ایجاد میشه و این trigger در زمان مناسب توسط خود موتور SQLite اجرا میشه و نیازی به کنترل ما نداره.

فرصت ساخت مثال MMB رو ندارم، گرچه نیازی هم نیست، پس فقط کدها رو میزارم.

یک دیتابیس جدید ایجاد کنید. کدهای SQL زیر رو اجرا کنید تا Tableها و Trigger مربوطه ساخته بشه:
کد:
CREATE TABLE "Unit" ("id" INTEGER PRIMARY KEY  NOT NULL ,"cat" TEXT,"width" FLOAT NOT NULL  DEFAULT (1) ,"height" FLOAT NOT NULL  DEFAULT (1) ,"depth" FLOAT NOT NULL  DEFAULT (0.1) );
CREATE TABLE "categories" ("id" INTEGER PRIMARY KEY  NOT NULL ,"cat_id" INTEGER NOT NULL ,"name" TEXT NOT NULL ,"width" FLOAT NOT NULL ,"height" FLOAT NOT NULL ,"depth" FLOAT NOT NULL );
CREATE TRIGGER "update_categories" AFTER UPDATE ON "Unit" FOR EACH ROW  BEGIN UPDATE categories SET width = (0.75 * new.width), height = (1.3 * new.height), depth = new.depth WHERE cat_id = new.id; END;
خط اول و دوم که دوتا جدول ایجاد کردیم که نیازی به توضیح نداره.
جدول اول حاوی واحد اندازه گیری ما هست که مثلاً واحد پیشفرض اندازه گیری برای پنجره، ارتفاع = 1، عرض = 1 و عمق برابر 0.1 هست. فیلد id این جدول نشون دهنده ی id اون دسته بندی هست (مثلاً معیار اندازه گیری برای پنجره ها، درها...)
با کد زیر داده ی نمونه برای اندازه ی معیار پنجره (Window) رو وارد می کنیم:
کد:
INSERT INTO "main"."Unit" ("cat","width","height","depth") VALUES ('Windows',1,1,0.1);
id این رکورد برابر 1 هست.
جدول دوم دسته بندی ما هست، مثلاً یک پنجره ممکنه عرضش 0.75 عرض معیار، ارتفاعش 1.3 ارتفاع معیار و عمقش برابر با عمق معیار باشه. فیلد cat_id نشون دهنده ی دسته بندی والد هست.
یعنی اگر قصد داشته باشیم یک پنجره ی جدید ایجاد کنیم، فیلد cat_id برابر 1 که آی دی دسته ی "پنجره" هست
یک داده ی نمونه از دسته بندی پنجره در جدول دوم ایجاد می کنیم که نسبت اندازه ها به شکلی که توضیح داده شد هست.
کد:
INSERT INTO "main"."categories" ("cat_id", "name", "width", "height", "depth") VALUES (1, 'long_window', 0.75, 1.3, 0.1);

پس باید Trigger به گونه ای ساخته بشه که با ایجاد تغییرات در واحد اندازه گیریمون (Unit)، تغییرات لازم رو در زیر مجموعه های اون دسته بندی اعمال کنه.


در خط سوم Trigger ایجاد شده.
نام Trigger که ساختیم update_categories هست.
عبارت "AFTER UPDATE ON "Unit به این معنا هست که این Trigger پس از ایجاد تغییرات (UPDATE) در تیبل Unit اجرا میشه.
عبارت FOR EACH ROW هم به این معنا هست که کدهای مشخص شده برای هر رکورد (Row) اجرا میشه.
کدها بین عبارات BEGIN و END نوشته میشن.
کدی که اجرا کردیم این هست:
کد:
UPDATE categories SET width = (0.75 * new.width), height = (1.3 * new.height), depth = new.depth WHERE cat_id = new.id;
این کد عرض، ارتفاع و عمق همه ی زیر مجموعه های اون واحد رو تغییر میده (WHERE cat_id = new.id)
عبارت new.width اشاره به مقدار جدید فیلد width از جدولی که Trigger برای اون ساخته شده (Unit) میکنه.

دیتابیسی بر اساس ساختاری که توضیح داده شد ایجاد کنید. یک رکورد جدید برای Unit بسازید و بر اساس id اون یک یا چند رکورد در جدول categories ایجاد کنید.
حالا مقادیر رکورد موجود در جدول unit رو تغییر بدید، می بینید که تغییرات در جدول categories هم اعمال میشه.

البته این فقط یک مثال برای نشون دادن کاربرد Trigger هست و خود مثال شاید چندان معقول نباشه.
 

aryana2500

Active Member
سلام
تشکر بخاطر راهنماییتون راستش قضیه یه کم برام پیچیده شده اینکه:

مثلاً یک پنجره ممکنه عرضش 0.75 عرض معیار، ارتفاعش 1.3 ارتفاع معیار و عمقش برابر با عمق معیار باشه.
رو حتما بایددرحین تشکیل جداول لحاظ کنیم یا اینکه از قبل هم میشه فرمولش رو تعریف کرد
اگه توضیحات دوستان با یه مثال همراه باشه فکر کنم بهتر باشه
کس دیگه ای به این مبحث علاقه مند نیست؟؟؟
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
Trigger رو هر زمانی میتونید ایجاد کنید و یا حذف کنید
میتونید چندین تریگر مختلف داشته باشید.

شما اگر با کار با SQLite رو بلد باشید نیاز به مثال نیست، فقط یه کد هست که باید اجرا بشه تا تریگر ساخته بشه، بعد از ایجاد خودش کارش رو بدون دخالت شما انجام میده و اصلاً نیاز نیست منطق و کدنویسی برنامه تون تغییر کنه.

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

اگر سوالی دارید یا جاییش براتون گنگ هست بپرسید
 

aryana2500

Active Member
منظور بنده اینه که ما با یه فرمولی یا یه رابطه ای میخواهیم بین رکورد اصلی و زیرمجموعه هاش ارتباط بر قرار کنیم سوال اینجاست که این رابطه حتما باید در خط Trigger باشه مثل همین رابطه که شما برقرار کرده اید
یا از قبل هم میشه تعریف کرد با تشکر
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
کلاً Trigger به معنای دستوراتی هست که قبل/بعد از یک رویداد خاص اجرا میشن
رویدادهایی مثل DELETE, UPDATE...
همونطور که عرض کردم Trigger هر لحظه میتونه ایجاد بشه یا حذف بشه.
شما می تونید با همون برنامه ای که دیتابیس رو ایجاد میکنه Trigger رو هم بسازید. برای اینکه Trigger اجرا بشه در MMB نیاز به هیچ کدنویسی ای نیست.

حالا اینکه دستورات موجود در Trigger چی باشه بر میگرده به نیاز خودتون

خیر، ارتباط بین چند جدول از طریق Trigger نیست، کار Trigger اینه که یکسری کدهای SQL رو بطور خودکار، قبل یا بعد از رویداد خاصی روی دیتابیس اجرا کنه.


بین این دو(رکورد اصلی و زیرمجموعه) باید ارتباط مستقیم برقرار باشه یعنی با ویرایش هر کدام تغییراتی که تعریف کرده ایم رو طرف مقابل اعمال شود
Trigger برای این شرایط مناسب هست، یعنی کدهایی که بلافاصله پس از دستور Update اجرا بشن.
 

جدیدترین ارسال ها

بالا