PDA

View Full Version : حالت بهتر برای ایجاد جداول موقت؟



A.Farzin
سه شنبه 21 فروردین 1386, 19:35 عصر
با سلام
در حین اجرای برنامه نیاز است تا از داده‌های اصلی جداولی موقتی بسازم و پس از مقداری محاسبه روی فیلدها و رکوردهای آن، از نتیجه کار در یک گزارش استفاده کنم. در پایان هم بعد از بستن گزارش جدول موقتی را کلاً حذف کنم.
درخصوص شیوه پیاده‌سازی این کار چند راه‌کار دارم ولی نمی‌دانم کدام بهتر است

اول
از دیتابیس TempDB برای نگهداری جداول موقتی استفاده کنم. که مطمئنا در این حالت نیاز خواه داشت تا جداول موقت کاربران با نامهای متفاوت ایجاد شود. مساله مورد توجه در این حالت سرعت کار خواهد بود چون جداول موقت هم روی سرور گذاشته می‌شوند.

دوم
راه‌حل دیگر استفاده از یک دیتابیس اکسس روی کلاینهاست.

سوم
استفاده از آرایه‌ها به عنوان جدول موقتی که در این حالت نمی‌دانم چگونه گزارش کریستال ریپورت را به آن متصل کنم.

whitehat
سه شنبه 21 فروردین 1386, 20:48 عصر
لزوما لازم نیست اطلاعات را در سرور ایجاد کنید، اگه هر کاربری اطلاعات مشخصی را لازم دارد برای آن یک SP بنویسید و نتیجه را به ابزار گزارش گیری ارسال کنید. جدا از این می توانید اطلاعات مورد نیاز خود را در یک شیء Dataset یا DataReader در Client ها ذخیره کنید و سپس تغییرات مورد نظر را در آن انجام دهید

AminSobati
سه شنبه 21 فروردین 1386, 22:12 عصر
چرا از جدول که نامش با # شروع میشه استفاده نمیکنین؟ اولا به ازاء هر کاربر ایجاد میشه و کاربرهای همزمان با هم تداخل نمیکنند، ثانیا به محض بسته شدن Connection، این جدول هم Drop میشه. همچنین از Table Variable میتونین استفاده کنین

A.Farzin
شنبه 25 فروردین 1386, 19:06 عصر
چرا از جدول که نامش با # شروع میشه استفاده نمیکنین؟ اولا به ازاء هر کاربر ایجاد میشه و کاربرهای همزمان با هم تداخل نمیکنند، ثانیا به محض بسته شدن Connection، این جدول هم Drop میشه. همچنین از Table Variable میتونین استفاده کنین

جداول موقتی که به این ساخته می‌شوند را نمی‌توانم در Enterprise Manager ببینم.
اگر بخواهم یک گزارش روی جدول طراحی کنم آیا باید ابتدا یکی از آنها را بدون # در TempDB بسازم و وقتی ساخته شد آنرا حذف نمایم یا اینکه راهی برای دیدن جدول موقتی (دارای # در نام) برای طراحی گزارش بر روی آن وجود دارد؟

DonetKarvb
شنبه 25 فروردین 1386, 20:22 عصر
دستورات زیر را اجرا کن

Select * into #TempTable From Customers
Select * From #TempTable

حالا کانکشن رو باز و بسته کن دیگر نمیتوانید Select بزنی:چشمک:

AminSobati
شنبه 25 فروردین 1386, 21:38 عصر
جداول موقتی به این شکل رو میتونین در Tempdb ببینین. البته نامگذاری اونها در Tempdb کمی عجیب غریب هستش!
ولی نحوه استفاده شما از جدول موقتی برای من عجیبه. یعنی Query شما روی این جدول به حدی پیچیده است که باید حتما در Enterprise Manager بصورت Visual براش Query بنویسین؟ اگر بله،باید یک جدول دائمی با همون ساختار درست کنین، Query رو ایجاد کنین و در متن Query نام جدول رو Replace کنین و در برنامه از این Query استفاده کنین

A.Farzin
دوشنبه 10 اردیبهشت 1386, 05:39 صبح
لزوما لازم نیست اطلاعات را در سرور ایجاد کنید، اگه هر کاربری اطلاعات مشخصی را لازم دارد برای آن یک SP بنویسید و نتیجه را به ابزار گزارش گیری ارسال کنید. جدا از این می توانید اطلاعات مورد نیاز خود را در یک شیء Dataset یا DataReader در Client ها ذخیره کنید و سپس تغییرات مورد نظر را در آن انجام دهید

آیا منظور شما همان راهکار دوم یاد شده در بالاست. یعنی استفاده از یک دیتابیس اکسس روی کلایتنها.
اگر هست آیا ممکن است به پست زیر هم نگاهی داشته باشید
http://www.barnamenevis.org/forum/showthread.php?p=333948#post333948

خیلی ممنون

Kamyar.Kimiyabeigi
دوشنبه 10 اردیبهشت 1386, 08:10 صبح
A.Farzin به نظر من بهترین و Safe ترین راه همان راهی است که آقای ثباتی در پست #3 اشاره کردند (فرضا" اگر از Access استفاده کردین و کاربر سهوا" فایل mdb شما رو پاک کرد چی؟؟؟)

A.Farzin
دوشنبه 10 اردیبهشت 1386, 18:27 عصر
چون جداول موقتی به اکسس برده می‌شوند حذف کردنشان مشکلات چندانی ایجاد نخواهد کرد. فرمایش شما و رهنمود جناب ثباتی را هم درنظر دارم. و در واقع دنبال یادگیری روش پیاده کردن هر سه راهکار فوق هستم.
از دنبال کردن این مورد چند منظور دارم:
1) تمام جداولی که بدین شکل درست شوند، خوراک یک Report را فراهم خواهند کرد و قبل از نمایش گزارش باید محاسبات زیادی روی مقادیر انجام شود. و اگر این داده‌ها روی Client قرار گیرند، سرعت تولید گزارش کم نخواهد بود.
2) به دنبال این هستم که همیشه آخرین داده‌های مورد استفاده در هر گزارش در هر کامپیوتر روی همان دستگاه باقی بماند و بتوان در صورت لزوم آنها را مورد استفاده مجدد قرار داد و یا استفاده‌های برنامه‌ریزی نشده در برنامه از این داده‌ها به عمل آورد.
3) نمی‌دانم چگونه باید برای جداول موقتی (#) ساخته شده در SQL Server باید گزارش بسازم حال آنکه این جدول در زمان اجرا ساخته می‌شود و قابل دیدن به شکل بصری نیست.
4) چون برنامه روی شبکه اجرا می‌شود و اگر فرض کنم که این جداول موقتی خود را با ترکیب یک کلمه و شماره کاربران در خود SQL بسازم تا کار کردن همزمان کاربران مشکلی ایجاد نکند آنگاه به مشکل زیر برمی‌خورم که البته به این انجمن خیلی مربوط نمی‌شود:
برای گزارش گرفتن از کریستال ریپورت 9 استفاده می‌کنم و نمی‌دانم چرا وقتی گزارش را روی یک Table و یا View طراحی می‌کنم حتی اگر SQLQueryString گزارشم را مساوی دیتاست جدید با نام Table و یا View دیگری بگذارم خطا می‌گیرد و به نبود نام همان Table و یا View که گزارش را روی آن طراحی کرده بودم اشاره می‌کند.
ممنون

AminSobati
دوشنبه 10 اردیبهشت 1386, 23:07 عصر
آقای فرزین عزیز،
من فکر میکنم در سخت ترین شرایط، اگر حتما ناچار باشین از جدول دائمی استفاده کنین، میتونین چنین جدولی رو بسازین و یک فیلد GUID هم بهش اضافه کنین. وقتی اطلاعاتی برای تهیه گزارش باید وارد جدول کنین، به کمک تابع NewID یک GUID جدید تولید کنین و ازش برای Insert استفاده کنین. وقتی باید گزارش رو به کمک Select به کلاینت بدین، موقع Query گرفتن شرط GUID رو هم در Query قرار بدین. به این ترتیب حتی اگر کاربرهای دیگه ای همزمان اطلاعات وارد کنند، ولی هر کدوم رکوردهای مربوط به خودشون رو Select خواهند کرد. بعد از تهیه گزارش باز با استفاده از همون GUID رکوردهای قبلی رو از جدول حذف کنین. این جدول موقتی برای بازده بهتر نیاز به Clustered Index روی فیلد GUID داره.

A.Farzin
سه شنبه 11 اردیبهشت 1386, 19:06 عصر
بله
مرحبا این مناسبترین راه است برای من. جناب ثباتی با همین روش پیش خواهم رفت.