آموزش قدم به قدم پلاگين SQLite

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
توابع مربوط به متغیرها: متغیرهای رشته ای - فصل ششم

  • (StrDel(String$, Indx, Count
این تابع کاراکترهایی را از رشته حذف میکند
این تابع سه پارامتر به عنوان ورودی میپذیرد:

  1. $String : رشته ی مادر که قرار است کاراکترهایی از آن حذف شود
  2. Indx : محل شروع حذف کاراکترها در رشته (عدد)
  3. Count : تعداد کاراکترهایی که باید از محل شروع به بعد حذف شوند (عدد)
* اگر Indx بزرگتر از طول متغیر $String باشد، هیچ کاراکتری حذف نمیگردد
** اگر count تعداد کاراکترها را بیش از تعداد موجود مشخص کند، این دستور کاراکترها را از نقطه ی شروع تا انتهای رشته حذف مینماید و رشته ی تغییر یافته را به عنوان خروجی باز میگزداند.
کد:
[FONT=Courier New][SIZE=2]String$ = [COLOR=#800000]'Have a nice day!'[/COLOR] 
ReturnExt$ = [COLOR=#000090][B]StrDel[/B][/COLOR](String$,[COLOR=#ff0000]1[/COLOR],5)[/SIZE][/FONT]
این کداز شروع رشته (کاراکتر اول) به مقدار 5 کاراکتر از رشته را حذف میکند
این کد مقدار زیر را بر میگرداند:
کد:
 a nice day!
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
توابع مربوط به متغیرها: متغیرهای رشته ای - فصل هفتم

  • (StrIns(SourceStr$, DestStrs$, Indx
این تابع یک رشته را با رشته ای دیگر ادغام میکند یا به عبارتی رشته ای را به رشته ی دیگر اضافه میکند
این تابع سه پارامتر به عنوان ورودی میپذیرد:

  1. $SourceStr : رشته ی مادر که قرار است رشته ی دیگر به آن اضافه شود
  2. $DestStrs : رشته ی دوم که باید به رشته ی اول اضافه گردد
  3. Indx : محلی از رشته ی اول که باید رشته ی دوم از آنجا به آن اضافه گردد
کد:
[FONT=Courier New][SIZE=2]SourceStr$ = [COLOR=#800000]'Have a nice day!'[/COLOR] 
DestStr$ = [COLOR=#800000]' too'[/COLOR] 
[COLOR=#009000]** count number of letters[/COLOR] 
Count = [COLOR=#000090][B]LEN[/B][/COLOR](SourceStr$) 
ReturnStr$ = [COLOR=#000090][B]StrIns[/B][/COLOR](SourceStr$,DestStr$,Count)[/SIZE][/FONT]
این دستور یک رشته را به انتهای رشته ی دیگر(قبل از آخرین کاراکتر) اضافه میکند که مقدار بازگشتی آن اینگونه خواهد بود:
کد:
 Have a nice day!  too
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
توابع مربوط به متغیرها: متغیرهای رشته ای - فصل هشتم

  • (StrGet(String$,Int
این تابع n-ام ین کاراکتر یک رشته را باز میگرداند،
این دستور دو پارامتر بعنوان ورودی می پذیرد:

  1. $String : رشته ی مادر
  2. Int : شماره ی کاراکتر مورد نظر که تابع باز میگرداند
کد:
[FONT=Courier New][SIZE=2]String$ = [COLOR=#800000]'Have a nice day!'[/COLOR] 
Count = [COLOR=#000090][B]LEN[/B][/COLOR](String$) 
ReturnStr$ = [COLOR=#000090][B]StrGet[/B][/COLOR](String$,Count)[/SIZE][/FONT]
این کد آخرین کاراکتر از رشته را که کاراکتر " ! " است را باز میگرداند
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
توابع مربوط به متغیرها: متغیرهای رشته ای - فصل نهم

  • ($StrSet(String$, Int,C
این تابع کاراکتر n-ام یک رشته رو با کاراکتری دیگه تعویض میکنه
این دستور سه پارامتر بعنوان ورودی می پذیرد:

  1. $String : رشته ی مادر
  2. Int : شماره ی کاراکتر مورد نظر که باید تعویض شود
  3. $C : کاراکتری که بجای کاراکترموردنظر قرار میگیرد
خروجی این تابع رشته ی تغییر یافته خواهد بود
کد:
[FONT=Courier New][SIZE=2]String$ = [COLOR=#800000]'Have a nice day!'[/COLOR] 
Count = [COLOR=#000090][B]LEN[/B][/COLOR](String$) 
C$ = [COLOR=#800000]'!!!'[/COLOR] 
ReturnStr$ = [COLOR=#000090][B]StrSet[/B][/COLOR](String$,Count,C$)[/SIZE][/FONT]
این کد ابتدا تعداد کاراکترهای (طول) رشته ی داده شده رو حساب میکنه، سپس آخرین کاراکتر رشته که محل اون برابر با طول رشته هست رو با رشته ی $C تعویض میکنه.
خروجی این کد مقدار زیر خواهد بود:
کد:
 Have a nice  day!!!
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
توابع مربوط به متغیرها: متغیرهای رشته ای - فصل دهم

  • (StrOfChar(C$, Int
این تابع یک کاراکتر و یک عدد را به عنوان ورودی پذیرفته، و خروجی آن رشته ای خواهد بود که حاوی کاراکتر موردنظر به تعداد مشخص شده میباشد
برای درک بهتر موضوع به اسکریپت زیر دقت کنید
کد:
[FONT=Courier New][SIZE=2]C$ = [COLOR=#800000]'#'[/COLOR]  
ReturnStr$ = [COLOR=#000090][B]StrOfChar[/B][/COLOR](C$,[COLOR=#ff0000]5[/COLOR])[/SIZE][/FONT]
خروجی این کد رشته ی زیر خواهد بود:
کد:
#####
همانگونه که مشاهده میکنید، این تابع یک رشته حاوی 5 کاراکتر # ایجاد کزده است

کد:
[FONT=Courier New][SIZE=2][COLOR=#009000]**  use CHR for obtaining special characters from ASCII table[/COLOR] 
 
C$ = [COLOR=#000090][B]CHR[/B][/COLOR]([COLOR=#ff0000]177[/COLOR])  
ReturnStr$ = [COLOR=#000090][B]StrOfChar[/B][/COLOR](C$,[COLOR=#ff0000]5[/COLOR])[/SIZE][/FONT]
و خروجی این کد رشته ای حاوی 5 کاراکتر ±، که کاراکتر شماره ی 177 در جدول ASCII هست، خواهد بود.
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
توابع مربوط به متغیرها: متغیرهای رشته ای - فصل یازدهم

  • ($StrChange(String$, FromStr$, ToStr
این تابع تمام کاراکترها و عبارات موجود در رشته ی $String ؛ که در رشته ی $FromStr مشخص شده اند را به کاراکتر ها و عبارات موجود در رشته ی $ToStr تغییر میدهد
برای درک بهتر موضوع به کد زیر توجه فرمایید
کد:
[FONT=Courier New][SIZE=2]String$ = [COLOR=#800000]'Lord of the Rings'[/COLOR] 
FromStr$ = [COLOR=#800000]'Rings'[/COLOR] 
ToStr$ = [COLOR=#800000]'Beer'[/COLOR] 
ReturnStr$ = [COLOR=#000090][B]StrChange[/B][/COLOR](String$,FromStr$,ToStr$)[/SIZE][/FONT]
این کد تمام کلمات Rings در رشته ی Lord of the Rings را به کلمه ی Beer تغییر میدهد، که خروجی کد فوق، رشته ی زیر خواهد بود:
کد:
Lord of the  Beer


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

برای توضیحات تکمیلی و آشنایی با بقیه ی توابعی که در این مبحث ذکر نشده ن، به کتاب جامع مولتی مدیا بیلدر که حامد عزیز (Silvercover) زحمتش رو کشیدن مراجعه کنید، صفحات 200 تا 206.

موفق و پیروز باشید !
 

evil_gates

اين نيز بگذرد ...
خب دوستان

تا اينجا مباحثي در مورد دستورات پايگاه داده مبتني بر SQL و دستورات و توابع مربوطه در mmb مطرح شد. در اين مرحله بهتره روي يك پروژه عملي دستورات رو استفاده و كاربرد واقعيشون رو ببينيم.

بيايد يكم تفريح كنيم

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

خب براي شروع چي لازم داريم؟

قبل از هر چيزي آنچه در ذهن داريد رو روي كاغذ بياريد. ما قصد داريم يك دفتر تلفن بسازيم. دفتر تلفني كه بتونه مشخصات افراد مثل نام، شماره تلفن، آدرس و ... رو ثبت كنه و هر زمان كه بهش احتياج داشتيم با جستجو نتيجه رو نمايش بده.

من يك جدول شبيه اين رسم ميكنم:

attachment.php


حالا بايد در مورد برنامه خودم فكر كنم:

من يه جدول دارم كه 5 تا ستون داره و تعداد زيادي سطر كه مشخصات افراد رو مينويسم.

پس من بايد يه ديتابيس بسازم كه يك جدول داشته باشه و اين جدول 5 تا فيلد داشته باشه.

بعد تو برنامه از طريق پلاگين SQLite با اين ديتابيس ارتباط برقرار كنم. اطلاعاتي رو تو ديتابيس بنويسم. جستجو كنم ويرايش كنم و ...

بهتر نيست طرح دستي برنامه رو رسم كنيم؟

به نظر من بهتره يه صفحه اصلي داشته باشيم و تو اين صفحه اصلي 2 تا كليد بزاريم تا هر كدوم به صفحه اي هدايت بشن.

كليد جستجو اطلاعات كه ما رو به صفحه جستجو و نمايش نتايج ببره و كليد ورود اطلاعات كه ما رو صفحه ورود اطلاعات جديد جديد ببره

attachment.php


صفحه ورود اطلاعات ميتونه به طور كلي دو بخش داشته باشه. كادر دريافت اطلاعات و كليد ثبت اطلاعات . چيزي شبيه به اين:

attachment.php


صفحه جستجو چه آيتم هايي داشته باشه؟

من پيشنهاد ميكنم صفحه جستجو رو به 3 بخش تقسيم كنيم

بخش كادر جستجو (كه ميتونه جستجو بر اساس نام يا شماره تلفن فرد مورد نظر باشه) - بخش نمايش نتايج جستجو و بخش كليدهاي كنترلي

attachment.php


تو بخش كادر جستجو: من بايد انتخاب كنم كه جستجو بر چه اساسي باشه. بر اساس نام و نام خانوادگي فرد يا شماره تلفنش؟ و ديگه اينكه چه عبارتي رو جستجو كنه؟

تو بخش نمايش اطلاعات: من بايد بخشي داشته باشم تا نتايجي كه از جستجو بدست مياد رو نمايش بدم.

و تو بخش كليدهاي كنترلي هم ميتونه شامل كليدهاي ويرايش، حذف، نمايش ركورد قبلي، نمايش ركورد بعدي و ... باشه.

در مجموع صفحه جستجو چيزي شبيه اين تصوير ميشه:

attachment.php


كليد حذف اطلاعات ركوردي كه در حال نمايش هست رو حذف ميكنه و كليد ويرايش هم به صفحه ديگه اي شبيه به ورود اطلاعات ميره و ميشه اطلاعات ركوردي كه تو جستجو پيدا شده رو ويرايش كرد.

خب من تقريبا طرح دستي از برنامه تهيه كردم و حالا ميتونم بگم كه دقيقا چي ميخوام و چه بخشهايي رو بايد توليد كنم.
 

پیوست ها

  • p1.jpg
    p1.jpg
    41 کیلوبایت · بازدیدها: 669
  • p2.jpg
    p2.jpg
    26.9 کیلوبایت · بازدیدها: 661
  • p3.jpg
    p3.jpg
    38.7 کیلوبایت · بازدیدها: 662
  • p4.jpg
    p4.jpg
    31.8 کیلوبایت · بازدیدها: 657
  • p5.jpg
    p5.jpg
    50.4 کیلوبایت · بازدیدها: 659

evil_gates

اين نيز بگذرد ...
همونطور كه قبلا هم گفتم من بايد يه ديتابيس بسازم كه يك جدول داشته باشه و اين جدول 5 تا فيلد داشته باشه.

من ديتابيس خودم رو mytelldb نامگذاري ميكنم چطوره؟

خب براي ديتابيسم بايد يك جدول داشته باشم اسم جدولمون رو بزاريم tell خوبه؟

براي فيلدها چي؟

براي رديف ميزاريم id

براي نام و نام خانوادگي ميزاريم name

براي شماره ثابت ميزاريم home

براي شماره همراه ميزاريم mob

و براي آدرس ميزاريم address

حالا بايد نرم افزار mmb رو اجرا و پروژه جديدي رو تو اين برنامه باز كنم. و بعد پلاگين SQLite رو تو پروژه وارد كنم. قبلا راجع به اين چيزا مطالبي ياد گرفتيم درسته؟

attachment.php


خب براي اينكه بتونم از اين پلاگين استفاده كنم لازمه اول اونو راه بندازم. براي اينكار يك اسكريپت به نام initialization ميسازم و تو page start اين دستور رو براي اجراي دستورات درون اين اسكريپت قرار ميدم:
کد:
[B][COLOR=Navy]RunScript[/COLOR][/B]("Initialization")
حالا داخل اين اسكريپت چي بايد بنويسم؟
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","SQLiteInit")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin"," Initialized")
پارامتر SQLiteInit كه توسط دستور PluginRun در پلاگين اجرا ميشه باعث ميشه كه اين پلاگين راه اندازي بشه.

تو خط بعد با دستور PluginGet نتيجه اين راه اندازي رو تو متغيري به نام Initialized بدست ميارم. نتيجه بايد عدد 1 باشه. يعني اگه پلاگين ما بدون هيچ مشكلي راه اندازي شده باشه بايد مقدار Initialized = 1 باشه

ميتونيم اين نتيجه رو با يك شرط چك كنيم:
کد:
[COLOR=Blue]If [/COLOR](Initialized = 1) [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","SQLite plugin initialized successfully")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Error: Unable to initialize SQLite plugin")
[COLOR=Blue]End[/COLOR]
با اين شرط مقدار Initialized بررسي ميشه كه اگه برابر با 1 بود پيغام موفقيت و اگه غير از اين بود پيغام خطا عدم موفقيت صادر ميشه.

البته شايد احتياج نداشته باشم كه پيغام موفقيت رو ببينم. چون اگه مقدار شرط 1 باشه بهتره كارهاي ديگه اي انجام بدم مثل ساختن ديتابيس، جدول و فيلدهاي جدول.

پس پيغام موفقيت رو نديده ميگيرم و به جاش دستورات ديگه اي مينويسم.

براي ساختن ديتابيس اول بايد نام و آدرس محلي كه ميخوام ديتابيسم ساخته بشه رو به پلاگين بفرستم.

براي اينكار از يك متغير رشته اي به نام $db_path استفاده ميكنم و آدرس محل ديتابيسم رو تو اين متغير ميريزم.

تو اين مثال نام فايل من mytelldb هست، پسوند فايل من db. و محل ذخيره شدن فايل متن درايو C خواهد بود.
کد:
db_path$ =[COLOR=DarkRed] 'C:\mytelldb.db'[/COLOR]
بعد مقدار اين متغير رو با دستور PluginSet به پلاگين ارسال ميكنم:
کد:
[B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","db_path$")
بعد دستور PluginRun رو با پارامترهاي GetDBFileName و CreateSQLDB اجرا ميكنم تا ديتابيسم رو در محل مورد نظر بسازه.
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","GetDBFileName")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","CreateSQLDB")
به درايو C مراجعه كنيد ميبينيد كه فايلي به نام mytelldb.db ساخته شده.

من ميتونم به كمك يك متغير ديگه بررسي كنم كه آيا ديتابيس من ساخته شده يا نه. پس با دستور PluginGet مقدار بازگشتي از پلاگين رو دريافت ميكنم:
کد:
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Created")
در صورتي كه ديتابيس من به درستي ساخته شده باشه مقدار Created بايد هر عددي مخالف صفر باشه. پس به كمك يك شرط ميشه اون رو چك كرد:
کد:
[COLOR=Blue]If [/COLOR](Created<>0) [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Database created successfully")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Error: Unable to create database")
[COLOR=Blue]End[/COLOR]
در صورتي كه مقدار Created <>0 باشه پس ديتابيس ما به درستي ساخته شده و برنامه به ما پيغام موفقيت خواهد داد. اما اگه مقدار Created = 0 باشه اين يعني ديتابيس ما به درستي ساخته نشده پس برنامه پيغام خطا عدم موفقيت ميده.

خب تا اينجا من يك ديتابيس خالي ساختم. (به مثال پيوست شده دقت كنيد)

در ادامه نوبت به ساختن جدول و فيلدهاي درون جدول ميرسه.
 

پیوست ها

  • s1.jpg
    s1.jpg
    261 کیلوبایت · بازدیدها: 682
  • step1.zip
    176.7 کیلوبایت · بازدیدها: 618
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
تا اينجا ديتابيس من ساخته شد، اما فقط يك ديتابيس خالي.

براي استفاده از اين ديتابيس لازمه جدول و فيلدهاي جدول رو هم بسازيم.

براي اينكار اول بايد ديتابيسم رو باز كنيم و بعد دستور ساخت جدول رو ارسال كنيم.


پس من يك اسكريپت جديد به نام create_table تو محيط برنامه ايجاد ميكنم و شرط قبلي رو تو اسكريپت Initalization به اين صورت اصلاح ميكنم:
کد:
[COLOR=Blue]If [/COLOR](Created<>0) [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Database created successfully")
  [B][COLOR=Navy]RunScript[/COLOR][/B]("create_table")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Unable To create database")
[COLOR=Blue]End[/COLOR]
در اينصورت بعد از اينكه ديتابيس ساخته شد و پيغام موفقيت هم نمايش داده شد، بلافاصله اسكريپت create_table اجرا خواهد شد.

اما دستورات داخل اين اسكريپت:

خب همونطور كه گفتيم بايد بعد از ساخته شدن ديتابيس اون رو باز كرد.
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","OpenSQLDB")
با استفاده از پارامتر OpenSQLDB در دستور PluginRun ديتابيس ما باز ميشه.

خب ما ميتونيم با PluginGet چك كنيم كه آيا واقعا ديتابيس باز شده يا نه؟ در صورتي كه ديتابيس باز نشده باشه نميشه فرامين بعدي رو اجرا كرد.

پس من اين كد رو به اين صورت اصلاح ميكنم:
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","OpenSQLDB")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Opened")
[COLOR=Blue]If [/COLOR](Opened=1) [COLOR=Blue]Then[/COLOR]

[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Unable to open database")
[COLOR=Blue]End[/COLOR]
متغير Opened توسط دستور PluginGet مقدار بازگشتي حاصل از باز شدن ديتابيس رو بدست مياره. در صورتي كه ديتابيس به درستي باز شده باشه مقدار Opened = 1 خواهد بود.

پس با يك شرط چك ميكنيم كه آيا ديتابيس باز شده يا نه؟

در صورتي كه جواب منفي باشه پيغام خطايي صادر ميشه.

اما اگه جواب مثبت باشه چي؟

خب حالا وقتشه كه دستور ساختن جدول رو بديم.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
يادتون مياد دستور ساختن جدول در SQL چي بود؟
کد:
CREATE TABLE name(
    Field1 datatype,
    Field2 datatype,
    Field3 datatype
    );
من بايد اين دستور رو به صورت يك متغير رشته اي به پلاگين ارسال كنم تا جدول رو بسازه. به اين كدها نگاه كنيد:
کد:
sql_1$ = [COLOR=DarkRed]'CREATE TABLE tell ('[/COLOR]
sql_2$ =[COLOR=DarkRed] 'id INTEGER PRIMARY KEY NOT NULL,'[/COLOR]
sql_3$ =[COLOR=DarkRed] 'name CHAR NOT NULL,'[/COLOR]
sql_4$ = [COLOR=DarkRed]'home INTEGER NOT NULL,'[/COLOR]
sql_5$ =[COLOR=DarkRed] 'mob INTEGER NOT NULL,'[/COLOR]
sql_6$ = [COLOR=DarkRed]'address CHAR NOT NULL );'[/COLOR]
sql_query$ = sql_1$ + sql_2$ + sql_3$ + sql_4$ + sql_5$ + sql_6$
من تو خط اول دستور ساختن جدول رو همراه با نام جدول تو يك متغير رشته اي ريختم و تو خطوط بعدي به ترتيب نام فيلدهاي جدول و خصوصياتشون رو تو متغيرهاي رشته اي ديگه اي ريختم.

در نهايت تو خط آخر همه اين متغيرهاي رشته اي رو با هم جمع كردم.

بنابراين متغير رشته اي $sql_query حاوي دستور ساختن جدولي با نام tell و 5 تا فيلد id – name – home – mob – address هست:
کد:
CREATE TABLE tell (id INTEGER PRIMARY KEY NOT NULL,name CHAR NOT NULL,home INTEGER NOT NULL,mob INTEGER NOT NULL,address CHAR NOT NULL );
حالا مقدار اين متغير رو به پلاگين ارسال ميكنم:
کد:
[B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","sql_query$")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","Query")
با دستور PluginSet مقدار متغير $sql_query به پلاگين ارسال ميشه و با دستور PluginRun و پارامتر Query دستور ساختن جدول اجرا ميشه.

يادمون باشه تنها روش حرف زدن با اين پلاگين همينه.

يعني دستورات مورد نظر به زبان SQl رو تو يك متغير رشته اي ميريزيم. بعد با PluginSet مقدار متغير رشته اي رو به پلاگين ارسال ميكنيم و بلافاصله با PluginRun و پارامتر Query اون دستور رو اجرا ميكنيم.

و حالا نوبت اينه كه چك كنيم آيا واقعا جدول ساخته شده يا نه؟

من اين كد رو به ادامه دستورات قبلي اضافه ميكنم:
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin ","DBError")
با پارامتر DBError كه توسط PluginRun اجرا ميشه ميشه فهميد كه آيا در هنگام اجراي دستوري تو پلاگين خطايي بوجود اومده يا نه.

ما ميتونيم نتيجه بدست اومده از اين دستور رو با PluginGet بدست بياريم:
کد:
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Error$")
مقدار متغير $Error به ما ميگه كه آيا در هنگام اجراي دستورات SQL آيا خطايي به وجود اومده يا نه.

اگه مقدار ' ' = $Error ( تهي ) باشه يعني خطايي به وجود نيومده. اما اگه خطايي در حين اجراي دستورات وجود داشته باشه اين متغير اون خطا رو درون خودش ثبت ميكنه.

من با يك شرط از اين وضعيت مطمئن ميشم:
کد:
[COLOR=Blue]If [/COLOR](Error$='') [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Database table created successfully")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Error$")
[COLOR=Blue]End[/COLOR]
اگه مقدار ' ' = $Error باشه يعني خطايي وجود نداره پس برنامه پيغام موفقيت صادر ميكنه و اگه خطايي وجود داشته باشه برنامه با دستور Message اون خطا رو نمايش ميده.

خب پس تا اينجا چي داريم؟

پلاگين راه اندازي شد، ديتابيس ساخته شد، ديتابيس باز شد، جدول مورد نظر داخل ديتابيس ساخته شد. و ما ميتونيم از اين ديتابيس استفاده كنيم و داده ها رو درونش ثبت و استخراج كنيم.

فايل پيوست شده حاوي برنامه اي هست كه تا الان توليد شده

يه سوال؟

آيا هربار كه قصد داريم يك ديتابيس جديد بسازيم بايد همه اين راه ها رو بريم؟

راه حل ساده تري وجود نداره؟ مثلا يه برنامه كه بتونه با چندتا كليك ساده، بلافاصله يه ديتابيس با جدول و فيلدهاي موردنظر برامون بسازه !

من فكر ميكنم اگه بتونيم برنامه اي بنويسيم كه آدرس محل ذخيره شدن و نام ديتابيس رو از ما بپرسه، بعد نام جدول و نام فيلدها رو بپرسه و با توجه به اين داده ها باقي كدها رو خودش بنويسه و يك ديتابيس بسازه كار ما براي ساختن ديتابيس‌هاي جديد بسيار ساده ميشه.

اينطور نيست؟
 

پیوست ها

  • step2.zip
    177 کیلوبایت · بازدیدها: 611
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
پايان پست قبلي سوالي رو مطرح كرده بودم. يادتون مياد؟
يه سوال؟

آيا هربار كه قصد داريم يك ديتابيس جديد بسازيم بايد همه اين راه ها رو بريم؟

راه حل ساده تري وجود نداره؟ مثلا يه برنامه كه بتونه با چندتا كليك ساده، بلافاصله يه ديتابيس با جدول و فيلدهاي موردنظر برامون بسازه !

من فكر ميكنم اگه بتونيم برنامه اي بنويسيم كه آدرس محل ذخيره شدن و نام ديتابيس رو از ما بپرسه، بعد نام جدول و نام فيلدها رو بپرسه و با توجه به اين داده ها باقي كدها رو خودش بنويسه و يك ديتابيس بسازه كار ما براي ساختن ديتابيس‌هاي جديد بسيار ساده ميشه.

من برنامه اي رو آماده كردم كه همين كار رو انجام ميده. در واقع با پرسيدن نام و مسير ديتابيس، نام جدول و نام فيلدها، ديتابيس موردنظر رو ميسازه.

البته همونطور كه تو مباحث قبلي ديديم با نوشتن دستورات مربوطه به راحتي خودمون ميتونيم ديتابيس موردنظر رو بسازيم. ولي اين برنامه كار ما رو كمي راحت تر ميكنه. ديگه لازم نيست به ازاي هر ديتابيسي كه قصد داريم بسازيم كلي كد بنويسيم.

مطئنم اگه سورس اين برنامه رو با دقت نگاه كنيد حتما متوجه ميشيد كه من از چه تكنيكي استفاده كردم ولي بيايد با هم يه بار ديگه سورس رو با جزئياتش بررسي كنيم.

برنامه رو تو mmb اجرا ميكنيم. اين برنامه فقط يك صفحه داره و اشياء مختلفي تو اين صفحه قرار دارن.

attachment.php


اول پلاگين SQLite كه تو برنامه وارد شده

دوم تعدادي اسكريپت

سوم 5 گروه كه هر گروه شامل اشيايي هستند و كاري رو انجام خواهند داد.

به جز اولين گروه باقي گروهها مخفي هستن (دليلش رو بعدا خواهيم ديد)

اين گروهها شامل:

گروه path كه يك كليد Browse و يك شي متني به نام DBPath داره. همونطور كه از اسم اين گروه هم مشخص هست از اين بخش براي گرفتن نام و مسير ديتابيس استفاده خواهيم كرد.

گروه table كه شامل يك شي متني براي توضيحات و عنوان اين بخش، يك شي EditBox براي دريافت نام جدول و يك كليد به نام set هست. اين گروه براي دريافت نام جدول استفاده خواهد شد.

گروه field كه باز شامل يك شي متني براي توضيحات و عنوان اين بخش، يك شي EditBox براي دريافت نام فيلدها و دوتا كليد Add و Reset هست. از اين گروه براي دريافت نام فيلدهاي جدول و خصوصياتشون استفاده خواهد شد.

گروه create كه فقط يك شي متني براي توضيحات و عنوان اين بخش و يك كليد Create داره براي ساختن نهايي ديتابيس همراه با جدول استفاده ميشه.

و گروه آخر sql_query كه شامل يك مستطيل رنگي، پاراگراف و شي متني هست. اين گروه كاربرد زيادي نداره و فقط براي نمايش دستورات به زبان SQL استفاده ميشه.

توصيه ميكنم برنامه رو اجرا كنيد و با توجه به توضيحات يك ديتابيس جديد بسازيد.

در ادامه كدهايي كه براي هر گروه از اشياء نوشته شده رو بررسي ميكنيم.
 

پیوست ها

  • s2.jpg
    s2.jpg
    208.3 کیلوبایت · بازدیدها: 702
  • db_creator.zip
    178.1 کیلوبایت · بازدیدها: 771

evil_gates

اين نيز بگذرد ...
اولين بخشي كه بررسي ميكنيم گروه path هست.

اين گروه حاوي يك شي متني به نام DBPath و يك كليد هست.

كدهايي كه تو اين كليد نوشته شده:
کد:
[B][COLOR=Navy]SaveFile[/COLOR][/B]("SQLite Database (*.db)|*.db|All Files (*.*)|*.*|","*.db")
path$=[COLOR=Blue]CBK_OpenDir[/COLOR] + [COLOR=Blue]CBK_OpenFile[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("DBPath","path$")
[B][COLOR=Navy]RunScript[/COLOR][/B]("Initialization")
تو خط اول با دستور SaveFile پنجره ذخيره فايل براي كاربر نمايش داده ميشه. كاربر ميتونه نام فايل و مسيرش رو انتخاب كنه و با فرمت db يك فايل جديد ذخيره كنه.

نتيجه اين انتخاب تو خط بعدي تو متغيري به نام $path ذخيره ميشه. در واقع به كمك توابع CBK_OpenDir مسير انتخاب شده و CBK_OpenFile نام انتخاب شده توسط كاربر رو بدست مياريم و تو متغير رشته‌اي به نام $path ميريزيم.

مقدار اين متغير براي ساختن ديتابيس ضروري هست.

تو خط بعدي مقدار متغير رو تو شي متني DBPath كه تو همين گروه قرار داره نمايش ميديم و در نهايت در خط آخر اسكريپت Initialization رو اجرا ميكنيم.

تو اين اسكريپت كدهايي براي راه اندازي پلاگين و ساختن ديتابيس نوشته شده. قبلا با اين كدها آشنا شديم اما يكبار ديگه اونا رو بررسي ميكنيم:
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","SQLiteInit")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Initialized")
[COLOR=Blue]If [/COLOR](Initialized = 1) [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","path$")
  [B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","GetDBFileName")
  [B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","CreateSQLDB")
  [B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Created")
  [COLOR=Blue]If [/COLOR](Created<>0) [COLOR=Blue]Then[/COLOR]
    [B][COLOR=Navy]Message[/COLOR][/B]("","Database created successfully")
    [B][COLOR=Navy]Show[/COLOR][/B]("table_group")
  [COLOR=Blue]Else[/COLOR]
    [B][COLOR=Navy]Message[/COLOR][/B]("","Unable To create database")
  [COLOR=Blue]End[/COLOR]
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Unable To initialize SQLite plugin")
[COLOR=Blue]End[/COLOR]
در خط اول اين كد با دستور SQLiteInite پلاگين راه اندازي ميشه و نتيجه راه اندازي پلاگين تو متغيري به نام Initialized ذخيره ميشه.

همونطور كه ميدونيد اگه پلاگين به درستي راه اندازي بشه مقدار Initialized = 1 خواهد بود.

پس به كمك شرطي مقدار اين متغير رو چك ميكنيم. در صورتي كه مقدار متغير مخالف 1 باشه يعني پلاگين راه اندازي نشده پس پيغام عدم موفقيت راه اندازي پلاگين صادر ميشه.

اما در صورتي كه شرط صحيح باشه يعني پلاگين راه اندازي شده باشه

با PluginSet مقدار متغير $path كه همون مسير و نام فايلي بود كه توسط كاربر انتخاب شده بود رو به پلاگين ارسال ميكنيم.

در خط بعدي با دستور GetDBFileName اين مسير رو در پلاگين اجرا ميكنيم و با دستور CreateSQLDB ديتابيس موردنظر ساخته خواهد شد.

نتيجه حاصل از اجراي دستورات بالا يعني ساخته شدن ديتابيس رو توسط دستور PluginGet تو متغيري به نام Created ذخيره ميشه.

اگه ديتابيس به درستي ساخته شده باشه مقدار اين متغير نبايد صفر باشه. پس به كمك يك شرط ديگه اين مسئله رو چك ميكنيم

در صورتي كه مقدار متغير صفر باشه يعني ديتابيس ساخته نشده پس برنامه پيغام عدم موفقيت صادر ميشه و در صورتي مقدار متغير مخالف صفر باشه يعني ديتابيس به درستي ساخته شده پس تو خطوط بعدي:

پيغام ديتابيس با موفقيت ساخته شد صادر و با دستور Show گروه table نمايش داده ميشه.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
گروه table شامل شي متني به نام tablename_title براي عنوان و توضيحات اين گروه، يك شي EditBox به نام tablename_ed براي دريافت نام جدول و يك كليد به نام Set هست.

عبارتي كه تو كادر EditBox در اين گروه وارد ميشه تو متغير رشته اي به نام $tablename ثبت خواهد شد.

با فشردن كليد Set اسكريپت set_tablename اجرا ميشه كه دستورات اين اسكريپت رو بررسي ميكنيم:
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","OpenSQLDB")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Opened")
[COLOR=Blue]If [/COLOR](Opened=1) [COLOR=Blue]Then[/COLOR]
  sql_table$ =[COLOR=DarkRed] 'CREATE TABLE '[/COLOR] + tablename$ +[COLOR=DarkRed] ' ('[/COLOR]
  [B][COLOR=Navy]Show[/COLOR][/B]("field_group")
  [B][COLOR=Navy]Show[/COLOR][/B]("sql_query_group")
  [B][COLOR=Navy]LoadText[/COLOR][/B]("sql_query","sql_table$")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Unable To open database")
[COLOR=Blue]End[/COLOR]
همونطور كه ميدونيد بعد از ساختن ديتابيس لازمه كه اون رو باز كنيم و بعد جدول و فيلدها رو درون اون بسازيم.

پس در خط اول اين كد با دستور OpenSQLDB ديتابيس رو باز ميكنيم.

نتيجه اجراي اين دستور توسط PluginGet تو متغيري به نام Opened ثبت ميشه.

اگه ديتابيس به درستي باز شده باشه مقدار Opened = 1 خواهد بود. پس باز به كمك يك شرط مقدار اين متغير رو چك ميكنيم.

در صورتي كه مقدار Opened<>1 باشه يعني ديتابيس به درستي باز نشده. پس برنامه پيغام خطاي عدم موفقيت صادر ميكنه.

اما اگه برنامه به درستي باز شده باشه نوبت به ساختن جدول ميرسه:

براي ساختن جدول از دستور CREATE TABLE در SQL استفاده ميكرديم. پس اين دستور رو تو يك متغير رشته‌اي به نام $sql_table ميريزيم و به ادامه اون نام جدول و كاراكتر پرانتز رو اضافه ميكنيم. نام جدول همون عبارتي خواهد بود كه تو كادر EditBox نوشته شده.

پس اگه فرض كنيم كه نام جدول ما tell باشه مقدار متغير $sql_table رشته‌اي معادل مقدار زير خواهد بود:
کد:
CREATE TABLE tell (
تو خطوط بعدي گروه سوم يعني گروه field و گروه آخر يعني گروه sql_query ظاهر خواهند شد.

تو خط بعدي به كمك دستور LoadText مقدار متغير $sql_table رو در پاراگرافي كه در گروه sql_query قرار داره نمايش ميديم.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
گروه field شامل يك شي متني به نام field_title براي نمايش و توضيحات اين گروه، يك شي EditBox براي دريافت نام فيلدها و دوتا كليد Add و Reset هست.

عبارتي كه تو كادر EditBox درج ميشه تو متغيري به نام $field ثبت خواهد شد. تو اين كادر نام فيلد و خصوصيتي كه براي فيلد در نظر گرفتيم رو وارد ميكنيم.

مثلا: id INTEGER PRIMARY KEY

يا مثلا: name CHAR

كليد Add دستوراتي كه تو اسكريپت add_field نوشته شده رو اجرا ميكنه. دستورات اين اسكريپت رو بررسي ميكنيم:
کد:
sql_field$ = sql_field$ + [COLOR=Blue]CHR[/COLOR]([COLOR=Red]13[/COLOR]) + [COLOR=Blue]CHR[/COLOR]([COLOR=Red]10[/COLOR]) + field$ + [COLOR=DarkRed]' NOT NULL ,'[/COLOR]
sql_query$ = sql_table$ + sql_field$
[B][COLOR=Navy]LoadText[/COLOR][/B]("sql_query","sql_query$")
temp$=[COLOR=DarkRed]''[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("field_ed","temp$")
[B][COLOR=Navy]Show[/COLOR][/B]("create_group")
تو خط اول متغير رشته‌اي به نام $sql_field رو در نظر ميگيريم و مقدارش با پارامتر (CHR(13 و (CHR(10 جمع ميكنيم. در ادامه مقدار متغير $field رو به اين متغير رشته‌اي اضافه ميكنيم. و در پايان هر فيلد عبارت NOT NULL و كاراكتر ويرگول ( , ) در پايان جمله رو اضافه ميكنيم.

تو خط دوم مقدار متغير رشته‌اي $sql_field با مقدار متغير رشته‌اي $sql_table كه حاوي دستور نام جدول بود جمع ميشه و تو متغير ديگه اي به نام $sql_query ثبت ميشه.

متغير $sql_field در ابتدا خالي هست ولي هربار كه كليد Add رو بزنيم اين دستورات تكرار و يك فيلد به فيلدهاي قبلي اضافه خواهد شد.

تو خط سوم با دستور LoadText مقدار متغير $sql_query كه حاوي دستور ساختن نام جدول و نام فيلدهاي مورد نظر هست درون شي پاراگراف نمايش داده ميشه

براي اينكه بعد از هربار فشردن دكمه Add كادر EditBox خالي و آماده دريافت عبارت جديد بشه به همين خاطر يك متغير رشته اي برابر با تهي در نظر ميگيريم.

خط چهارم يعني ' ' = $temp همين كار رو انجام ميده. يعني مقدار متغير رشته‌اي $temp رو برابر تهي قرار ميده.

تو خط پنجم مقدار اين متغير رو تو شي EditBox با دستور LoadText نمايش ميديم. در واقع به اين روش كادر EditBox رو خالي ميكنيم.

و تو خط آخر هم آخرين گروه يعني create رو ظاهر ميكنيم.

با فرض اينكه قصد داشته باشيم 3 تا فيلد به برنامه خودمون اضافه كنيم. بايد نام فيلد و خصوصيت مورد نظر رو تو كادر مربوطه وارد و كليد Add رو بزنيم. بنابراين مقدار متغير $sql_query چيزي شبيه اين خواهد بود:
کد:
CREATE TABLE tell (
id INTEGER PRIMARY KEY NOT NULL ,
name CHAR NOT NULL ,
phone INTEGER NOT NULL ,
تو اين گروه يك كليد ديگه به نام Reset وجود داره.

اگه در طول ساختن فيلدهاي جدول فيلدي رو به اشتباه وارد كرديم با كمك اين كليد ميشه فيلدها رو ويرايش و مجددا اون رو ساخت.
کد:
sql_field$ =[COLOR=DarkRed] ''[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("sql_query","sql_table$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("field_ed","sql_field$")
تو خط اول مقدار متغير $sql_field كه حاوي فيلدهاي ساخته شده تا الان هست رو خالي ميكنه. در واقع هرچي فيلد تاحالا ساخته بوديم پاك ميشه.

تو خط بعدي مقدار متغير $sql_table كه همون دستور ساختن و نام جدول بود رو تو شي پاراگراف نمايش ميده.

و تو خط سوم هم مقدار متغير $sql_field كه خالي هست رو تو كادر EditBox نمايش ميده.

به اين ترتيب فيلدهايي كه ساخته شدن پاك ميشه و مجددا ميشه فيلدهاي جديد با خصوصياتشون رو ساخت.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
گروه create شامل يك شي متني create_title براي نمايش توضيحات و عنوان و يك كليد به نام Create براي ساختن نهايي جدول هست.

كليد Create دستورات اسكريپت create_table رو اجرا خواهد كرد

کد:
x = [COLOR=Blue]LEN[/COLOR](sql_query$)
sql_query$ = [COLOR=Blue]StrDel[/COLOR](sql_query$,x,1)
sql_query$ = sql_query$ + [COLOR=DarkRed]');'[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("sql_query","sql_query$")
[B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","sql_query$")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","Query")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","DBError")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Error$")
[COLOR=Blue]If [/COLOR](Error$='') [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Database table created successfully")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Error$")
[COLOR=Blue]End[/COLOR]
به وسيله گروههاي قبلي دستور CREATE TABLE رو همراه با نام جدول و نام فيلدها تو متغيري به نام $sql_query ثبت كرديم.

حالا نوبت پايان دادن به اين دستور و ارسالش به پلاگين براي ساخت جدول هست.

حتما يادتون مياد كه براي پايان دادن به دستور از كاراكتر ;( استفاده ميكرديم.

خب كافيه اينجا مقدار متغير $sql_query رو با اين كاراكتر جمع كنيم و بعد اين متغير رو به پلاگين ارسال كنيم.

ولي اگه با دقت به كدهاي مثال پست قبلي نگاه كنيد ميبينيد كه در پايان آخرين فيلد يعني phone يك كاراكتر ويرگول ( , ) درج شده. در صورتي كه بعد از آخرين فيلد ديگه لازم نيست اين كاراكتر وجود داشته باشه.

اسكريپت add_field كه قبلا بررسي كرديم از يك قاعده ثابت پيروي ميكنه. يعني هربار كه فيلدي رو به اين متغير اضافه كنه يك كاراكتر ويرگول به انتهاي اون اضافه خواهد كرد. جدول ما چه يك فيلد داشته باشه چه 10 تا فيلد باز هم در انتهاي هر فيلد يك كاراكتر ويرگول درج خواهد شد.

براي رفع اين مشكل لازمه اول آخرين كاراكتر متغير رشته اي $sql_query كه همون كاراكتر ويرگول هست رو پاك كنيم. بعد كاراكتر ;( رو به انتهاي اون متغير اضافه كنيم تا دستور CREATE TABLE به درستي تكميل بشه.

اگه به دو خط اول دستورات اسكريپت create_table دقت كنيد ميبينيد كه همين اتفاق ميفته و كاراكتر ويرگول از انتهاي متغير حذف ميشه.

از اونجايي كه نميدونيم طول متغير چه مقدار هست بنابراين تو خط اول با تابع LEN طول متغير رشته‌اي $sql_query رو بدست مياريم و تو x ثبت ميكنيم.

بنابراين موقعيت آخرين كاراكتر متغير كه همون ويرگول فيلد آخري هست برابر با x خواهد بود

تو خط دوم با تابع StrDel در محل x كه همون آخرين كاراكتر هست يك كاراكتر رو حذف مي كنيم. (يعني كاراكتر ويرگول آخرين فيلد حذف ميشه)

تو خط سوم كاراكتر ;( رو به انتهاي متغير اضافه ميكنيم.

و تو خط بعدي نتيجه كه همون دستور كامل CREATE TABLE هست رو تو شي پاراگراف نمايش ميديم.

نوبت ساختن جدول هست. با PluginSet مقدار متغير $sql_query رو به پلاگين ارسال ميكنيم و با PluginRun و دستور Query اين دستور رو اجرا ميكنيم.

نتيجه: جدول مورد نظر درون ديتابيس ساخته خواهد شد.

براي اطمينان از اين نتيجه با دستور DBError از پلاگين ميخوايم كه اگه مشكلي در ساخت جدول به وجود اومده رو به ما گزارش بده.

با دستور PluginGet نتيجه اين گزارش تو متغيري به نام $Error ثبت ميشه.

اگه مقدار $Error خالي باشه يعني جدول به درستي ساخته شده و مشكلي وجود نداره.

با يك شرط اين مسئله رو بررسي ميكنيم.

اگه ' ' = $Error يعني جدول به درستي ساخته شده. پس برنامه يك پيغام موفقيت صادر ميكنه . در غير اينصورت برنامه پيغام عدم موفقيت رو صادر و مقدار متغير $Error رو كه همون خطاي مربوطه هست رو نمايش ميده.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
خب دوستان تا اينجا تونستيم يك ديتابيس بسازيم. همينطور براي ساختن ديتابيس هاي بيشتر راه حلي پيدا كرديم و برنامه اي توليد كرديم كه با چندتا كليك ساده بشه ديتابيس جديدي رو با جدول و فيلدهاي مورد نظر ساخت.

البته برنامه‌اي به نام SQLite Database Browser توسط جناب silvercover تو اين مبحث معرفي شده كه همين كار رو با امكاناتي بيشتر انجام ميده.

اما هدف اين بود كه با مكانيزم اين نوع برنامه ها بيشتر آشنا بشيم و بتونيم مشكلاتمون رو خودمون حل كنيم.

در ادامه بر اساس طرح دستي كه قبلا تهيه كرده بوديم سعي ميكنيم دفتر تلفنمون رو بسازيم.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
براي ساختن دفتر تلفن همونطور كه تو مباحث قبلي ديديد طرح دستي برنامه رو تهيه كرديم. بعد بر اساس طرح ديتابيس موردنظر رو ساختيم.

ديتابيس ما شامل يك جدول به نام tell با 5 فيلد زير بود:

رديف ( id ) از نوع عددي يا INTEGER و خصوصيت كليد اصلي PRIMARY KEY

نام و نام خانوادگي ( name ) از نوع متني يا CHAR

شماره ثابت ( home ) از نوع عددي يا INTEGER

شماره همراه ( mob ) از نوع عددي يا INTEGER

و آدرس ( address ) از نوع متني يا CHAR

يكي از بخشهاي برنامه دفتر تلفن ما بخش ورود اطلاعات بود. يعني صفحه كه بتونه اطلاعات موردنظر رو دريافت و تو ديتابيس ثبت كنه.

من يه برنامه براي اين منظور آماده كردم بيايد برنامه پيوست شده رو با جزئياتش بررسي كنيم:

قبل از هر چيزي بايد اشياء مورد نظر رو وارد صفحه اصلي برنامه كنيم.

attachment.php


من يك پلاگين SQLite وارد برنامه ميكنم. 5 تا كادر EditBox براي دريافت مقادير ورودي از كاربر و يك شي متني براي توضيح. دوتا كليد و دو تا اسكريپت

كادر id_editbox براي دريافت رديف استفاده شده و عدد وارد شده رو تو متغيري به نام $id ثبت ميكنه

كادر name_editbox براي دريافت نام و نام خانوادگي استفاده شده و عبارت وارد شده رو تو متغيري به نام $name ثبت ميكنه

كادر home_editbox و mob_editbox براي دريافت شماره ثابت و شماره همراه استفاده شده اعداد وارد شده رو به ترتيب تو متغيرهايي به نام $home و $mob ثبت ميكنه

و كادر address_editbox براي دريافت آدرس استفاده شده و عبارت وارد شده رو تو متغيري به نام $address ثبت ميكنه

كليد add براي اضافه كردن داده هاي ما به ديتابيس استفاده ميشه. اين كليد دستورات اسكريپت add_record رو اجرا خواهد كرد.

كليد reset براي زماني استفاده ميشه كه قصد داشته باشيم اطلاعاتي كه تو كادرهاي EditBox نوشتيم رو پاك كنيم.

در زمان اجراي برنامه ابتدا با دستوري كه تو page start نوشتيم:
کد:
[COLOR="Navy"][B]RunScript[/B][/COLOR]("initialization")
دستورات اسكريپت initialization اجرا خواهند شد.

پس اول اين دستورات رو بررسي ميكنيم:
کد:
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","SQLiteInit")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Initialized")
[COLOR=Blue]If [/COLOR](Initialized = 1) [COLOR=Blue]Then[/COLOR]
  db_path$ =[COLOR=DarkRed] '<SrcDir>\mytelldb.db'[/COLOR]
  [B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","db_path$")
  [B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","GetDBFileName")
  [B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","OpenSQLDB")
  [B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Opened")
  [COLOR=Blue]If [/COLOR](Opened = 0) [COLOR=Blue]Then[/COLOR]
    [B][COLOR=Navy]Message[/COLOR][/B]("","Unable To open database")
    [COLOR=Navy]Exit[/COLOR]()
  [COLOR=Blue]End[/COLOR]
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Unable To initialize SQLite plugin")
  [B][COLOR=Navy]Exit[/COLOR][/B]()
[COLOR=Blue]End[/COLOR]
ميدونيد كه هميشه در زمان كار با پلاگين SQLite اول بايد اين پلاگين رو راه اندازي كرد.

پس طبق معمول تو خط اول با دستور SQLiteInit اين پلاگين رو راه اندازي ميكنيم

تو خط بعدي با PluginGet مقدار بازگشتي از اين دستور رو تو متغيري به نام Initialized ثبت ميكنيم. در صورتي كه پلاگين به درستي راه اندازي شده باشه مقدار Initialized = 1 خواهد بود.

پس با يك شرط اون رو چك ميكنيم.

در صورتي كه مقدار Initialized = 1 نباشه يعني پلاگين به درستي راه اندازي نشده. پس برنامه پيغام خطاي عدم موفقيت راه اندازي صادر ميكنه و بلافاصله با دستور Exit از برنامه خارج ميشه.
(البته اين بسته به ميل شماست كه دستور Exit رو استفاده كنيد يا نه يا هر دستور ديگه اي به جاي اون استفاده كنيد.)

اما اگه مقدار Initialized = 1 باشه يعني پلاگين به درستي راه اندازي شده پس ميتونيم مراحل بعدي رو طي كنيم.

بعد از راه اندازي پلاگين نوبت باز كردن ديتابيس ماست.

من آدرس ديتابيس رو تو متغير رشته اي به نام $db_path ريختم و با PluginSet اين آدرس رو به پلاگين ارسال كردم. با دستور GetDBFileName و OpenSQLDB ديتابيس خودم رو باز كردم.

آيا ديتابيس به درستي باز شده؟ اين نكته رو ميشه با PluginGet بدست آورد و با يك شرط چك كرد.

PluginGet نتيجه اجراي دستور بالا رو تو متغيري به نام Opened ثبت ميكنه.

اگه ديتابيس به درستي باز شده باشه مقدار Opened بايد مخالف صفر باشه. تو شرطي كه من نوشتم اگه مقدار Opened = 0 باشه يعني ديتابيس به درستي باز نشده پس يك پيغام خطا صادر ميشه و با دستور Exit از برنامه خارج ميشيم.
(البته بازهم اينجا استفاده از اين دستور به نظر خودتون بستگي داره.)

خب تا اينجا پلاگين راه اندازي شد و ديتابيس ما هم باز شد.

نوبت ميرسه به اضافه كردن اطلاعاتمون. يادتون هست كه گفتيم اطلاعات مورد نظر رو بايد با دستور INSERT INTO به ديتابيس صادر كنيم تا به صورت ركورد در جدولمون ثبت بشه؟

اطلاعات ما اينجا شامل 5 بخش رديف، نام و نام خانوادگي، شماره ثابت، شماره همراه و آدرس هست.

پس اين اطلاعات رو به ترتيب تو كادرهاي EditBox كه ايجاد كرديم وارد ميكنيم. با كليك كردن روي دكمه ثبت اطلاعات دستورات اسكريپت add_record اجرا خواهند شد. اين اسكريپت براي ارسال داده هاي ما به ديتابيس نوشته شده.

بيايد دستورات اين اسكريپت رو بررسي كنيم:
کد:
[COLOR=Blue]If [/COLOR](id$=[COLOR=Black]''[/COLOR] | name$='' | home$='' | mob$='' | address$='') [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Error : You must fill all blank box")
  [B][COLOR=Navy]Return[/COLOR][/B]()
[COLOR=Blue]End[/COLOR]
sql_query1$  =[COLOR=DarkRed] 'INSERT INTO tell (id,name,home,mob,address)'[/COLOR]
sql_query2$  =[COLOR=DarkRed] ' VALUES '[/COLOR]+id$+[COLOR=DarkRed]',"'[/COLOR]+name$+[COLOR=DarkRed]'",'[/COLOR]+home$+[COLOR=DarkRed]','[/COLOR]+mob$+[COLOR=DarkRed]',"'[/COLOR]+address$+[COLOR=DarkRed]'");'[/COLOR]
query$ = sql_query1$ + sql_query2$
[B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","query$")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","UpdateDB")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","update")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","DBError")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Error$")
[COLOR=Blue]If [/COLOR](update<>0) [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Your record has been saved successfully")
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Message[/COLOR][/B]("","Error$")
  [B][COLOR=Navy]Return[/COLOR][/B]()
[COLOR=Blue]End[/COLOR]
[COLOR=Green]*****************[/COLOR]
temp$=[COLOR=DarkRed]''[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("id_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("name_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("home_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("mob_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("address_editbox","temp$")
قبل از هر چيزي من با يك شرط چك كردم كه آيا محتويات تمام EditBox ها پر شده يا نه.

اگه مقدار $id يا $name يا $home يا $mob يا $address تهي باشه يعني يكي از اون كادرها هنوز پر نشده.

پس يك پيغام خطا صادر ميشه كه ميگه بايد تمام كادرها تكميل بشن و بلافاصله با دستور Return از ادامه عمليات اين اسكريپت جلوگيري ميشه.

اما اگه محتواي تمام كادرها پر شده باشه دستورات بعد از شرط به ترتيب اجرا خواهند شد.

حتما ميدونيد كه براي كار با پلاگين SQLite لازمه دستورات به زبان SQL رو تو متغيرهاي رشته‌اي بريزيم و بعد مقدار متغير رو به پلاگين ارسال و دستور مربوطه رو اجرا كنيم.

دستور ثبت اطلاعات در ركوردهاي جدول به زبان SQL اين صورت بود:
کد:
INSERT INTO tablename (field 1, field 2, field 3, …) VALUE (value 1, value 2, value 3, …);
من تو متغير رشته‌اي sql_query1$ بخش اول اين دستور يعني دستور، نام جدول و نام فيلدهاي جدول رو ثبت كردم.
کد:
sql_query1$  =[COLOR=DarkRed] 'INSERT INTO tell (id,name,home,mob,address)'[/COLOR]
تو بخش دوم اين دستور هم مقاديري كه از كادرهاي EditBox بدست ميان رو بعنوان مقادير فيلدها تو يك متغير رشته‌اي ديگه به نام sql_query2$ ثبت كردم.
کد:
sql_query2$  =[COLOR=DarkRed] ' VALUES '[/COLOR]+id$+[COLOR=DarkRed]',"'[/COLOR]+name$+[COLOR=DarkRed]'",'[/COLOR]+home$+[COLOR=DarkRed]','[/COLOR]+mob$+[COLOR=DarkRed]',"'[/COLOR]+address$+[COLOR=DarkRed]'");'[/COLOR]
فرض كنيد ما اين اطلاعات رو تو كادرهاي EditBox وارد كرده باشيم:
کد:
id = 1
name = evil_gates
home = 1234567
mob = 09151234567
address = زمين آسيا ايران پلاك 10
در اين صورت مقدار متغير sql_query2$ برابر با اين رشته خواهد شد:
کد:
VALUE (1, "evil_gates", 123456789, 09151234567, "زمين آسيا ايران پلاك 10");
تو اين عبارت دقت كنيد كه evil_gates و زمين آسيا ايران پلاك10 درون يك جفت دابل كوتيشين ( " " ) محصور شدن اما اعدادي كه مربوط به فيلد رديف و شماره ثابت و شماره همراه بودن به تنهايي درون رشته قرار گرفتن.

دليل اين امر اين بوده كه چون نوع داده فيلدهاي name و address از نوع متني يا CHAR هستند بنابراين مقداري كه درون اين فيلدها بايد ثبت بشه بايد درون يك جفت دابل كوتيشن قرار بگيره تا تمايز اون با داده هاي عددي رو مشخص كنه.

بعد از اين دو خط به كمك يك متغير رشته‌اي ديگه به نام $query مقدار دو متغير $sql_query1 و $sql_query2 رو با هم جمع كردم تا دستور INSERT INTO كامل بشه.

در واقع مقدار $query عبارت زير خواهد شد:
کد:
INSERT INTO tell (id,name,home,mob,address) VALUE (1, "evil_gates", 123456789, 09151234567, "زمين آسيا ايران پلاك 10");
حالا من يك دستور به زبان SQL دارم كه يك ركورد با مقادير موردنظر به جدول tell ديتابيس من اضافه ميكنه.

با PluginSet مقدار متغير رشته‌اي $query رو به پلاگين ارسال ميكنم. و با دستور UpdateDB دستور مربوطه رو تو پلاگين اجرا ميكنم.

نتيجه اضافه شدن ركورد مورد نظر به ديتابيس خواهد بود.

ميتونيم صحت اين نتيجه رو بررسي كنيم. نتيجه حاصل از دستور بالا تو متغيري به update ثبت ميشه كه با PluginGet بدست مياد.

با يك شرط چك ميكنيم كه آيا مقدار update <> 0 هست يا خير. اگه مقدار متغير مخالف صفر بود يعني اطلاعات به درستي ثبت شده. پس برنامه يك پيغام موفقيت صادر ميكنه و به سراغ دستورات بعد از شرط ميره.

اما اگه مقدار update = 0 باشه يعني در ثبت اطلاعات خطايي به وجود اومده. براي اينكه بدونيم چه خطايي با دستور DBError خطا رو پيدا ميكنيم و با PluginGet تو متغيري به نام $Error ميريزيم.

من تو خط بعدي با دستور Message مقدار $Error رو نمايش ميدم تا خطاي مورد نظر رو ببينم. و بلافاصله با دستور Return از انجام عمليات بعدي اسكريپت جلوگيري ميكنم.

اگه اطلاعات به درستي ثبت بشه و شرط ما هم اين مسئله رو تاييد كنه برنامه سراغ دستورات بعد از شرط ميره.

کد:
temp$=[COLOR=DarkRed]''[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("id_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("name_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("home_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("mob_editbox","temp$")
[B][COLOR=Navy]LoadText[/COLOR][/B]("address_editbox","temp$")
بر اي اينكه بعد از ثبت يك ركورد برنامه آماده ثبت ركوردهاي جديد بشه لازمه كه كادرهاي EditBox خالي و آماده دريافت اطلاعات بشن.

من يك متغير خالي به نام $temp ايجاد ميكنم و مقدارش رو با دستور LoadText تو كادرهاي EditBox نمايش ميدم. درواقع به اين روش كادرها رو خالي ميكنم.

از همين كدها براي كليد بازنويسي (reset) هم ميشه استفاده كرد تا در هر زماني كه مايل بوديم محتواي كادرهاي EditBox رو خالي كنيم.

خب دوستان با روشي كه تا اينجا يادگرفتيم ركوردهاي مختلفي رو تو ديتابيس ثبت كنيد تا تو مباحث بعدي روشهاي جستجو، بازيابي، ويرايش و حذف اطلاعات رو بررسي كنيم.
 

پیوست ها

  • tell.zip
    743 کیلوبایت · بازدیدها: 843
  • p1.jpg
    p1.jpg
    224.3 کیلوبایت · بازدیدها: 654
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
فرض كنيد ركوردهاي زير رو تو جدولمون ثبت كرديم:

attachment.php


و حالا قصد داريم تو جدولي كه ركوردهاي مختلفي ثبت شده جستجو كنيم و ركورد موردنظر رو بدست بياريم.

براي اين منظور اول بايد تعيين كنيم جستجو بر چه اساسي باشه. من يه برنامه ساختم كه بر اساس نام و نام خانوادگي ركوردهاي جدول رو جستجو ميكنه و نتيجه موردنظر رو نمايش ميده.

attachment.php


جزئيات اين برنامه رو بررسي ميكنيم:

برنامه من شامل سه بخش كلي كادر جستجو، نمايش نتيجه و كليد ها و اسكريپت هاي مربوطه هست.

بخش كادر جستجو يك شي متني و يك كادر EditBox به نام search_ed داره. عبارتي كه تو كادر search_ed نوشته ميشه تو متغير رشته اي به نام $search ثبت ميشه.

تو بخش نمايش اطلاعات يك شي متني براي عنوان به نام itm_text و 5 شي متني براي نمايش فيلدهاي مختلف ركورد موردنظر وجود داره.

شي id_text براي نمايش فيلد رديف
شي name_text براي نمايش فيلد نام و نام خانوادگي
شي home_text براي نمايش فيلد شماره ثابت
شي mob_text براي نمايش فيلد شماره همراه
شي address_text براي نمايش فيلد آدرس

بخش سوم كه كليد جستجو هست و دستورات اسكريپت search رو اجرا خواهد كرد.

باز هم طبق معمول اول پلاگين رو راه اندازي و ديتابيس رو باز ميكنيم.

دستورات مربوط به اين عمليات تو اسكريپتي به نام initialization نوشته شده. تو پستهاي قبلي راجع به اين دستورات به طور كامل توضيح داده شد.

اگه پلاگين به درستي راه اندازي بشه و ديتابيس هم بدون مشكلي باز بشه برنامه آماده دريافت عبارت موردنظر براي جستجو و نمايش دادن نتيجه خواهد بود.

عبارتي كه بعنوان نام و نام خانوادگي تو كادر search_ed نوشته ميشه با اسكريپت search تو ديتابيسمون جستجو ميشه.

دستورات اين اسكريپت رو بررسي ميكنيم:
کد:
sql_query$ = [COLOR=DarkRed]'SELECT * FROM tell WHERE name LIKE "'[/COLOR] + search$ + [COLOR=DarkRed]'";'[/COLOR]
[B][COLOR=Navy]PluginSet[/COLOR][/B]("SQL_Plugin","sql_query$")
[B][COLOR=Navy]PluginRun[/COLOR][/B]("SQL_Plugin","Query")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Result$")
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Rows")
[COLOR=Blue]If [/COLOR](Rows>0) [COLOR=Blue]Then[/COLOR]
  [COLOR=Blue]For [/COLOR]i=1 [COLOR=Blue]To [/COLOR]Rows
    record$[i]=[COLOR=Blue]GetArrayItem[/COLOR](Result$,[COLOR=DarkRed]'#'[/COLOR],i)
    record$[i]=record$[i]+[COLOR=DarkRed]'|'[/COLOR]
    [COLOR=Blue]For [/COLOR]j=1 [COLOR=Blue]To [/COLOR]5
      field$[j]=[COLOR=Blue]GetArrayItem[/COLOR](record$[i],[COLOR=DarkRed]'|'[/COLOR],j)
    [COLOR=Blue]Next [/COLOR]j
  [COLOR=Blue]Next [/COLOR]i
[COLOR=Blue]Else[/COLOR]
  [B][COLOR=Navy]Return[/COLOR][/B]()
[COLOR=Blue]End[/COLOR]
[B][COLOR=Navy]LoadText[/COLOR][/B]("id_text","field$[1]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("name_text","field$[2]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("home_text","field$[3]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("mob_text","field$[4]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("address_text","field$[5]")
قبلا گفتيم براي جستجو و بازيابي اطلاعات در ديتابيس دستوري به نام SELECT در SQL داريم.

براي اينكه بتونيم با پلاگين SQLite اين عمليات رو اجرا كنيم لازمه دستور SELECT رو با پارامترهاي لازم به صورت يك متغير رشته‌اي به پلاگين ارسال و اجرا كنيم.

من تو خط اول اين اسكريپت دستور SELECT رو تو يك متغير رشته اي به نام $sql_query ثبت كردم.
کد:
sql_query$=[COLOR=DarkRed]'SELECT * FROM tell WHERE name LIKE "'[/COLOR] + search$ +[COLOR=DarkRed] '";'[/COLOR]
تو اين دستور SELECT * FROM tell WHERE name LIKE ميگه انتخاب كن هر ركوردي رو تو جدول tell به شرطي كه فيلد name شبيه !!!

شبيه چي باشه؟

شبيه $search باشه. $search همون متغيري هست كه عبارتي كه تو كادر EditBox وارد كرده بوديم رو تو خودش ثبت كرده بود.

مثلا اگه تو اون كادر عبارت ali رو نوشته باشيم خروجي اين دستور به اين صورت خواهد شد.
کد:
SELECT * FROM tell WHERE name LIKE "ali";
در واقع دستور ميگه انتخاب هر ركوردي رو از جدول tell به شرطي كه فيلد name شبيه عبارت ali باشه.

دقت كنيد كه عبارت ali تو يك جفت دابل كوتيشن ( " " ) قرار گرفته. دليلش رو حتما ميدونيد ديگه ؟

اين دستور به زبان SQL تو متغير رشته اي به نام $sql_query ثبت شده و حالا من به كمك خط بعدي يعني دستور PluginSet مقدار اين متغير رو به پلاگين ارسال ميكنم با دستور Query در خط بعدي اون رو اجرا ميكنم.

با اين دستورات قبلا هم آشنا شديم درسته؟

نتيجه اجراي اين دستورات تو خط بعدي توسط PluginGet تو متغير رشته اي به نام $Result ثبت ميشه.

نتيجه اي كه تو $Result ثبت شده در واقع فيلدهاي ركوردي هست كه تو جدول tell بر اساس شرط ما پيدا شده.

مثلا اگه همون دستور بالا رو در نظر بگيريم. ركوردي كه فيلد name اون شبيه عبارت ali باشه پيدا شده (يعني ركورد شماره 3)

فيلدهاي اين ركورد شامل:

3
ali
02100004561
09120003834
تهران

هستند. اما چطور بايد اين فيلدها رو نمايش داد؟

نتايج بدست اومده از جستجو يعني فيلدهاي يك ركورد به ترتيب و پشت سر هم تو يك خط قرار ميگيرن و براي جداشدن از هم ديگه از كاراكتر ( | ) بينشون استفاده ميشه.

در واقع عبارتي كه تو متغير $Result ذخيره شده رشته زير خواهد بود.
کد:
3|ali|02100004561|09120003834|تهران#
كاراكتر ( # ) كه در انتهاي رشته بالا نوشته شده نشان دهنده پايان ركورد هست.

تو دستور بالا به خاطر شرطي كه نوشته بوديم و اينكه فقط يك ركورد تو جدول وجود داره كه فيلد name اون ali هست بنابراين مقدار $Result شامل فقط ركورد هست.

اما اگه نتيجه جستجو بيشتر از ركورد باشه چي؟

مثلا فرض كنيد دستور SELECT رو به اين صورت تغيير بديم:
کد:
sql_query$=[COLOR=DarkRed]'SELECT * FROM tell WHERE name LIKE "%'[/COLOR] + search$ +[COLOR=DarkRed] '%";'[/COLOR]
همونطور مي بينيد من كاراكتر ( % ) رو قبل و بعد از $search اضافه كردم يعني بازه جستجو رو گسترش دادم. (به صفحه اول اين آموزش مراجعه كنيد راجع به اين موارد توضيح كافي داده شده.)

بنابراين اگه اين دستور رو تو پلاگين اجرا بشه نتيجه شامل ركوردهاي 3 و 5 و 7 خواهد بود.

چون عبارت ali تو فيلد name اين سه تا ركورد وجود داره.

در اينصورت مقدار $Result چه رشته اي خواهد شد؟
کد:
3|ali|02100004561|09120003834|تهران#5|amirali|03410005885|09130008270|كرمان#7|alireza|02610002217|09120003003|كرج#
همونطور كه ميبينيد هر ركورد با كاراكتر ( # ) از ركوردهاي ديگه جدا شده و فيلدهاي درون يك ركورد هم با كاراكتر ( | ) از فيلدهاي ديگه اون جدا شده.

كاري كه در ادامه بايد انجام بديم اينه كه بدونيم چندتا ركورد بدست اومده و بعد با يك حلقه ركوردها و فيلدهاي هر ركورد رو از هم جدا كنيم و هر فيلد رو تو يك متغير ديگه بريزيم و نتيجه رو با LoadText تو شي متني مربوطه نمايش بديم.

کد:
[B][COLOR=Navy]PluginGet[/COLOR][/B]("SQL_Plugin","Rows")
من با دستور PluginGet كه تو خط پنجم دستورات اسكريپت نوشتم تعداد ركوردهاي بدست اومده رو تو متغيري به نام Rows ثبت ميكنم.

در حال حاضر مقدار Rows = 1 خواهد بود. چون شرط ما براي جستجو فقط عبارت ali بود و تو جدول هم فقط يك ركورد داريم كه فيلد name اون ali هست.

من با يك شرط ميتونم چك كنم كه آيا اصلا ركوردي پيدا شده يا نه؟ اگه مقدار Rows = 0 باشه يعني هيچ ركوردي پيدا نشده. اما اگه حتي يك ركورد هم پيدا بشه مقدار Rows>0 خواهد بود.

خب شرط من ميگه اگه Rows>0 بود دستوراتي رو اجرا كن.

اما اگه شرط صحيح نبود چي؟ اگه هيچ ركوردي پيدا نشد؟ در اينصورت من با دستور Return از ادامه عمليات اسكريپت جلوگيري ميكنم.

اما اگه شرط صحيح باشه و ركوردي پيدا شده باشه در اينصورت به كمك يك حلقه ركوردها و فيلدهاي بدست اومده رو از هم تفكيك ميكنم.
 

پیوست ها

  • p1.jpg
    p1.jpg
    52.2 کیلوبایت · بازدیدها: 628
  • p2.jpg
    p2.jpg
    191.5 کیلوبایت · بازدیدها: 649
  • tell1.zip
    742.9 کیلوبایت · بازدیدها: 622
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
يه سوال !!!

اگه قرار باشه ركوردها و فيلدها رو از هم تفكيك كنيم و هر داده رو تو يك متغير بريزيم چندتا متغير لازم داريم براي اينكه هيچ داده اي رو از دست نديم؟

تعدادشون رو نميدونيم. اما حدس ميزنيم كه قطعا تعداد زيادي متغير لازمه.

راه حل مطلوب تو اينجور مواقع استفاده از متغيرهاي آرايه اي هست. (حتما تو صفحه دوم اين آموزش راجع به متغيرهاي آرايه اي و استفاده از اونا مطالبي رو خونديد.)

در اينجا من به كمك يك حلقه و همين متغيرهاي آرايه اي اول ركوردها رو از هم جدا ميكنم و بعد هر ركورد رو با يك حلقه ديگه جدا ميكنم و مقدارش رو تو يك متغير آرايه اي ديگه ميريزم.

در واقع من فقط دوتا متغير خواهم داشت.

يك متغير آرايه اي كه ركوردهاي من رو نگه ميداره و يك متغير آرايه اي ديگه كه فيلدهاي هر ركورد رو نگه ميداره.

خيلي ساده تر شد نه؟

چون كاراكتر جداساز هر ركورد كاراكتر ( # ) بود بنابراين شرط تفكيك رشته ها هم همين كاركتر هست. اين حلقه رو ببينيد:
کد:
[COLOR=Blue]For [/COLOR]i=1 [COLOR=Blue]To [/COLOR]Rows
  record$[i]=[COLOR=Blue]GetArrayItem[/COLOR](Result$,[COLOR=DarkRed]'#'[/COLOR],i)
[COLOR=Blue]Next [/COLOR]i
تو اين حلقه از يك تا مقدار Rows ميچرخه. (مقدار Rows رو كه ميدونيد همون تعداد ركوردهاي پيدا شده هست. مثلا اگه 3 تا ركورد پيدا شده باشه حلقه 3 باز خواهد چرخيد)

و به ازاي هربار چرخش يك واحد به i اضافه ميشه و دستورات درون حلقه اجرا ميشن.

من تو اين حلقه يك دستور دارم: GetArrayItem

با اين دستور مقدار متغير $Result كه حاوي ركوردهاي بدست اومده جدول ما هست از محل ( ‌# ) از هم جدا ميشن و تو متغير آرايه اي به نام [record$[i ذخيره ميشن.


اما چرا [record$[i ؟

دستور GetArrayItem از سمت چپ رشته شروع ميكنه به خوندن كاراكتر ها و به اولين كاراكتر ( # ) كه رسيد رشته رو جدا ميكنه و تو متغير مربوطه ثبت ميكنه.

چون اين دستور درون حلقه اجرا ميشه هربار به i يك واحد اضافه ميشه بنابراين متغير آرايه اي هم اگه بر اساس متغير i شماره گذاري بشه نتايج صحيح رو تو خودش نگه ميداره.

براي درك بهتر فرض كنيد همونطور كه قبلا گفتيم خروجي جستجو نتيجه زير شده باشه:
کد:
3|ali|02100004561|09120003834|تهران#5|amirali|03410005885|09130008270|كرمان#7|alireza|02610002217|09120003003|كرج#
يعني 3 تا ركورد پيدا شده كه هر ركورد با كاراكتر ( # ) از ركوردهاي ديگه جدا شده باشه. در اينصورت اگه متغير $Result رو تو حلقه بالا بزاريم اين نتيجه حاصل ميشه:
کد:
record$[1] = 3|ali|02100004561|09120003834|تهران

record$[2] = 5|amirali|03410005885|09130008270|كرمان

record$[3] = 7|alireza|02610002217|09120003003|كرج
ميبينيد كه متغير آرايه اي [record$[i به ازاي هربار چرخش حلقه مقدار i رو ميگيره و يك ركورد رو تفكيك ميكنه و تو خودش ثبت ميكنه.

خب ركوردها تفكيك شدن و حالا نوبت اينه كه فيلدهاي هر ركورد رو از هم تفكيك كنيم.

فيلدهاي هر ركورد با كاراكتر ( | ) از هم جدا ميشن. بنابراين كاراكتر جداساز ما ( | ) خواهد بود.

براي تفكيك رشته لازمه كه كاراكتر جداساز در انتهاي هر فيلد قرار بگيره. اما اگه تو رشته‌هاي بالا دقت كنيد ميبينيد كه كاراكتر ( | ) در انتهاي فيلد آخر كه آدرس هست قرار نداره.

بنابراين تو عمليات تفكيك رشته آخرين فيلد يعني آدرس به درستي بدست نمياد.

براي حل اين مشكل من كاراكتر ( | ) رو به انتهاي ركورد اضافه ميكنم:
کد:
record$[i]=record$[i]+[COLOR=DarkRed]'|'[/COLOR]
دراينصورت خروجي رشته چيزي شبيه به اين خواهد شد:
کد:
record$[1] = 3|ali|02100004561|09120003834|تهران|
حالا به كمك يك حلقه ديگه و دستور GetArrayItem مقدار [record$[i رو تفكيك و نتيجه رو تو متغير آرايه اي ديگه اي به نام $field ثبت ميكنم.

چون ميدونيم كه تعداد فيلدهاي هر ركورد 5 تا هست بنابراين ميتونيم بگيم كه حلقه ما بايد 5 مرتبه بچرخه تا در هر بار چرخش به ترتيب يكي از بخشهاي رشته موردنظر ما جدا بشه و تو متغير آرايه اي ثبت بشه

حلقه زير همين كار رو انجام ميده:
کد:
[COLOR=Blue]For [/COLOR]j=1 [COLOR=Blue]To [/COLOR]5
  field$[j]=[COLOR=Blue]GetArrayItem[/COLOR](record$[i],[COLOR=DarkRed]'|'[/COLOR],j)
[COLOR=Blue]Next [/COLOR]j
خروجي حلقه بالا اين نتيجه خواهد شد:
کد:
field$[1] = 3
field$[2] = ali
field$[3] = 02100004561
field$[4] = 09120003834
field$[5] = تهران
بنابراين من يك حلقه i دارم كه به تعداد ركوردهاي بدست اومده تو پلاگين ميچرخه و به ازاي هربار چرخش يكي از ركوردها رو تفكيك ميكنه. داخل اين حلقه يه حلقه j دارم كه 5 بار ميچرخه و به ازاي هربار چرخش يكي از فيلدهاي ركورد رو جدا ميكنه و تو متغير مربوطه ثبت ميكنه.

حالا من تمام فيلدهاي ركورد موردنظر رو از هم جدا كردم و ميتونم با دستور LoadText تو شي متني مربوطه اونا رو نمايش بدم.
کد:
[B][COLOR=Navy]LoadText[/COLOR][/B]("id_text","field$[1]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("name_text","field$[2]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("home_text","field$[3]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("mob_text","field$[4]")
[B][COLOR=Navy]LoadText[/COLOR][/B]("address_text","field$[5]")
تو مباحث بعدي اين مثال رو گسترش ميديم و حالت هاي مختلف عمليات جستجو رو بررسي ميكنيم.
 
آخرین ویرایش:

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

بالا