ورود

View Full Version : مشکل با بعضی کاراکترها هنگام جستجو در بانک SQL توسط Edit دلفی 2009



hamidrah
یک شنبه 13 تیر 1389, 11:59 صبح
سلام دوستان عزیز
یک دفترچه تلفن نوشتم با دلفی 2009 نوشتم که با بانک SQL و توی شبکه کار می کنه ، یک Edit برای جستجو گذاشتم که جستجو را براساس فیلد یا فیلدهای انتخابی انجام می دهد ، تمام فیلدهای بانک اطلاعاتی نیز از نوع nvarchar است ، مشکلم اینه که با بعضی کاراکترهای خاص مثل "ی" درست جستجو انجام نمی شود و چیزی پیدا نمی کند ، کسی میدونه مشکل چیه ؟:متفکر:


SQL Command :
Command := 'select * from ph where FName like '+QuotedStr('%'+EditPHSearch.Text+'%')+' and PH_Group like '+QuotedStr('%'+GroupForPH+'%')+' and WorkSubject like '+QuotedStr('%'+SubGroupForPH+'%')+' order by '+OrderField+' '+SortType

DataModule11.ADOPHQuery.SQL.Clear;
DataModule11.ADOPHQuery.SQL.Add(Command);
DataModule11.ADOPHQuery.Open;

vcldeveloper
یک شنبه 13 تیر 1389, 12:38 عصر
ورود اطلاعات در بانک اطلاعاتی به چه شکلی صورت گرفته؟ با همین برنامه ایی که با دلفی 2009 نوشتید، و با همین سیستم بوده، یا برنامه ایی دیگه و سیستم دیگه؟
به نظر میاد که بعضی از کارکترها را در زمان ورود داده به بانک، یا تایپ در Edit به صورت فارسی وارد کردید، و بعضی رو هم به صورت عربی. در اون صورت، جستجوی شما درست انجام نمیشه، چون فرضا ی عربی و فارسی از نظر ظاهر مشابه هستند، ولی کدهای یونیکد آنها متفاون هست، و در هنگام جستجو، به عنوان دو کارکتر متفاوت شناخته میشند.

hamidrah
یک شنبه 13 تیر 1389, 14:20 عصر
سلام
داده ها با همین برنامه و از روی سیستم دیگری وارد شده البته بغیر از گروه ها و زیر گروه ها که از روی سیستم خودم وارد کردم و در قسمت RegionalAndLanguage هم فارسی رو در همه تب ها انتخاب کردم ، البته از روی سیستمی که داده ها یعنی تماس ها وارد شده در قسمت RegionalAndLanguage و تب اول (RegionalOption) و در قسمت Standards And Formats ،گزینه ی(English(UnitedStates انتخاب شده بو د که با توضیحاتی که براش نوشته معلومه برای فرمت اعداد و تاریخ و روز است ، ولی نکته جالب اینجاست که وقتی در بانکم نوع داده ها را از nvarchar به text تغییر دادم جستجو درست انجام می شد ولی مشکل دیگری ایجاد می شد یعنی برای بجای نمایش اطلاعات (MEMO) را نمایش می دهد:متفکر:

vcldeveloper
یک شنبه 13 تیر 1389, 16:11 عصر
عنی برای بجای نمایش اطلاعات (MEMO) را نمایش می دهد
DBGrid استاندارد دلفی به خودی خود امکان نمایش داده های Memo (یعنی همون فیلدهای Text در SQL Server) را نداره. برای نمایش این نوع از فیلدها، یا باید خودتان DBGrid را Custom Draw کنید، یا از گرید شرکت های ثالث که امکان نمایش اینگونه داده ها را دارند، استفاده کنید؛ یا از رویدادهای OnGetText و OnSetText فیلد مربوطه در دلفی استفاده کنید. البته اگر نمیخواید این داده را در گرید نمایش بدید، می تونید از کنترل های DBMemo یا DBRichEdit برای نمایش آن استفاده کنید.

در ضمن، به جای نوع داده text، باید از ntext استفاده کنید، تا داده های یونیکد به درستی در بانک ثبت بشند.



البته از روی سیستمی که داده ها یعنی تماس ها وارد شده در قسمت RegionalAndLanguage و تب اول (RegionalOption) و در قسمت Standards And Formats ،گزینه ی(English(UnitedStates انتخاب شده بو د
مسئله کیبورد کاربر هست، می تونید با نوشتن یک برنامه ساده، بررسی کنید که در زمان فشردن کلید ی در کیبورد آن سیستم، چه کد یونیکدی تولید میشه، و سپس آن را با کد کلید ی در سیستم خودتان مقایسه کنید، و ببینید که آیا یکی هستند، یا خیر؟

Felony
دوشنبه 14 تیر 1389, 05:38 صبح
برای من هم دیشب همچین مشکلی پیش اومد ( مشکل در جست و جو در بانک SQL Server 2008 ) ، من توسط برنامه خودم در بانک رکوردها رو اضافه کرده بودم ولی وقتی در بانک جست و جو میکردم و داخل جست و جوم حروف 'ی' یا 'ک' میومد جواب کوئری خالی بود ! ؛ این مشکل در خود SQL Server هم پا برجا بود یعنی با گرفتن کوئری تو خود SQL Server هم همین مشکل پیش میومد .

خلاصه با کمی تحقیق و ور رفتن به این نتیجه رسیدم که باید Query هام رو به صورت زیر بنویسم ، مثلا اگر Query به صورت زیر باشه :


Select * From TB_Test Where FName Like 'Ali%'

باید به صورت زیر تغییر کنه :

Select * From TB_Test Where FName Like N'Ali%'

البته من مطمئن بودم که کارکتر 'ی' و 'ک' که تو بانک ثبت کردم فارسی بوده و درضمن Collection بانک هم روی Persian قرار داده بودم .

موفق باشید .

hamidrah
دوشنبه 14 تیر 1389, 10:02 صبح
سلام دوستان عزیز
قبل از همه چیز از راهنمایی شما متشکرم
دوست عزیز آقای کشاورز

DBGrid استاندارد دلفی به خودی خود امکان نمایش داده های Memo (یعنی همون فیلدهای Text در SQL Server) را نداره. برای نمایش این نوع از فیلدها، یا باید خودتان DBGrid را Custom Draw کنید، یا از گرید شرکت های ثالث که امکان نمایش اینگونه داده ها را دارند، استفاده کنید؛ یا از رویدادهای OnGetText و OnSetText فیلد مربوطه در دلفی استفاده کنید.
Custom Draw در DBGrid برای چی استفاده میشه و چطوری ازش استفاده کنم؟
در رویدادهای OnGetText و OnSetText چه کدی بنویسم؟

البته اگر نمیخواید این داده را در گرید نمایش بدید، می تونید از کنترل های DBMemo یا DBRichEdit برای نمایش آن استفاده کنید.
دست شما درد نکنه خیلی راهنمایی خوبی بود ، و برای نمایش و ویرایش اطلاعات خیلی به دردم می خوره.:تشویق:
حالا اگر بخوام توی Label نمایش بده باز هم (WideMemo)رو بجاش نشون میده،برای این راه حلی دارید؟

مسئله کیبورد کاربر هست، می تونید با نوشتن یک برنامه ساده، بررسی کنید که در زمان فشردن کلید ی در کیبورد آن سیستم، چه کد یونیکدی تولید میشه، و سپس آن را با کد کلید ی در سیستم خودتان مقایسه کنید، و ببینید که آیا یکی هستند، یا خیر؟

یعنی اگه تنظیمات Regional And Language رو درست کنم بازم ممکنه کد کلید فشرده شده در صفحه کلیدهای مختلف فرق کنه؟

دوست عزیز آقای تاجیک


Select * From TB_Test Where FName Like N'Ali%'
این N دقیقا چیکار میکنه؟
من کد رو با مساوی نوشتم خطا میداد

DataModule11.ADOPHTable.Filter := 'WorkSubject=N'+QuotedStr(MainForm.ComboBox2.Text)


Error : Arqument are the wrong type :اشتباه:

hamidrah
دوشنبه 14 تیر 1389, 12:22 عصر
سلام آقای تاجیک
آقا دست شما درد نکنه این N کارمو راه انداخت.
ولی اگر در خاصیت Filter از N استفاده بشه خطای Syntax میده ، با PHQuery و دستور SQL رو نوشتم درست شد.
ولی هنوز نفهمیدم این N دقیقا چیه؟آیا همون National است یا نه؟یعنی نوع کاراکتر رو عوض میکنه؟

vcldeveloper
دوشنبه 14 تیر 1389, 13:14 عصر
ولی هنوز نفهمیدم این N دقیقا چیه؟
پیشوند n در SQL Server برای مشخص کردن داده های یونیکد به کار میره (nVarChar, nText, nChar، و غیره). استفاده از n قبل از یک مقدار در داخل کوئری هم به SQL Server میگه که این داده یونیکد هست، و باید بصورت یونیکد پردازش بشه.


Custom Draw در DBGrid برای چی استفاده میشه و چطوری ازش استفاده کنم؟
منظور از Custom Draw این هست که باید رسم در Grid را خودتان بر عهده بگیرید. برای این منظور، می تونید از رویداد OnDrawColumnCell استفاده کنید. همین عبارت Bold شده را که در سایت جستجو کنید، نمونه کدهایی برای این کار پیدا می کنید.


در رویدادهای OnGetText و OnSetText چه کدی بنویسم؟
اون فیلدها از نوع TMemoField، یا TWideMemoField تعریف شدند. شما می تونید در رویداد OnGetText اونها، مقدار پارامتر خروجی را بر روی خصوصیت Value فیلد مربوطه تنظیم کنید، و در رویداد OnSetText هم متن ورودی را به همان خصوصیت اختصاص بدید. برای OnGetText و OnSetText هم نمونه کدهایی در سایت وجود دارند.

hamidrah
سه شنبه 15 تیر 1389, 13:47 عصر
سلام
اگر بخوام همه کاراکترهایی که توسط کار ثبت می شود (کاراکترهای یونیکد عربی،فارسی و ...) را قبل از ثبت در بانک اطلاعاتی به یونیکد فارسی تبدیل کنم که موقع جستجوی با مشکل مواجه نشود،از چه روشی باید استفاده کنم؟
اگر موقع ثبت کوئری از N استفاده کنم همه داده ها بهشکل یونیکد فارسی ثبت می شوند؟
:متفکر:

behzadboloori
چهارشنبه 16 تیر 1389, 07:19 صبح
تا جایی که من میدونم ما دو جور حرف ک و دو جور حرف ی داریم که کد اونا در xp و ویستا با کدپیج های رایج دیگه متفاوته. زمان ثبت در بانک اطلاعاتی باید بصورت یکسان ثبت بشن تا توی جستجو با کدپیجهای متفاوت دچار اشکال نشیم

hamidrah
چهارشنبه 23 تیر 1389, 08:22 صبح
سلام
چطور می تونیم ک و ی رو با کد پیج های یکسان در بانک ثبت کنیم؟

bootshow
پنج شنبه 24 تیر 1389, 16:32 عصر
البته بقیه دوستان هم گفته بودند.
باید ببینی چه کدهای اسکی برای حروف ی و ک و آ و ... وجود داره و اونا رو به یک کد اسکی تبدیل کنی.مثلا برای حرف ی اگر shift +x را بزنی "ي" بصورت عربی نوشته میشه.
(البته کامپوننت dbisam (http://www.elevatesoft.com) مشکلات جستجو و سورت زبان فارسی را نداره)

procedure TForm1.Edit1Change(Sender: TObject);
var
i:integer;
begin
Edit2.Text:='';
for i:=1 to length(Edit1.Text) do
Edit2.Text:=Edit2.Text+'#'+IntToStr(ORD(Edit1.text[i]))+'+';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str:string;
begin
str:=Edit1.Text;
for i:=1 to Length(str) do
if str[i] in['ي',#237] then
str[i]:=#237
else if str[i] in ['آ','ا'] then
str[i]:='آ';
end;