PDA

View Full Version : row number در access



b.mahsa
یک شنبه 06 تیر 1389, 11:00 صبح
سلام من از دستور زير استفاده مي كنم براي paging در data base sql





SELECT sample.ID from (SELECT ID,ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWS
FROM tableName) AS sample
WHERE sample.ROWS >= (groupNumber * pageSize) AND sample.ROWS <= ((groupNumber * pageSize) + pageSize)



معادل اين دستور در access وجود داره؟
تابع row_number رو در Access نمي شناسه
ممنونميشم راهنماييم كنين.

mazoolagh
یک شنبه 06 تیر 1389, 12:47 عصر
در اکسس باید از تکنیک های دیگه ای مبتنی بر جداول موقت برای پیجینگ استفاده کنین که مطمئنا نسبت به روشهای ذاتی sql سربار زیادی دارن

b.mahsa
یک شنبه 06 تیر 1389, 13:04 عصر
ممنون بابت پاسختون
ميشه بيشتر توضيح بدين.
يا يك مثال كوچيك بزنيد.

mazoolagh
یک شنبه 06 تیر 1389, 13:12 عصر
ببینین کلا وقتی بانک ذاتا قابلیت پیجینگ نداره شما خواه ناخواه مجبور میشین هر پیج رو شبیه سازی کنین که روش متعارف استفاده از جداول موقتی هست.

من خودم چون هیچوقت کد برای اینکار ننوشتم نمونه اش رو به گوگل واگذار میکنم:
http://www.google.com/webhp?hl=en#hl=en&q=access+record+paging

b.mahsa
چهارشنبه 09 تیر 1389, 13:25 عصر
تو foxpro يك تابعي به اسم recno() هست كه دقيقا كار row_number رو تو sql مي كنه . تو access همچين تابعي وجود نداره .
من چه طور مي تونم تو access شماره ركورد رو به دست اورد؟؟؟؟

mazoolagh
چهارشنبه 09 تیر 1389, 13:48 عصر
ببینین پشتیبانی دستورات sql در اکسس محدود هست

راستی چرا از رکوردست استفاده نمیکنین؟ اونجا دستتون خیلی باز هست و راحت میتونین توی رکوردها بچرخین

b.mahsa
چهارشنبه 09 تیر 1389, 13:55 عصر
سلام. ممنون بابت پاسختون .
من يه بانك دارم با 1ميليون ركورد.
پر كردن dataset عملا امكان پذير نيست.
اينه كه بايد از خاصيت paging استفاده كنم
يعني دستور selcet رو بايد محدود كنم .

select * from table where row_number >1000 and row_number <2000

يه دستوري مثل بالا.

mazoolagh
چهارشنبه 09 تیر 1389, 13:56 عصر
یک سئوال:
visual studio کار میکنین؟
web application یا windows application ؟

b.mahsa
چهارشنبه 09 تیر 1389, 14:00 عصر
بله . visual studio , windows application
البته فكر نمي كنم فرق چنداني بكنه
من اگه با محدوديتي كه مي خوام dataset رو پر كنم . مشكلم حل ميشه

mazoolagh
چهارشنبه 09 تیر 1389, 14:12 عصر
البته فرق که میکنه

ضمنا با یک میلیون رکورد مهاجرت به sql نه تنها کاملا توجیه پذیر هست بلکه بشدت هم توصیه میشه

b.mahsa
چهارشنبه 09 تیر 1389, 14:16 عصر
بله كاملا درسته . من خودم هم رو بانك sql كار ميكنم و زياد به access وارد نيستم ولي متاسفانه امكان تغيير بانك نيست.
يعني تو acces به هيچ وجه نميشه يه بازه خاصي از record ها رو select كرد؟؟

mazoolagh
چهارشنبه 09 تیر 1389, 14:28 عصر
نمیتونیم بگیم "بهیچ وجه" چون شدنش میشه ولی همونطور که گفتم سربار زیادی تحمیل میکنه بخصوص اگر بخواین آپدیت هم داشته باشین

b.mahsa
چهارشنبه 09 تیر 1389, 14:35 عصر
نه بحث update رو ندارم.
لينكي كه داده بودين رو ديدم ولي چيزي كه ميخواستم رو پيدا نكردم.:ناراحت:

mazoolagh
چهارشنبه 09 تیر 1389, 14:58 عصر
اگر اطلاعات دیتابیس فیکس هست یا دیر به دیر آپدیت میشه راه حل دارین

b.mahsa
چهارشنبه 09 تیر 1389, 16:07 عصر
بله دید به دیر update میشه .
چه راهی داره.
شما راهش می دونید؟
ممنون میشم راهنماییم کنین.

dadsara
دوشنبه 14 تیر 1389, 10:03 صبح
سلام
دوست عزیز اگر منظورتان از شماره رکورد همان شماره ردیف هست باید به استحضار جنابعالی برسانم تعداد از دوستان روشهائی را طراحی و در تاپیکهای دیگر ارائه فرموده اند که هر کدام در یک جای خاص با مشکل برخورد می کند
مثلا برای نمونه این فایل خدمت شما

mazoolagh
دوشنبه 14 تیر 1389, 14:49 عصر
همانطور که قبلا گفته شد و جناب دادسرا هم اشاره کردن وقتی خود بانک قابلیت پیجینگ نداشته باشه روشهای جایگزین دردسرهای خودشون رو خواهند داشت.

اما برای کیس شما که اطلاعات دیر به دیر بروز میشه میتونین از استراکچر جدول یک کپی بگیرین به اسم مثلا new_table و یک فیلد دیگه autonumber بهش اضافه کنین مثلا به اسم srtrdr که البته ایندکس هم باید باشه

حالا یک append query مینویسین که رکوردهای جدول اصلی رو به این جدول جدید طبق sort order خودتون اضافه کنه. بالطبع مقدار فیلد srtrdr نشوندهنده ترتیب رکوردهای موردنظر شما میشه.

از اینجا به بعد دیگه آسون هست، بجای جدول اصلی از جدول جدید بعنوان datasource استفاده کنین و از فیلد srtrdr هم بعنوان شرط جستجو. مثلا اگر هر پیج 50 رکورد داره رکوردهای پیج پنجم اینجوری انتخاب میشن:



select * from new_table where srtrdr between 201 to 250 order by srtrdr


هر وقت جدول اصلی آپدیت شد میتونین عملیات بالا را مجددا اجرا کنین (از طریق کد البته)

alireza_s_84
دوشنبه 14 تیر 1389, 15:10 عصر
سلام دوست عزیز:
متاسفانه انجام اینکار با دیتابیس اکسس چندان ساده نیست شما به ترتیب زیر عمل کنید:
الف) یک Query برای ایجاد جدول موقت بسازید:

CREATE TABLE TemporaryCategories(
Id COUNTER PRIMARY KEY,
CatIndex Integer
);

این جدول موقت شامل دو فیلد است یکی بصورت AutoNumber و دیگری از نوع Integer که برای نگهداری شناسه یا کلید اصلی رکوردهایی است که باید استخراج شوند.
ب) پر کردن جدول موقت با شناسه رکوردهای جدولی که باید مورد پرس و جو قرار بگیره:
INSERT INTO TemporaryCategories
SELECT CatId AS CatIndex
FROM Categories;

ج) ایجاد یک پرس و جو برای استخراج رکوردهای مورد نظر با دو پارامتر که یکی تعداد رکوردهایی که باید استخراج شوند و دیگری محل شروع ایندکس رکورهای مورد پرس و جو):
SELECT CatId, EtagereId, CatTitle, Caption, Description, Picture, StockCount, Price, PostPrice, AddDate, AddTime
FROM Categories
WHERE ((CatId IN (SELECT CatIndex FROM TemporaryCategories WHERE (Id > [@startRowIndex] AND (Id < ([@startRowIndex] + [@maximumRows] + 1))
)
)));
و در نهایت حذف جدول موقت:
DROP TABLE TemporaryCategories

نکته: چون در اکسس از جداول موقت پشتیبانی نمیشه (Temporary Table) لذا مجبور به اجاد جدول و حذف آن بصورت دستی هستیم.(البته عدم پشتیبانی آن در دسترسی از خارج دیتابیسه وگرنه در خود محیط دیتابیس میتونید از دستور Create TemporaryTable استفاده کنید.)
یادآوری: در حین اجرای تمامی پرس و جوهای فوق از عملیات TransAction استفاده کنید تا در صورت بروز خطا پروسه ایجاد و حذف جدول موقت بطور دقیق انجام بگیره.
موفق باشید