ورود

View Full Version : ايجاد شماره رديف در كوئري با ID ثابت



Reza G
دوشنبه 02 مهر 1403, 14:49 عصر
با سلام
دوستان به نظر شما راه حلي براي ايجاد شماره رديف در يك كوئري با يك ستون كه در آن يك سري عدد يكسان ثبت شده وجود دارد؟
فرمول روبرو
RowNum: DCount("[ID]","[tblNames]","[ID]<="& [ID])

زماني كاربرد دارد كه محتواي ستون ID متفاوت باشد نه يكسان
قصد دارم ستون ID را ايجاد كنم كه با تغيير محتواي ستون A شمارنده از عدد يك شروع و تا تغيير بعدي شمارش را ادامه دهد و دوباره از يك شروع شود و ....
ممنون

156089

mazoolagh
دوشنبه 02 مهر 1403, 17:31 عصر
سلام و روز خوش

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

Reza G
سه شنبه 03 مهر 1403, 08:49 صبح
سلام و سپاس
قرار است يك كوئري از جدول تهيه شود و رديف ID در كوئري ايجاد و سپس خروجي اكسل گرفته شود.
خروجي نهايي توسط ديتالودر ثبت سيستم شركت خواهد شد.
در ستون A در واقع آيتم كد قرار مي گيرد.

156093

atf1379
سه شنبه 03 مهر 1403, 09:39 صبح
سلام و روز خوش

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

با سلام
بر اساس جستجوهائی که بنده هم در سایت برنامه نویس و سایر سایت ها انجام دادم در همه موارد با استفاده از ستون ID جدول اقدام به ایجاد ردیف در کوئری شده است
و موردی را نیافتم که بدون استفاده از ID جدول یک ستون ردیف در جدول ایجاد شود

mazoolagh
سه شنبه 03 مهر 1403, 12:41 عصر
سلام و سپاس
قرار است يك كوئري از جدول تهيه شود و رديف ID در كوئري ايجاد و سپس خروجي اكسل گرفته شود.


سلام دوباره و روز خوش
این که پرسیدم کجا و چجوری استفاده میشه به این خاطر هست که خود کوئری که ساخته میشه updateable نیست.

برای سورس گزارش اگر باشه که اصولا نیازی نیست چون خود گزارش ابزار نامبرینگ داره،
و برای فرم هم readonly میشه - میشه روشهایی رو پیاده کرد برای دور زدن این موضوع ولی پیچیده است و بنظرم ارزش نداره.

شما از چندین راه میتونین این رو پیاده کنین:

یکی کوئری خالص هست بدون هیچ کدنویسی،
یکی کدنویسی خالص هست و ساخت یک جدول که اون رو میتونین به اکسل بفرستین.

mazoolagh
سه شنبه 03 مهر 1403, 12:50 عصر
برای کوئری روی دیتابیس northwind مثال میزنم،
شما میتونین روی دیتابیس خودتون پیاده اش کنین.

یک جدول products داریم که هر product یک categoryid داره،
و میخواهیم که به ازای هر category نامبرینگ جدا داشته باشیم:

SELECT
A.ProductID,
A.ProductName,
A.CategoryID,
(
SELECT COUNT(ProductID)
FROM Products AS B
WHERE B.CategoryID = A.CategoryID
AND
B.ProductID <= A.ProductID
) AS [Row Number]
FROM Products AS A
ORDER BY A.CategoryID, A.ProductID;

همونجور که میبینین روش مشابه همونی هست که خودتون گفتین،
ولی از subquery استفاده کردیم.

156097

mazoolagh
سه شنبه 03 مهر 1403, 13:06 عصر
مشابه همین اگر بخواهیم نامبرینگ رو براساس supplier انجام بدیم:

SELECT
A.ProductID,
A.ProductName,
A.SupplierID,
(
SELECT COUNT(ProductID)
FROM Products AS B
WHERE B.SupplierID = A.SupplierID
AND
B.ProductID <= A.ProductID
) AS [Row Number]
FROM Products AS A
ORDER BY A.SupplierID, A.ProductID;

156098

mazoolagh
سه شنبه 03 مهر 1403, 13:08 عصر
برنامه نمونه

mazoolagh
سه شنبه 03 مهر 1403, 13:15 عصر
روش کار در MS SQL:

USE NorthWind

SELECT
P.ProductID,
P.ProductName,
P.CategoryID,
C.CategoryName,
ROW_NUMBER() OVER(PARTITION BY P.CategoryID ORDER BY P.ProductID) AS [Row Number]
FROM Products AS P
INNER JOIN Categories AS C
ON P.CategoryID=C.CategoryID

156100

mazoolagh
سه شنبه 03 مهر 1403, 13:23 عصر
استفاده از VBA وقتهایی که ساخت کوئری ها پیچیده میشه روش بهتری هست،
بخصوص اگر قرار هست عملیات دیگه ای جز ساخت نتایج هم انجام بشه.

در اینجا هم میشه همه این کارها رو یکجا و خودکار انجام داد: فقط انتخاب جدول و بعد در کد ساخت نتایج و ارسال به اکسل.

یا اینکه کد رو در اکسل اجرا کرد و از اکسس خوند.

mazoolagh
سه شنبه 03 مهر 1403, 13:30 عصر
با سلام
بر اساس جستجوهائی که بنده هم در سایت برنامه نویس و سایر سایت ها انجام دادم در همه موارد با استفاده از ستون ID جدول اقدام به ایجاد ردیف در کوئری شده است
و موردی را نیافتم که بدون استفاده از ID جدول یک ستون ردیف در جدول ایجاد شود

سلام و روز خوش

الان این پرسش هست یا مطلب تکمیلی؟
چون اینجا هیچ اشاره ای به id نکردم.

و البته که بدون id هم میشه - ولی موضوع این تاپیک نیست!

atf1379
سه شنبه 03 مهر 1403, 15:34 عصر
با سلام
دوستان به نظر شما راه حلي براي ايجاد شماره رديف در يك كوئري با يك ستون كه در آن يك سري عدد يكسان ثبت شده وجود دارد؟
فرمول روبرو
RowNum: DCount("[ID]","[tblNames]","[ID]<="& [ID])

زماني كاربرد دارد كه محتواي ستون ID متفاوت باشد نه يكسان
قصد دارم ستون ID را ايجاد كنم كه با تغيير محتواي ستون A شمارنده از عدد يك شروع و تا تغيير بعدي شمارش را ادامه دهد و دوباره از يك شروع شود و ....
ممنون


سلام و روز خوش

الان این پرسش هست یا مطلب تکمیلی؟
چون اینجا هیچ اشاره ای به id نکردم.

و البته که بدون id هم میشه - ولی موضوع این تاپیک نیست!

سلام
روز شما هم خوش!
این مطلب را بعنوان مطلب تکمیلی پست اول استارتر محترم مطرح کردم . البته باید در پستی که ایجاد کردم مطلب ایشان را بعنوان نقل قول درج میکردم
ایشان در توضیحات پست اول اشاره کرده اند که فرمولی که برای ایجاد ردیف در کوئری قرار داده اند زمانی کاربرد دارد که اعداد ستون ID جدول پیوسته و پشت سرهم باشد و اگر اعداد تکراری باشد خروجی فرمول فوق بصورت پیوسته و غیر تکراری نمی باشد .
در کل منظوئر اینست که آیا بدون استفاده از چنین ستونی میتوان ستونی در کوئری ایجاد کرد که اعداد آن متناسب با تعداد رکوردها از عدد 1 شروع و به عدد جمع رکوردها خاتمه پیدا کند . (با استفاده از نمونه پست 3)

Reza G
چهارشنبه 04 مهر 1403, 13:50 عصر
مشابه همین اگر بخواهیم نامبرینگ رو براساس supplier انجام بدیم:

SELECT
A.ProductID,
A.ProductName,
A.SupplierID,
(
SELECT COUNT(ProductID)
FROM Products AS B
WHERE B.SupplierID = A.SupplierID
AND
B.ProductID <= A.ProductID
) AS [Row Number]
FROM Products AS A
ORDER BY A.SupplierID, A.ProductID;

156098

سپاس
عالي و دقيق بود.
ببخشيد وجود ProductID به عنوان يك شمارنده Unique الزامي است؟
تكراري بودن اين شمارنده ايجاد خطا نمي كند؟
عذر من را بپذيريد فيلد شمارنده رديف كوئري من از دو جدول مجزا دريافت شده و رديف تكراري دارد.

mazoolagh
چهارشنبه 04 مهر 1403, 16:40 عصر
وجود ProductID به عنوان يك شمارنده Unique الزامي است؟
تكراري بودن اين شمارنده ايجاد خطا نمي كند؟
فيلد شمارنده رديف كوئري من از دو جدول مجزا دريافت شده و رديف تكراري دارد.


آره نیاز هست،
یا یک فیلد autonumber به جدول اضافه کنین،

یا این که کلا با VBA باید خروجی رو بسازین - این یکی رو سر فرصت یه نمونه درست میکنم.