View Full Version : محدود کردن select در یک فرم
IC_prog
شنبه 21 اردیبهشت 1387, 08:30 صبح
با تشکر از جناب مهران بخاطر توضیحات عالیشون .
http://barnamenevis.org/forum/showthread.php?t=67807&highlight=Environment
:تشویق:
چنانچه در فرمهایمان از روش data Environment استفاده نکنیم و از همان روش select (بازکردن تیبل ها در نواحی کاری مختلف) استفاده شود آیا راهی وجود دارد که select ها محدود به فرمها شوند.
اگر جواب منفیست آیا در این روش منطقیست که دست کاربر را باز بزاریم تا فرمهای مختلف را باز کند یا باید در منوها کاربر را محدود کرد تا مثلا یک فرم تا بسته نشده کاربر اجازه باز کردن فرم جدیدی را نداشته یاشد. :متفکر:
rezaTavak
شنبه 21 اردیبهشت 1387, 09:16 صبح
چرا استفاده نکنید؟
اما
از دستور set session to استفاده کنید.
باید در موقع استفاده از data environment این گزینه بصورت زیر باشد:
THISFORM.DataSession=2
ببین خودت بیشتر دوست داشتی ورد فقط یک سند برات باز میکرد یا چندین سند؟
دوست داشتی مثل داس فقط یک برنامه کار کنی یا چندین برنامه مانند ویندوز؟
اصلا ببین خودتان محدودیت را دوست دارید؟
در ضمن ربط سوالها به هم چیه؟
IC_prog
شنبه 21 اردیبهشت 1387, 10:29 صبح
چرا استفاده نکنید؟
اما
از دستور set session to استفاده کنید.
باید در موقع استفاده از data environment این گزینه بصورت زیر باشد:
THISFORM.DataSession=2
ببین خودت بیشتر دوست داشتی ورد فقط یک سند برات باز میکرد یا چندین سند؟
دوست داشتی مثل داس فقط یک برنامه کار کنی یا چندین برنامه مانند ویندوز؟
اصلا ببین خودتان محدودیت را دوست دارید؟
در ضمن ربط سوالها به هم چیه؟
با تشکر من جواب سئوال اولم رو نگرفتم !
set session to یک دستوره ؟
آیا با روش data environment میتوان از select هم استفاده کرد یا file is in use میدهد؟
mehran_337
شنبه 21 اردیبهشت 1387, 12:12 عصر
بدون select که کاری از پیش نمی ره . environment مدیریت جداول رو بر عهده داره یعنی که اینکه برنامه نویس در فکر اینکه کجا و چگونه جدول باز یا بسته شود را نداشته باشد .
ممکن است در environment یک فرم بیش از یک جدول باز باشد و مسلما فرمهای زیادی به بیش از یک جدول نیاز دارند.
دستور select برای باز و بسته کردن که نیست برای تعیین ناحیه کاریه . پس وجودش ضروریه . اگر بخواهید از دستور use استفاده کنید . مسلما مدیریت را از environment گرفته اید و عواقب کار هم خودتان باید مدیریت کنید
IC_prog
یک شنبه 22 اردیبهشت 1387, 15:11 عصر
با تشکر از اینکه سئوالات بنده رو جواب دادید.
rezaTavak
دوشنبه 23 اردیبهشت 1387, 09:01 صبح
طبیعت فرمهای فاکس پرو در داشتن یک Object به نام DataSession است.
بطور پیش فرض تمام جداول اطلاعاتی در این شی باز خواهند شد.
پس اگر فرمی اجرا شده و نام آن Form1 است :
form1.DataSession یک عدد است که به شماره session مربوطه را نشان میدهد.
session شماره یک همان default است که شما با آن کار میکنید.
حال برای اینکه بدانید در default چه جداولی است باید session را تغییر دهید.
set datasession to 1
برای فرمتان
set datasession to form1.datasession
پس فرقی ندارد که شما جدول باز کنید یا select -SQL (دقت کنید این هم نوعی جدول است!) هر دو در session که الان فعال است باز خواهد شد.
هر فرمی یک session مربوط به خود دارد که اگر نام آن فرم را بدانید به آن دسترسی دارید.
اگر از دستور set هم استفاده کنید یک منو بصورت لیست فعال برای تغییر session دارد.
حال اگر در فرمتان set session to 1 باشد جدوالی که در پیش فرض باز شده نشان خواهند رفت.
در واقع
_SCREEN.DataSEssion = 1
است! یعنی تمام جداول پیش فرض در فاکس در فرمی به نام _screen باز خواهند شد که خب میدانید این چه متغیری است.
حتی می توانید در موقع طراحی فرم THISFORM.DataSession=1 قرار دهید. به صورت ویژوال.
IC_prog
دوشنبه 23 اردیبهشت 1387, 09:02 صبح
یک برنامه بانک اطلاعاتی با word, photoshop ,... فرق میکنه . آیا اشتباه یا خطای کاربری در یک برنامه گرافیک یا محیط تایپ با بانک اطلاعات یکیست .
محدوده زمانی یافتن خطا و رفع آن حتی در برنامه های بانک اطلاعاتی هم یکسان نیست . مثلا دریک برنامه دبیرخانه شاید اصلاح ورودی چند ساعت یا چند روز بعد صورت گیرد بدون آنکه مشکل خاصی بوجود آورد خوب در یک اینچنین برنامه هایی شاید بتوان دست کاربر را در باز کردن و تغییرات همزمان در جداول مختلف باز گذاشت .
ولی در برخی برنامه ها با بار مالی زمان یافتن تا رفع خطا حتی از یک دقیقه کمتر خواهد بود !!
در یک برنامه سیستم فروش با حداقل 8 صندوقدار (کاربران online) آیا باز هم مانند photoshop یا word
میتوان به کاربر اجازه داد تا هر تعداد جدول را بازکند و تغییرات اعمال کند (اشتباه نکنید منظورم محدوده دسترسی نیست ) در اینجا مبلغ پرداخت و مشتری فروشگاه را ترک کرده . word نیست که متن نامه مرجوع شود و اصلاح.
آیا واقعا چون از خواص ویندوز این است که هم زمان میتوان چندین پنجره را باز و min,max کرد , ما نیز باید در هر برنامه ای بدون در نظر گرفتن احتمالات دست کاربر را باز بگزاریم .
نوشتن یک برنامه که در یک روز کاری 30رکورد ورود اطلاعات میشه با برنامه ای که روزانه حداقل 4000 رکورد ورود اطلاعات داره فرق نمیکنه ؟ آیا تبعات خطا در یک برنامه سیستم فروش . حسابداری . تابلو فرمان خط تولید با word یکسیت ؟
آیا به نظر شما برنامه نویسان 3DMAX یا WORD اگر قرار بود یک سیستم فروش بنویسند به همان تعداد نا محدود که در WORD اجازه باز کردن پنجره داده بودند در سیستم فروش هم همین کار را میکردند .
لطفا اساتید نظرشون رو بدن شاید من اشتباه میکنم . اونهایی هم که فکر میکنند ربطی نداره من عذرخواهی میکنم ببخشید.
kia1349
دوشنبه 23 اردیبهشت 1387, 11:11 صبح
اين موضوع از ابعاد مختلفي قابل بحثه.من هم کاملا با نظر شما موافقم که ماهيت نرم افزارهاي مختلف مثا word يا photoshop با برنامه هاي مالي و ثبت اقلام اطلاعات متفاوت ميباشد
حتي با توجه به ابعاد متفاوت در برنامه هاي مشابه(مثل برنامه هاي حسابداري و مالي و پرسنلي) اين موضوع از منظرهاي مختلفي قابل طرح و تحليله
به هر جهت اين که کاربر بتواند در زمان ورود اقلام اطلاعاتي به برنامه, توانايي سوئيچ بين پنجره هاي مختلف رو داشته باشه و بتونه اطلاعات پايه جديدي ايجاد ,حذف,يا ويرايش کنه و اين عمل موجب بروز خطا در سيستم نشه ,به نظر شخصي من به نحوه طراحي سيستم و نوع برنامه نويسي , مهارت برنامه نويس در کنترل جداول و حتي ارتباط نزديک به نرخ رشد اطلاعات و مقدار ورود اطلاعات توسط کاربر داره
سينگل بودن و يا شبکه بودن برنامه و يا به عبارتي مالتي يوزر بودن برنامه هم در تصميم گيري و نوع طراحي سيستم تاثير مستقيم داره
به همين خاطر در نرم افزارهايي مثل فاکس اين امکان در اختيار برنامه نويس گذاشته شده تا بتواند موضوع سوئيچ کردن کاربر بين پنجره ها و بخشهاي مختلف سيستم رو در زمان ورود اطلاعات محدود يا کنترل کند
ولي در نهايت همه چيز به ابعاد سيستم مورد نظر , درصد ريسک و اهميت اطلاعات و از همه مهمتر به توانائي نرم افزار در ارائه سولوشن هاي خوب بر ميگرده که اگر يه برنامه نويس مجرب هم پاش باشه ديگه ............
mehran_337
دوشنبه 23 اردیبهشت 1387, 11:32 صبح
در همه برنامه های من هم کاربر مادامیکه پنجره ای بازه اجازه نداره پنجره دیگری هم باز کنه و تمام منو و تولبار برنامه غیر فعال می شه.
چندین اتوماسیون در اداره ما وجود داره که همه شون هم همینطور عمل می کنند.
بحث نیاز مندیه کاربره و اصول درست کار و همچنین در نظر گرفتن سرعت.
اما اگر کاربر خواستار این باشه که مثلا وقتی پنجره باز شد اونو یه گوشه بزاره و در همان زمان پنجره لیست افراد و لیست خریدها در دو پنجره دیگر هم در دسترسش باشه برنامه نویس باید این مبحث و مدیریت کنه.
یادمان نرود در هر اکتیو شدنی به یاد رفرش صفحه باشیم. فکر کنم در چنین برنامه هایی هنر برنامه نویس و تخصصش مشخص می شه.
در ضمن از کاربر محترمی که این تاپیک رو مطرح کردند عذر خواهی می کنم چون جوابی که در پست 4 دادم متوجه سوالشون نشده بودم.
موفق باشید
IC_prog
دوشنبه 23 اردیبهشت 1387, 14:22 عصر
با تشکر از راهنمایهای استاد توکل برای گذشته . حال و آینده
استاد کیا با تشکر از نظرات ارزندتون خصوصا در نظر گرفتن ضریب ریسک که بنظرم همیشه بالاتر از تکنیک است . بسیار استفاده کردم. در گذشته. حال . آینده
جناب مهران با تشکر از نظراتتون بسیار جالب بود من هم در مورد پنجره ها مثل شما عمل میکنم .
و با تشکر مجدد بخاطر بخاطر توضیحات خوبتون در مورد data Environment
و با تشکر از کلیه اساتیدی که منو تحمل میکنند.
(( هر چی از vfp میدونم مربوط به این سایت و اساتید و کاربران پرتلاشش است ))
IC_prog
سه شنبه 24 اردیبهشت 1387, 09:46 صبح
در داخل data Environment مربوط به فرم 3 جدول add کردم و THISFORM.DataSession=2 قرار دادم حال
جدول شماره 1 باز میشه ()dbf?
اگر بخوام جدول 2 یا 3 باز بشه چکار باید انجام داد؟
چگونه میتوان به جدولهای data Environment جدولی را اضافه کرد
rezaTavak
سه شنبه 24 اردیبهشت 1387, 10:28 صبح
باید از دستور SELECT 0 استفاده کنید.
چون به یک محیط جدید نیاز است. اگر استفاده نکنید روی جدول فعلی باز میشود.
برای رفتن به هر جدول هم Select TableName یا Select NumberArea را بزن که TableName نام جدول و NumberArea شماره محیط جدول.
IC_prog
سه شنبه 24 اردیبهشت 1387, 12:27 عصر
با تشکر از توضیحاتتون. منظورم رو درست بیان نکردم .
ببینید من در ابتدای برنامه جداول رو در نواحی مختلف فعال کرده ام :
select 1
use vdata1
select 2
use vdata2
select 3
use vdata3
select 4
use vdata4
select 5
use vdata5
و...
حالا در DataEnvironment یک فرم جدولهای vdata1,vdata2,vdata3 را قرار داده ام
و در DataEnvironment فرم دیگر vdata4,vdata5 قرار گرفته .
حال وقتی هم زمان دو فرم اجرا میشه میخوام برای فرم اول vdata2 یا ناحیه کاری 2 فعال باشه و برای فرم دوم vdata5 یا ناحیه کاری 5 فعال باشه .
حالا با set session to در فرم اول و دوم چکار کنم ؟ بطوری که در حین سویچ کردن بین دو فرم هر کدام select خود را داشته باشند.
آیا اصولا چنین کاری شدنیست یا اینکه باید در هر فرم کدهای کنترلی بنویسم تا ناحیه کاری مخصوص به خودش فعال باشه .
rahro
سه شنبه 24 اردیبهشت 1387, 13:12 عصر
با تشکر از توضیحاتتون. منظورم رو درست بیان نکردم .
ببینید من در ابتدای برنامه جداول رو در نواحی مختلف فعال کرده ام :
select 1
use vdata1
select 2
use vdata2
select 3
use vdata3
select 4
use vdata4
select 5
use vdata5
و...
حالا در DataEnvironment یک فرم جدولهای vdata1,vdata2,vdata3 را قرار داده ام
و در DataEnvironment فرم دیگر vdata4,vdata5 قرار گرفته .
حال وقتی هم زمان دو فرم اجرا میشه میخوام برای فرم اول vdata2 یا ناحیه کاری 2 فعال باشه و برای فرم دوم vdata5 یا ناحیه کاری 5 فعال باشه .
حالا با set session to در فرم اول و دوم چکار کنم ؟ بطوری که در حین سویچ کردن بین دو فرم هر کدام select خود را داشته باشند.
آیا اصولا چنین کاری شدنیست یا اینکه باید در هر فرم کدهای کنترلی بنویسم تا ناحیه کاری مخصوص به خودش فعال باشه .
توجه كن دوست عزيز اصلا نيازي نيست شما مانند روش سنتي در نواحي مختلف جداول خود رو باز كنين اين نكته رو دوستان نيز اشاره كردن . شما براي باز كردن يك جدول ميتواني از نام اون جدول استفاده كني مانند :
Select vdata1
و يا ميتوني براي جداول آزاد از فانكشن ذيل استفاده كني .
FUNCTION USEDBF
LPARAMETERS tcTableName
IF USED(tcTableName)
SELECT (tcTableName)
ELSE
SELECT 0
USE (tcTableName)
ENDIF
ENDFUNC
IC_prog
سه شنبه 24 اردیبهشت 1387, 13:19 عصر
ولی منظور من همون چیزی بود که تو پست 13 گفتم !
کاری که شما انجام میدید با کار من چه فرقی داره ؟ اصلا شما وقتی select 10 رو اجرا میکنی مگه تو کل برنامه جدول مربوطه فعال نمیشه . من اینو نمیخوام !
rahro
سه شنبه 24 اردیبهشت 1387, 13:27 عصر
ولی منظور من همون چیزی بود که تو پست 13 گفتم !
کاری که شما انجام میدید با کار من چه فرقی داره ؟ اصلا شما وقتی select 10 رو اجرا میکنی مگه تو کل برنامه جدول مربوطه فعال نمیشه . من اینو نمیخوام !
ببين مشكل شما چيه !؟ آيا با ارور خاصي مواجه شديد؟ كار خاصي ميخواد انجام بديم كه نميشه ؟
بهتر نيست بازش كني تا دوستان بهتر بتوانند كمكت كنن.
mehran_337
سه شنبه 24 اردیبهشت 1387, 16:57 عصر
خب بحث همینه اصلا نیازی به use نیست . یا خودتان selec 1 و سپس use table می کنید یا مدیریت را به data enviroment می سپارید . اگر حالت دوم باشد جدول خودکار باز می شود و با بستن فرم بطور خودکار بسته می شود و نیازی به use کردن نیست
IC_prog
سه شنبه 24 اردیبهشت 1387, 19:57 عصر
مهران جان من وقتی در data enviroment تعداد 3 جدول قرار میدم و فرم رو اجرا میکنم میره جدول اولی رو باز میکنه چطوری میشه مشخص کرد که data enviroment کدامیک از این 3 جدول رو باز کنه ؟
rahro
چهارشنبه 25 اردیبهشت 1387, 06:29 صبح
مهران جان من وقتی در data enviroment تعداد 3 جدول قرار میدم و فرم رو اجرا میکنم میره جدول اولی رو باز میکنه چطوری میشه مشخص کرد که data enviroment کدامیک از این 3 جدول رو باز کنه ؟
سلام
همينه ! خوب توي init فرمت جدول مربوطه رو باز كن مثلا"
Select tablename
كه در آن tablename جدول مورد نظرته.
mehran_337
چهارشنبه 25 اردیبهشت 1387, 07:33 صبح
سلام
همينه ! خوب توي init فرمت جدول مربوطه رو باز كن
كه در آن tablename جدول مورد نظرته.
توسط دیتااینوایرمنت جداول باز می شن .
کافیه بگی select table3 .
یعنی وقتی که در دیتااینوایرمنت جداول را اضافه کردی حالا فقط با select tblName در نواحی مختلف کار میکنی
IC_prog
چهارشنبه 25 اردیبهشت 1387, 07:57 صبح
حالا یک سئوال :
قبلا نواحی کاری را در یک فایل prg تعریف کرده ایم (پست 14) تا در کدنویسی ها خارج فرم بتوانیم از آن استفاده کنیم . آیا با این شرایط در فرم وقتی select tabelname اجرا میکنیم مشکلی بوجود نمی آید.
IC_prog
چهارشنبه 25 اردیبهشت 1387, 08:04 صبح
با این شرایط ایا دیگر نمیتوان برابر پست 14 جداول را در نواحی کاری مختلف تعریف کرد؟ چون ما از جداول فقط قرار نیست که در داخل فرمها استفاده کنیم . جایی که قراره فایل prg نوشته بشه چطور ؟
rahro
چهارشنبه 25 اردیبهشت 1387, 08:56 صبح
با این شرایط ایا دیگر نمیتوان برابر پست 14 جداول را در نواحی کاری مختلف تعریف کرد؟ چون ما از جداول فقط قرار نیست که در داخل فرمها استفاده کنیم . جایی که قراره فایل prg نوشته بشه چطور ؟
نه اينطور نيست.! براي همينه كه چندين پسته كه گفته ميشه از نام جدول به همراه دستور SELECT براي باز كردن ناحيه اي كه جدولت در آن قرار داره استفاده كن. به اين عرض حقير برس كه:
شما براي باز كردن يك جدول يا ميتونين همان ابتدا با وارد كردن ناحيه اي خاص , محل فعال شدن جدول خودت رو مشخص كني مثلا
SELECT 1
USE TABLE 1
ولي گاها" برنامه نويس از SELECT 0 براي اين منظور استفاده ميكنه كه منظور اينه كه اولين ناحيه خالي رو براي باز كردن جدول فاكس در نظر بگيره . حال براي اينكه خطاي فاكس در خصوص باز شدن همان جدول در يك ناحيه خاص ديگه روبه رو نشيم همان طور كه قبلا عرض كردم از يك فانكشن استفاده ميكنم كه در چند پست قبل ارايه شد.
اون تابع همين كار رو به عهده داره يعني اول تست ميكنه كه جدول مربوطه باز هست يا خير اگر باز باشه كه ناحيه مربوطه رو فعال ميكنه و اگر خير در اولين ناحيه اي كه هيچ جدولي فعال نيست جدول مربوطه را باز ميكنه .
اين نمونه خيلي سريع و ساده باري مثال طراحي كردم نگاهي بهش بينداز.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.