PDA

View Full Version : مشکل در جستجو با حرف (ی)



mahyar-m
پنج شنبه 13 فروردین 1388, 20:04 عصر
دوستان عزیز خسته نباشید
من دارم یه پروژه می نویسم که یه مشکل داره تو جستجو و اونم اینه که تو تکست که یه نامو یعنی اسمو می گیره تا موقعی که حرف ی رو وارد نکرده داخل گرید اطلاعات فیلتز شده رو نمایش میده اما به محض ورود حرف ی همه اطلاعات داخل گرید خالی میشه و هیچی نشون نمیده . دیتا بیسم sql 2000 و با c# کار میکنم اینم کدی که نوشتم .



DataSet ds11 = new DataSet();
dap.SelectCommand = new SqlCommand();
dap.SelectCommand.Connection = connect;
dap.SelectCommand.CommandText = "select " +
"sabt.id,ltrim(rtrim(sabt.name))+' '+ltrim(rtrim(sabt.family)),sefareshat.codes," +
"sefareshat.mozos,sefareshat.tedads,sefareshat.tari khss," +
"sefareshat.tarikhts,sefareshat.mablaghbs,sefaresha t.mablaghkols" +
",sefareshat.tozihats,sefareshat.tahvils " +
"from sefareshat " +
"inner join sabt" +
" on sabt.id=sefareshat.id" +
" where sabt.family like '%" + textBoxX86.Text + "%' and sabt.name like '%" + textBoxX15.Text +
"%' and sefareshat.codes like '%" + textBoxX82.Text + "%'";
connect.Open();
dap.Fill(ds11, "code10");
SqlDataReader fdr = dap.SelectCommand.ExecuteReader();
dataGridViewX2.DataSource = ds11;
dataGridViewX2.DataMember = "code10";
dataGridViewX2.AutoGenerateColumns = true;
dataGridViewX2.Columns[0].HeaderText = "کد مشتری";
dataGridViewX2.Columns[1].HeaderText = "سفارش دهنده";
dataGridViewX2.Columns[2].HeaderText = "كد سفارش";
dataGridViewX2.Columns[3].HeaderText = "موضوع";
dataGridViewX2.Columns[4].HeaderText = "تعداد";
dataGridViewX2.Columns[5].HeaderText = "تاريخ سفارش";
dataGridViewX2.Columns[6].HeaderText = "تاريخ تحويل";
dataGridViewX2.Columns[7].HeaderText = "بيعانه";
dataGridViewX2.Columns[8].HeaderText = "مبلغ كل";
dataGridViewX2.Columns[9].HeaderText = "توضيحات";
dataGridViewX2.Columns[10].HeaderText = "تحويل داده شده";
connect.Close();


توضیح در مورد کد :
خیلی واضحه من چند تا جدول رو join کردم و اون 3 تا باکس هم یکیش مقدار ورودیش کد سفارش یکی نام و دیگری فامیل مشکل از جوینم نیست چون بدون جوین هم که تست کردم این مشکل باز هم بود . ممنون میشم کسی راهنمایم کنه چون خیلی مسئله حیاتیه

mohammad diba
پنج شنبه 13 فروردین 1388, 21:39 عصر
با سلام
من هم همین مشکل رو دارم البته می دونم که به خاطر فارسی ساز نصب شده ویندوزه- البته من با (ک) هم مشکل دارم . اگه کسی برای حل این مشکل راه حلی داره ممنون می شم بگه.

rnm123
پنج شنبه 13 فروردین 1388, 23:18 عصر
دوستان عزیز این مشکل به علت تفاوت حرف ی در زبان عربی و فارسی و تعدد حالتهای این حرف است . برای حل این مشکل یا باید بانک خود را آپدیت کنید و یا یک روش راحتتر این است که وقتی در جستجوی شما حرف ی به میان آمد در رشته خود پیمایش کنید و کلیه حرفهای ی موجود را با یک حرف ی ( که آنرا با کد اسکی اش معرفی و انتخاب میکنید ) تعویض کنید و با همین حرف ی اطلاعات را سرچ و یا ذخیره کنید به عبارتی دیگر وقتی اطلاعاتی را میخواهید در بانکتان بریزید ابتدا آنرا با یک تابعی که برای منظور فوق تعریف کرده اید پیمایش کنید و حرفهای ی موجود را با حرف ی مخصوص و مشخص شده ( توسط کد اسکی) تعویض کنید و سپس در بانکتان ذخیره کنید و در هنگام جستجو هم برعکس .
البته اگر بانکتان در sql باشد با انتخاب Collation مناسب (Arabic_CI_AS) فکر کنم مشکتان حل شود و یک موضوع دیگر هم این که اگر ذخیره و جستجوی اطلاعات در یک سیستم انجام شود مشکلی وجود نخواهد دشات تازمانی که ویندوز آن تعویض شود .

zoofa
جمعه 14 فروردین 1388, 00:59 صبح
سلام دوستان
برای رفع این مشکل در همه ی فرم های پروژتان keypreview = true قرار دهید و کد زیر را در رویداد keypress فرمتان اضافه کنید تا هم در زمان ثبت کردن اطلاعات و هم در زمان جستجو و کلاً در همه ی زمانها وقتی ی و ک عربی وارد کرد به ی و ک فارسی تبدیل شود و وارد بانک شود


در vb:



If e.KeyChar = "ي"Then
e.KeyChar = "ی"
EndIf
If e.KeyChar = "ك"Then
e.KeyChar = "ک"
EndIf




در C#




if (e.KeyChar == 'ي') e.KeyChar = 'ی';
if (e.KeyChar == 'ك') e.KeyChar = 'ک';



من این روش را استفاده کردم مشکلم بر طرف شد


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

mahyar-m
جمعه 14 فروردین 1388, 15:48 عصر
مرسی از جوابتون دوست عزیز
میشه بیشتر توضیح بدید دقیقا این keypreview رو کجا true کنم >

mahyar-m
جمعه 14 فروردین 1388, 15:56 عصر
دوست عزیز من یادمه دز دیتابیس از چنین چیزی Arabic_CI_AS استفاده می کردیم ولی کجاشو یادم نیست اگه میشه یه توضیح بدید که این Collationو باید به کجای دیتا بیس alter کنم . ضمن اینکه اگر بشه با یه مثال توضیح بدید خیلی ممنون میشم .

zoofa
جمعه 14 فروردین 1388, 18:17 عصر
سلام دوست عزيز
براي true كردن keypreview فقط كافي است كه فرم خود را انتخاب كنيد و در پنجره‌ي مشخصات فرم keypreview را پيدا كرده و مقدار آن را برابر true قرار دهيد
و يا در رويداد فرم لود فرمتان form_load مد زير را بنويسيد:




Me.KeyPreview = True

rnm123
شنبه 15 فروردین 1388, 21:35 عصر
دوست عزیز من یادمه دز دیتابیس از چنین چیزی Arabic_CI_AS استفاده می کردیم ولی کجاشو یادم نیست اگه میشه یه توضیح بدید که این Collationو باید به کجای دیتا بیس alter کنم . ضمن اینکه اگر بشه با یه مثال توضیح بدید خیلی ممنون میشم .
دوست عزیز کافی است در محیط sql managment روی نام دیتابیس راست کلیک کرده و properties را انتخاب کنبد از ستون سمت چپ options را انتخاب کنید و در موارد ظاهر شده در سمت راست میتوانید حالت Arabic_CI_AS را انتخاب کنید

afsharm
یک شنبه 16 فروردین 1388, 09:44 صبح
البته اگر بانکتان در sql باشد با انتخاب Collation مناسب (Arabic_CI_AS) فکر کنم مشکتان حل شود و یک موضوع دیگر هم این که اگر ذخیره و جستجوی اطلاعات در یک سیستم انجام شود مشکلی وجود نخواهد دشات تازمانی که ویندوز آن تعویض شود .

تغییر Collation نمی‌تواند این مشکل را حل کند. Collation روی مسائلی مثل نحوه سورتینگ (order by) و رفتار بعضی توابع استرینگی داخل خود SQL تاثیر می‌گذارد.

همه راه حل‌های ارائه شده مشکل جستجو را حل می‌کنند ولی راه حل جامع آن استفاده از «جستجوی هم ارز» است. این روش جستجو در متون «یونیکد» به خوبی توضیح داده شده‌اند و منظور از آن این است که در جستجو بین حالات مختلف حرف «ی» تفاوتی قائل نشویم. مثلا همه حروف «ی، ي، ئ، ى» که چهار کد یونیکد متفاوت دارند یکی در نظر گرفته شوند. به عنوان مثال دیگر می‌توان «ک، ك» که اولی فارسی و دومی عربی است را عنوان کرد. اگر کمی دقت کنید جستجوی هم ارز در گوگل به خوبی استفاده می‌شود. در گوگل فرقی ندارد که به دنبال «ایرانی» بگردید یا «ايراني»، گوگل همه نتایج مشابه را به شما نشان می‌دهد.

mahyar-m
دوشنبه 17 فروردین 1388, 10:37 صبح
دوستان عزیز از همتون ممنونم ولی مشکل من هنوز حل نشده !!!

من هم از colltion arabic استفاده کردم هم از جایگزینی اما متاسفانه بازم جواب نداد تو هر ویندوزی هم که بگین چک کردم بازم نشد که بگیم مشکل از فارسی ساز باشه یا از ویندوز . نمیدونم باید چی کار کنم .

میشه دز مورد جستجوی هم ارز بیشتر توضیح بدید یا حداقل یه منبعی یا تیکه کدی یا سمپلی چیزی بدین .

خیلی ممنون از همتون که وقت میذارین و پاسخ سئوال من رو میدید .

newgoldenman
دوشنبه 17 فروردین 1388, 18:05 عصر
دوستان عزیز از همتون ممنونم ولی مشکل من هنوز حل نشده !!!

من هم از colltion arabic استفاده کردم هم از جایگزینی اما متاسفانه بازم جواب نداد تو هر ویندوزی هم که بگین چک کردم بازم نشد که بگیم مشکل از فارسی ساز باشه یا از ویندوز . نمیدونم باید چی کار کنم .

میشه دز مورد جستجوی هم ارز بیشتر توضیح بدید یا حداقل یه منبعی یا تیکه کدی یا سمپلی چیزی بدین .

خیلی ممنون از همتون که وقت میذارین و پاسخ سئوال من رو میدید .

سلام دوست عزیز

توی كدی كه نوشتی، اگه بدین صورت عمل كنی، ایشالا مشكلت حل میشه:

where sabt.family like N'%" + textBoxX86.Text + "%'

با تشكر از آقای مداح

موفق باشید.

afsharm
چهارشنبه 19 فروردین 1388, 18:25 عصر
من هم از colltion arabic استفاده کردم هم از جایگزینی اما متاسفانه بازم جواب نداد تو هر ویندوزی هم که بگین چک کردم بازم نشد که بگیم مشکل از فارسی ساز باشه یا از ویندوز . نمیدونم باید چی کار کنم .
بهتره کارتون را دیباگ کنید. هم برنامه سی‌شارپ را و هم Queryهای ارسالی به SQL Server را. برای دیباگ برنامه دات نت ببینید در هر مرحل چه کاراکتری در متغیرها ذخیره، دریافت یا ارسال می‌شه. برای Queryها هم از SQL Server Profiler استفاده کنید.
خود من در یک موقعیت مشابه برای آنکه بفهمم هر کاراکتری دققیقا کدام حرف یونیکد است، کد اسکی و هگز آن چیست، شکل آن در فونت‌های مختلف چیست و اسم رسمی آن در یونیکد چیست مجبور شدم یک برنامه ریزه میزه بنویسم. ممکنه این برنامه هم به دردت بخوره. آدرسش اینه: http://fardis.codeplex.com/
-------

میشه دز مورد جستجوی هم ارز بیشتر توضیح بدید یا حداقل یه منبعی یا تیکه کدی یا سمپلی چیزی بدین .
پیاده سازی جستجوی هم ارز کار ساده‌ای نیست. برای این کار معمولا از کتابخانه‌هایی که گروه‌های خاصی نوشته‌اند استفاده می‌شود. و بعید می‌دانم که فعلا چیزی برای زبان فارسی ایجاد شده باشد.

zoofa
پنج شنبه 20 فروردین 1388, 09:46 صبح
دوستان عزیز از همتون ممنونم ولی مشکل من هنوز حل نشده !!!



دوست شما باید تمام ی و ک هایی که در بانک به زبان عربی ثبت شده است را به ی و ک فارسی جایگزین کنید و با اون کدی که گفتم در رویداد keypress بنویسید مشکلتان حل می شود

pardeew
شنبه 24 مهر 1389, 13:13 عصر
در مطلب لینک زیر، توضیحاتی درباره یکسان سازی حروف ی و ک (فارسی و عربی) و نحوه جستجوی صحیح کلمه یا عبارت، به طوری که همه حروف ی و ک را دربرگیرد ... وجود دارد.
امیدوارم مفید واقع شود.

http://www.eslamifar.com/index.php/archives/88

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

خودم خیلی دنبال این موضوع گشتم تا به اینجا رسیدم ... به نظرم که این تنها راه حل برای جستجو در بانک اطلاعاتی است.
خوشحال میشم نظر شما رو هم بدونم تا به عنوان یک تازه کار از تجربیات دیگران هم استفاده کنم.

mn_zandy63
پنج شنبه 06 آبان 1389, 12:27 عصر
سلام دوست من،
در تکمیل پاسخ دوستان اینجا رو هم ببین.
http://vahidnasiri.blogspot.com/2009/01/blog-post_13.html
کاملترین روش برای این مشکل هست که تا حالا دیدم.
موفق باشی

pardeew
چهارشنبه 12 آبان 1389, 08:17 صبح
سلام دوست من،
در تکمیل پاسخ دوستان اینجا رو هم ببین.
http://vahidnasiri.blogspot.com/2009/01/blog-post_13.html
کاملترین روش برای این مشکل هست که تا حالا دیدم.
موفق باشی

دوست عزیز ... مطلب شما رو قبلا خونده بودم ... مطمئنا این هم یک روش برای یکسان سازی حروف در دیتابیس می باشد که هنگام جستجو نیز حروف همانند سازی می شوند و مشکلی برای جستجو به وجود نمی آید ... ولی کدی که من در سایتم گذاشتم فرقی نمی کنه که با چه حروف ی و ک در دیتابیس یا در عبارت جستجو، مواجه شود .... به هر حال اگر بشه کدی که شما در سایتتون گذاشتید به صورت اتوماتیک هنگام Insert و یا update عمل کنه خیلی بهتره ...

موفق باشید.

mn_zandy63
یک شنبه 23 آبان 1389, 23:46 عصر
دوست عزیز ... مطلب شما رو قبلا خونده بودم ... مطمئنا این هم یک روش برای یکسان سازی حروف در دیتابیس می باشد که هنگام جستجو نیز حروف همانند سازی می شوند و مشکلی برای جستجو به وجود نمی آید ... ولی کدی که من در سایتم گذاشتم فرقی نمی کنه که با چه حروف ی و ک در دیتابیس یا در عبارت جستجو، مواجه شود .... به هر حال اگر بشه کدی که شما در سایتتون گذاشتید به صورت اتوماتیک هنگام Insert و یا update عمل کنه خیلی بهتره ...

موفق باشید.

سلام دوست من
البته این آدرس، آدرس سایت بنده نیست.

اینجا دو تا رویکرد متفاوت هست.
اول اینکه موقع درج اطلاعات داخل دیتابیس اجازه درج ی و ک متفاوت ندی و عمری رو آسوده بخوابی.
دوم اینکه موقع جستجو هر دو تا رو جستجو کنی.

البته شما ممکنه نظرت متفاوت باشه، اما به نظر من روش اول بهتره و اصلی ترین دلیلم هم اینه که رعایت مورد اول برام ساده تره. ;)
یعنی موقع درج، ی و ک رو یکسان کنی که چند خط اول این صفحه که لینکش رو گذاشتم به همین مورد پرداخته.
در این صورت دیگه نیازی نیست موقع جستجو نگران تفاوت حروف باشیم.

بعد از اون این بحث پیش میاد که حالا اومدیم و تا الآن که این مورد رو دقت نکرده بودیم یه سری ی و ک متفاوت داخل دیتابیس داریم. در این صورت با کدی که در ادامه متن توضیح داده شده میتونی کل ی و ک های موجود رو اصلاح کنی.


البته به نظر من روش شما برای کسی که رویکرد دوم رو انتخاب میکنه، روش زیبایی هست.

موفق باشی

im ezraeel
پنج شنبه 18 آذر 1389, 07:36 صبح
- در هنگام مقایسه در دستورات از N استفاده شود. مانند



select * from student where name = N'علي'

SAEEDDOE
پنج شنبه 07 بهمن 1389, 22:58 عصر
با سلام و تشکر از جوابتان
من هم این مشکل رو دارم فکر کنم کدی که در بالا نوشتید بصورت ذیل صحیح می باشد یعنی ما حرف ی و ک را از همان ابتدا تبدیل به عربی بکنیم و در موقع جستجو نیز بدنبال يو ك عربی باشیم.من این حالت رو انتخاب کردم و جواب گرفتم. با تشکر
سعید.
if (e.KeyChar == 'ی') e.KeyChar = 'ي';
if (e.KeyChar == 'ک') e.KeyChar = 'ك';

farkhondei70
پنج شنبه 25 اسفند 1390, 08:35 صبح
با سلام خدمت دوستان عزیز
من اطلاعاتم رو از فایل اکسل مخونم و به صورت دستی اطلاعات وارد نمیشن. اینجا باید چه کنم؟

naghshineh m&h
جمعه 13 اردیبهشت 1392, 19:31 عصر
سلام مشکل به راحتی و صد درصد قابل حل است فقط نکته ای که اینجانب به آن ایمان دارم این است که مهندسین مایکروسافت هیچ راه غیر قابل حلی برایشان نیست و هیچگاه برنامه نویسی را به حدی سخت نمی کنند که کاربر بخواهد ابتدا Replace کند بعد یه کاردیگه و بعد ..........
راه حل به این شکل است که دقیقا قبل از like از حرف N استفاده کنید
مثالSELECT * FROM tbl WHERE col LIKE N'%ی%'

mojtabamalaekeh
دوشنبه 06 آبان 1392, 16:15 عصر
سلام
مشکل من با حرف ی و ي حل شده.
میگم شاید به درد کسی خورد :چشمک:

این راه حل ربطی به حروف ک و ك نداره و جواب نمیده.

فیلدی که میخواید عملگر LIKE رو روش اعمال کنید به NCHAR تبدیل کنید:
مقدار سمت راست عملگر LIKE رو تبدیل کنید یا نه فرقی نمیکنه. اولش N بذارید یا نذارید هم فرقی نمیکنه.



use [Statistics]
go
SELECT
tblPersonnels.ID, tblPersonnels.fldYeganID, tblYegans.fldName AS fldYeganName, tblPersonnels.fldPersNo,
tblPersonnels.fldGrade, tblPersonnels.fldName, tblPersonnels.fldFamily,
tblPersonnels.fldDescription
FROM tblPersonnels LEFT OUTER JOIN tblYegans ON tblPersonnels.fldYeganID = tblYegans.ID

WHERE
CAST(tblPersonnels.fldGrade + ' ' + tblPersonnels.fldName + ' ' + tblPersonnels.fldFamily AS VARCHAR)
LIKE '%ی%'



خروجیش شامل مقادیر دارای «ی» و «ي» همزمان خواهد بود :)
ضمنا من همیشه توی طراحی جدول هام برای فیلدهای رشته ای، نوع nvarchar(max) استفاده می کنم و برای nchar و text هیچ آزمایشی انجام ندادم.

jigar2000
یک شنبه 29 فروردین 1395, 11:33 صبح
سلام ممنونم مشکل من حل شد فقط نکته ای که در این کد باید رعایت شود این است که بین حرف N و علامت ' فاصله نباشد.

jigar2000
یک شنبه 29 فروردین 1395, 11:34 صبح
سلام دوست عزیز

توی كدی كه نوشتی، اگه بدین صورت عمل كنی، ایشالا مشكلت حل میشه:

where sabt.family like N'%" + textBoxX86.Text + "%'

با تشكر از آقای مداح

موفق باشید.

سلام ممنونم مشکل من حل شد فقط نکته ای که در این کد باید رعایت شود این است که بین حرف N و علامت ' فاصله نباشد.