PDA

View Full Version : جستجوی رکوردهای خالی در دیتابیس



حمیدرضاصادقیان
چهارشنبه 28 اردیبهشت 1384, 19:34 عصر
سلام دوستان
من یک بانک دارم که 60000 تا رکورد داره.
حالا میخوام براساس شماره سند جستجو کنم وسندهای خالی رو پیدا کنم.که دراین بین ثبت نشده اند و در یک memo نمایش بدم
خودم اومدم از اولین رکورد تا اخرین رکورد یک سرچ گذاشتم و با استفاده از دستور locate اینکارو میکنم ولی خودم خوشم نمیاد خیلی کنده.
میخوام ببینم روش دیگه ای داره.
درضمن روی فیلدی هم که سرچ میکنم index دارم

پنج شنبه 29 اردیبهشت 1384, 10:05 صبح
اگه از adoquery یا query bde استفاده نمایید با یک select کوچک میتونید نتایج دلخواه داشته باشید .

:موفق:

دنیای دلفی
پنج شنبه 29 اردیبهشت 1384, 11:34 صبح
اگر فیلد شما متنی یا memo است می توانید از Full Text Search استفاده کنید بسیار سریع می باشد .

:D

حمیدرضاصادقیان
پنج شنبه 29 اردیبهشت 1384, 21:17 عصر
نه دوست من فیلد من متنی نیست بلکه شماره سند رو میخوام جستجو کنم.
اقای دادوند من از اون select که گفتی چه جوری استفاده کنم روشش رو بکو.

ebnsina
پنج شنبه 29 اردیبهشت 1384, 21:24 عصر
با سلام
در اینجا من از جدول کاردکسم رکوردهایی که فیلد نوعشون رسید ثبت شده ولی فیلد سندشون خالی رو پاک کردم.



delete from Kardex
where (SanadKind = 'Resid' and SanadID IS NULL)


موفق باشید
:موفق:

حمیدرضاصادقیان
جمعه 30 اردیبهشت 1384, 19:32 عصر
ببینید ما مثلا در ورود اطلاعات سند حسابداری به فرض از شماره 1 تا 10 فرضا 1 تا 8 رو سند زدیم سند 9 رو نزدیم و بعد سند 10 رو وارد کردیم.
حالا میخوایم با یک جستجو به ما نشون بده که سند 9خالیه و ما بیایم سند بعدیمون رو شماره 9 قرار بدیم.
بازم از همه دوستان ممنون :oops:

حمیدرضاصادقیان
شنبه 31 اردیبهشت 1384, 12:44 عصر
[quote]دوست عزیزم روشی که گفتین میتونه جواب بده اما بسیار کنده. بهینه ترین راه استفاده از خاصیت Join هستش. برای مثال، در جدول زیر من چند مقدار بین 1 تا 10 وارد میکنم ولی 4,6,7,9 رو جا میندازم:


create table sanad(
sid int)

insert sanad values(1)
insert sanad values(3)
insert sanad values(2)
insert sanad values(8)
insert sanad values(10)
insert sanad values(5)

create index ix1 on sanad(sid)

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

به فرض اینکه Min و Max شما 1 و 10 باشن، باید یک جدول مجازی ایجاد کنیم و از 1 تا 10 رو در این جدول وارد کنیم. بعد با یک Join رکوردهای جا افتاده بدست میاد:


declare @Min int
declare @Max int
set @Min=1
set @Max=10

declare @tmp table(tid int primary key)
declare @Counter int
set @Counter=@Min
while @Counter <=@Max
begin
insert @tmp values(@Counter)
set @Counter=@Counter+1
end

select t.tid from @tmp t left outer join sanad s
on t.tid=s.sid
where s.sid is null
[/quote]
دوستان من مشکل رو با این کدی که استاد ثباتی راهنمایی کردن حل کردم.
حالا وقتی میخوام فیلد tid یا sid رو نمایش بدم در یک memo خطا میدهد که نمیتواند یک مقدار null را در یک string بریزد. چه جوری میتونم مشکلمو حل کنم.؟؟؟؟؟؟؟؟ :گیج:

حمیدرضاصادقیان
شنبه 31 اردیبهشت 1384, 15:53 عصر
سلام
من مشکل بالا رو حل کردم.
حالا مقدارو میریزه ولی همش صفره :cry:
من این کد رو نوشتم ولی همش در Recordcount گیر میکنه و مقدارش 421 هست.
نمیدونم چرا

for i := 0 to adst.RecordCount do
begin

if memSabtNashode.Text=' ' then memSabtNashode.Text:=memSabtNashode.Text+adst.Fiel dbyname('tid').asstring
else
memSabtNashode.Text:=memSabtNashode.Text+' - '+ adst.Fieldbyname('tid').asstring;

end;

شنبه 31 اردیبهشت 1384, 17:33 عصر
نه دوست من فیلد من متنی نیست بلکه شماره سند رو میخوام جستجو کنم.
اقای دادوند من از اون select که گفتی چه جوری استفاده کنم روشش رو بکو.

من نمیدونم کجاش مشکل داری ولی یک مثال کوچک برا استفاده از دستور select برات نوشتم.

adoquery1.sql.text='select * from table1 where name = 'ali'

این دستور sql تمام رکوردهایی که مقدار فیلد name شون ali هست رو پیدا میکنه. حالا برا خالی بودن کافیست از مقدار null استفاده کنی .

:موفق:

حمیدرضاصادقیان
شنبه 31 اردیبهشت 1384, 21:19 عصر
دستت درد نکنه.
با اون کدی که خودم نوشتم مشکلم حل شد.ممنون از همگی :wink: :flower: