PDA

View Full Version : SORT



شفیعی
پنج شنبه 09 بهمن 1382, 18:18 عصر
سلام
1- می خواهیم با کلیک بر روی هر ستون DBGRID اطلاعات بر اساس آن ستون مرتب شود
2- بر ای ساخت ایندکس از داخل برنامه باید چکار کرد در ضمن فایل از نوع DBF است

v_shalchian
پنج شنبه 09 بهمن 1382, 20:42 عصر
سلام
در مورد سوال 1 :
باید در رویداد OnTitleClick از DBGrid کد زیر را بنویسید.
به صورت صعودی :


Table1.Sort := Column.FieldName +' ASC'

به صورت نزولی :


Table1.Sort := Column.FieldName +' DESC'

شفیعی
پنج شنبه 09 بهمن 1382, 23:07 عصر
سلام
دوست عزیز دستور بالا را انجام دادم پیغام خطا می دهد
Undeclared identifier: 'SORT'

baabi
پنج شنبه 09 بهمن 1382, 23:30 عصر
سلام
ممکنه این راه حل نهایی نباشه!
شما میتونید از یکی از این دو راه حل استفاده کنید:
1- یک table داشته باشید که در قسمت OnTitleClick بنویسید:

table1.indexfieldname:=Column.FieldName

2- با استفاده از query اینکارو انجام بدید ( در همون رویداد ontitleclick‌)

شفیعی
جمعه 10 بهمن 1382, 10:29 صبح
سلام
برای سوال دوم باید چکار کرد

v_shalchian
جمعه 10 بهمن 1382, 10:37 صبح
در این کد


Table1.Sort := Column.FieldName +' ASC'

منظور از Table1 نامی است که شما به Dataset یا جدول خود می دهید.
شما احتمالا این نام را به DBGrid خود داده اید که تولید خطا می کند.

شفیعی
جمعه 10 بهمن 1382, 10:45 صبح
سلام
دوست عزیز TABLE چیزی به نام SORT نداره ویا اینکه من اونا پیدا نکردم می توانی بیشتر توضیح دهی ویا یک نمونه برنامه برایم ارسال کنی خیلی ممنون

Developer Programmer
جمعه 10 بهمن 1382, 11:28 صبح
من یکبار این سوال رو کرده بودم البته من از ADO استفاده می کردم

حالا هم یه سری به آدرس زیر بزن :!:

http://delphi.about.com/b/a/027886.htm?PM=ss15_delphi

هر چی درباره DBGrid در دلفی بخوای داره

v_shalchian
جمعه 10 بهمن 1382, 12:07 عصر
دوست عزیز TABLE چیزی به نام SORT نداره
شما درست میگید.من منظورم ADOTable یا ADODataset بود.نه TTable.
در link ای که Afshin_Zavar هم فرستاده از ADO استفاده شده.

شفیعی
جمعه 10 بهمن 1382, 14:14 عصر
سلام
در مورد ایندکس کسی از دوستان نظری ندارد

v_shalchian
جمعه 10 بهمن 1382, 15:27 عصر
سلام
برای ساختن Index از داخل برنامه می توانید از دستورات SQL استفاده کنید.
این هم Syntax دستور CREATE INDEX
http://www.simple-sw.com/sql-crndx.htm
برای اجرای دستورات SQL هم از ADOCommand استفاده کنید.

شفیعی
جمعه 10 بهمن 1382, 21:06 عصر
سلام
من دستور بالا را به روش زیر انجام دادم پیغام خطا می دهد


procedure TFreport.DBGrid1TitleClick(Column: TColumn);
VAR S:STRING;
begin
S:='CREATE INDEX N ON "N_NAGHSH.DBF" N_naghsh ('+Column.FieldName+')';
Freport.Caption :=S;
Query1.Active:=FALSE;
Query1.SQL.Clear;
Query1.SQL.Add(S);
Query1.Active:=TRUE;
end;

invalid use keyword token (Column.FieldName)


برای اجرای دستورات SQL بجای استفاده از ADOCommand می خواهم از QUERY استفاده کنم

شفیعی
دوشنبه 20 بهمن 1382, 04:24 صبح
سلام
خسته نباشید
برای سورت کردن از ADO استفاده کردم فقط 2 تا مشکل دارم
اول اینکه چگونه در ADO از ALIAS استفاده می کنند
دوم اینکه وقتی با ADO کار می کنیم اول برنامه یک USERNAME و پسورد می خواهد چگونه می توان این پنجره را غیر فعال نمود

Gladiator
دوشنبه 20 بهمن 1382, 09:12 صبح
برای غیر فعال کردن اون پنجره Prompt.. ( پرومپت نمیدونم چی چی ) رو False کن . :mrgreen:

v_shalchian
دوشنبه 20 بهمن 1382, 18:02 عصر
سلام
همونطور که Gladiator اشاره کرد در ADOConnection (در صورت وجود) خاصیت Loginprompt رو False کن.

شفیعی
سه شنبه 21 بهمن 1382, 07:15 صبح
سلام
خیلی ممنون
در مورد سوال اول باید چکار کرد :?:

شفیعی
پنج شنبه 23 بهمن 1382, 05:34 صبح
سلام
از وقتی به جای TABLE از ADO استفاده کرده ام اطلاعات فارسی فایل قابل خواندن نمی باشد
یعنی اطلاعات فارسی را درست نمایش نمی دهد :?:

شفیعی
شنبه 05 دی 1383, 04:59 صبح
سلام
منتظر جواب دوستان هستم

MiRHaDi
شنبه 05 دی 1383, 08:42 صبح
سلام
شفیعی جان ADO که کاری نداره Sort داره
اگه هنوز با BDE کار میکنی از Query استفاده کنی بهتره
اگه نمیخوای باید جدولت رو بگی برای همه فیلدها Index بسازه و از اونا استفاده کنی
تو خود طراحی جدول باید بگی
بای

Panje Tala
یک شنبه 06 دی 1383, 08:42 صبح
باسلام
با کد نویسی هم خیلی راحت میشه index گذاری کرد.من این کار رو انجام دادم و بدون هیچ مشکلی کارکرد.متاسفانه نتونستم نمونه کدم را پیدا کنم .ولی میدونم از متد Addindex جدول استفاده کردم.

شفیعی
یک شنبه 06 دی 1383, 16:56 عصر
سلام
ببخشید همه دوستان می گویند راحت می توان این کار انجام داد من انجام دادم شد ولی کسی نمونه برنامه ای ارائه نمی کندبنده خیلی بیسواد هستم با این عبارات چیزی حالیم نمی شه
اگر لحنه بندکمی تند است دوستان به بزرگوار خودشان بنده را عفو نمایند زیرا از دست این مشکل دیگر کلافه شده ام

kimia1
شنبه 19 دی 1383, 08:52 صبح
سلام فکر کنماین کد که توی SwissDelphiCenter.ch پیدا کردم بدردت بخوره. من اون را تست کردم و جواب گرفتم

type
TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure

{...}

procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer);
var
i, j: Integer;
Sorted: Boolean;

function Sort(Row1, Row2: Integer): Integer;
var
C: Integer;
begin
C := 0;
Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C]][Row2]);
if Result = 0 then
begin
Inc(C);
while (C <= High(ColOrder)) and (Result = 0) do
begin
Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1],
Grid.Cols[ColOrder[C]][Row2]);
Inc(C);
end;
end;
end;

begin
if SizeOf(ColOrder) div SizeOf(i) <> Grid.ColCount then Exit;

for i := 0 to High(ColOrder) do
if (ColOrder[i] < 0) or (ColOrder[i] >= Grid.ColCount) then Exit;

j := 0;
Sorted := False;
repeat
Inc(j);
with Grid do
for i := 0 to RowCount - 2 do
if Sort(i, i + 1) > 0 then
begin
TMoveSG(Grid).MoveRow(i + 1, i);
Sorted := False;
end;
until Sorted or (j = 1000);
Grid.Repaint;
end;
به عنوان مثال :

procedure TForm1.Button1Click(Sender: TObject);
begin
{ Sort rows based on the contents of two or more columns.
Sorts first by column 1. If there are duplicate values
in column 1, the next sort column is column 2 and so on...}
SortGridByCols(StringGrid1, [1, 2, 0, 3, 4]);
end;

امیدوارم بدردت بخوره :wink:

kimia1
شنبه 26 دی 1383, 09:05 صبح
یه راه دیگه هم هست مخصوص DBGrid با استفاده از SQL به شرح زیر:
توی رویداد ONCreate فرم میتونی خطوط زیر را بنویسی:

QuerySql:='Select * From Custom.DB';
Query1.Sql.add(querySql);
query1.Open;
حالا توی رویداد OnTitleClick مربوط به DBGrid کد زیر را بنویس:

with query1 do
begin
disablecontrols;
close;
sql.clear;
sql.add(querysql);
sql.add('order by'+column.fieldname);
open;
dbgrid1.columns.restoredefaults;
column.title.font.color:=clblue;
enablecontrols;
end;

Dolphin
جمعه 02 بهمن 1383, 12:13 عصر
یک راه حل ساده استفاده از کامپوننت tms هست که با استفاده از html می تونی مرتب سازی انجام بدی

esi022
یک شنبه 04 بهمن 1383, 05:09 صبح
سلام شفیعی جان
قبول دارم که با پیغامها ادم سخت به نتیجه میرسه - حالا مشکلت حل شد یا نه؟
اگه نه پایم که مشکلت رو حل کنم.

پیشنهادم اینه که اصلا ایندکس نسازی تو برنامه . استفاده از adoquery بهترین گزینه هست ( بنظر من ) .
اگه از ado connection داری استفاده میکنی - از ado table , ado query استفاده کن
و اینکه برای کنجکاوی خودم میپرسم!!!!:
اطلاعاتتو چطوری فارسی ذخیره میکنی؟ unicode ؟ arabic ؟ خرچنگ غورباغه ؟
:kaf:

minmoj
یک شنبه 04 بهمن 1383, 11:30 صبح
در رویداد title click گرید کد زیر را قرار بده
(Column.Field.DataSet as TADOTable).IndexFieldNames:=Column.FieldName;
در ضمن نیازی به هیچ کامپوننت دیگری نداری

شفیعی
یک شنبه 11 اردیبهشت 1384, 21:20 عصر
سلام
اگر بخواهیم بعد از سورت کردن یک ICO و یا یک تصویر روی TITEL DBGRID نمایش دهیم باید چکار کرد که مشخص شود اطلاعات داخل DBGRID بر اساس این فیلد مرتب شده است باید چکار کرد

MiRHaDi
یک شنبه 08 خرداد 1384, 02:21 صبح
سلام
هندلش رو میگیری روش میکشی !
نخواستی با Canvas میکشی
نخواستی یک Image میذاری و جاش رو میذاری روی اون Title مورد نظر
بازم نخواستی Title رو عوض میکنی و کاراکتری بهش اضافه میکنی مثلا Name /\
راه زیاده شما میتونید از هر کدوم که میخواید استفاده کنید
بای

kamyar_kimiyabeigi
چهارشنبه 18 خرداد 1384, 13:20 عصر
شما میتونین از cxgrid استفاده کنین خودش این کار رو می کنه

leylam
چهارشنبه 18 خرداد 1384, 15:20 عصر
من یک پیشنهاد دارم: برای فایل های DBF بهتره از Table های apollo استفاده کنی این apollotable به راحتی قابلیت index گذاری را به شما میدهد و هم اطلاعات فارسی را خراب نمی کنه با این componentها به راحتی میشه روی فایل های dbf کارکرد. من نمی دونم چطوری باید این component ها رو ضمیمه کنم اگر خواستید برایتون بفرستم . موفق باشید. :)

afshar
سه شنبه 14 تیر 1384, 15:32 عصر
سلام
من می خواهم با کلیک بر روی هر ستون DBGRID اطلاعات بر اساس آن ستون sort شود ، همانطور که دوستان گفته بودند از ADOTable.Sort استفاده کردم به صورت زیر


tbl_contract.Sort := column.FieldName +' ASC'
ولی موقع اجرا خطای زیر را میگرد :cry:
:Arguments are of the wrong type,are out of acceptable range, or are in conflict with one another
کسی میتونه راهنماییم کنه

Hamid_PaK
سه شنبه 14 تیر 1384, 15:46 عصر
نمیدونم بدردتون می خوره یا نه ولی من با ADO Table اندکس ساختم بسیار ساده بود اینم یه مسال از TTable روش همونه . . .
http://www.barnamenevis.org/forum/viewtopic.php?t=29140

afshar
چهارشنبه 15 تیر 1384, 10:11 صبح
ممنون از توجه تان :flower:
tableمن هم از نوع ADO است.حالا امتحان میکنم ببینم جواب میده یا نه.