PDA

نسخه کامل مشاهده نسخه کامل : اختلال در چاپ در برنامه های تحت شبکه!



MTPROG
11-06-2009, 08:59
تو یک برنامه عملیات چاپ اینطوری صورت میگره:
1-تو بانک یک جدولTMP به نام فرضا x قرار گرفته که شامل چند تا فیلد هستش و برای همه چاپها استفاده میشه
2-وقتی کاربر میخواد چاپ کنه اطلاعاتشو بعد از انتخاب به این جدول میفرسته و چاپ میشه(فرمهای کریستال به این جدول متصل هستند)

مشکل:
این روش تو برنامه تک کاربره مشکلی نداره اما تو برنامه تحت شبکه امکان اختلال در چاپ وجود داره چون به فرض مثال اگر دو کاربر همزمان بخوان اطلاعات برای چاپ بفرستن (مثلا فاکتور) در یک زمان اطلاعات هر دو فاکتور در جدول x نوشته میشه و هنگام نمایش فاکتور اطلاعات اضافی نمایش داده میشود

البته من فکر میکنم با گذاشتن یک فیلد در بانک با نام flag که هنگام نوشتن اطلاعات مقدار آن 1 و هنگام اتمام کار مقدار 0 بگیره و کلاینتها هنگام چاپ این فیلد رو بررسی کنن اگه 1 بود در یک حلقه منتظر بمونن تا 0 بشه و اگر 0 بود اطلاعاتشونو برای چاپ بفرستن میشه مشکلو حل کرد (چیزی تو مایه های قفل دستی)



به نظر شما چه راه یا روشی بهتری وجود داره که بتوان این مشکل رو حل کرد؟

_H2_
11-06-2009, 16:14
سلام
کلاً لزوم وجود جدول TMP را درک نمیکنم و به نظرم کار بیهوده ای است و توجیحی در آن نمیبینم. چرا مستقیم از جدول اصلی گزارش نمیگیرد؟

MTPROG
13-06-2009, 08:24
به دو دلیل :
1-گزارشات ترکیبی هستند فرضا برای یک گزارش از چهار تا جدول مختلف استفاده میشه که فیلدهای بدست آمده با جدول اصلی متفاوت هستش چطور میشه از همون جدول اصلی استفاده کرد(مثلا جدول اصلی 3 فیلد ولی گزارش 5 فیلد)

2-برای تهیه گزارش با کریستال باید یک DataSet از یک جدول وجود داشته باشه تا بتونی فیلدها رو ربط بدی اگر از جدول اصلی باشه و فیلدهای اون به اندازه فیلدهای گزارش ترکیبی نباشه تکلیف بقیه فیلدها چی میشه!

عــــلی
13-06-2009, 11:33
سلام دوست عزیز خسته نباشید.اگه بخوای بزاری توی یه حلقه میدونی چه بلایی سر سیستم میاد؟هیچوقت این کارو نکن.
بهت پیشنهاد میکنم یه فرم طراحی کنی و طوری طراحی کنی که بسته نشه(اگه نمیدونی بپرس تا بگم).حالا اون فرم رو ShowDialog میکنی و توش مینویسی لطفاً صبر کنید... حالا تا زمانی که فرم بسته نشه کدهای بعد فرم اجرا نمیشن چون فرم ShowDialog شده.خوب حالا تو فرم یه دکمه میزاری که هر وقت OK شد امتحان کنه ببینه اجازه ورود هست یا نه در صورتی که اجازه ورود داده شد پنجره بسته بشه و کد ها اجرا بشن.
یا علی.

MTPROG
13-06-2009, 12:03
برای انتظار من از روشهای دیگه ای استفاده میکنم اون بالا فقط برای درک مطلب بود

من تو برنامهام یک کامپونینت انتظار با فلش طراحی کردم که به کاربر نشون داده میشه تا عملیات تموم بشه

ولی از پیشنهادتون ممنون

_H2_
14-06-2009, 22:01
سلام

... به دو دلیل ...
بهرحال اگر چندین جدول را هم به هم join کنید، باز یک دستور select خواهید داشت!
با دستور Select خود dataset را پر کنید و dataset را تحویل کریستال بدهید...

نکند شما جدول را مستقیماً به کریستال متصل میکنید؟؟؟

در واقع ان جدول temp شما میشود dataset داخل خود برنامه...


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

MTPROG
15-06-2009, 08:36
تو پر کردن dataset مشکلی نیست

مشکل هنگام طراحی کریستال هستش چون باید فیلدهاتو از یک dataset بکشی توی فرم چاپ اینجاست که اگر فیلدهای dataset موجود در قسمت Datasource محیط VS کمتر از نیاز شما باشه مشکل به وجود میاد.

بزارید با یه مثال بگم
فرض کنید سه تا جدول با فیلدهای رو برو داریم : x=id,x1,x2 y=id,y1,y2 z=id,z1,z2

با Select زیر خروجی بدست میاد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال dataset داخل برنامه شامل شش فیلد هستش و اطلاعات برای چاپ اماده است

حالا موقع طراحی کریستال ریپورت باید یه dataset تو Datasource محیط VS وجود داشته باشه تا بتونی فیلدهاتو بکشی تو فرم کریستال و جداول رو مرتب کنی
ولی از هر کدوم از جداول اصلی که بخوای استفاده کنی حداکثر دارای سه فسلد است ولی خروجی دارای شش فیلد است
مشکل من تو این قسمت هستش!

_H2_
15-06-2009, 10:38
سلام
خود dataset شما باید شش فیلدی باشد!!!
و خود dataset شما باید حاصل این sql را نگه دارد...
یعنی خود dataset شما باید جای آن جدول TMP را بگیرد...

گمانم شما در ساخت datatable شش فیلدی تان مشکل دارید.

یک dataset خالی اضافه کنید و روی قسمت خالی اش در نمایه طراحی راست کلیک ..
RightClick->Add->TableAdapter

Connection را برای ویزارد تکمیل کنید و با تنظیمات پیش فرض Next کنید تا به بخش Enetr a SQL Statement برسید...
1- با کمک دکمه Query Builder دستور SQL دلخواه تان را وارد نمایید (مثلاً همانکه در بالا نوشته بودید... میتوانید قسمت where و پارامتر شرطی هم اضافه کنید...)

2- دکمه Advanced Options را هم کلیک کنید و تیک هر سه گزینه را بردارید...

ویزارد را Next کنید.
تیک Create methods to send updates directly to database را هم بردارید...

و باز هم Next و OK

حالا شما یک datatable در داخل dataset تان دارید که خود این datatable دارای شش فیلد میباشد و دقیقاً معادل همان جدول tmp هارد است.

نتیجتاً از این datatable و dataset جدید در کریستال استفاده کنید.
موفق باشید.

MTPROG
15-06-2009, 10:51
میرم تست کنم