PDA

View Full Version : مرتب سازی اسناد



حمیدرضاصادقیان
سه شنبه 10 مرداد 1385, 09:06 صبح
سلام. من میخواستم مرتب سازی اسناد را بر اساس تاریخ و سند انجام بدم .میخواستم ببینم کسی الگوریتم خواصی مد نظرش هست؟
ببینید به این صورت که فرض کنید 5 تا سند با شماره و تاریخهای زیر داریم.

1 01/01/85
2 01/03/85
4 02/01/85
5 03/03/85
6 02/03/85

حالا میخوام اینا رو به صورت زیر مرتب کنم.

1 01/01/85
2 02/01/85
3 01/03/85
4 02/03/85
5 03/03/85

با تشکر

AminSobati
سه شنبه 10 مرداد 1385, 10:09 صبح
سلام،
زمانی که تاریخها به شکل String ذخیره شده باشند، نباید مشکلی داشته باشید:


declare @tmp table (c1 varchar(100))

insert @tmp select '85/01/01' union
select '85/03/01' union
select '85/01/02' union
select '85/03/03' union
select '85/03/02'

select * from @tmp order by c1

حمیدرضاصادقیان
سه شنبه 10 مرداد 1385, 13:57 عصر
ممنون از جوابتون.ببینید در اصل من میخوام این update رو روی جدولم انجام بدم.
ببینید الان روی برنامه ای که من کار میکنم بدین صورت عمل میکنه
که یک جدول دیگه با مشخصات جدول سند من ایجاد کرده بعد شروع میکنه در یک حلقه تک تک رکوردها رو خونده و اگر عدد سند یا تاریخ اون مرتب نبود مرتبش کرده در جدول دوم اضافه میکنه.بعد میاد محتویات جدول اصلی رو پاک میکنه دوباره تمامی این داده ها رو از جدول دوم به جدول اول اضافه میکنه.
روی 70000 تا سند تقریبا 1 ساعت طول کشید . بعد هم اگر وسط کار برق بره دیگه هیچی.


سلام. من میخواستم مرتب سازی اسناد را بر اساس تاریخ و سند انجام بدم .میخواستم ببینم کسی الگوریتم خواصی مد نظرش هست؟
ببینید به این صورت که فرض کنید 5 تا سند با شماره و تاریخهای زیر داریم.

1 --> 01/01/85
2 --> 01/03/85
4 --> 02/01/85
5 --> 03/03/85
6 --> 02/03/85

حالا میخوام اینا رو به صورت زیر مرتب کنم.

1 --> 01/01/85
2 --> 02/01/85
3 --> 01/03/85
4 --> 02/03/85
5 --> 03/03/85

با تشکر

ببینید استاد ثباتی اعداد سمت راست شماره سند و سمت چپ هم تاریخ اون سند هست. من میخوام سندهای بالا رو مثل سند های پایین در جدول update کنم.

AminSobati
سه شنبه 10 مرداد 1385, 15:38 عصر
بسیار خوب. شما از کجا تشخیص میدین که کدوم تاریخها باید بین خودشون Sort بشن؟ مثلا SanadID یا مشابهش رو دارین؟

حمیدرضاصادقیان
سه شنبه 10 مرداد 1385, 15:49 عصر
خوب به قول شما چون تاریخ رشته هست با Order by اینکار داره انجام میشه.
بعد تو یک حلقه یک متغیر گرفته میشه از یک تا max سند. سپس تو این حلقه هر شماره این متغیر با شماره سند چک میشه اگر برابر بود همونو توی جدول دوم اضافه میکنه اگر نبود شماره رو عوض میکنه و باهمون شماره متغیر حلقه به جدول اضافه میکنه.

AminSobati
سه شنبه 10 مرداد 1385, 23:33 عصر
این کار شما شبیه به Rank گذاشتن هست. در SQL Server 2005 امکانات بهتری برای این کار هست اما در 2000 این هم میتونه استفاده بشه:


declare @tmp table (c1 varchar(100))
declare @tmp2 table (ID int identity(1,1),c1 varchar(100))

insert @tmp select '85/01/01' union
select '85/03/01' union
select '85/01/02' union
select '85/03/03' union
select '85/03/02'

insert @tmp2 (c1) select * from @tmp order by c1
select * from @tmp2

ولی هنوز یقین ندارم دقیقا جواب شما باشه!

حمیدرضاصادقیان
چهارشنبه 11 مرداد 1385, 09:16 صبح
ممنون استاد.ببینید حالا اگه تعداد سندها زیاد باشه باید چیکار کرد؟ فکر کنم خیلی طول میشکه.
در ضمن الان من کد قسمتی که اینکارو انجام میده برای شما میفرستم لطفا یک نگاهی بندازید.


Query1.SQL.Clear;
Query1.SQL.Add('select * from f_sanad');
Query1.SQL.Add('order by date1,sanad,rdf');
Query1.Active:=true;
i:=1;

while not (Query1.eof) do
begin
check:=Query1.FieldByName('Sanad').AsInteger;
with DmAdo.Qtemp do
begin
close;
SQL.Clear;
SQL.Add('insert into testf_sanad');
SQL.Add('(sanadold,sanad,rdf,kol_n,moen_n,tafzil_n ,bd_bs,'+
'price,disk1,date1,typ,user1,markaz,ghatei,t_print )');
SQL.Add('values(:sold,:s,:r,:k,:m,:t,:bds,:p,:dk,: d,:tp,:us,:mark,:gh,:t_p)');
Parameters.ParamByName('sold').Value:=Query1.Field ByName('Sanad').AsInteger;
Parameters.ParamByName('s').Value:=i;
Parameters.ParamByName('r').Value:=Query1.FieldByN ame('Rdf').AsInteger;
Parameters.ParamByName('k').Value:=Query1.FieldByN ame('Kol_n').AsInteger;
Parameters.ParamByName('m').Value:=Query1.FieldByN ame('Moen_n').AsInteger;
Parameters.ParamByName('t').Value:=Query1.FieldByN ame('Tafzil_n').AsInteger;
Parameters.ParamByName('bds').Value:=Query1.FieldB yName('Bd_bs').AsInteger;
Parameters.ParamByName('p').Value:=Query1.FieldByN ame('Price').AsInteger;
Parameters.ParamByName('dk').Value:=Query1.FieldBy Name('Disk1').AsString;
Parameters.ParamByName('d').Value:=Query1.FieldByN ame('Date1').AsString;
Parameters.ParamByName('tp').Value:=Query1.FieldBy Name('Typ').AsInteger;
Parameters.ParamByName('us').Value:=Query1.FieldBy Name('User1').AsString;
Parameters.ParamByName('mark').Value:=Query1.Field ByName('Markaz').AsInteger;
Parameters.ParamByName('gh').Value:=Query1.FieldBy Name('ghatei').AsInteger;
Parameters.ParamByName('t_p').Value:=Query1.FieldB yName('t_print').AsInteger;
ExecSQL;
end;
Query1.Next;
if (Query1.FieldByName('Sanad').AsInteger <> check) then i:=i+1;

label3.Caption:='&#211;&#228;&#207; &#212;&#227;&#199;&#209;&#229; '+inttostr(Query1.FieldByName('Sanad').AsInteger);
end; // of query1.eof
WriteSQL(DmAdo.spNewEveryThing,' delete from f_sanad ',1);
WriteSQL(DmAdo.spNewEveryThing,' insert into f_sanad select * from testf_sanad',1);
WriteSQL(DmAdo.spNewEveryThing,' delete from testf_sanad ',1);


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

AminSobati
چهارشنبه 11 مرداد 1385, 14:32 عصر
یک مشکل کوچیک اینجا هست: متاسفانه دلفی بلد نیستم!
لطفا توضییح بدین که چه کاری در این کد انجام میدین که دستورات من انجام نمیده.

حمیدرضاصادقیان
چهارشنبه 11 مرداد 1385, 15:02 عصر
سلام.
ببینید ابتدا یک متغیر i گرفته و مقدار اونو صفر گذاشته و با یک حلقه while تا زمانی که query به انتها نرسیده حلقه رو ادامه میده. بعد روی هر رکورد که می ایسته مقدار شماره سند اونو در متغیر check میریزه. سپس شروع میکنه تمامی مقدایر جدول اصلی رو توی یک جدول دومی اضافه میکنه.بعد پایان این اضافه کردن میاد مقدار سند رو با مقداری که در متغیر check هست چک میکنه که مطمئن باشه به انتهای حلقه رسیده یا خیر.بعد هم در پایان حلقه میاد تمام داده های جدول اصلی رو پاک میکنه و داده های جدول دوم رو به جدول اول اضافه میکنه.
ولی این عمل خیلی طول میکشه.

hmm
چهارشنبه 11 مرداد 1385, 18:25 عصر
حمیدرضای عزیز شما اگه بتونی ستون تاریخ رو سورت کنی و کنارش با روشهای موجود یه sequence بگذاری مشکلت حل میشه

حمیدرضاصادقیان
چهارشنبه 11 مرداد 1385, 19:43 عصر
دوست عزیز من ستون تاریخ رو سورت میکنم به راحتی
با دستور


select * from f_sanad order by date1

به راحتی سورت میشن و هیچ مشکلی هم ندارن حالا بخوام اینو روی خود جدول update کنم و شماره سند ها رو هم به ترتیب کنم باید چیکار کنم؟
منظورت از sequence چی هست؟

AminSobati
چهارشنبه 11 مرداد 1385, 22:45 عصر
sequence منظور همون ترتیبه. کاری که من انجام دادم این فیلد رو برای شما ایجاد میکنه. توضیح ندادین کدی که براتون نوشتم چه اشکالی داره تا کاملش کنم

حمیدرضاصادقیان
پنج شنبه 12 مرداد 1385, 17:50 عصر
ببینید کدی که شما نوشتین یعنی من باید بیام برای 70 هزار تا سند هم تک تک تاریخها رو بنویسم؟
خوب برای سندهای تعداد بالا باید چه جوری ازش استفاده کنم؟

AminSobati
پنج شنبه 12 مرداد 1385, 22:35 عصر
متوجه نشدم که "تک تک تاریخها رو بنویسم" منظورتون چیه! من یک دستور Insert نوشتن برای تمام اطلاعات