# پایگاه‌های داده > سایر پایگاه‌های داده > Foxpro >  برنامه نویسی شبکه

## binyaz2003

سلام 
می خواستم بدونم در برنامه نویسی برای شبکه بغیر از قفل کردن فایل یا رکورد موضوع دیگه ای هم هست یا نه؟
اگر هر چیزی هست حتی کوچک بگید لطفاً
مثلاً برنامه هایی که معمولی مینویسیم رو شبکه اجرا میشه؟

----------


## kia1349

بافرینگ روی سطر یا فایل/قفلهای خوش بینانه یا بدبینانه/transaction/rollback/

----------


## rezaTavak

با سلام


یکی از تفاوتهای مهم شبکه و تک کاربری در این است که این برنامه ها بایستی منابع را مشترک استفاده نمایند. بنابراین در ابتدای هر برنامه مخصوص شبکه معمولا از دستور 
SET EXCLUSIVE OFF استفاده می کنند یا اینکه هر بانک یا جدولی را با زیر دستور SHARED باز میکنند. 
اما متاسفانه بعضی از دستورات نیاز دارند که بانک به صورت اختصاصی باز شود این دستورات شامل:
ALTER TABLE, INDEX,INSERT [BLANK],MODIFY STRUCTURE,PACK, REINDEX, ZAP
هستند. شما مواظب این دستورات باشید.
همچنین بافرینگ داده ها را همانطور که آقا "کیا" فرمودند مد نظر قرار دهید. همچنین جلوگیری از تداخل داده ها. برای توضیحات بیشتر به Help ویژوال فاکس پرو مراجعه کنید با عنوان
Programming for Shared Access مراجعه فرمائید.

----------


## binyaz2003

منون از توجه شما من منظورم این بود که تمام فرق شبکه اینه که باید از تداخل  جلوگیری کنیم و مواظب قفل ها باشیم
کار دیگه ای لازم نیست؟

----------


## naghdi

سلام
یک بانک بصورت اشتراکی باز شده.
چند کاربر در برنامه با چند رکورد در حال کار هستند.
قرار هست تمام یا بعضی از رکوردها پاک شود 
در صورت تداخل شروط با رکوردهای فعال کاربران برنامه  دچار مشکل میشود
سوال
نمایش تعداد رکورد فعال در یک بانک ؟
پاک نمودن تمام یا بعضی از رکوردها به همراه شرط عدم فعال بودن ؟
نمایش فعال یا عدم فعال بودن یک رکورد؟ 
متشکرم

----------


## rahro

سلام 
آیا توابع ذیل برای قفل کردن یک رکورد کافیست آیا مشکل ندارد؟
FUNCTION rekord_lock
PARAMETERS in_table
DO WHILE .t.
   IF .not. RLOCK(in_table)
     =MESSAGEBOX('این رکورد توسط کاربران دیگر درحال استفاده است','لطفا چند لحظه صبر کنید',64,100)
      =RLOCK(in_table)
   ELSE
      =RLOCK(in_table)
      exit
   ENDIF
ENDDO
return(.t.)       
من در یک فرم از یک گرید برای نمایش رکوردهای ثبت شده استفاده کرده ام ولی به هنگام اصلاح یک رکورد خطای استفاده رکورد توسط کاربر دیگری را میدهد ولی در ثبت چنین خطایی مشهود نیست مشکل در کجاست؟!!
رهرو

----------


## rezaTavak

شاید یکبار قفل می کنید و باز نمی کنید و ...

باید ببینید مشکل از کجاست.

اما چرا از ابزارهای خود فاکس استفاده نمی کنید؟

----------


## rahro

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


جناب تاوک سلام 
کدام ابزارها؟ میشه بیشتر توضیح بدین!؟
در ضمن از همه دوستان متشکر میشم  در خصوص تائید یا رد تابع فوق  نظرشون رو اعلام کنن!

----------


## rezaTavak

مثلا کلاسهای آماده مانند txtbtn  و...

----------


## arashkhaan2002

سلام 
من چند ساله با فاکس پروژه انجام میدم و خیلی ازش راضی هستم
فقط منابع فارسی در دسترس نیست
نمیدونم بقیه چیکار میکنین ولی من از یک DBF  موقت به عنوان COntrol Source فرم ها و اشیای داخلش استفاده میکنم و Data رو از DBF اصلی میخونم (کلا از دستورات SQL برای ثبت و ویرایش و گزارشات استفاده میکنم)و داخل اون میریزم واسه ثبت یا ویرایش اطلاعات تا حالا از data base  ها استفاده نکردم همیشه از free table ها استفاده میکنم .
واسه تخت شبکه هم به همین روش با  این تفاوت که dbf  رو share  میکنم و موقع ثبت و ویرایش حواسم به شماره ردیف ها هم هست .
آیا روش من درست هست یا نه ؟ شما ها چیکار میکنید؟
مشکلی که دارم اگر شبکه راه دور باشه همه حجم اطلاعات رو میخواد بکشه اونور که عملی نیست.
لطفا در مورد استفاده از remote View و نحوه Update اون و کلا پروژه هائی که باید از این طریق نوشته بشه و مزایاش بگین .

مرسی 

زنده باد ویژوال فاکس

----------


## mehran_337

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

اما وقتی دیدم وقتی جدول در دیتابیس قرار بگیرد و استفاده از tiger ها چقدر کد نویسی را بهتر و راحت تر کرده دیگه طرفدار پروپاقرص دیتابیس شدم.
اما خوب مسلما برای ارتباط با راه دور و حجم بالاتر باید به فکر sql - mysql و ... باشیم

----------


## rahro

> من خودم به شخصه از جدول استفاده می کردم. و همیشه عقیده داشتم هر کاری باشه با همین جداول انجام میشه.
> 
> اما وقتی دیدم وقتی جدول در دیتابیس قرار بگیرد و استفاده از tiger ها چقدر کد نویسی را بهتر و راحت تر کرده دیگه طرفدار پروپاقرص دیتابیس شدم.
> اما خوب مسلما برای ارتباط با راه دور و حجم بالاتر باید به فکر sql - mysql و ... باشیم


سلام مهران جان
میشه در مورد   tiger ها بیشتر توضیح بدی 
یه مثال کوچلو لطفا
متشکرم

----------


## mehran_337

خودمن و خیلی ها که با فاکس کار می کنیم کد نویسی رو درون فرمهامون می دونیم.
مثلا برای اینکه یک فیلدی با فیلد دیگر جمع بسته بشه درون فرم و باکدهایی هنگام ثبت این کار رو می کنیم.

اما اگر جداول را تحت دیتابیس ایجاد کنیم در برگه سوم صفحه table می تونیم گزینه tigger رو ببینیم.
insert tigger - update tigger - delete tigger

اگر جلوی اینها اسم تابعی رو بنویسیم دیگه لازم نیست درون فرم کد نویسی کنیم .
مثلا من حین کار با پروژه یادم اومد که باید روی فیلدی محاسبه می شد و در فیلدی دیگر ذخیره می شد . حالا باید بگردم و در تمام فرمهایی که فیلد مورد نظر وارد شده بود محاسبات انجام بشه.
بجای همچین کاری تابعی می سازم و در جلوی آپدیت تیگر می نویسم.
درون تابع هم محاسباتم رو انجام می دم و در فیلد مورد نظر جایگزین می کنم.
حالا حتی در brow هم اگر درون فیلد تغییراتی بدید می بینید محاسبات انجام می شه.
من امشو می زارم کدنویسی در دیتابیس . خیلی کارها می شه کرد.
مثلا ایجاد کد شناسایی : در insert tigger تابعی درست کنیم که کد تولید کنه.
حالا اگر در brow هم رکورد ایجاد کنیم می بینیم کد ایجاد شده.

----------


## rezaTavak

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

----------


## Esikhoob

با سلام
ظاهرا تنها فرق برنام نویسی تحت شبکه VFoxPro با غیر شبکه ای ، استفاده از set exclusive off است و اگر برنامه نویسی قشنگ و حرفه ای ای بخواهیم بکنیم باید موضوع استفاده چند کاربر به طور همزمان را هم در نظر بگیریم(در غیر این صورت ، کاربر دوم یک Error می گیرد).
یک موردی که من بهش برخوردم ، این بوده که بعضی وقتها اطلاعات به درستی روی سرور ذخیره نمیشود ، در حالی که برنامه منطقا درست است و اشکال هم به ندرت پیش میآید و دقیقا معلوم نیست کی ممکن است پیش آید ، در این مورد Microsoft مطلب زیر را گفته:
http://support.microsoft.com/default...b;en-us;224992
البته با توجه به این مقاله زمان به وجود آمدن این اشکال Hang کردن ،قطعی شبکه ، ریست شدن ناگهانی سیستم ، یا اشکالات کامپیوتری دیگر عنوان شده ، و برای کمتر کردن بروز این اشکال از راه برنامه نویسی، استفاده از FlushFileBuffers API پیشنهاد شده . اما به نظر من microsoft در مورد این مسئله درست توضیح نمیدهد تا مردم را به سمت MS SQL SERVER بکشد.
اگر شما از VFP9  استفاده میکنید دستور FLUSH Force همان API را که  microsoft گفته را صدا میکند (رجوع شود به help این دستور)
در ورژن های قبلی VFP فقط دستور FLUSH  (بدون Force)  وجود دارد که طبق گفته افراد مختلف  تاثیر لازم را ندارد .(منظورم در Forum های دیگه است).

----------


## mehran_337

به این لینک نگاه کن 
https://barnamenevis.org/showth...A8%DA%A9%D9%87

----------


## IC_prog

> با سلام
> ظاهرا تنها فرق برنام نویسی تحت شبکه VFoxPro با غیر شبکه ای ، استفاده از set exclusive off است و اگر برنامه نویسی قشنگ و حرفه ای ای بخواهیم بکنیم باید موضوع استفاده چند کاربر به طور همزمان را هم در نظر بگیریم(در غیر این صورت ، کاربر دوم یک Error می گیرد).
> یک موردی که من بهش برخوردم ، این بوده که بعضی وقتها اطلاعات به درستی روی سرور ذخیره نمیشود ، در حالی که برنامه منطقا درست است و اشکال هم به ندرت پیش میآید و دقیقا معلوم نیست کی ممکن است پیش آید ، در این مورد Microsoft مطلب زیر را گفته:
> http://support.microsoft.com/default...b;en-us;224992
> البته با توجه به این مقاله زمان به وجود آمدن این اشکال Hang کردن ،قطعی شبکه ، ریست شدن ناگهانی سیستم ، یا اشکالات کامپیوتری دیگر عنوان شده ، و برای کمتر کردن بروز این اشکال از راه برنامه نویسی، استفاده از FlushFileBuffers API پیشنهاد شده . اما به نظر من microsoft در مورد این مسئله درست توضیح نمیدهد تا مردم را به سمت MS SQL SERVER بکشد.
> اگر شما از VFP9 استفاده میکنید دستور FLUSH Force همان API را که microsoft گفته را صدا میکند (رجوع شود به help این دستور)
> در ورژن های قبلی VFP فقط دستور FLUSH (بدون Force) وجود دارد که طبق گفته افراد مختلف تاثیر لازم را ندارد .(منظورم در Forum های دیگه است).


در برنامه نویسی تحت شبکه در داس یادمه که نمیشد از بعضی دستورات مانند sum استفاده کرد یا مثلا بجای scan for باید از scan whil  استفاده میشد .
آیا واقعا در vfp دیگر نیازی به اینها نیست ؟ البته من تا حالا با vfp کار شبکه انجام ندادم ولی تو داس زیاد کار تحت شبکه انجام میدادم و همیشه به این نکات دقت داشتم .

----------


## Esikhoob

با سلام
دوست عزیز من نمی دانم که این شکالات که شما گفتی در VFP برطرف شده یا نه ، ولی می‌خواهم بدانم چرا در DOS نباید از SUM استفاده کرد و یا SCAN FOR  گذاشت؟

----------


## IC_prog

> با سلام
> دوست عزیز من نمی دانم که این شکالات که شما گفتی در VFP برطرف شده یا نه ، ولی می‌خواهم بدانم چرا در DOS نباید از SUM استفاده کرد و یا SCAN FOR گذاشت؟


در فرمانهای فوق کل رکوردهای tabel درگیر میشود که در حالت اضافه یا حذف رکورد توسط کاربر دیگر با پیغام خطا مواجه میشیم. در حالی که وقتی با seek به رکورد مورد نظر رسیدید با اجرای scan whil  فقط رکوردهای شرط فوق درگیر میشوند .
البته سوادم در این حد بود که توضیح دادم

----------


## kia1349

ساده و خلاصه:
در مجموع درست عمل ميکنيد
در خصوص شبکه پيشنهاد ميکنم از فاکس پرو+اس کيو ال يا ماي اس کيو ال استفاده کنيد

----------


## arashkhaan2002

استفاده از Remote Table ها و نوشتن به صورت Client server رو کسی کار کرده؟

----------


## arashkhaan2002

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

----------


## mehran_337

اگر قرار بود این مشکلات حل می شد در مرحله اول اینترنت کشور باید از اینهمه مشکلات فارغ می شد.
اتوماسیون اداره ما چند ده میلیون خریداری شده با هزینه پشتیبانی بسیار بالا.
sql server هم داره کار می کنه . اما بعضا هنگام ثبت نام دانشجویان می رسه وقتی روی ثبت کلیک می کنی 1 دقیقه باید بمونی تا عمل کنه.
به هر حال فکر نمی کنم مشکل شما در مان قطعی داشته باشه . ذات شبکه در کشور و نوع شبکه و در مرحله آخر ( صرفا از نظر بنده ) این مشکلات را به همراه دارد. 
در تعداد رکورد پایین و ترافیک کمتر برنامه خوب کار می کنه و در مواقع دیگر نه . حال بعضی برنامه ها log طراحی می کنند که کلیه عملیات کاربران در آن ثبت شده و قابل پیگری می باشد. این فایل وقتی یه مدت بگذره تعداد رکورد عظیمی داره و خودش عاملی برای کندی برنامه .

----------


## binyaz2003

شما ميتوانيد به  همين جداول فاکس با odbc وصل بشيد.يعني ديگه share نکنيد انگار داريد به sql وصل ميشيد اما رشته اتصالتون رو براي فاکس پرو انتخاب کنيد
http://www.connectionstrings.com/visual-foxpro
http://www.connectionstrings.com/dbf-foxpro
اينجوري ديگه براي يک گزارش کل اطلاعات جابجا نميشه.

----------


## arashkhaan2002

الان من تو برنامه ام به صورت پارامتری آدرس DBF هام رو کهfree table هم  هستند  server\dfs\\ که یه فولدر share هست تعریف کردم و بلدم روی server اون فولدر رو بیارم تو odbc ، ولی :

1- بعد از اون آدرس dbf هام رو تو برنامه به جای server\dfs\\ چی بدم ؟
2- رو کامپیوتر کلاینت چکار باید بکنم که با dbf های روی سرور کارکنه ؟

----------


## arashkhaan2002

یک سوال دیگه :

تفاوت Visual foxpro ODBC Driver با VFP OL DB Provider چیه؟
من هر دوشو دانلود کردم فعلا OBDC Driver رو نصب کردم و فولدر DBF ها مو با این درایور از روی شبکه آوردم تو ODBC.
بعد آمدم و در پروژه فاکس هم یک database ایجاد کردم و شاخه اطلاعات رو که حالا درون ODBCهست آوردم توی کانکشن (Connection1) این Database.
ولی حالا نمیدونم چطوری table های داخل اون فولدر رو بیارم از طریق کانکشن توی پروژه ام؟!!
اینجا فقط از طریق REmote View میشه فقط Field های منتخب رو از اون Table ها آورد تو پروژه .
لطفا برام توضیح بدبد چیکار کنم. مرسی.

----------


## binyaz2003

يک مثال ساده ميارم که خودم امتحان کردم.براي تست اين کد اول يک ديتابيس در يک پوشه بسازيد و بعد در اون يک جدول به اسم contacts بسازيد(ميتونيد از ويزارد جدولها،جدول contacts رو انتخاب کنيد.چند تا رکورد وارد کنيد )و کلا ديتابيس و جدول رو ببنديد.
حالا يک فايل prg بسازيد و کد زير رو وارد و اجرا کنيد :
gnConnHandle=Sqlstringconnect("Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDB=c:\test\dat\data1.  dbc;Exclusive=No; NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED  =NO;")
If gnConnHandle < 0
	= Messagebox('Cannot make connection', 16, 'SQL Connect Error')
ELSE
	RetVal=SQLEXEC(gnConnHandle,"select * from contacts","cont")
	BROWSE
	= Messagebox('Connection made', 48, 'SQL Connect Message')
	= SQLDisconnect(gnConnHandle)
Endif

اگر همه چيز درست پيش بره شما يک کرسر به اسم cont که محتوي تمام فيلدهاي جدولي که ساختيد،ميبينيد.توسط دستور sqlexec ميتونيد تمام دستورات استاندارد sql رو اجرا کنيد.انگار با يک ديتابيس sql server  يا mysql يا ... کار ميکنيد.با remote view هم ميشه کار کرد اما من اين روش رو ترجيح ميدم چون با تنها استفاده از سه دستور شما به ديتابيس وصل ميشيد،با اطلاعات بازي ميکنيد و اتصال رو ميبنديد.

----------


## arashkhaan2002

خوب ولی این کار یا Remote view صرفا بدرد گزارش گیری میخوره ، اگر بخواهیم با بانک ها کار کنیم چی؟

----------


## mehran_337

فرق ویو با کوئری همینه . کوئری صرفا برای گزارشات استفاده می شه اما ویو دقیقا با بانکها حتی بانکهای دیگر مثل اس کیول و مای اسکیوال مانند جداول فاکس رفتار می کنه یعنی در ویو می تونید append blank کنید و replace  و ...

----------


## binyaz2003

دستورات پرکاربرد SQL : 
Select
Delete
Insert
هم رکوردها رو نمايش ميديد،پاک ميکنيد و جديد وارد ميکنيد.
کار ديگه اي هست؟

----------


## arashkhaan2002

اتفاقا من در کل برنامه ام از این 3 دستور و Update استفاده میکنم ولی وقتی به صورت تست یک database ایجاد کردم و فولدر dbf ها رو آوردم تو ODBC و از اون database یه کانکشن زدم به اون ODBC و یکی از بانک ها رو به صورت REmote viewآوردم داخل database، وقتی اطلاعات داخل View رو تغییر میدادم به صورت دستی ، بانک اصلی تغییر نمی کرد!! به نظر شما مشکل کجاست ؟ آیا واسه Update شدن View با بانک اصلی باید دستوری چیزی زد؟

----------


## arashkhaan2002

مرسی خودم از Help فاکس فهمیدم چیکار باید کرد !
یا باید از روی رکورد جابجا شی تا Update بشه یا دستور Tableupdate() رو بزنی!
مرسی دوستان ، شما با این روش برنامه ای که از راه دور کارکنه نوشتین تا حالا؟

----------


## arashkhaan2002

حالا سوال جدید اینه که وقتی یه کاربر شبکه رکوردی رو اضافه یا ویرایش میکنه ، View کاربران دیگه چطور این تغییر رو میفهمه و واسه خودش آپ دیت میکنه ، من راه یا دستوری پیدا نکردم ، تنها راهی که فهمیدم  اینه که هی View  بسته بشه و دوباره اجرا بشه !! البته اگر در پروژه روی View بری و راست کلیک بکنی یه آیتم Run Query هست که اگه بزنی این کارو میکنه ولی من Command شو پیدا نکردم. اگه شما میدونید بفرمائید چه کنم؟؟

----------


## amir.azimi2000

سلام .
آقا من هم همین مشکل را داشتم (یعنی Command را پیدا نمیکردم) آخرش هم بیخیال ویوها شدم و رابطه ها را دستی تعریف کردم(اصل پاک کردن صورت مسئله در صورت نیافتن جواب).

----------


## arashkhaan2002

حالا سوال جدید اینه که وقتی یه کاربر شبکه رکوردی رو اضافه یا ویرایش میکنه ، View کاربران دیگه چطور این تغییر رو میفهمه و واسه خودش آپ دیت میکنه ، من راه یا دستوری پیدا نکردم ، تنها راهی که فهمیدم اینه که هی View بسته بشه و دوباره اجرا بشه !! البته اگر در پروژه روی View بری و راست کلیک بکنی یه آیتم Run Query هست که اگه بزنی این کارو میکنه ولی من Command شو پیدا نکردم. اگه شما میدونید بفرمائید چه کنم؟؟

----------


## arashkhaan2002

در بعضی مواقع کاربری روی یک کلاینت ثبت اطلاعات میکنه و روی سرور هم ثبت میشه از کلاینت خودش هم میتونه ببینه ولی از کلاینت دیگر اون سند دیده نمیشه (یعنی انگار updateنشده) این مشکل به نظرتون از چیه؟ میتونه از ترافیک بالا در شبکه نشأت بگیره ؟ یا از کارت شبکه سیستم یا کندی اون؟ خلاصه اشکال سخت افزاری باشه؟

----------


## Esikhoob

من قبلا متوجه موضوعی در برنامه نویسی شبکه شده بودم که دلم میخواد آن را اینجا بگویم :
وقتی یک بانک را USE میکنید، بخشی از آن فایل DBF (نفهمیدم چقدر) ، load میشود داخل حافظه کامپیوتر .
وقتی میخواهیم بفهمیم فلان فیلد مقدارش چند است یا فلان فیلد را با یک عدد دیگر جمع کنیم ، باید نام فیلد خالی را مثل یک متغییر معمولی صدا بزنیم ، در این حالت اطلاعات از همان حافظه میآید نه از روی DISK اصلی!!!
مثلا  بعد از USE ، اگر شما 5 ثانیه ثبر کنید و بعد نام یکی از فیلدهایش را به کار ببری مثلا:
lnSumField=table.field1+2اینtable.field1  ، مقدار 5 ثانیه پیش فیلد را بر میگرداند . 
در واقع به کار بردن نام خالی فیلد - بدون استفاده از تابع CURVAL() ، که آن هم فقط در حالت Buffer هست- هیچگاه اطلاعات را از روی DISK نمیآورد.(set refresh to هم در این مورد هیچ تاثیری نداد)

به نظرم برای حل این مشکل  وقتی که به سر record مورد نظر رسیدیم باید یک RLOCK() بزنیم تا اولا مقدار فیلد Update شود ، ثانیا چون record ، قفل شده و کس دیگری نمیتواند عوضش کند ، می توانیم با خیال راحت از دستوراتی مثل:
? table.field1
REPLACE Field1 with Field1+1
MESSAGEBOX("content of field2 is:"+table.field2,"",16)
استفاده کنیم.

----------


## arashkhaan2002

مرسی اتفاقا قبل از اشاره شما من برای بالا بردن امنیت این کرو کردم فعلا هم مسئله ویرایش همزمان توسط 2 کاربر حل شده هم مسئله Update نبودن اطلاعات.
فقط مشکلی که هست چون Rlock() رکورد رو قفل میکنه و من موقع ثبت اطلاعات از دستور Flock() استفاده کردم ، وقتی یکی داره کار ویرایش انجام میده ، دیگه کسی نمیتونه ثبت اطلاعات بکنه ، سرو صدای کاربرا در آومده !!

----------


## mehran_337

بد نیست اگر بگین چطور حل شده . چون می تونه جوابی برای کاربرای دیگه هم باشه

----------


## new_day

SET MULTILOCKS on
SET REPROCESS TO 2
*message 

if RLOCK()=.f.
RLOCK()
ENDIF


SET REPROCESS TO 1
IF ISRLOCKED()=.f.
wait window "اين شماره ، حساب ، ... ذر اختيار كاربر ديگري است"
RETURN 0
ENDIF

----------


## new_day

اما توضيح البته ممكنه راه مناسبي نباشه اما به هر حال خودش يك روشه
 سطر اول كه مشخصه از مولتي لوك استفاده ميكنيم تا بتونيم ركوردهاي متعددي را قفل كنيم
اگه فرض كنيم ما فايلي داريم كه شامل شماره حسابها و نام اشخاص باشه و فايلهاي متعدد ديگه كه شامل  فايل سند و يا دفاتر معين و تفضيل و كل و ..
ابتدا بايدبراي ثبت سند هر حسابي اون ركورد را در اختيار بگيريم نه فايل را چون تغييري نميخواهيم در اين فايل 
انجام بديم فرض كنيم عمليات بانكي باشه بر اساس مانده فعلي عمليات برداشت انجام ميشه
پس ركورد  شماره حساب خاص را بررسي و در صورتي كه قفل نيست قفل و در صورت قفل بودن به كاربر پيام ميديم  و زمان بررسي قفل را هم به يك يا دوثانيه كاهش ميديم
اما اگه ركورد قفل نبود و توسط ما قفل شد پس از هر مدت زمان لازم كه اطلاعات سند را كامل كرديم و دستور ثبت را صادر كرديم چون در اين حالت با توجه به نوع دستورات براي اضافه كردن اطلاعات و يا تغييرات در فايلهاي ديگر ممكنه فايل هاي ديگر كاملا قفل بشه دستور بررسي قفلهاي فايل را روي اتوماتيك مي گذاريم
و در نهايت همين فايل اولي را unlock ميكنيم
اگه اشتباه نكنم زمان اتوماتيك بررسي قفل فايل حدود 100 ثانيه است كه اين هم زمان زيادي براي ثبت در فايلها و ما كمتر از يك ثانيه نياز داريم
بعد كاربر بعدي وقتي به اون حساب دسترسي داره كه مانده تغيير كرده
اميدوارم منظورم را رسونده باشم  اگه مفهوم نيست بگيد تا توضيح بدم

----------


## new_day

البته راه حل بهتري هم هست كه از دستور BEGIN TRANSACTION استفاده كني
و البته از نوع تو در تو كه بصورت منطقي شرايط فايلها و قفل اونها را بررسي و در كمترين زمان بصورت فيزيكي بروز اوري ميشه
دستورات sql معمولا بصورت اتوماتيك  ركورد يا فايل را قفل ميكنند كه در help توضيحاتش هست

----------


## arashkhaan2002

سلام دوستان
اکثر اوقات *اطلاعات داخل حافظه* *کلاینت* (مثلا در ناحیه 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 میکنم.
*لطفا هرکس میتونه کمک کنه.*
*ممنون*

----------


## kia1349

برای کار در شبکه سعی کنید از قدرت و سهولت فاکس و برتری sql server کمک بگیرید
یعنی برنامه نویسی با فاکس و بانک اطلاعاتیش sql server
این موضوع باعث میشه قدرت این دو را با هم جمع کنید و راحت تر به هدفتون برسید

----------


## arashkhaan2002

Sql serverیا mysql? کدوم ورزنش؟

----------


## arashkhaan2002

یعنی از طریق vfp odbc driver از بانکهای sql تو فاکس view بسازمو باهاش کار کنم دیگه؟

----------


## kia1349

sql server منابع زیادی در اینترنت داره که میتونید از طریق oledb یا odbc باهاش ارتباط برقرار کنید.وقتی یک رکورد ست از اطلاعاتتون ساختید و خواستید دوباره کانکشن رو فعال کنید و اطلاعاتتون رو با تغییراتی که توش دادید دوباره در دیتابیس ذخیره کنید اگر کاربر دیگه ای هم همون موقع بخواد تغییراتی بده میشه کانفلیکت بوجود آمده رو مدیریت کرد
در مورد mysql هم باید بگم که خوش دسته ولی منابع کمی داره.یه کتاب برای کار با فاکس و mysql هست که من تا الان نتونستم نسخه ای از اونو توی نت برای دانلود پیدا کنم.خریدشم که با شرایطی که ما داریم ............

----------


## arashkhaan2002

من 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 تغییرات انجام شده روی sql-server در view ما update نمیشه !؟
اگرم از دستور refresh() استفاده کنم پیغام میده که key field ، بانک uniqe نیست !
برای حل این مشکل باید چکارکرد که وقتی کاربر دیگه ای بانک sql server رو تغییر میده روی viewما update بشه؟

----------


## kia1349

این به خاطر اینه که شما ارتباط یک طرفه با sql برقرار کردی و تغییرات از سمت شما در sql اعمال میشه ولی از اون طرف این اتفاق نمی افته
من منظورم اینه که شما باید بطور کلی از دستورات ado استفاده کنید تا این مشکل هارو نداشته باشید

----------


## arashkhaan2002

چطوری؟ ado رو از کجا نصب کنم و دستوراتش خاصه؟ کلا روش کار چیه؟

----------


## kia1349

امیدوارم با مطالعه فایلها و مثالهای این ضمیمه مشکلتون حل بشه.متاسفانه چون حجمش یکم زیاد بود مجبور شدم بزارمش توی سایت rapidshare
http://rapidshare.com/files/31185027...mssql.rar.html

----------


## binyaz2003

سلام
اين همون Client-Server Applications with Visual FoxPro 6.0 and SQL Server هست يا يک چيز جديده؟

----------


## kia1349

همون کتابه به علاوه یه تعداد مثال

----------


## arashkhaan2002

چرا بعضی اوقات روی شبکه کاربرا وقتی یکی اطلاعات ذخیره میکنه و روی DBF که روی سرور شیر شده هم ذخیره میشه ، بقیه کامپیوترها نمیتونند اون رکوردها رو ببینند؟ یهنی اگه مثلا با دستور Select sql که میزنی نمیارتش ، گاها هم دیدم که اصلا با اجرای این دستور select که به آدرس اون فایل روی سرور اشاره داره هیچ send,recive دیده نمیشه ولی error هم نمیده؟!!

این مشکل فاکسه؟ شبکه س؟ یا ویندوز؟ یا بافر؟؟

ضمنا اگه ویندوز کلاینت ریستارت شه اونوقت رکوردهای جدید رو میبینه.

***user 1

select 1
if flock()

delete from '\\server\sds\snd.dbf' where s_no=6;

insert into '\\server\sds\snd.dbf' (s_no,...) value (6,...)

flush force in 1
unlock in 1
endif

****
i check the snd.dbf on server and the record(s) is saved on it on server BUT....

*** another users ***

select * from '\\server\sds\snd.dbf' where s_no=6

result:
it's empty!!

or 

select max(s_no) from '\\server\sds\snd.dbf' into cursor snd_no;


result:
max_s_no=5!!!!

****
and during the execution of select command there is no activity on network indicator!!!

----------


## arashkhaan2002

انگاری دوستان کسی با فاکس دیگه برنامه شبکه نمینویسه که به مشکل بخوره!

----------


## kia1349

جناب آرش
قبلا هم عرض کردم که برای کار در شبکه سعی کنید از بانک اطلاعاتی sql server استفاده کنید
فاکس بیشتر به درد محیط کاری تک کاربره میخوره و امروزه مدیریت فرآیندهای پیچیده در بانکهای اطلاعاتی مستلزم استفاده از پایگاه های داده قوی مانند sql اوراکل mysql میباشد
هرچند فاکس هنوز هم قویه ولی واقعا با پیچیدگیهای شبکه ای بهتره استفاده از فایلهای dbf رو کنار بزارید.همونطور که میدانید دلفی بصورت پیش فرض از پارادوکس استفاده میکنه ولی تقریبا تمام برنامه نویسهای دلفی برای مدیریت بانکهای اطلاعاتی از sql و ... استفاده میکنن.البته dbf کجا و پارادوکس کجا.
حتی بهتون پیشنهاد میکنم در صورت ادامه استفاده از جداول dbf بر روی یک کامپیوتر و share کردن آن برای سایرین ، بدلیل مشکلات حافظه و کندی و ... حتما از بافرینگ بر روی سطر(توجه کنید که سطر و نه کل جدول)
استفاده کنید
باور بفرمائید سهولت برنامه نویسی با فاکس رو اگر با قدرت بانکهای اطلاعاتی قوی مثل sql آمیخته کنید برنامه شما صاحب توانائی های خوبی میشود
من توی vb.net , C#‎ یکی از کارهای کوچیکی رو که مثل آب خوردن توی فاکس انجام میدادم نمیتونم انجام بدم از بس که سخت و طاقت فرساست
باور کنید برای استفاده از کومبو و گرید و برخی از این ابزارهای پر مصرف آدم باید توی سی شارپ و وی بی دات نت و .... هزار تا پشت وارو بزنه تا به نتیجه برسه در صورتی که در فاکس همه اینها با کمترین کوششی قابل دست یافتنه
یا علی مدد
عید بر همگی مبارک

----------


## rahro

سلام 
من فكر ميكنم فرايند استفاده شما اشتباهه. من در پروژه هاي تحت شبكه  هيچ گاه به اين مشكلاتي كه شما مي فرمائيد بر نخوردم و فكر ميكنم علتش تمامي شيوه كدنويسي ست .
مثلا من در يك فايل متني مسير ديتابيس اصلي رو گذاشتم حال اون ديتابيس ميتونه ازش استفاده تك كاربره بشه يا شبكه . اگر قرار باشه تحت شبكه كار كنن كاربر مياد مسير ديتابيس رو تنظيم ميكنه .
بعد از DataEnvironment براي كار با جداولم استفاده ميكنم .
در ضمن من فقط ديتابيس رو شر ميكنم نه كل پوشه برنامه رو.

----------


## arashkhaan2002

مرسی آقای کیا ، شما درست میفرمائید ، این کار واسه پروژه های آتیم عملی هست منتها در حال حاضر من دنبال حل مشکل کاربران فعلیم هستم.
رهرو جان من تو برنامه ام بانکهام همه free table هستش ، و فقط مسیرشون روی سرور آدرس میدم همونطور که تو کدهای بالائی میبینی ، میشه لطفا در مورد روش مورد استفادت بیشتر توضیح بدی .
من فایلهام بینشون ریلیشنی وجود نداره و در صورت نیاز از دستورات sql واسه پیوندشون استفاده میکنم.
راجع به گذاشتن فایلهات تو دیتابیس و آدرس دهی روی سرور و نحوه اتصال data enviroument  به database یا free table روی سرور میشه بیشتر توضیح بدی ، البته تا حدوی میدونم ولی میخوام ببینم دقیقا چیکار کردی.
مثلا فرض کنیم یک دیتابیس ایجاد کردیم و میخوایم توش add table کنیم ، معلوم نیست بعدا مسیر table ها روی سرور کجا باشه که الان بخواهیم add کنیم؟؟!! واسه data enviroument هم همین مسئله هست.
واسه همین من اول برنامه مسیر فایل های روی سرور رو تو یه متغییر میریزم و اول آدرس table هام میگذارم و باهاشون با دستورات sql کار میکنم.

----------


## rahro

دوست من ،‌ من به نوبه خودم ميتونم بگويم اين  ساده ترين نوع در شبكه است . و اصلا از اين درسرهايي كه شما ميگيد درش دخيل نيست . شما زحمت خودتون را اضافه كردي. مثلا چرا از ريليشنها نبايد استفاده كرد در حالي خيلي مفيد ميشه ازش سود جست.
موقعي كه شما ديتابيس رو شر ميكني اصلا نيازي نيست بدوني مسير جداولت كجا قرار دارند و دقيقا روش رفتار با اونها مثل رفتار با يك سيستم تك كاربره ست . شما فقط و فقط آدرس ديتابيس رو ميخاي كه اونهم داري .
يك تست كوچكلو بزن ، خودت متوجه ميشي .
البته هنوز از اساتيد من نقدي بر اين روش نديدم .

----------


## mehran_337

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

2 - استفاده از دیتابیس شیرین ترین بخش قدرت نمایی فاکسه چرا free table اون هم تحت شبکه ؟؟؟؟ با این کار قدرت فاکس و محدود کردین
3 - منم تفاوت خاصی بین ایجاد رلیشن در ابتدای دیتابیس احساس نکردم ارتباط ها را با select ایجاد می می کنم اینطوری وقتی در ساختار جد اول تغییراتی ایجاد می شه دردسر سر و کله زدن با رلیشن ها کمتر می شه
4 - بجای flock از قفل رکورد استفاده کنید و حتما رکورد جاری رو بافرینگ کنید

----------


## arashkhaan2002

ممنون دوستان عزیز
من هم برای قدرت نمائی بیشتر فاکس! فعلا فری تیبل هامو بردم تو یه دیتابیس و تو برنامه ام به جای آدرس دهی تک تک فری تیبل ها فقط آدرس دیتا بیس رو دادم و سپس بصورت معمولی با آوردن اسم دیتابیس و سپس نام فری تیبل اونها رو تو نواحی مختلف کاری یوز کردم . حالا ببینم بازم به مشکلات تداخلی میخورم یا نه

در مورد flock() من مجبورم هنگام ثبت واسه شماره دهی اینکاروبکنم تا تداخل شماره ایجاد نشه.

----------


## arashkhaan2002

دوستان عزیز و آقا مهران گل و جناب کیا;
در رابطه با ایجاد بانکها در sql server 2000 من به راحتی تونستم از طریق odbc  و با remote view زدن به بانک sql و کار کردن با remote view به عنوان بانک اطلاعاتی فاکس و پس از هر تغییر tableupdate() زدن برای به روز شدن بانک اصلی در sql ,  برای به روز کردن remote view با استفاده از دستور requery()  کار رو تا اینجا به راحتی انجام بدم.
فقط مجبور شدم همه فیلدها رو با هم به عنوان key field تعریف کنم.چون احتمال تکراری بودن همه رکورد یک سند میرفت.

----------


## arashkhaan2002

هیچکی مارو وشبکه فاکسو تحویل نمیگیره انگاری .
خوبه چه فروم فعالی داریم ، بهتره دوستان عزیز یه سری به www.foxite.com بزنن ببینن چقدر فعاله.
مهران جان از توصیه ات ممنونم ، free table هامو گذاشتم تو یه دیتابیس و اول برنامه به جای آدرس دهی تک تک تیبل ها ، open database میکنم و راحت با table ها کار میکنم فعلا تو شبکه تحت تسته ، امیدوارم دیگه تداخل ، کانفلیکت ، کالیژن و آپدیت نبودن واسم پیش نیاد.
فکر میکنی غیر از امنیت ، تو سرعت کارمم هم اینجوری تاثیر مثبت بذاره؟

----------


## mehran_337

مسلما تاثیر می زاره . حالا اگه کاربرات زیاد باهوش نیستند (البته من در هیچ برنامه ای کاربرارو دست کم نمی گیرم) می تونی کارهای امنیتی هم تا حدی پیش ببری.
مثلا توی محثی دیتابیس قرار بگیر و راست کلیک و پروپرتیز بزن می بینی که دیتابیس هم واسه خودش متدهایی داره مثلا وقتی باز می شه یا وقتی تیبلی مشاهد می شه حذف می شه و ...
می تونی پروسیجری بنویسی مثلا در active دیتابیس بنویس 

if a <> 123
  return .f.
endif


حالا توی برنامه ات یه متغیر عمومی a با مقدار 123 تعریف کن بعد دیتابیس و باز کن. اگه کاربر یه کم بلد باشه از use استفاده کنه تا این رمز و ندونه نمی تونه بازش کنه
ولی برای کار با برنامه های تحت شبکه بزرگ که فکر کنم برنامه ات جزو اونها باشه بهتره اسکیوال رو ادامه بدی مسلما در ابتدای راه این مشکلات و خواهی داشت.
موفق باشید

----------


## binyaz2003

شايد کمک کنه :
http://www.foxite.com/articles/read....er-application

----------


## arashkhaan2002

دوستان عزیز و آقا مهران گل سلام

از وقتی free table هامو بردم داخل یک دیتابیس و ازشون استفاده میکنم ، امنیت بالاتر رفته و دیگه به اون مشکلات قبلی بر نخوردم ولی چون از دیتا بافرینگ استفاده نمیکنم بدلیل ترس از بروز نبودن حتی لحظه ای اطلاعات ، سیستم روی شبکه سرعتش کمتر شده . این مسئله به وضوح هنگام browse کردن مشهوده و کاربرا رو شاکی کرده ، موقعی که از free table استفاده میکردم سرعت به مراتب بالاتر بود .
اگه توصیه ای دارین بفرمائین . ضمنا اول برنامه set refresh to 1,0.001 گذاشتم.

----------


## rahro

> دوستان عزیز و آقا مهران گل سلام
> 
> از وقتی free table هامو بردم داخل یک دیتابیس و ازشون استفاده میکنم ، امنیت بالاتر رفته و دیگه به اون مشکلات قبلی بر نخوردم ولی چون از دیتا بافرینگ استفاده نمیکنم بدلیل ترس از بروز نبودن حتی لحظه ای اطلاعات ، سیستم روی شبکه سرعتش کمتر شده . این مسئله به وضوح هنگام browse کردن مشهوده و کاربرا رو شاکی کرده ، موقعی که از free table استفاده میکردم سرعت به مراتب بالاتر بود .
> اگه توصیه ای دارین بفرمائین . ضمنا اول برنامه set refresh to 1,0.001 گذاشتم.


سلام 
عذر ميخوام منظورتون از browse كردن چيه ؟! 
اگر نمايش در گريد هستش ، مگر شما از sql استفاده نميكنين ؟. منظورم اس كيو ال خود فاكسه ؟

----------


## mehran_337

دیتابیس شدن جز اینکه یک سری امکانات بیشتری بده فکر نمی کنم تاثیری توی سرعت داشته باشه .
بافرینگ را روی یک رکورد تنظیم کنید نباید نگران رفرش شدن باشید چون فقط رکوردی که در حال تغییر هست بافرینگ می شه.
در هر صورت اگر کندی به دلیل حجم بالای اطلاعات شماست بازهم می گم مای اسکیوال که راحت تر از اسکیوال سرور هم هست

----------


## arashkhaan2002

Browse را وقتی که کاربر میخواد جستجو کنه روی کدها میگذارم .

set refresh ru gozashtam rye 0,5 سرعت بهتر شد.

----------


## saba_2362

سلام دوستان 
اگه منبعی در رابطه با برنامه نویسی شبکه با #c و sql دارید معرفی کنید

----------


## kia1349

شما باید برای دریافت پاسخ به بخش C#‎ مراجعه کنید.در بخش open source ، من یه مثال خوب و جامع گذاشتم

----------


## rahro

اين واقعا يك سوال جديده ؟!! آخه تاريخ ارسالش مربوط به شنبه 02 اسفند 1382, 01:01 صبح  است ولي آخرين پست اين تاپيكه ؟!!

----------


## amir.azimi2000

> مسلما تاثیر می زاره . حالا اگه کاربرات زیاد باهوش نیستند (البته من در هیچ برنامه ای کاربرارو دست کم نمی گیرم) می تونی کارهای امنیتی هم تا حدی پیش ببری.
> مثلا توی محثی دیتابیس قرار بگیر و راست کلیک و پروپرتیز بزن می بینی که دیتابیس هم واسه خودش متدهایی داره مثلا وقتی باز می شه یا وقتی تیبلی مشاهد می شه حذف می شه و ...
> می تونی پروسیجری بنویسی مثلا در active دیتابیس بنویس 
> 
> if a <> 123
>   return .f.
> endif
> 
> 
> ...


با سلام .

مهران جان به فرمایش شما در active دیتابیسم ، پروسیجر شما را نوشتم ولی بدون وجود متغیر A هم بانک اطلاعاتی من باز شد و هم جدولم با دستور Use فعال شد .
حالا اگر بخواهم روی بانک اطلاعاتی و یا جدولم پسوورد بگذارم باید چه کنم ؟

با سپاس .

----------


## binyaz2003

در وقايع زير کدتون رو اضافه کنيد : 

PROCEDURE dbc_OpenData(cDatabaseName, lExclusive, lNoupdate, lValidate)
*Immediately after DBC is opened.
ENDPROC

PROCEDURE dbc_ModifyData(cDatabaseName, lNoWait, lNoEdit)
*Immediately after MODIFY DATABASE is issued.
ENDPROC

PROCEDURE dbc_Activate(cDatabaseName)
*When DBC is made current via SET DATABASE TO <dbname> or after OPEN DATABASE completes.
ENDPROC


PROCEDURE dbc_BeforeAddTable(cTableName, cLongTableName)
*Just before a table is added to the DBC. Return .F. to prevent table from being added.
ENDPROC

PROCEDURE dbc_BeforeAppendProc(cFileName, nCodePage, lOverWrite)
*Just before a DBC stored procedure is appended to.
ENDPROC

PROCEDURE dbc_BeforeCreateTable(cTableName, cLongTableName)
*Just before a table is created. Return .F. to prevent table creation.
ENDPROC

PROCEDURE dbc_BeforeCreateView(cViewName)
*Just before a view is created. Return .F. to prevent view creation.
ENDPROC

PROCEDURE dbc_BeforeModifyProc()
*Just before a DBC stored procedure is modified.
ENDPROC

PROCEDURE dbc_BeforeModifyTable(cTableName)
*Just before a table is modified. Return .F. to prevent modification.
ENDPROC

PROCEDURE dbc_BeforeDropTable(cTableName, lRecycle)
*Just before a table is dropped from DBC. Return .F. to prevent table from being dropped.
ENDPROC

PROCEDURE dbc_BeforeModifyView(cViewName)
*Just before a view is modified. Return .F. to prevent modification.
ENDPROC

PROCEDURE dbc_BeforeOpenTable(cTableName)
*Just before a table or view is opened. Return .F. to prevent table or view being opened.
ENDPROC

----------


## amir.azimi2000

با سلام .
جناب بی نیاز عزیز ، مدیر محترم 

در وقایع مربوطه کد مذکور را اضافه کردم ولی نشد .
به پیوست فایلها را ارسال میکنم ، تا در صورت صلاحدید بررسی بفرمایید .

با تشکر

----------


## binyaz2003

علاوه بر نوشتن کدها بايد روي ديتابيس در طراح ديتابيس کليک راست کنيد و گزينه Properties ر ا انتخاب و سپس گزينه Set Events On را انتخاب کنيد.

----------


## new_day

#DEFINE DVDLOGIN_LOC	[Enter password:]
#DEFINE DVDLOGINCAP_LOC	[DVD Login]
#DEFINE DATAOPEN_LOC	Database opened by
#DEFINE DATACLOSED_LOC	Database closed by
#DEFINE NOMOD_LOC		"Sorry, you cannot modify this table."


PROCEDURE dbc_BeforeOpenTable(cTableName)
*Just before a table or view is opened. Return .F. to prevent table or view being opened.
IF ATC("ctablename",cTableName)#0 AND UPPER(ALLTRIM(INPUTBOX(DVDLOGIN_LOC,DVDLOGINCAP_LO  C)))#"123456"
*IF ATC("operator",cTableName)#0 AND USERNAME#"23456"

	* Since this is a sample, we will ignore password, however, you can enforce it by returning .F.
	 RETURN .F.
	*RETURN .T.
ENDIF
ENDPROC


PROCEDURE dbc_OpenData(cDatabaseName, lExclusive, lNoupdate, lValidate)
*Immediately after DBC is opened.
LOCAL lcStr,lcLog
TEXT TO lcStr NOSHOW TEXTMERGE
DATAOPEN_LOC <<SYS(0)>>  <<DATETIME()>>.

ENDTEXT
lcLog = FORCEEXT(cDatabaseName,"LOG")
STRTOFILE(lcStr,lcLog,.T.)
ENDPROC


PROCEDURE dbc_CloseData(cDatabaseName, lExclusive, lNoupdate, lValidate)
*Immediately after DBC is opened.
LOCAL lcStr,lcLog
TEXT TO lcStr NOSHOW TEXTMERGE
DATACLOSED_LOC <<SYS(0)>>  <<DATETIME()>>.

ENDTEXT
lcLog = FORCEEXT(cDatabaseName,"LOG")
STRTOFILE(lcStr,lcLog,.T.)
ENDPROC


PROCEDURE dbc_BeforeModifyTable(cTableName)
* Just before a table is modified. Return .F. to prevent modification.
IF ATC("ctablename",cTableName)#0
	MESSAGEBOX(NOMOD_LOC)
	RETURN .F.
ENDIF
ENDPROC
اين كدها در مثالهاي  خود ويژوال موجود كه  درedit stroed procedures ذخيره و براي امنيت ديتاباس استفاده ميشه

----------


## new_day

http://social.msdn.microsoft.com/For...a-798c91028f87
به اين ادرس نگاه كنيد
در مورد امنيت جدول و پسورد گذاري موضوع جالبي داره
Procedure dbc_OpenData(cDatabaseName, lExclusive, lNoupdate, lValidate)

*Immediately after DBC is opened.

If Vartype(ANY_RANDOM_VARIABLE)= "U" .Or. ANY_RANDOM_VARIABLE<> "YOUR_PASSWORD"

Return .F.

Endif

Endproc

----------


## new_day

هنگامي كه جدولي خارج از برنامه بخواهد باز بشه   و براي كنترل  متغيري در برنامه تعريف كرده باشيم چون متغير براي كنترل مجاز بودن و غير مجاز بودن در بانك تعريف نــــــــــــشده پيام خطا ميده  اما در برنــــامه فوق  Vartype(ANY_RANDOM_VARIABLE)= "U" ميگه اگه چنين متغيري نامفهوم و ناشناخته بود يا مخالف پسورد بود دسترسي را  غير ممكن كن

----------


## new_day

با سلام
ايا براي باز كردن جداول يك بانك در محيط شبكه براي بالا بردن سرعت يكي از اين دو راه زير مناسب است يا خير؟
1- در فرم اصلي برنامه در متدي تمام جداول را با دستور USE database!table SHARED IN 0   باز كنيم و
datasession مساوي يك قرار بدهيم تا از جداول باز شده در تمام فرمها بتونيم استفاده كنيم.
2-در data environment  فرم اصلي كليه جداول را انتخاب كنيم  كنيم  و بازم  datasession مساوي يك قرار بدهيم  تا بتونيم در  تمام فرمها از انها استفاده كنيم
و در دو حالت  براي خواندن و ثبت و ويرايش از دستورا ت sql مثل insert into , update   و  SELECT ... INTO cursor استفاده كنيم

----------


## amir.azimi2000

با سلام .
جناب بی نیاز به فرموده شما :
"علاوه بر نوشتن کدها بايد روي ديتابيس در طراح ديتابيس کليک راست کنيد و گزينه Properties ر ا انتخاب و سپس گزينه Set Events On را انتخاب کنيد." 
عمل کردم و مشکلم حل شد ، خیلی ممنونم .

ولی یک ایراد اینکه کاربران میتوانند بدون بازکردن دیتابیس با دستور Free Table جداول را از بانک بیرون کشیده و محتویات آنرا ببینند و صد البته کار من را زیاد کنند چون باید دوباره به دیتابیس اضافه اش کنم .
آیا راهی برای جلوگیری از اینمورد وجود دارد ؟

----------


## gh_khajehzade

با سلام-اگه جداول در server رو use کنی فرمانهای free table و remove table  امكان اجرا ندارند.البته اگر روی سرعت برنامه تاثیری نداشته باشدکه خوب باید تست بشه.

----------


## new_day

با سلام
اگه راهنمايي در مورد پست 80  سه تا پست قبل از اين داريد بفرماييد در مورد باز كردان جداول در شبكه.
در محيط شبكه  باز كردن ديتاباس زياد طول ميكشه اما جداول كمتر . درايوي را شرينگ كرده ايم و با دستور
OPEN DATABASE N:\MASIR\MYDATA.DBC انرا باز ميكنيم  در اين مورد سرعت باز كردن ديتا بايس كمي كند است N همان درايو شبكه است  اما اگر   از دستور OPEN DATABASE \\SERVER\MASIR\MYDATABASE.DBC
باز هم سرعت پايين است   ولي كمي بهتر است لطفا راهنمايي كنيد

----------


## gh_khajehzade

سلام-اگه امکانش هست بجای ip از نام server استفاده کنیدودر برنامه اصلی پوشه default رو پوشه share شده قرار بدید.البته من ابتدا در سرور یک user به پوشه share شده اختصاص میدم و در برنامه اصلی با فرمان net use به پوشه در سرور connect میشم(با username و password تعریف شده برای user )

-کلا به نظر من بهتره از sql server استفاده کنید.فقط کافیه اطلاعات خیلی کمی از sqlserver بدونی و با استفاده از remote view براحتی (تا حد زیادی مانند جداول خود فاکس)باهاش کار کنید.به هر حال اگه دوست داشتید میتونم اطلاعات کاملتری بهتون بدم.

----------


## Esikhoob

> با سلام-اگه جداول در server رو use کنی فرمانهای free table و remove table  امكان اجرا ندارند.البته اگر روی سرعت برنامه تاثیری نداشته باشدکه خوب باید تست بشه.


 - در مورد سرعت باید بگویم طبق امتحانی که کردم وقتی یک نفر table ی را با یک آدرس شبکه use میکند سرعت SEEK و ذخیره اطاعات تا حدود 10 برابر سریعتر است از موقعی که یک نفر دیگر هم آن TABLE را فقط USE کند.
این مسئله کاملا به WINDOWS مربوط میشود ، این را از اینجا میگویم که در HELP ویژوال فاکس پرو به هیچوجه در این مورد صحبتی نشده ، و بالعکس WINDOWS در مورد روش برخورد با کسانی که از فایل share شده در شبکه استفاده میکنند نوشته هایی دارد که این موضوع را تایید میکند.
 WINDOWS که مسئول فایلهاست ، وقتی برنامه ای فایلی را از یک آدرس شبکه باز میکند ، به Windows Client اجازه میدهد که تغییرات را مرتبا بر روی دیسک SERVER ننویسد و نخواند بلکه آنها را یکبار برای همیشه روی کامپیوتر خودش CACHE کند، دقت کنید که روح آن برنامه از این موضوع خبر ندارد.
 به محض اینکه برنامه دیگری از یک کامپیوتر دیگر همان فایل را خواست باز کند ، WINDOWS server به WINDOWS client که برنامه  اول روی آن اجرا بود میگوید که اطلاعات را بر روی دیسک server بنویس و CACHE بازی دیگه تموم ، حالا همه باید مستقیم با دیسک SERVER کار کنند چون دیگر تنها نیستی. (این قضیه درست است چون از دید همه ، برنامه اول فایل روی SERVER را تغییر داده ، در حالی که تغییر در CACHE با تغییر فایل در دیسک SERVER متفاوت است)
همین موقع است که سرعت نفر اول کم میشود.
البته این کم شدن سرعت موقعی محسوس هست که بانکها خیلی حجیم باشد یا سرعت شبکه خیلی کم باشد چون مثلا اگر هر دستور replace ،زمان 0.0004 ثانیه طول بکشد ، و شما 100 بار این دستور را در  اون پروسه ای که در حال اجرا شدن است داشته باشید کلا میشود 0.04 ثانیه که اگر این بحثی که بالا کردم 10 برابر هم سرعت را کم کند ، سرعت اجرای برنامه شما میشود 0.4 ثانیه که باز قابل حس نیست.

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

----------


## new_day

با سلام
منظور شما اينه كه جداول را هم با ادرس سرور باز كنيم  ميشه توضيح  بيشتري بدهيد و مثال بزنيد كه 
1-چگونه ديتاباس را باز ميكني 
2- چطور جداول را باز ميكني 
3- سرور را چگونه تنظيم ميكني ايا پوشه را شرينگ ميكني يا درايوي را شرينگ ميكني 
4-ايا حجم درايو  شرينگ شده اگر زياد باشد در كندي سرعت نقش دارد
5-بعد ار اينها در فرمها از چه سبكي استفاده ميكني مثلا از بافر يا از دستورات SQL , ...
اگه براتون ممكنه مثال هم بزنيد با تشكر فراوان

----------


## Esikhoob

نه ،منظور من اصلا این نیست ، من در مورد موضوعات کاملا متفاوتی صحبت کردم.

من کلا در مورد لایه های زیرین سیستم عامل Windows و موضوع  CACHE شدن فایل میخواستم توضیح بدهم و منظور من از "یک نفر table ی را با یک آدرس شبکه use میکند"  این بود که میخواستم CACHE شدن فایلها هنگامی که از شبکه خوانده شده اند را توضیح بدهم.(در مقابل خوانده شدن از هارد دیسک کامپیوتر )


اما در مورد سئولات شما که موضوع دیگریست ، تنظیماتی که برای نرم افزار خودمان اجرا شده است را به شما میگویم که ممکن است بهینه نباشد (این یک برنامه قدیمی است که من ننوشتم و فقط پشتیبانی آن را بر عهده دارم):
1-
 OPEN DATABASE &p_prim_dir\account_store
.
.
.
Close DataBase

که "p_prim_dir="Q:\BANKS
ما برای بازکردن دیتابیس هایمان از dataenvironment استفاده نکرده ایم ، و در هر پروسه از برنامه بانکها را همان جا اول باز میکنیم و بعد میبندیم ، برنامه نویسش معتقد بود که بانکها نباید همیشه باز باشند در اینجا ممکن است انتقادی باشد که نمونه های برنامه VFP اکثرا بانکها را در dataenvironment  باز میکنند تا برنامه نویسی راحتتر شود.
اما به نظرم این کاری که ما کردیم جلوی چند اشکال را میگیرد ، احتمال خراب شدن بانکها کمتر میشود و همینطور یک خوبی دیگر هم دارد که صحت اطلاعات بهتر میشود که مربوط به اون قضیه ایست که در پست قبل گفتم .

2-
USE t821100r1

3-ما یک پوشه به نام PROGRAMS را در سرور share میکنیم و از کامپیوتر های client این فولدر MAP میشود به Q:

4-فکر نمی کنم.

5-همان طور که از 1 و2 معلوم است ما از همان DBF های VFP استفاده میکنیم. و در برنامه یمان از Buffering   استفاده نکردیم . چون برنامه نویسمان ، برنامه نویس FoxPro DOS بود و اصلا نمیدانستند که Buffering  هم وجود دارد ، اما بالاخره برنامه امان با اشکالاتی کار میکند . من خودم از SELECT SQL جدیدا به وفور استفاده کرده ام ولی قبل از من کل برنامه ما حتی یک SELECT SQL  هم نداشت.(از بقیه دستورات SQL استفاده نمیکنیم)

----------


## gh_khajehzade

سلام به اساتید عزیز-من از برنامه زیر برای اتصال به پوشه share شده استفاده میکنم که بدون map drive 
انجام میشه.البته همانطور که مشخصه نام سرور رو با استفاده از sqlserver میگیرم.که هم با فرمانهای 
net use خود windows ميشه گرفت(فرمانش یادم نیست تو help هست)وهم اینکه نام رو تو بر نامه وارد کنیم.

----------

