درخواست يه مثال بانك اطلاعاتي

evil_gates

اين نيز بگذرد ...
سلام دوست عزيز

... چون پلاگين به صورت خودكار دوتا كاراكتر به رشته اضافه ميكنه پس با تابع len طول رشته بدست مياد و 2 واحد از اون در خط اول كد كم ميشه حالا در خط دوم كد با تابع strcopy از طول رشته كپي گرفته شده و دوباره توي متغير get ريخته ميشه
سوال اينه كه اين عدد1 توي خط دوم بين get و strlen چكار ميكنه ...

بله همونطور كه گفتيد با تابع LEN طول رشته رو بدست مياريم و ازش دو واحد كم ميكنيم. بنابراين طول واقعي رشته بدست مياد. حالا ميتونيم با اطمينان بگيم كه رشته ما رو از كاراكتر 1 تا كاركتر n (كه n همون طول رشته هست) كپي كن
تابع StrCopy براي كپي كردن بخشي از رشته ما در متغير رشته اي استفاده ميشه. به اين صورت كه رشته ما رو از محلي كه مشخص ميكنيم به تعداد كاراكتري كه تعيين ميكنيم جدا ميكنه و در يك متغير رشته اي ديگه ذخيره ميكنه.

شكل كلي اين دستور به اين صورت هست.
کد:
str$=StrCopy(string$,position,count)
تو دستور بالا $string همون رشته اصلي ماست position كاراكتر نقطه شروع و count تعداد كاراكترهايي كه بايد كپي بشن. و در نهايت تو متغير جديدي به نام $str ذخيره ميشه. (اگه ما به جاي $str از $string استفاده كنيم. در واقع عبارتي كه از رشته اصلي جدا شده مجددا تو خودش ذخيره ميشه. پس ميتونيم بگيم كه ساير كاراكترهاي رشته كه كپي نشدن حذف ميشه.)

فرض كنيد رشته اي داريم به نام ThisIsTest وقتي از تابع StrCopy استفاده كنيم و در قسمت position عدد 5 و تو قسمت count عدد 2 رو وارد كنيم. خروجي ما عبارت Is خواهد بود. از كاراكتر پنجم از ابتداي رشته به اندازه 2 كاراكتر جدا خواهد شد.

در دستور بالا select يعني فرمان جستجو به زبان sql * يعني تمام ركوردها از جدول contacts كه فيلد firstname آنها برابر متغير get$ باشه
اول اينكه من فيلد last name آيا درست حذف كردم ؟
بله

دوم اين علايم منو سردرگم ميكنه
Like\'' يا %\',' ميدونم زبان sql هست ميخوام بدونم براي مثلا يه مثال ديگه كدوم ازين علايم نياز هست و كدوم نه چون جايي از صحبتهاي آقا محمد شنيدم كه گفته بودن ميتونيد مورد جستجو رو بين دوتا علامت درصد قرار بدبد البته فكر كنم براي جستجوهاي مشابه بود.
توصيه ميكنم كمي زبان sql رو مطالعه كنيد. البته اگه با دقت متن دستور رو بخونيد از ترجمه فارسيش ميتونيد تشخيص بديد چه اتفاقي خواهد افتاد.
زبان SQL خيلي نزديك به زبان محاوره اي و همين امر دركش رو خيلي ساده ميكنه.

وقتي ميگيم SELECT * FROM tablename WHERE fiedname LIKE var يعني انتخاب كن هرچيزي از جدول ما رو به شرطي كه فيلد مشخص شده با var برابر باشه.
نتيجه: خروجي ما ركوردي خواهد بود كه var با fieldname برابر باشه.

اگه شما از % قبل يا بعد از متغير استفاده كنيد در واقع عمليات جستجو رو تعميم داديد و عبارتهاي مشابه رو هم جستجو ميكنيد. مثل استفاده از كاراكتر * كه در جستجو ويندوز استفاده ميكنيد.

براي اينكه به روش من رشته شما تفكيك بشه لازمه يك كاراكتر | به انتهاي اين رشته اضافه كنيد بنابراين از اين كد استفاده ميكنيم:
کد:
Results$=Results$+'|'
اينكه ميگيد به روش شما يعني چي آيا روش ديگه اي هم وجود داره و آيا روش كلي وجود داره كه من بتونم بر اساس اون توي يك مثال ديگه هم عمل كنم.
هر برنامه اي ميتونه چندين الگوريتم داشته باشه و هر برنامه نويسي به روش خودش و الگوريتمي كه تو ذهنش مينويسه برنامش رو اجرا ميكنه.
شما ممكنه يك برنامه واحد رو به ده برنامه نويس بديد و هر كدوم با روشي برنامه رو بنويسن. در واقع هركدوم با الگوريتم خودشون كار ميكنن.

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

...راي خروجي زير آيا من بايد شماره فيلدهارو بدونم و اگه بخوام چهار آيتم زير رو به يك ليست باكس اضافه كنم چكار بايد بكنم خودم كه فكر ميكنم بايد از حلقه تكرار استفاده كنم اما نميدونم چطور...
شما وقتي رشته رو با اين روش تفكيك ميكنيد. از سمت چپ به ترتيب رشته شما تكه تكه ميشن. پس قبل اينكه متن رو تفكيك كنيد يكبار متغير $Results رو با فرمان message نمايش بديد و با دقت اون رو ببينيد. اينطوري فكر ميكنم بهتر ميتونيد منظورم رو درك كنيد.

براي اينكه اون آيتمها رو به ليست باكس اضافه كنيد اين دستور رو ببينيد.
کد:
For i=1 To 5
ListBoxAddItem("ListBox","substr$[i]")
Next i
ميتونيد تحليل كنيد دستورات رو؟ سعي كنيد خط به خط به من بگيد چه اتفاقي افتاد.

در ضمن اگه از اين متغير رشته اي مثالهاي ساده داري كه بتونه بهم كمك كنه واسم لينك بذار بلكه بتونم بيشتر ياد بگيرم.
كتاب آموزشي جناب silvercover يه بخش كامل درباره متغيرهاي رشته اي داره. توصيه ميكنم اون رو با دقت بخونيد. فكر ميكنم حدود صفحات 200 به بعد باشه.

تو فرصت بعدي ايشالا ادامه ميديم.
موفق باشيد.
 
دستور:
For i=1 To 5​
به ازاي متغير I از 1 تا 5 بار حلقه تكرار ميشه
ListBoxAddItem("ListBox","substr$")

در هر بار چرخش حلقه آيتمي به ليست باكس اظافه ميشه و از متنغير رشته اي I كم ميشه
Next i​
اين آخرين آيتم حلقه تکرار هستش.​
من کد رو با ديتا بيس حامد خان اجرا كردم جوابي كه در ازاي جستجوي نام Behzad گرفتم شامل 5 تا آيتم در ليست باكس بود به اين صورت:
1: iran​
2: 4​
3: 218874214​
4: tehran​
5: this cool guy!​
كه فكر كنم آيتم دوم كه عدد 4 هست شماره ركورد باشه.
خواستم بدونم چطور ميشه فيلدي رو از داخل اين چرخه حذف كرد براي مثال فيلد مثلا سوم رو در ليست باكس قرار نده چكار بايد كرد.من خودم فكر ميكنم بايد از دستور شرطي استفاده كرد و لي چطور بين فيلد دوم و چهارم بايد ارتباط برقرار كرد رو نميدونم.
 

evil_gates

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

اين الگوريتم رو ببينيد
کد:
[COLOR=DarkGreen]1- [/COLOR]start 
[COLOR=DarkGreen]2-[/COLOR] x=0
[COLOR=DarkGreen]3- [/COLOR]x=x+1
[COLOR=DarkGreen]4-[/COLOR] run some commands
[COLOR=DarkGreen]5-[/COLOR] if x<5 then 
        go to line 3
    else
        go to line 6
    end
[COLOR=DarkGreen]6-[/COLOR] end

تو اين الگوريتم ما از شماره 1 برنامه رو شروع ميكنيم. تو خط دوم يك متغير به نام x رو در نظر ميگيريم كه معادل صفر هست. تو خط سوم به x يك واحد اضافه ميكنيم. تو خط چهارم دستوري رو اجرا ميكنيم (مهم نيست چه دستوري هرچيزي ممكنه باشه). تو خط پنجم. يك شرط تعيين ميكنيم. كه اگه مقدار x كوچكتر از 5 هست به خط 3 برگرده و اگه نيست (يعني x بزرگتر يا مساوي 5 ) به خط 6 بره. و خط ششم هم كه پايان برنامه هست.

با اين الگوريتم در واقع ما يك حلقه درست كرديم كه چندين بار خواهد چرخيد. و هربار دستورات خط 4 اجرا خواهد شد. به اين صورت كه برنامه x رو در نظر ميگيره. بهش يك واحد اضافه ميكنه (x ميشه 1) دستورات خط 4 رو اجرا ميكنه و شرط رو بررسي ميكنه. x كوچكتر از 5 پس به خط 3 ميره و دوباره يك واحد به x اضافه ميكنه (x ميشه 2) و به همين ترتيب تا زماني كه x بزرگتر يا مساوي 5 بشه. در اينصورت شرط ما نقض شده و برنامه به خط 6 خواهد رفت.

حلقه for / next هم دقيقا چنين الگوريتمي رو دنبال ميكنه.
کد:
For i=1 To 5
run some commands
Next i
تو حلقه ما متغير i از 1 شروع ميشه. به اين معني كه برنامه متغير i رو در نظر ميگيره و اون رو معادل 1 قرار ميده و با To شرط پايان حلقه رو مشخص ميكنه و چون شرط پايان حلقه عدد 5 بوده اون رو مقايسه ميكنه كه آيا i كوچكتر از 5 هست يا نه. بله هست پس دستورات داخل حلقه رو اجرا ميكنه. وقتي به خط Next i ميرسيم در واقع يك واحد به متغير i اضافه ميشه و باز چك ميشه و دستورات داخل حلقه اجرا ميشه تا زماني كه i=5 بشه.

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

مثلا اگه حلقه ما دفعه اولي باشه كه داره اجرا ميشه پس مقدار i=1 خواهد بود. پس اگه بگيم [myvar[i يعني [myvar[1 و اگه حلقه ما دومين چرخش باشه يعني [myvar[2

تو قسمت قبلي بعد از تفكيك حلقه اين مقدار بدست اومد:
کد:
substr$[1]=firstname
substr$[2]=lastname
substr$[3]=age
substr$[4]=address
substr$[5]=call
و قسمت بعدش باز دقيقا به كمك حلقه و يك متغير i كه هربار يك واحد بهش اضافه ميشه ما مقدار خودمون رو تو ListBox قرار داديم. وقتي حلقه ما شروع بشه مقدار i=1 هست پس اگه بگيم:
کد:
ListBoxAddItem("ListBox","substr$[i]")
در واقع به اين معني هست كه به برنامه گفتيم مقدار متغير [substr$[1 رو به ليست باكس اضافه كن. و به همين ترتيب تا انتهاي حلقه كه همون i=5 باشه يكي يكي مقادير متغير آرايه اي ما به ليست باكس اضافه خواهد شد.

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

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

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

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

موفق باشيد.
 
[FONT=&quot]كد:[/FONT]
[FONT=&quot]For[/FONT][FONT=&quot] i=[/FONT][FONT=&quot]1[/FONT][FONT=&quot] [/FONT][FONT=&quot]To[/FONT][FONT=&quot] [/FONT][FONT=&quot]5[/FONT]
براي حقه تكرار به ازاي I مساوي 1 تا 5
[FONT=&quot] X$= substr$[[/FONT][FONT=&quot]3[/FONT][FONT=&quot]][/FONT]
مقدار [FONT=&quot]substr$[[/FONT][FONT=&quot]3[/FONT][FONT=&quot]][/FONT] رو كه age هست در x قرار ميديم
[FONT=&quot] [/FONT][FONT=&quot]If[/FONT][FONT=&quot] (substr$<> X$) [/FONT][FONT=&quot]Then[/FONT]

حالا اگه متغير ما مخالف مقدار x باشه يه آيتم به ليست باكس اضافه ميشه و حلقه به خط ليست باكس اد آيتم ميره در غير اين صورت اگه متغير مساوي مقدار x باشه به خط بعد از else ميريم
[FONT=&quot] [/FONT][FONT=&quot]ListBoxAddItem[/FONT][FONT=&quot]("SongList","substr$")[/FONT]

[FONT=&quot] [/FONT][FONT=&quot]Else[/FONT]
اگه متغير مساوي مقدار ايكس باشه به خط بعد ميره يعني حلقه تمام ميشه
[FONT=&quot] [/FONT][FONT=&quot]End[/FONT][FONT=&quot][/FONT]​
[FONT=&quot]Next[/FONT][FONT=&quot] i[/FONT]
 

evil_gates

اين نيز بگذرد ...
دوست عزيز
اين كد هم همون كار رو انجام ميده فقط فرقش اينه كه ساده تره و يك خط از خطوط برنامه شما رو كمتر كرده و يك متغير اضافي به نام $x رو درگير نكرده.

کد:
For i=1 To 5
   If (i<>3) Then 
      ListBoxAddItem("ListBox","substr$[i]")
   End
Next i

حالا ميتونيد به سوالي اصلي خودتون پاسخ بديد؟ اينكه چطور ميتونيم عبارتهاي مشابه رو هم جستجو كنيم و نتيجه رو برگردونيم؟
 
آخرین ویرایش:
سلام.
باور كن من وقتي نگاهم به كد زير ميفته نميدونم اصلا از كجا بايد شروع كنم اصلا نميدونم كجاي اين كد رو بايد تغيير بدم بيشتر مشكلم همين جاست كه نميدونم مجموعه كد رو پيكر بندي كنم و بخشهاي كد رو از هم جدا كنم و بونم با كدوم بخش كار دارم و كجا رو بايد در حلقه قرار بدم اما سعي ميكنم يه چيزايي بگم البته نه خط به خط چون با لطف شما ميدونم كه خطوط اين مجموعه معنيشون چيه.
خب من ميخوام مقداري كه وارد پلاگين ميشه گرفته بشه و در پايگاه جستجو بشه و نمايش داده بشه.پس:
[FONT=&quot]PluginRun[/FONT][FONT=&quot]("PlugIn1","GetText")[/FONT]
[FONT=&quot]PluginGet[/FONT][FONT=&quot]("PlugIn1","get$")[/FONT]
[FONT=&quot]str_len=LEN(get$)-2[/FONT]
[FONT=&quot]get$=StrCopy(get$,1,str_len)[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]SearchQuery$ = 'SELECT * FROM contacts WHERE FirstName LIKE \''+ get$+'\' OR LastName LIKE \''+get$+'%\';'[/FONT]
[FONT=&quot] PluginSet("PlugIn","SearchQuery$")[/FONT]
[FONT=&quot] PluginRun("PlugIn","Query")[/FONT]
[FONT=&quot] PluginGet("PlugIn","Results$")[/FONT]
[FONT=&quot] PluginGet("PlugIn","Rows")[/FONT]
[FONT=&quot] PluginRun("PlugIn","DBError")[/FONT]
[FONT=&quot] PluginGet("PlugIn","DBError$")[/FONT]
[FONT=&quot] ScriptTimer("ReadFirstRow","100")[/FONT]
[FONT=&quot] Results$=Results$+'|'[/FONT]
[FONT=&quot] arraynum=GetArrayNum(Results$,'|')[/FONT]
[FONT=&quot] For i=1 To arraynum[/FONT]
[FONT=&quot] substr$=GetArrayItem(Results$,'|',i)[/FONT]

[FONT=&quot] Next i[/FONT]
[FONT=&quot]End[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]For i=1 To 5[/FONT]
[FONT=&quot] If (i=<>3 ) Then[/FONT]
[FONT=&quot] ListBoxAddItem("SongList","substr$")[/FONT]

[FONT=&quot] End[/FONT]
[FONT=&quot]Next i[/FONT]
در قسمت قرمز رنگ بالا مرحله اول انجام ميشه مقدار تايپ شده به پلاگين فرستاده ميشه و در متغير get$ ريخته ميشه.
در قسمت آبي رنگ حالا بايد اين متغير در پايگاه جستجو بشه و موارد مشابه يعني ركوردهايي كه فيلدهاي نام و نام خانوادگيشون برابر اين متغير هست باز گردانده بشه و تفكيك بشه.
و در قسمت سياه رنگ متغير تفكيك شده ما آيتم به آيتم در ليست باكس با شرط خاص ذخيره ميشه.

يعني من بايد بنابر گفته شما دستور جستجو رو در يك حلقه قرار بدم كه از 1 تا عددي نامعلوم تكرار بشه چون مانميدونيم كه چند تا مورد مشابه ممكنه وجود داشته باشه.
يعني:
[FONT=&quot]For i=1 To x[/FONT]
به ازاي متغير I مساوي 1 تا x :
[FONT=&quot]If (i<>0 ) Then[/FONT]
اگر مقدار I مخالف صفر بود اونوقت دستور جستجو در بالا يعني قسمت آبي و سياه اجرا بشه در غير اين صورت دستور به قسمت else و end ميره.
من هر كاري كردم نتونستم براين اساس كاري كنم مشكل اينجاست كه من نميدونم آيتمها چي هستن و كدوم رو برابر كدوم بايد قرار بدم در واقع من الان نميدونم حلقه بايد دنبال چي بگرده .و نميدونم از كجا بايد شروع كنم.
شرمنده ام كه نا اميدت كردم اما من توي متغير هاي رشه اي و آرايه اي خيلي ضعيفم . از راهنماييت ممنون ميشم.
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
 

evil_gates

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

تو خطی که دستور جستجو به زبان SQL رو به یک متغیر رشته ای بر میگردوندیم. (اولین خط آبی رنگ). به جای اون خط این خط رو بنویسید:
کد:
SearchQuery$ = 'SELECT * FROM contacts WHERE FirstName LIKE "%'+ get$+'%" OR LastName LIKE "%'+get$+'%";'
و بعد از خط:
کد:
 PluginGet("PlugIn","Results$")
دستور massage رو بنویسید:
کد:
Massage("","Results$")
برنامه رو اجرا کنید. عبارتی رو تو کادر جستجو وارد کنید و نتیجه رو ببینید.

میتونید توضیح بدید چه اتفاقی افتاده؟
 
بعد از وارد كردن كدها و اجراي برنامه و بعد از جستجو پيغامي ظاهر ميشه كه ركوردي رو كه فيلد نام يا نام خانوادگي اون برابر مقدار جستجو هست رو نشون ميده كه فيلدهاي اين ركورد با همون كاراكتر كه شما به كدها اضافه كرديد از هم جدا شدن.
 

evil_gates

اين نيز بگذرد ...
دوست عزيز
وقتي شما از كاراكتر % قبل و بعد از متغير شرطتون استفاده ميكنيد همونطور كه تو پست هاي قبلي هم عرض كردم در واقع محدوده جستجو رو گسترش ميديد.
بعنوان مثال وقتي كد شما اين هستش: % + $get + % و براي كلمه مثلا علي جستجو مي كنيد در واقع %ali% شرط شما اين شده. در اين حالت ممكنه نتايج زير بدست بياد

mohamadali
alireza
salivan

وقتي نتيجه شرط شما در هر ركورد مثبت بود يعني عبارت علي تو فيلد Firstname يا Lastname شما وجود داشت. نتيجه اون ركورد تو متغير Results$ باز خواهد گشت و از اونجايي كه شما محدوده جستجو رو گسترش داديد و ممكنه به اين خاطر به جاي يك ركورد چندين ركورد بدست بياد. محتوي هر ركورد با ركورد بعدي خودش با كاراكتر # از هم جدا ميشن.

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

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

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

فكر ميكنم بتونيد رشته بزرگ خودتون رو به رشته هاي كوچكتر تفكيك كنيد. اينطور نيست ؟

لطفا امتحان كنيد و نتيجه رو بگيد.
 
تا جايي كه من فهميدم قبلا متغير [FONT=&quot]Results$[/FONT] يك ركورد رو بر ميگردوند كه طبق گفته شما با كاراكتر (ا) از هم جدا ميشدن اما حالا با توجه به كد بالا چند ركورد رو بر ميگردونه كه با كاراكتر # از هم جدا شدن.
قبلا كه رشته شامل يك ركورد بود به صورت زير عمل ميكرديم :
Results$=Results$+'|'​

اما حالا رشته بالا زير مجموعه اي از رشته جديد هست پس فكر كنم بايد اينطور نوشت:
Results$=Results$+' # '​
حالا اگر دستور رو به صورت بالا بنويسيم و به جاي كاراكتر ا از # استفاده كنيم كه من انجام دادم هر آيتم كه به ليست باكس اضافه شد شامل يك ركورد بود يعني هر آيتم از ليست باكس خودش يك ركورد بود كه با كاراكتر ا از هم جدا شده بودن.
آيا درست رفتم آيا حالا بايد آيتمهاي ليست باكسو تفكيك كنم؟
در ضمن دستور :
[FONT=&quot]Message[/FONT][FONT=&quot]("","substr$")[/FONT][FONT=&quot][/FONT]

كه نتيجه به صورت 5 تا پيغام بود كه هر كدوم شامل يك ركورد بودن.
 

evil_gates

اين نيز بگذرد ...
اما حالا رشته بالا زير مجموعه اي از رشته جديد هست پس فكر كنم بايد اينطور نوشت:
Results$=results$+' # '
دوست عزيز

احتياجي به اين كار نيست. تو نمونه قبل به خاطر اينكه بعد از آخرين فيلد ركورد كاراكتر | وجود نداشت. بنابراين نميشد آخرين فيلد رو تو حلقه تفكيك كرد مجبور بوديم به انتهاي رشته كاراكتر | رو اضافه كنيم. تا آخرين فيلد هم منظور بشه

اما اينجا به خاطر اينكه كاراكتر# كه بعنوان كاراكتر جداساز ازش استفاده ميكنيم در آخر هر ركورد درج ميشه بنابراين اگه شما يكبار ديگه كاراكتر# رو به انتهاي رشته اضافه كنيد در واقع آخر رشته دوتا كاراكتر## پشت سر هم خواهد داشت كه اين باعث ميشه حلقه شما يكبار ديگه اضافه بچرخه و چون چيزي بين اين دوتا # چيزي وجود نداره يك رشته خالي توليد ميشه. پس نيازي نيست به اين كد نيست.

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

شما در واقع با يك حلقه رشته خودتون از محل # رو تفكيك ميكنيد به چند زير رشته كه هر زيررشته در واقع يك ركورد هست كه باز همون رو هم ميتونيد با يك حلقه و كاراكتر | تفكيك كنيد و مقاديرش رو تو يك متغير آرايه اي ديگه بريزيد.

خب حالا شروع كنيد به نوشتن دستورات. بايد بتونيد به نتيجه اي كه ميخواستيد برسيد. درسته؟
 
كد:
arraynum=GetArrayNum(Results$,'#')
For i=1 To arraynum
substr$=GetArrayItem(Results$,'#',i)
Next i
arraynum2=GetArrayNum(substr$,'|')
For i=1 To arraynum2
substr2$=GetArrayItem(substr$,'|',i)
Message("","substr2$")
Next i
For i=1 To arraynum2
ListBoxAddItem("SongList","substr2$")
Next i
نشد
 

evil_gates

اين نيز بگذرد ...
اين كد رو ببينيد دوست من:
کد:
record_arraynum=GetArrayNum(Results$,'#')
For i=1 To record_arraynum
  record$[i]=GetArrayItem(Results$,'#',i)
  Message("","record$[i]")
  record$[i]=record$[i]+'|'
  field_arraynum=GetArrayNum(record$[i],'|')
  For j=1 To field_arraynum
    field$[j]=GetArrayItem(record$[i],'|',j)
    Message("","field$[j]")
  Next j
Next i
 
حل شد.
شرمنده خيلي اذيتت كردم خب تا حالا با برنامه نويسي سر و كار نداشتم متاسفانه وقت زيادي هم واسه تمرين ندارم. واسه همين بازم مزاحمت خواهم شد فقط كاش دبگران هم كمك ميكردن تا شما اين همه اذيت نميشدي.
بازم از راهنماييت ممنون.
 

evil_gates

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

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

توصيه ميكنم تلاش كنيد براي نوشتن برنامه به يك روش ديگه.

موفق باشيد.
 
كد :
[FONT=&quot]record_arraynum=[/FONT][FONT=&quot]GetArrayNum[/FONT][FONT=&quot](Results$,[/FONT][FONT=&quot]'#'[/FONT][FONT=&quot])[/FONT]
در اين قسمت نام تك تك آرايه هاي متغير results$ تا كاراكتر # گرفته شده و در [FONT=&quot]record_arraynum[/FONT] ميريزه كه در واقع حاصل تعداد ركوردهايي هستند كه برگردانده ميشن.
كد:
[FONT=&quot]For[/FONT][FONT=&quot] i=[/FONT][FONT=&quot]1[/FONT][FONT=&quot] [/FONT][FONT=&quot]To[/FONT][FONT=&quot] record_arraynum[/FONT]
در اين حلقه از مقدار I برابر يك تا تعداد ركوردهاي پيدا شده حلقه تكرار خواهد شد.
كد:
[FONT=&quot] record$=[/FONT][FONT=&quot]GetArrayItem[/FONT][FONT=&quot](Results$,[/FONT][FONT=&quot]'#'[/FONT][FONT=&quot],i)[/FONT]

در اين قسمت ركوردها از هم جدا ميشن در واقع از اين قسمت اگه از[FONT=&quot]record$[/FONT] پيغام بگيريم هر ركورد رو جداگانه در يك پيغام نمايش ميده
كد:
[FONT=&quot] record$=record$+[/FONT][FONT=&quot]'|'[/FONT]

اين قسمت رو در مثال سورس ديكشنري هم ديدم ولي خودم بلد نبودم اما فكر كنم معنيش به اين صورت ميشه كه مقدار record$ كه شامل ركوردهاي جداگانه هست رو حالا فيلدهاشون رو تا كاراكتر ا شمرده و باز در متغير آرايه اي record$ ميريزه در واقع در اين قسمت رشته بزرگتر رو تفكيك به رشته كوچكتر ميكنيم.
كد:
[FONT=&quot] field_arraynum=[/FONT][FONT=&quot]GetArrayNum[/FONT][FONT=&quot](record$,[/FONT][FONT=&quot]'|'[/FONT][FONT=&quot])[/FONT]

در اين قسمت فيلدها شمرده شده و در [FONT=&quot] field_arraynum[/FONT] ريخته ميشه
كد:
[FONT=&quot] [/FONT][FONT=&quot]For[/FONT][FONT=&quot] j=[/FONT][FONT=&quot]1[/FONT][FONT=&quot] [/FONT][FONT=&quot]To[/FONT][FONT=&quot] field_arraynum[/FONT]
براي جدا سازي فيلدها بازم از حلقه استفاده ميکنيم و از j مساوي يك تا تعداد فيلدها حلقه تكرار ميشه
كد:
[FONT=&quot] field$[j]=[/FONT][FONT=&quot]GetArrayItem[/FONT][FONT=&quot](record$,[/FONT][FONT=&quot]'|'[/FONT][FONT=&quot],j)[/FONT]

در اين قسمت هم فيلدها يا به عبارتي رشته ما تفكيك شده و ميتونيم اون رو در هر آبجكتي كه ميخوايم نمايش بديم. كه در زير در ليست باكس نمايش داده شده.
كد:
[FONT=&quot] [/FONT][FONT=&quot]ListBoxAddItem[/FONT][FONT=&quot]("SongList","field$[j]")[/FONT]
[FONT=&quot] [/FONT][FONT=&quot]Next[/FONT][FONT=&quot] j[/FONT][FONT=&quot][/FONT]​
[FONT=&quot]Next[/FONT][FONT=&quot] i[/FONT][FONT=&quot][/FONT]
من چون صورتهاي ديگه اي از چنين مثالهايي نديدم نميتونم با الگوريتم ديگه اي اين برنامه رو بنويسم اگه وقتت اجازه ميده راهنمايي كن تا بتونم اين كارو انجام بدم.
سوال دومم اينه كه چه مقدار اطلاعات رو در يك پايگاه داده ميشه ذخيره كرد بر فرض مثال آيا ميشه يك كتاب رو در يك فايل dll ذخيره كرد و با پلاگين پايگاه داده از اون اطلاعات استخراج كرد در واقع ميخوام بدونم تا چه حجمي از اطلاعات رو ساپورت ميكنه و دچار مشكل نميشه.
 

evil_gates

اين نيز بگذرد ...
من چون صورتهاي ديگه اي از چنين مثالهايي نديدم نميتونم با الگوريتم ديگه اي اين برنامه رو بنويسم اگه وقتت اجازه ميده راهنمايي كن تا بتونم اين كارو انجام بدم.
هيچ راه حل ديگه اي به ذهنتون نميرسه؟ لازم نيست كه حتما مثالي رو ببينيد. شما بايد تلاش كنيد براي پيدا كردن راه حل جديد دوست من.

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

چه مقدار اطلاعات رو در يك پايگاه داده ميشه ذخيره كرد بر فرض مثال آيا ميشه يك كتاب رو در يك فايل dll ذخيره كرد و با پلاگين پايگاه داده از اون اطلاعات استخراج كرد در واقع ميخوام بدونم تا چه حجمي از اطلاعات رو ساپورت ميكنه و دچار مشكل نميشه.
فكر ميكنم جناب silvercover بتونن پاسخ دقيقتري به اين سوال شما بدن. اما من تا به حال ديتابيس هايي با حدود 800 - 700 ركورد با اين پلاگين ساختم و مشكلي نداشتم.
 

nevercom

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

سایت رسمی SQLite هم میتونه منبع خوبی باشه
 
منظورم فقط تعداد ركرد نيست مثلا اگه يه پايگاه داده فقط شامل سه تا فيلد باشه يعني نام و نام خانوادگي و توضيحات.
حالا نام و نام خانوادگي كاراكترهاشون كمه ولي اگه مثلا توي فيلد توضيحات هر فيلد از هر ركورد خودش مثلا دوصفحه a4 باشه اونوقت چي.
يعني ما يه پايگاه داريم با مثلا 1000 ركورد كه در هركدوم از اين ركوردها فيلد توضيحاتش شامل يك يا دو صفحه a4 هست حالا توي همچين ديتا بيسي مشكل بوجود نمياد؟
 

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

بالا