PDA

View Full Version : برنامه نویسی شبکه



binyaz2003
شنبه 02 اسفند 1382, 00:31 صبح
سلام
می خواستم بدونم در برنامه نویسی برای شبکه بغیر از قفل کردن فایل یا رکورد موضوع دیگه ای هم هست یا نه؟
اگر هر چیزی هست حتی کوچک بگید لطفاً
مثلاً برنامه هایی که معمولی مینویسیم رو شبکه اجرا میشه؟

kia1349
شنبه 02 اسفند 1382, 06:54 صبح
بافرینگ روی سطر یا فایل/قفلهای خوش بینانه یا بدبینانه/transaction/rollback/

rezaTavak
دوشنبه 04 اسفند 1382, 01:33 صبح
با سلام


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

binyaz2003
دوشنبه 04 اسفند 1382, 12:43 عصر
منون از توجه شما من منظورم این بود که تمام فرق شبکه اینه که باید از تداخل جلوگیری کنیم و مواظب قفل ها باشیم
کار دیگه ای لازم نیست؟

naghdi
شنبه 30 اردیبهشت 1385, 16:48 عصر
سلام
یک بانک بصورت اشتراکی باز شده.
چند کاربر در برنامه با چند رکورد در حال کار هستند.
قرار هست تمام یا بعضی از رکوردها پاک شود
در صورت تداخل شروط با رکوردهای فعال کاربران برنامه دچار مشکل میشود
سوال
نمایش تعداد رکورد فعال در یک بانک ؟
پاک نمودن تمام یا بعضی از رکوردها به همراه شرط عدم فعال بودن ؟
نمایش فعال یا عدم فعال بودن یک رکورد؟
متشکرم

rahro
چهارشنبه 03 خرداد 1385, 09:29 صبح
سلام
آیا توابع ذیل برای قفل کردن یک رکورد کافیست آیا مشکل ندارد؟
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
چهارشنبه 03 خرداد 1385, 12:36 عصر
شاید یکبار قفل می کنید و باز نمی کنید و ...

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

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

rahro
چهارشنبه 03 خرداد 1385, 17:38 عصر
شاید یکبار قفل می کنید و باز نمی کنید و ...

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

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

rezaTavak
چهارشنبه 03 خرداد 1385, 20:00 عصر
مثلا کلاسهای آماده مانند txtbtn و...

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

مرسی

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

mehran_337
دوشنبه 30 بهمن 1385, 11:17 صبح
من خودم به شخصه از جدول استفاده می کردم. و همیشه عقیده داشتم هر کاری باشه با همین جداول انجام میشه.

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

rahro
دوشنبه 30 بهمن 1385, 12:53 عصر
من خودم به شخصه از جدول استفاده می کردم. و همیشه عقیده داشتم هر کاری باشه با همین جداول انجام میشه.

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

mehran_337
دوشنبه 30 بهمن 1385, 13:46 عصر
خودمن و خیلی ها که با فاکس کار می کنیم کد نویسی رو درون فرمهامون می دونیم.
مثلا برای اینکه یک فیلدی با فیلد دیگر جمع بسته بشه درون فرم و باکدهایی هنگام ثبت این کار رو می کنیم.

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

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

rezaTavak
دوشنبه 30 بهمن 1385, 23:09 عصر
مسلما فاکس دیروز را با امروزه نمیشه مقایسه کرد باید بهتر بشه.

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

mehran_337
شنبه 07 اردیبهشت 1387, 08:43 صبح
به این لینک نگاه کن
http://barnamenevis.org/forum/showthread.php?t=52505&highlight=%D8%B4%D8%A8%DA%A9%D9%87

IC_prog
شنبه 07 اردیبهشت 1387, 09:47 صبح
با سلام
ظاهرا تنها فرق برنام نویسی تحت شبکه VFoxPro با غیر شبکه ای ، استفاده از set exclusive off است و اگر برنامه نویسی قشنگ و حرفه ای ای بخواهیم بکنیم باید موضوع استفاده چند کاربر به طور همزمان را هم در نظر بگیریم(در غیر این صورت ، کاربر دوم یک Error می گیرد).
یک موردی که من بهش برخوردم ، این بوده که بعضی وقتها اطلاعات به درستی روی سرور ذخیره نمیشود ، در حالی که برنامه منطقا درست است و اشکال هم به ندرت پیش میآید و دقیقا معلوم نیست کی ممکن است پیش آید ، در این مورد Microsoft مطلب زیر را گفته:
http://support.microsoft.com/default.aspx?scid=kb;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
چهارشنبه 11 اردیبهشت 1387, 23:32 عصر
با سلام
دوست عزیز من نمی دانم که این شکالات که شما گفتی در VFP برطرف شده یا نه ، ولی می‌خواهم بدانم چرا در DOS نباید از SUM استفاده کرد و یا SCAN FOR گذاشت؟

IC_prog
شنبه 14 اردیبهشت 1387, 09:58 صبح
با سلام
دوست عزیز من نمی دانم که این شکالات که شما گفتی در VFP برطرف شده یا نه ، ولی می‌خواهم بدانم چرا در DOS نباید از SUM استفاده کرد و یا SCAN FOR گذاشت؟
در فرمانهای فوق کل رکوردهای tabel درگیر میشود که در حالت اضافه یا حذف رکورد توسط کاربر دیگر با پیغام خطا مواجه میشیم. در حالی که وقتی با seek به رکورد مورد نظر رسیدید با اجرای scan whil فقط رکوردهای شرط فوق درگیر میشوند .
البته سوادم در این حد بود که توضیح دادم

kia1349
چهارشنبه 18 اردیبهشت 1387, 08:59 صبح
ساده و خلاصه:
در مجموع درست عمل ميکنيد
در خصوص شبکه پيشنهاد ميکنم از فاکس پرو+اس کيو ال يا ماي اس کيو ال استفاده کنيد

arashkhaan2002
چهارشنبه 17 تیر 1388, 02:48 صبح
استفاده از Remote Table ها و نوشتن به صورت Client server رو کسی کار کرده؟

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

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

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

arashkhaan2002
پنج شنبه 18 تیر 1388, 04:53 صبح
الان من تو برنامه ام به صورت پارامتری آدرس DBF هام رو کهfree table هم هستند server\dfs\\ که یه فولدر share هست تعریف کردم و بلدم روی server اون فولدر رو بیارم تو odbc ، ولی :

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

arashkhaan2002
پنج شنبه 18 تیر 1388, 21:50 عصر
یک سوال دیگه :

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

binyaz2003
جمعه 19 تیر 1388, 00:16 صبح
يک مثال ساده ميارم که خودم امتحان کردم.براي تست اين کد اول يک ديتابيس در يک پوشه بسازيد و بعد در اون يک جدول به اسم 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
یک شنبه 21 تیر 1388, 13:58 عصر
خوب ولی این کار یا Remote view صرفا بدرد گزارش گیری میخوره ، اگر بخواهیم با بانک ها کار کنیم چی؟

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

binyaz2003
یک شنبه 21 تیر 1388, 19:07 عصر
دستورات پرکاربرد SQL :
Select
Delete
Insert
هم رکوردها رو نمايش ميديد،پاک ميکنيد و جديد وارد ميکنيد.
کار ديگه اي هست؟

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

arashkhaan2002
دوشنبه 22 تیر 1388, 23:29 عصر
مرسی خودم از Help فاکس فهمیدم چیکار باید کرد !
یا باید از روی رکورد جابجا شی تا Update بشه یا دستور Tableupdate() رو بزنی!
مرسی دوستان ، شما با این روش برنامه ای که از راه دور کارکنه نوشتین تا حالا؟

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

amir.azimi2000
چهارشنبه 24 تیر 1388, 08:13 صبح
سلام .
آقا من هم همین مشکل را داشتم (یعنی Command را پیدا نمیکردم) آخرش هم بیخیال ویوها شدم و رابطه ها را دستی تعریف کردم(اصل پاک کردن صورت مسئله در صورت نیافتن جواب).

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

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

Esikhoob
چهارشنبه 07 مرداد 1388, 08:24 صبح
من قبلا متوجه موضوعی در برنامه نویسی شبکه شده بودم که دلم میخواد آن را اینجا بگویم :
وقتی یک بانک را 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
شنبه 10 مرداد 1388, 13:40 عصر
مرسی اتفاقا قبل از اشاره شما من برای بالا بردن امنیت این کرو کردم فعلا هم مسئله ویرایش همزمان توسط 2 کاربر حل شده هم مسئله Update نبودن اطلاعات.
فقط مشکلی که هست چون Rlock() رکورد رو قفل میکنه و من موقع ثبت اطلاعات از دستور Flock() استفاده کردم ، وقتی یکی داره کار ویرایش انجام میده ، دیگه کسی نمیتونه ثبت اطلاعات بکنه ، سرو صدای کاربرا در آومده !!

mehran_337
یک شنبه 11 مرداد 1388, 07:38 صبح
بد نیست اگر بگین چطور حل شده . چون می تونه جوابی برای کاربرای دیگه هم باشه

new_day
یک شنبه 11 مرداد 1388, 15:18 عصر
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
یک شنبه 11 مرداد 1388, 15:31 عصر
اما توضيح البته ممكنه راه مناسبي نباشه اما به هر حال خودش يك روشه
سطر اول كه مشخصه از مولتي لوك استفاده ميكنيم تا بتونيم ركوردهاي متعددي را قفل كنيم
اگه فرض كنيم ما فايلي داريم كه شامل شماره حسابها و نام اشخاص باشه و فايلهاي متعدد ديگه كه شامل فايل سند و يا دفاتر معين و تفضيل و كل و ..
ابتدا بايدبراي ثبت سند هر حسابي اون ركورد را در اختيار بگيريم نه فايل را چون تغييري نميخواهيم در اين فايل
انجام بديم فرض كنيم عمليات بانكي باشه بر اساس مانده فعلي عمليات برداشت انجام ميشه
پس ركورد شماره حساب خاص را بررسي و در صورتي كه قفل نيست قفل و در صورت قفل بودن به كاربر پيام ميديم و زمان بررسي قفل را هم به يك يا دوثانيه كاهش ميديم
اما اگه ركورد قفل نبود و توسط ما قفل شد پس از هر مدت زمان لازم كه اطلاعات سند را كامل كرديم و دستور ثبت را صادر كرديم چون در اين حالت با توجه به نوع دستورات براي اضافه كردن اطلاعات و يا تغييرات در فايلهاي ديگر ممكنه فايل هاي ديگر كاملا قفل بشه دستور بررسي قفلهاي فايل را روي اتوماتيك مي گذاريم
و در نهايت همين فايل اولي را unlock ميكنيم
اگه اشتباه نكنم زمان اتوماتيك بررسي قفل فايل حدود 100 ثانيه است كه اين هم زمان زيادي براي ثبت در فايلها و ما كمتر از يك ثانيه نياز داريم
بعد كاربر بعدي وقتي به اون حساب دسترسي داره كه مانده تغيير كرده
اميدوارم منظورم را رسونده باشم اگه مفهوم نيست بگيد تا توضيح بدم

new_day
یک شنبه 11 مرداد 1388, 15:39 عصر
البته راه حل بهتري هم هست كه از دستور BEGIN TRANSACTION استفاده كني
و البته از نوع تو در تو كه بصورت منطقي شرايط فايلها و قفل اونها را بررسي و در كمترين زمان بصورت فيزيكي بروز اوري ميشه
دستورات sql معمولا بصورت اتوماتيك ركورد يا فايل را قفل ميكنند كه در help توضيحاتش هست

arashkhaan2002
یک شنبه 01 آذر 1388, 20:09 عصر
سلام دوستان
اکثر اوقات اطلاعات داخل حافظه کلاینت (مثلا در ناحیه 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
دوشنبه 02 آذر 1388, 09:04 صبح
برای کار در شبکه سعی کنید از قدرت و سهولت فاکس و برتری sql server کمک بگیرید
یعنی برنامه نویسی با فاکس و بانک اطلاعاتیش sql server
این موضوع باعث میشه قدرت این دو را با هم جمع کنید و راحت تر به هدفتون برسید

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

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

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

arashkhaan2002
سه شنبه 03 آذر 1388, 00:26 صبح
من 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
سه شنبه 03 آذر 1388, 13:43 عصر
این به خاطر اینه که شما ارتباط یک طرفه با sql برقرار کردی و تغییرات از سمت شما در sql اعمال میشه ولی از اون طرف این اتفاق نمی افته
من منظورم اینه که شما باید بطور کلی از دستورات ado استفاده کنید تا این مشکل هارو نداشته باشید

arashkhaan2002
سه شنبه 03 آذر 1388, 15:54 عصر
چطوری؟ ado رو از کجا نصب کنم و دستوراتش خاصه؟ کلا روش کار چیه؟

kia1349
چهارشنبه 04 آذر 1388, 07:59 صبح
امیدوارم با مطالعه فایلها و مثالهای این ضمیمه مشکلتون حل بشه.متاسفانه چون حجمش یکم زیاد بود مجبور شدم بزارمش توی سایت rapidshare
http://rapidshare.com/files/311850278/vfp-mssql.rar.html

binyaz2003
چهارشنبه 04 آذر 1388, 10:13 صبح
سلام
اين همون Client-Server Applications with Visual FoxPro 6.0 and SQL Server هست يا يک چيز جديده؟

kia1349
چهارشنبه 04 آذر 1388, 11:06 صبح
همون کتابه به علاوه یه تعداد مثال

arashkhaan2002
چهارشنبه 11 آذر 1388, 17:23 عصر
چرا بعضی اوقات روی شبکه کاربرا وقتی یکی اطلاعات ذخیره میکنه و روی 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
شنبه 14 آذر 1388, 15:40 عصر
انگاری دوستان کسی با فاکس دیگه برنامه شبکه نمینویسه که به مشکل بخوره!

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

rahro
یک شنبه 15 آذر 1388, 09:24 صبح
سلام
من فكر ميكنم فرايند استفاده شما اشتباهه. من در پروژه هاي تحت شبكه هيچ گاه به اين مشكلاتي كه شما مي فرمائيد بر نخوردم و فكر ميكنم علتش تمامي شيوه كدنويسي ست .
مثلا من در يك فايل متني مسير ديتابيس اصلي رو گذاشتم حال اون ديتابيس ميتونه ازش استفاده تك كاربره بشه يا شبكه . اگر قرار باشه تحت شبكه كار كنن كاربر مياد مسير ديتابيس رو تنظيم ميكنه .
بعد از DataEnvironment براي كار با جداولم استفاده ميكنم .
در ضمن من فقط ديتابيس رو شر ميكنم نه كل پوشه برنامه رو.

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

rahro
دوشنبه 16 آذر 1388, 07:17 صبح
دوست من ،‌ من به نوبه خودم ميتونم بگويم اين ساده ترين نوع در شبكه است . و اصلا از اين درسرهايي كه شما ميگيد درش دخيل نيست . شما زحمت خودتون را اضافه كردي. مثلا چرا از ريليشنها نبايد استفاده كرد در حالي خيلي مفيد ميشه ازش سود جست.
موقعي كه شما ديتابيس رو شر ميكني اصلا نيازي نيست بدوني مسير جداولت كجا قرار دارند و دقيقا روش رفتار با اونها مثل رفتار با يك سيستم تك كاربره ست . شما فقط و فقط آدرس ديتابيس رو ميخاي كه اونهم داري .
يك تست كوچكلو بزن ، خودت متوجه ميشي .
البته هنوز از اساتيد من نقدي بر اين روش نديدم .

mehran_337
دوشنبه 16 آذر 1388, 07:57 صبح
1 - شاید اولین نقد این باشه که همه کاربران به دیتابیس شما دسترسی دارند حتی می تونن حذفش کنن .
البته شما مجبورید در شبکه ای که دامین نداره از همین روش استفاده کنید .

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

arashkhaan2002
دوشنبه 16 آذر 1388, 12:49 عصر
ممنون دوستان عزیز
من هم برای قدرت نمائی بیشتر فاکس! فعلا فری تیبل هامو بردم تو یه دیتابیس و تو برنامه ام به جای آدرس دهی تک تک فری تیبل ها فقط آدرس دیتا بیس رو دادم و سپس بصورت معمولی با آوردن اسم دیتابیس و سپس نام فری تیبل اونها رو تو نواحی مختلف کاری یوز کردم . حالا ببینم بازم به مشکلات تداخلی میخورم یا نه

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

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

arashkhaan2002
یک شنبه 22 آذر 1388, 18:31 عصر
هیچکی مارو وشبکه فاکسو تحویل نمیگیره انگاری .
خوبه چه فروم فعالی داریم ، بهتره دوستان عزیز یه سری به www.foxite.com (http://www.foxite.com) بزنن ببینن چقدر فعاله.
مهران جان از توصیه ات ممنونم ، free table هامو گذاشتم تو یه دیتابیس و اول برنامه به جای آدرس دهی تک تک تیبل ها ، open database میکنم و راحت با table ها کار میکنم فعلا تو شبکه تحت تسته ، امیدوارم دیگه تداخل ، کانفلیکت ، کالیژن و آپدیت نبودن واسم پیش نیاد.
فکر میکنی غیر از امنیت ، تو سرعت کارمم هم اینجوری تاثیر مثبت بذاره؟

mehran_337
دوشنبه 23 آذر 1388, 08:24 صبح
مسلما تاثیر می زاره . حالا اگه کاربرات زیاد باهوش نیستند (البته من در هیچ برنامه ای کاربرارو دست کم نمی گیرم) می تونی کارهای امنیتی هم تا حدی پیش ببری.
مثلا توی محثی دیتابیس قرار بگیر و راست کلیک و پروپرتیز بزن می بینی که دیتابیس هم واسه خودش متدهایی داره مثلا وقتی باز می شه یا وقتی تیبلی مشاهد می شه حذف می شه و ...
می تونی پروسیجری بنویسی مثلا در active دیتابیس بنویس


if a <> 123
return .f.
endif


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

binyaz2003
شنبه 28 آذر 1388, 17:17 عصر
شايد کمک کنه :
http://www.foxite.com/articles/read.aspx?id=67&document=how-to-handle-update-conflicts-and-refresh-data-in-forms-within-a-network-multiuser-application

arashkhaan2002
شنبه 12 دی 1388, 15:40 عصر
دوستان عزیز و آقا مهران گل سلام

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

rahro
یک شنبه 13 دی 1388, 07:32 صبح
دوستان عزیز و آقا مهران گل سلام

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

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

arashkhaan2002
دوشنبه 14 دی 1388, 16:12 عصر
Browse را وقتی که کاربر میخواد جستجو کنه روی کدها میگذارم .

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

saba_2362
چهارشنبه 21 بهمن 1388, 09:16 صبح
سلام دوستان
اگه منبعی در رابطه با برنامه نویسی شبکه با #c و sql دارید معرفی کنید

kia1349
پنج شنبه 22 بهمن 1388, 11:44 صبح
شما باید برای دریافت پاسخ به بخش c# مراجعه کنید.در بخش open source ، من یه مثال خوب و جامع گذاشتم

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

amir.azimi2000
یک شنبه 27 تیر 1389, 10:00 صبح
مسلما تاثیر می زاره . حالا اگه کاربرات زیاد باهوش نیستند (البته من در هیچ برنامه ای کاربرارو دست کم نمی گیرم) می تونی کارهای امنیتی هم تا حدی پیش ببری.
مثلا توی محثی دیتابیس قرار بگیر و راست کلیک و پروپرتیز بزن می بینی که دیتابیس هم واسه خودش متدهایی داره مثلا وقتی باز می شه یا وقتی تیبلی مشاهد می شه حذف می شه و ...
می تونی پروسیجری بنویسی مثلا در active دیتابیس بنویس


if a <> 123
return .f.
endif


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

با سلام .

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

با سپاس .

binyaz2003
یک شنبه 27 تیر 1389, 10:10 صبح
در وقايع زير کدتون رو اضافه کنيد :


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
یک شنبه 27 تیر 1389, 16:36 عصر
با سلام .
جناب بی نیاز عزیز ، مدیر محترم

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

با تشکر

binyaz2003
جمعه 01 مرداد 1389, 07:49 صبح
علاوه بر نوشتن کدها بايد روي ديتابيس در طراح ديتابيس کليک راست کنيد و گزينه Properties ر ا انتخاب و سپس گزينه Set Events On را انتخاب کنيد.

new_day
سه شنبه 02 شهریور 1389, 19:26 عصر
#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
جمعه 05 شهریور 1389, 19:07 عصر
http://social.msdn.microsoft.com/Forums/en-US/visualfoxprogeneral/thread/51b6e719-2172-42ab-893a-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
سه شنبه 09 شهریور 1389, 20:17 عصر
هنگامي كه جدولي خارج از برنامه بخواهد باز بشه و براي كنترل متغيري در برنامه تعريف كرده باشيم چون متغير براي كنترل مجاز بودن و غير مجاز بودن در بانك تعريف نــــــــــــشده پيام خطا ميده اما در برنــــامه فوق Vartype(ANY_RANDOM_VARIABLE)= "U" ميگه اگه چنين متغيري نامفهوم و ناشناخته بود يا مخالف پسورد بود دسترسي را غير ممكن كن

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

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

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

gh_khajehzade
جمعه 12 شهریور 1389, 11:10 صبح
با سلام-اگه جداول در server رو use کنی فرمانهای free table و remove table امكان اجرا ندارند.البته اگر روی سرعت برنامه تاثیری نداشته باشدکه خوب باید تست بشه.

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

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

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

Esikhoob
سه شنبه 23 شهریور 1389, 20:52 عصر
با سلام-اگه جداول در 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
سه شنبه 23 شهریور 1389, 22:20 عصر
با سلام
منظور شما اينه كه جداول را هم با ادرس سرور باز كنيم ميشه توضيح بيشتري بدهيد و مثال بزنيد كه
1-چگونه ديتاباس را باز ميكني
2- چطور جداول را باز ميكني
3- سرور را چگونه تنظيم ميكني ايا پوشه را شرينگ ميكني يا درايوي را شرينگ ميكني
4-ايا حجم درايو شرينگ شده اگر زياد باشد در كندي سرعت نقش دارد
5-بعد ار اينها در فرمها از چه سبكي استفاده ميكني مثلا از بافر يا از دستورات SQL , ...
اگه براتون ممكنه مثال هم بزنيد با تشكر فراوان

Esikhoob
جمعه 26 شهریور 1389, 17:26 عصر
نه ،منظور من اصلا این نیست ، من در مورد موضوعات کاملا متفاوتی صحبت کردم.

من کلا در مورد لایه های زیرین سیستم عامل 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
شنبه 27 شهریور 1389, 19:04 عصر
سلام به اساتید عزیز-من از برنامه زیر برای اتصال به پوشه share شده استفاده میکنم که بدون map drive
انجام میشه.البته همانطور که مشخصه نام سرور رو با استفاده از sqlserver میگیرم.که هم با فرمانهای
net use خود windows ميشه گرفت(فرمانش یادم نیست تو help هست)وهم اینکه نام رو تو بر نامه وارد کنیم.