ورود

View Full Version : نکات کار در شبکه :



mehran_337
دوشنبه 20 شهریور 1385, 07:36 صبح
با سلام خدمت همه دوستان !
مدتها بود توفکر برنامه نویسی توی شبکه بودم اما نگرانی از مشکل بودنش و نداشتن شبکه ای در دسترس از این کار اجتناب کردم.
با کمک دوستان خوبم در این فروم به نتایج خوبی رسیدم که تصمیم گرفتم تاپیک جدیدی باز کنم تا بقیه دوستان که شاید مثل من مشکل داشتن و هیچ اطلاعاتی از شبکه ندارن مشکلشون حل بشه
تشکر می کنم از دوست خوبم علی (بی نیاز) همینطور حامد عزیز
و تشکر ویژه به مدیر محترم جناب آقای حیدری کیا که مثل همیشه با صبر و حوصله زیاد ما رو شرمنده می کنن ، مشکل ما رو مشکل خودشون می دونن و اونقدر احساس مسئولیت دارن که وقت بزارن و فکر کنند .
دست علی نگهدار شما

salimim
دوشنبه 20 شهریور 1385, 07:44 صبح
خب حالا این نکات رو مطرح بفرمایید

mehran_337
دوشنبه 20 شهریور 1385, 08:53 صبح
سوالات زیادی داشتم که مطمئنم در نظر خیلی ها هم باشه . پس از کار با کمک دوستان به نتایجی رسیدم که براتون می زارم در ضمن این نتایج برداشت شخصی خودمه اگه کسی نطر بهتری داره بگه تا بقیه استفاده کنن.
* برنامه اجرایی باید روی سرور با شه یا کلاینتها ؟
اگر برنامه اجرایی روی هر کلاینت نصب بشه این مزیتها رو داره :
1 – خطوط شبکه بار کمتری را تحمل می کنند در نتیجه سرعت اجرای برنامه بیشتر می باشد .
2 – فایلهای موقت ازجمله کرسر ها روی هر کلاینت بطور مجزا تشکیل می شوند در نتیجه از کانفلیگ (برخورد) جلو گیری بعمل می آید.
3- هر سیستمی فایل پیکربندی (config.fpw) را با تنظیمات خاص خودش اجرا می کند
* بانک های اطلاعاتی و جداول در کجا باید باشند ؟
ابتدا یک پوشه روی سرور ایجاد کنید.
جداول را در ان کپی کنید.
آن پوشه را share کنید.
در فایل پیکر بندی مسیر آن پوشه را قرار دهید.
مثلا مسیر جداولی که در پوشه Dbase روی سروری با نام Server نصب می باشند بصورت زیر در فال پیکر بندی تعریف می شود:


path = \\server\Dbase (file://\\server\Dbase)

حالا فقط کافیه در برنامه بنویسیم :


set exclusive off
use myTable


حالا بانکها این قابلیت را دارند که بصورت مشترک باز بشوند.
فقط باید در مرحله بعدی اطلاعات را وارد یا ویرایش کنیم .

mehran_337
دوشنبه 20 شهریور 1385, 09:02 صبح
و اما برنامه را چطور باید طراحی کنیم ؟
اول باید بدونیم چه دستوراتی باعث قفل شدن رکورد می شود البته در بخش شبکه کتاب مرجع ویژوال فاکس 3 این دستورات لیست شده . دستوراتی نظیر :
Append , replace , delete و امثالهم در کل دستوراتی که باعث تغییرات در بانک اطلاعاتی می شه باید ابتدا رکورد را قفل کنیم تا مطمئن بشیم کاربر دیگری از آن استفاده نکند :
Set reprocess to 1
این دستور سبب می شود که اگر تلاش برای قفل کردن رکورد ناموفق بود (یعنی کاربر دیگری ان را قفل کرده) دیگر تلاش مجدد صورت نگیرد و برنامه به مرحله دیگری برود . بطور پیش فرض این دستور اینگونه است :
Set reprocess to automatic
و اگر رکوردی نتواند قفل شود سیستم به حالت هنگ می ماند تا آن رکورد باز شود چون دائما در حال تلاش برای قفل کردن است. پس با پارامتر 1 به برنامه می فهمانیم که فقط یکبار تلاش کند.
این کد به این صورت عمل می کند :
اگر رکورد قفل شد پس کار به روز رسانی انجام می شود در غیر اینصورت پیغام می دهد که کاربر دیگری در حال استفاده از این رکورد می باشد.


if rlock()
دستورات به روز رسانی
...
...
else
wait wind "کاربر دیگری در حال استفاده از این رکورد می باشد"

mehran_337
دوشنبه 20 شهریور 1385, 09:10 صبح
البته endif یادتون نره

mehran_337
دوشنبه 20 شهریور 1385, 10:04 صبح
این هم یک لینک درباره کار با شبکه . یک فایل پروژه برای ثبت و بازیابی اطلاعات و مثال دوم برای کار با بافرینگ جداول در شبکه . این لینک را آقای حیدری کیا زحمت کشیدند :
http://www.foxite.com/articles/how-to-handle-update-conflicts-and-refresh-data-in-forms-within-a-network-multiuser-application-067.htm (http://www.foxite.com/articles/how-to-handle-update-conflicts-and-refresh-data-in-forms-within-a-network-multiuser-application-067.htm)

rezaTavak
دوشنبه 20 شهریور 1385, 19:30 عصر
OPen Database lcDataBaseName Shared



هم برای اینکه بانکها به طور مشترک باز شوند ضروری است.

mehran_337
سه شنبه 21 شهریور 1385, 09:55 صبح
آقای توکل
اگه می شه بازهم نکاتی که از تجربیات شما سرچشمه می گیرد درج بفرمائید.
احساس می کنم آموزش گام به گام این بحث مخصوصا بانک اطلاعاتی در شبکه دغدغه خیلی ها باشد همانطوریکه بنده مدتها بدلیل نداشتن هیچ مرجع و راهنمای خاصی از شبکه اجتناب می کردم . به هر حال تکمیل این تاپیک توسط تجربیات دوستان می تواند مثمر ثمر باشد

rezaTavak
سه شنبه 21 شهریور 1385, 13:16 عصر
تست اینکه یک برنامه در شبکه درست کار کند خیلی راحت است :

برنامه دوبار اجرا بشه. (البته این برای برخی مقاصد درست در میاد)

اما برای مقاصد دیگر هم سعی کنید فقط یک لحظه قفل رکورد صورت گیرد و برنامه داخل حلقه قفل نیافتد.



حلقه قفل: اگر کاربر اول جدول اول را باز کند و بخواهد جدول دوم را که کاربر دوم باز کرد باز کند و از آن طرف کاربر دوم بخواهد جدول اول را بازکند در داخل حلقه قفل بانک هر دو کاربر متوقف خواهند شد!


راه حل تعداد دفعات سعی برای باز کردن جدول قفل شده محدود باشد.

mehran_337
سه شنبه 21 شهریور 1385, 14:00 عصر
منظور شما همون دستور Set reprocess to 1 هست ؟

rezaTavak
سه شنبه 21 شهریور 1385, 20:20 عصر
بله اما تعداد یک کم است حداقل ۳ و بعد از مکث یک ثانیه و یک اخطار به کاربر دوباره شروع کند.

mehran_337
دوشنبه 03 مهر 1385, 10:49 صبح
در طی اولین برنامه که با شبکه کار کردم درگیری های زیادی با نحوه کنترل برنامه داشتم. همون بحث rlock و امثالهم که در بالا توضیح دادم.
اما دیدم ثبت - حذف - ویرایش و بالاخره خیلی از بخش ها که از دستم در می ره بعدا یادم میاد که اینها هم باید کنترل بشه.
چیزی به ذهنم خطورکرد. با آقای حیدری کیا هم مطرح کردم . ایشون هم گفتند اینجا بزاریم نظر بقیه رو بپرسیم .
اینکه به جای اینکه برنامه رو کنترل کنم خطای برنامه رو کنترل کنم . مثلا من برنامه رو به همون صورت معمول خودم بدون قفل کردن رکورد یا تشخیص قفل بودن رکورد بنویسم فقط توی ارورهندلر بگم هروقت خطای کانفل داد اطلاعات را ریورت کن و پیغام بده کاربر دیگری درحال استفاده است.
از فایل آقا جواد حسینی عزیز که tap_win نوشته بودند هم استفاده کردم.
حالا می خوام ببینم این کار اشکالی پیش نمیاره و نظرتون چیه ؟ اگه تصویب کنید که می ره تو مرحله اجرا

binyaz2003
دوشنبه 03 مهر 1385, 10:55 صبح
به نظر من وقتی که خطایی رخ دهد یعنی عملی انجام شده است.مثلا اگر دوکاربر دست به ویرایش یک رکورد بزنند و شما جلوگیری نکنید در یک حلقه نامتناهی اسیر خواهید شد و خطایی نمیدهد که بخواهید جلوی اون رو بگیرید.
البته امتحان کردن این موضوع تا بحث روی هوا خیلی فرق میکنه!

mehran_337
دوشنبه 03 مهر 1385, 11:38 صبح
بنظر من خطا قبل از اتمام عملیات رخ می ده . چون پیغامی هم که می ده دکمه revert داره یعنی جای امید هست هنوز اتفاقی نیفتاده
خواستم ببینم نظر دوستان چیه؟

rezamim
پنج شنبه 06 مهر 1385, 21:39 عصر
کاری که من میکنم اینه که اول همه بانکها رو قفل میکنم ( بانکهایی رو که نیاز دارم ). اگه این کار عملی شد ادامه میدم و اگر نه اول یه دستور UNLOCK ALL میدم و بعد به کاربر میگم که یکنفر دیگه داره کار میکنه. مجددا اقدام کنه.


IF FLOCK("File1") .AND. FLOCK("File2")
.
.
.
ELSE
UNLOCK ALL
=MessageBox()
ENDIF

mehran_337
شنبه 08 مهر 1385, 08:26 صبح
بازهم می خواستم نظر دوستان رو درباره on error بدونم . می خوام بدونم این کار از نظر اصولی درست هست یا نه

binyaz2003
شنبه 08 مهر 1385, 10:59 صبح
از نظر اصولی کد آقای rezamim درسته

mehran_337
دوشنبه 10 مهر 1385, 07:38 صبح
سلام به همه دوستان ! نماز و روزه همه قبول حق
دو سیستم در دو مکان متفاوت باید از یک برنامه آن لاین استفاده کنند. فاصله بین دو مکان حداقل 10 کیلومتر می باشد. (پیدا کنید پرتقال فروش را)
چی کار باید بکنم ؟؟ نمی دونم چطور باید شبکه بشن و اگر شبکه بشند در فاکس کار خاصی باید انجام بدم یا همونطوریکه در lan می نوشتیم برنامه نویسی همونطوریه؟

binyaz2003
دوشنبه 10 مهر 1385, 09:01 صبح
یک سروسی مخابرات میده که اسمش و درست یادم نیست VIP یا VPN در واقع یک شبکه اینترانت هست اما در سطح وسیع که البته بیشتر برای بانکهای قرض الحسنه که شعبه های مختلف دارند استفاده میشوند.
بعدشم میشه یک شبکه معمولی

mehran_337
دوشنبه 10 مهر 1385, 10:42 صبح
از پاسخ شما سپاسگزارم.

rezaTavak
دوشنبه 10 مهر 1385, 14:11 عصر
VPN یعنی شبکه مجازی. که بر روی اینترنت ساخته میشه. و برای خصوصی سازی شبکه است.

mehran_337
دوشنبه 10 مهر 1385, 16:23 عصر
یعنی فقط کافیه با مخابرات هماهنگ کنیم خودش خط و درست می کنه.
خب مرحله بعدی چیه؟؟؟ ما باید روی سرور و کلاینت چه کارهایی انجام بدیم؟؟
و سیستمها چطور بهم ارتباط پیدا کنند؟
با تشکر

rezaTavak
سه شنبه 11 مهر 1385, 08:54 صبح
vpn یک سرویس مخابراتی نیست یک پروتکل شبکه است.

mehran_337
سه شنبه 11 مهر 1385, 08:58 صبح
چه جالب . !!!
اگه می شه بیشتر توضیح بدین . با تشکر

kia1349
شنبه 15 مهر 1385, 06:34 صبح
vpn(virtual private network)

mehran_337
شنبه 15 مهر 1385, 23:39 عصر
آقا رضا ! چه عجب .
کم پیدایین ؟؟!!!!

arashkhaan2002
چهارشنبه 17 تیر 1388, 02:55 صبح
سلام من دربدر دنبال این بحث هابودم که تازه اینجا پیدا کردم
دوستان عزیز و مهران گل ، من هم دقیقا همین مشکلات رو دارم . روشهای اجرائیم در شبکه به همین صورته که شما گفتید ، ولی الان در اجرای سیستمهای اتوماسیون بزرگ مشکلات زیر رو دارم
1- ترافیک کاری بالا سرعت کار با بانک های share روی سرور رو پاویین میاره
2- گزارش گیری ها خصوصا وقتی هم زمان چند کاربر دارن میگیرن یا ثبت اطلاعات میکنن سرعتش بسیار پائین میاد چون میخواد کل اطلاعات رو از روی شبکه از سرور بکشه روی کلاینت و گزارش تهیه کنه .
3- به دلایل فوق کلاینت راه دور که دیگه اصلا با اون سرعت پائینش جواب نمیده.
شما چکارکردید؟

arashkhaan2002
یک شنبه 01 آذر 1388, 19:58 عصر
سلام دوستان
اکثر اوقات اطلاعات داخل حافظه کلاینت (مثلا در ناحیه 2 یک dbf یوز شده) حتی من دستور set refresh to 1,1 هم گذاشتم به لحظه نیست و اگر کسی روی یک کلاینت سندی بزنه گاها اتفاق میوفته که کلاینت های دیگه اونو نمیبینن یا بدتر از اون با همون شماره (چون نمیبیننش) سند ثبت میکنن و سندها قاطی یا سند اولیه حذف میشه !
این مشکل وقتی از دستور select Max(field_name) from '\\server\sds\sanad.dbf برای پیدا کردن بزرگترین شماره سند استفاده میکنی کمتر بروز میکنه چون میره از روی خود سرور میخونه البته سرعت کار پائینه ولی دیروز من به جای این دستور ، چون رو فیلد شماره سند cdx داشتم ، از دو دستورselect 2, سپس go botom واسه پیدا کردن بزرگترین شماره سند و اضافه کردن عدد 1 برای ایجاد شماره سند جدید استفاده کردم به جای دستور select max(field_name اغلب سیستمها به مشکل خوردن و شماره های پرت و پلا و چند شماره قبل از آخرین شماره رو به عنوان بزرگترین شماره بعد از دستور go bottom بر گردونده!!! جالبش اینجاست که در بعضی قسمتها فقط یک سیستم داشته سند میزده!!!!!!
خلاصه حسابی آبروم رفته نمیدونم علت چیه.
ضمنا هنگام ثبت اطلاعات ابتدا flock میکنم با Insert اطلاعات رو ثبت و بعدش هم flush force کردهunlock میکنم.
لطفا هرکس میتونه کمک کنه.
ممنون
http://barnamenevis.org/forum/images/statusicon/user_online.gif http://barnamenevis.org/forum/images/buttons/report.gif (http://barnamenevis.org/forum/report.php?p=854049) http://barnamenevis.org/forum/images/misc/progress.gif

mehran_337
دوشنبه 02 آذر 1388, 07:44 صبح
همیشه بعضی پروژه ها بد قلق می شند برای من هم پیش اومده که دستوراتی که توی یه برنامه کمتر از یک ساعت ساخته شدند اما همون دستورات توی یه پروژه دیگه اونقدر آدمو اذیت می کنن که حد نداره مثل روزهایی که از سر صبح آدم بد میاره. بگذریم ...

آرش خان !
بنده قبلا هم عرض کردم بجای اینکه رکورد را قفل کنید بگذارید کاربر ها بطور عادی کار خودشونو انجام بدن . اگر کانفلیگ بوجود بیاد برنامه ارور می ده که با یک برنامه ساده می شه کنترلش کرد مثلا :


if t_err=108 OR t_err=1585 or t_err=109
msg(5,'this record is luck')
TableREVert()
endif


در ثانی وقتی می بینید با dbf در شبکه زیاد کار می شه از mysql استفاده کنید

arashkhaan2002
دوشنبه 02 آذر 1388, 13:56 عصر
Sql serverیا mysql? کدوم ورزنش؟

arashkhaan2002
دوشنبه 02 آذر 1388, 13:57 عصر
یعنی از طریق vfp odbc driver از بانکهای sql تو فاکس view بسازمو باهاش کار کنم دیگه؟

arashkhaan2002
سه شنبه 03 آذر 1388, 00:34 صبح
من sql server 2000 رو نصب کردم و برای آزمایش یکی از dbf هامو توی دیتابیسش import کردم ، بعد اون دیتابیس sql serverرو به odbc اضافه کردم.
بعد داخل پروژه ویژوال فاکس یک دیتابیس ایجاد کردم و یک کانکشن به دیتابیس sql درون odbc زدم و از اون بانک مورد نظر(همون بانک dbf که داخل sql server بردم و import کرده بودم) یک remote view گرفتم.
حالا این view رو در یک ناحیه کاری use میکنم و عین یک بانک عادی باهاش کار میکنم . هر وقت چیزی رو بهش اضافه یا ویرایش میکنم بعدش دستور tableupdate() رو میزنم تو بانک sql server هم اون تغییرات لحاظ میشه.
ولی اگه یه چیزی رو تو بانک sql تغیییر بدم (مثلا کاربر دیگری این تغییر رو داده) ، تا زمانی که view رو در ناحیه کاریش نبندم و دوباره use نکنم view تغییراتش update نمیشه !؟
اگرم از دستور refresh() استفاده کنم پیغام میده که key field ، عuniqe نیست !
برای حل این مشکل باید چکارکرد که اگه کاربر دیگری روی بانک Sql تغییری داد روی view ما update بشه؟

binyaz2003
سه شنبه 03 آذر 1388, 10:42 صبح
شما فيلد کليديتون بايد منحصربفردباشه.من تست کردم با رفرش مشکلي نيست