PDA

View Full Version : فراخوانی یک فرم در فایل پسورد دار ، از یک فایل دیگر اکسس



hamid-nice
دوشنبه 05 فروردین 1392, 23:00 عصر
سلام

چطور می شه بازدن یک دگمه در یک فرم در یک فایل اکسس بتوان یک فرم مثلا form1 که در یک فایل اکسس دیگری که مثلا در درایو دیگری مثل D که دارای پسورد 1234 قرار داره را باز کرد ؟

با تشکر

soheila2012
دوشنبه 05 فروردین 1392, 23:19 عصر
ببخشید خودتون متوجه سوالتون شدین؟؟؟

Abbas Amiri
دوشنبه 05 فروردین 1392, 23:36 عصر
سلام

چطور می شه بازدن یک دگمه در یک فرم در یک فایل اکسس بتوان یک فرم مثلا form1 که در یک فایل اکسس دیگری که مثلا در درایو دیگری مثل D که دارای پسورد 123 قرار داره را باز کرد ؟

با تشکر

سلام
از کدهای زیر استفاده کنید


Private Sub Command0_Click()
Dim db As Database, strDbName As String
Dim AccessApp As Access.Application
Set AccessApp = New Access.Application
AccessApp.Visible = True
strDbName = "D:\......................"
Set db = AccessApp.DBEngine.OpenDatabase(strDbName, False, False, ";PWD=1234")
AccessApp.OpenCurrentDatabase strDbName
AccessApp.DoCmd.OpenForm "YourFormName"
Set db = Nothing
Set AccessApp = Nothing
End Sub

hamid-nice
سه شنبه 06 فروردین 1392, 01:28 صبح
سلام

بسیار خوب و ممنون

نکته اول : را خدمت دوستان عرض کنم در کد بالا اگر در خط 5 عبارت True را به False تبدیل کنند فرم مورد نظر بدون اینکه خود برنامه اکسس نیز نمایان شود ، باز خواهد شد که در بسیاری از موارد مطلوبتر خواهد شد .

نکته دوم : در بعضی موارد فرم به سرعت باز و بسته می شود ( باز نمی ماند ) برای رفع این مشکل می توان کد خط 9 را به صورت زیر تغییر داد:

AccessApp.DoCmd.OpenForm "YourFormName", , , , , acDialog

اما سوال اینکه :
اگر به جای فرم بخواهیم یک ریپورت را باز کنیم دستور درست عمل نمی کنه حتی اگر یک دگمه روی فرم بذاریم که ریپورت را باز کنه باز هم نمی شه
برای این موضوع چه راهکاری وجود داره ؟

با تشکر فراوان از جناب Abbas Amiri (http://barnamenevis.org/member.php?189381-Abbas-Amiri)

hamid-nice
جمعه 09 فروردین 1392, 23:14 عصر
سلام

دوستان کسی میتونه را حلی ارائه بده ؟

Abbas Amiri
شنبه 10 فروردین 1392, 00:16 صبح
سلام

دوستان کسی میتونه را حلی ارائه بده ؟
خصوصیت Popup باید ست شده باشد و همچنین بعد از دستور بازکردن فرم و یا در روال Report_Load از دستور Docmd.Restore استفاده کنید

hamid-nice
یک شنبه 11 فروردین 1392, 19:24 عصر
سلام

با یک کد دیگری هم میشه این کار را انجام داد فقط گاهی درست عمل نمی کنه و هنگام باز کردن فایل دیگر ، پسورد را سوال می کنه یا باز میکنه ولی سریع بسته می شه

اگه ممکنه لطفا بررسی بفرمایید که اشکال از کجاست و آیا نیاز به اصلاحی داره ؟
در کد زیر فرض شده که یک فایلی به نام database10.mdb که پسورد آن 123 بوه و در درایو D قرار دارد که یک فرم به نام form1 که خاصیتpop up آن yes شده و در رویداد on load آن هم Docmd.Restore نوشته شده است

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

SendKeys "123{Enter}"
Dim obj As Object
Set obj = CreateObject("Access.Application")
obj.OpenCurrentDatabase "D:\database10.mdb"
obj.DoCmd.OpenForm "form1"


"مشکل فکر کنم در دستور sendkey باشد "

و این روش نسبت به روشی که جناب Amiri گذاشتند کدام بهتر هست و لطفا دلیل خود را هم بیان کنید.

با تشکر

Abbas Amiri
یک شنبه 11 فروردین 1392, 19:45 عصر
سلام
ایده SendKeys جالب بود. امتحان میکنم .
فقط آدرس تاپیک رو هم اگه میشه بذارید. ممنون

hamid-nice
یک شنبه 11 فروردین 1392, 19:51 عصر
این تاپیک در این سایت نیست و برای خیلی قبل هاست که الان دیگه اون سایت جمع شده است

حالا که اهل بررسی هستید یک نمونه دیگه که آقای پیروز مهر ارایه داده بودند در ضمیمه می ذارم
لطفا این را هم بررسی کنید و از بین این سه روش هر کدام بهتر و مطمین تر هست را با ارایه دلیل نقد بفرمایید

قسمتی از تاپیک مذکور در زیر آورده شده :
----------------------
سلام
ضمن تشكر از آقاي پيروز مهر بخاطر نمونه اي كه ارائه فرمودن ، ميخواستم بپرسم آيا امكان دارد كه فرمي كه در برنامه اصلي اجرا ميشود بدون پنجره ديتابيس باز شود( فقط پنجره ديتابيس اصلي باز باشد) و سؤال دوم اينكه در صورت اجراي حالت فوق آيا ميتوان با خروج از برنامه اصلي فرم فوق نيز بسته شود ؟
با تشكر
--------------------------------------------
کاربر سایت
alirezabahrami (http://barnamenevisan.net/member.php?u=104) :
سلام
با اجازه جناب آقاي پيروز مهر بنده نمونه را براساس دو مورد خواسته شما تغيير دادم .
شايان ذكر است همانطور كه براي فراخواني برنامه دوم كه مستقل از برنامه اصلي ميباشد نياز به وجود يك تابع و فراخواني آن ميباشد براي بستن آن نيز نياز به تابع مربوطه و فراخواني آن ميباشد.
ضمناً براي بستن برنامه دوم شما بايد نامي كه براي كپشن آن انتخاب كرده ايد در قطعه كد زير بكار ببريد كه در نمونه فوق بنده اختصاراً از حرف s استفاده كرده ام.
موفق باشيد

hWindow = FindWindow(vbNullString, "s")
------------------------------------------------------------------------------

من فایل اصلاح شده را ندارم و اون سایت هم بسته شده اگر می تونید این فرمان را هم که فکر کنم در ماژول اون باید بکار ببرید اصلاح کنید و نمونه اصلاح شده را هم لطفا قرار دهید
( در ضمن فایل را برای مورد پسورد دار اصلاح بفرمایید )
با تشکر

Abbas Amiri
دوشنبه 12 فروردین 1392, 00:16 صبح
سلام
دستور باز کردن فرم را به شکل زیر تغییر دهید:



.DoCmd.OpenForm "form1", , , , , acDialog

Abbas Amiri
دوشنبه 12 فروردین 1392, 14:08 عصر
سلام
کدهای مربوط به پست 7 باید به شکل زیر تغییر کند:


Dim obj As Object
Set obj = CreateObject("Access.Application")
SendKeys "1234{Enter}"
With obj
.OpenCurrentDatabase "D:\database10.mdb"
.DoCmd.OpenForm "form1", , , , , acDialog
.Quit
End With
Set obj = Nothing


چنانچه از دستور Quit استفاده نشود فایل مورد بسته نخواهد شد . هم فایل lde باز خواهد بود و هم در TaskManager در تب Proccess فعال بودن آن را خواهید دید.

hamid-nice
دوشنبه 12 فروردین 1392, 16:06 عصر
دوست گرامی
کد شما رو بکار بردم متاسفانه هنوز هنگام باز شدن پسورد را می پرسد

hamid-nice
دوشنبه 12 فروردین 1392, 16:19 عصر
اگه شما جواب گرفتید لطفا یک نمونه از دستور sendkeys بذارید

البته کد هایی که شما در پست 3# گذاشتید خیلی خوب عمل می کنه
در ضمن نظرتون را نسبت به ارجحیت بین سه روش ذکر شده تا به اینجا هم بگید
با تشکر

Abbas Amiri
دوشنبه 12 فروردین 1392, 23:53 عصر
سلام
شما ازهمان پست 3 استفاده کنید کدها وروش تقریبا یکی است
ضمنا شما در دستور

SendKeys "1234{Enter}"
رمزخودتان را گذاشته ایدیانه؟

hamid-nice
سه شنبه 13 فروردین 1392, 00:16 صبح
بله رمز خودم را گذاشته ام

hamid-nice
چهارشنبه 14 فروردین 1392, 13:50 عصر
کد ها را به صورت زیر تغییر دادم

پسورد فایلی که می خوایم بازش کنیم یعنی Database10 عدد 123 هست

روش 1 :
Dim obj As Object
Set obj = CreateObject("Access.Application")
SendKeys "123{Enter}"
obj.OpenCurrentDatabase "D:\database10.accdb"
obj.DoCmd.OpenForm "form1", , , , , acDialog

روش 2 :
Dim obj As Object
Set obj = CreateObject("Access.Application")
SendKeys "123{Enter}"
obj.OpenCurrentDatabase "D:\database10.accdb"
obj.DoCmd.OpenForm "form1", , , , , acDialog
With obj
.Quit
End With
Set obj = Nothing


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

(البته کد هایی که در پست 3# هست تا اینجا هنوز بهتر از این کدها عمل می کنه )

hamid-nice
جمعه 13 اردیبهشت 1392, 14:11 عصر
با سلام
در پست #9 که در جایی جناب پیروز مهر ارائه فرمودند فایلی را گذاشتم در این فایل پسورد لحاظ نشده بود که با اجازه ایشان پسورد دار شدن فایلی که قرار است باز شود ، را اصلاح کردم و همچنین آن فایل برای فرمتهای MDB محدود شده بود که این محدودیت را نیز برداشتم و در ضمیمه گذاشتم که خوب عمل می کنه

اما مساله اصلی :
در این مدت با استفاده از همه موارد ، مشاهده شد که متاسفانه همه مواردی که تا حالا ارائه شده این اشکال را دارند که گاهی پسورد را می پرسند و نمی توانند که بفرستند !!!
(حتی روشی را که در پست #13 که خوب ارزیابی کرده بودم در یکی از تستهام دیدم از همه موارد بیشتر این نقص را دارد)

آیا کسی علت را می داند که چرا گاهی پسورد را نمی توانند بفرستند ؟
اگر کسی برای این هدف راه دیگری می شناسد لطفا ارائه نماید

با تشکر

hamid-nice
یک شنبه 05 خرداد 1392, 22:35 عصر
با سلام
در فایل ضمیمه پست قبل پنجره خود اکسس هنگام باز شدن فرم ، باز می ماند
آیا کدی می توان به ماژول اضافه کرد تا فقط فرم باز شود و پنجره خود اکسس بالا نیاید؟
با تشکر

hamid-nice
سه شنبه 07 خرداد 1392, 17:12 عصر
با سلام
دوستان راه حلی ندارند؟

hamid-nice
چهارشنبه 08 خرداد 1392, 21:11 عصر
بالاخره و خوشبختانه راهی پیدا شد
کافی است در ماژول در فایل main file در فایل ضمیمه پست 17# به جای کد های
Private Const SW_MAXIMIZE = 3
Private Const SW_NORMAL = 1

کد زیر جایگزین یا اضافه شود
Private Const SW_SHOWNORMAL = 1


نکته : گاهی اگر باز هم پنجره اصلی باز شود در اینصورت چک شود که در فایل Another File.mdb که در ضمیمه پست 17# هست ، فرمی که باید باز شود (در اینجا frmAnotherForm )
در قسمتAccess option ---->current Database ------>Display Form
قرار نگرفته باشد( یا به هر صورت دیگری startup Form در فایل Another File.mdb تعریف نشده باشد)

موفق باشید

hamid-nice
جمعه 28 تیر 1392, 19:28 عصر
با سلام
یک راه دیگری پیدا کردم که به راههای بالا اضافه می کنم
در یک ماژول دستورات زیر را کپی کنید و سپس تابع را فرا بخوانید
Public Function OpenApplication()

Const strAccessLocation As String = "MSACCESS.EXE"

SendKeys "123~"

Const strDBLocation As String = "D:\database10.accdb"

Dim strShellString As String

Dim x As Double

strShellString = Chr(34) & strAccessLocation & Chr(34) & " " & Chr(34) & strDBLocation & Chr(34)
x = Shell(strShellString, vbMaximizedFocus)

Application.Quit

End Function


در اینجا آدرس و نام فایلی که قرار است باز شود وپسوردش 123 می باشد
D:\database10.accdb
فرض شده است که بر طبق فایل و آدرس و رمز خودتان باید تغییر داده شوند
در ضمن اگر بخواهیم پنجره اکسس به صورت مخفی اجرا شود دستور زیر را
x = Shell(strShellString, vbMaximizedFocus)
باید به صورت زیر تغییر دهیم :
x = Shell(strShellString, vbMinimizedFocus)
موفق باشید

Access2013
شنبه 29 تیر 1392, 00:12 صبح
سلام

بهتر بود نمونه نهايي را به ورژن 2003 براي دوستان قرار ميداديد تا طيف استفاده را بالا برده باشيد

موفق باشيد دوست من

hamid-nice
یک شنبه 30 تیر 1392, 23:24 عصر
سلام

بهتر بود نمونه نهايي را به ورژن 2003 براي دوستان قرار ميداديد تا طيف استفاده را بالا برده باشيد

موفق باشيد دوست من

سلام دوست من
اگر منظورتان نمونه براي دستورات پست 21# هست نمومه زير خدمتتان:
فايل database10.mdb كه پسوردش 123 هست را در درايو D قرار دهيد

hamid-nice
چهارشنبه 02 مرداد 1392, 00:40 صبح
با سلام
در روش آخر برای ست کردن پسورد از دستور sendkeys استفاده شده
آیا کسی می تونه به طور دیگری در همان کدها پسورد را ، ست کنه ؟
با تشکر

masoud903
چهارشنبه 02 مرداد 1392, 17:36 عصر
سلام
دستور send key عمل نمیکنه یعنی باید خودم پسورد رو بزنم.چرا؟
با تشکر

hamid-nice
چهارشنبه 02 مرداد 1392, 21:11 عصر
سلام
دستور send key عمل نمیکنه یعنی باید خودم پسورد رو بزنم.چرا؟
با تشکر
با سلام
دوست عزیز دستور و فایل ضمیمه را چک کردم و کاملا درست عمل می کنه
دستور sendkeys برای این نوشته شده که شما دیگر پسورد را دستی وارد نکنید و به طور خودکار این عمل انجام بشه
جلوی sendkeys پسورد 123 نوشته شده که شما باید پسورد دیتابیس خودتون را جایگزین کنید
فایل ضمیمه را چک کنید و هنگام اجرا برنامه دیگری را مثل word باز نکنید که احیانا پسورد اونجا بره ، در ضمن من استفاده از این دستور sendkeys به صورت فوق را برای ارسال و بکارگیری پسورد گزینه مطمئنی نمی دانم به همین دلیل از دوستان خواستم که اگر راهکار دیگری جایگزین آن می شناسند ارایه دهند زیرا که پسورد چیز مهمی است که نباید لو رود و باید دقیق عمل کند نه اینکه گاهی هنگام باز کردن برنامه به موقع send نشود و کاربر مجبور باشه تابرنامه را دوباره اجرا کند که این حتی اگر 10 بار یک دفعه اتفاق بیافتد فقط می شود کاچی به از هیچی
البته برای مطمئن تر عمل کردن این دستور راههای دیگری هست که اگر جواب تاپیک زیر داده شود می تونم اون را ارایه کنم که می تونه درصد خوب عمل کردن اون را بسیار بسیار افزایش بده
http://barnamenevis.org/showthread.php?408633-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%D8%A7-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D9%BE%D9%86%D8%AC%D8%B1%D9%87-%D9%BE%D8%B3%D9%88%D8%B1%D8%AF
موفق باشید

hamid-nice
شنبه 05 مرداد 1392, 23:13 عصر
با سلام
خوب مثل اینکه هنوز کسی جوابی برای پست قبل پیدا کرده و چنانکه خدمت دوستان گفتم چون ارسال پسورد و امنیت آن مطلبی نیست که بشه از آن به راحتی صرف نظر کرد بکار بردن دستور sendkeys به صورتی خام که در پستهای بالا ارایه شده به هیچ وجه موجه به نظر نمی رسد بنابراین می بایست به فکر راه حل دیگری بود
به جز دستورات ارایه شده در پست 21# که هنوز نتوانستم راهی برای جایگزین کردن دستور sendkeys پیدا کنم برای بقیه موارد خوشبختانه این کار صورت گرفت که در فایل ضمیمه به صورت سه روش جداگانه آورده شده است
امیدوارم مفید واقع شود ( از نقد و بررسی و بهبود و ارایه روشهای دیگر توسط سایرین ممنون می شو یم )

امیدوارم دوستان بتوانند راهی هم برای حذف دستور sendkeys برای روش ارایه شده در پست 21 # پیدا کنند زیرا این روش قادر است فایلهایی با فرمت دیگری را نیز اجرا کند که روشهای ارایه شده دیگر از عهده آن عاجزند مثل فایلهای accdr که باعث می شوند فایلهای اکسس در حالت runtime اجرا شوند
موفق باشید

mhkavian
شنبه 26 مرداد 1392, 21:54 عصر
با سلام
در صورتی که بخواهیم به دلیل استفاده از روش runtime در اجرا ، از خط فرمان استفاده کنیم و از روش sendkeys به دلیل امنیت کم آن استفاده ننماییم می توان از روش غیر متعارف زیر استفاده کرد :
روش انجام کار معلق کردن مقطعی کلمه عبور در پایگاه داده مقصد می باشد که بعد از باز کردن و بستن آن دوباره همان کمله عبور برای آن فعال می گردد .
تنها راه حل یافت شده برای اجرا در حالت runtime ، اجرا از طریق خط فرمان بود که کلمه عبور مانع انجام این کار بود لذا از این روش استفاده شد .

فایل مربوط به این راه حل را می توانید در این آدرس پیدا نمایید .

فراخوانی یک فرم در فایل پسورد دار ، از یک فایل دیگر اکسس (http://www.mantis.ir/discussions/%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%DB%8C%DA%A9-%D9%81%D8%B1%D9%85-%D8%A7%D8%B2-%D9%81%D8%A7%DB%8C%D9%84-%D9%85%D8%AD%D8%A7%D9%81%D8%B8%D8%AA-%D8%B4%D8%AF%D9%87-%D8%AF%D8%A7%D8%B1%D8%A7%DB%8C-%DA%A9%D9%84%D9%85%D9%87-%D8%B9%D8%A8%D9%88%D8%B1-%D9%BE%D8%B3%D9%88%D8%B1%D8%AF-%D8%8C-%D8%A7%D8%B2-%DB%8C%DA%A9-%D9%81%D8%A7%DB%8C%D9%84-%D8%A7%DA%A9%D8%B3%D8%B3-%D8%AF%DB%8C%DA%AF%D8%B1.html)


با تشکر
کاویان

hamid-nice
سه شنبه 26 شهریور 1392, 18:37 عصر
با سلام
با تشکر از جناب کاویان برای ارایه راهکارشان در پست قبل
در سایت مایکروسافت نیز سوال را مطرح نموده بودم که جوابی حاصل شده که بابررسی و تغییراتی آنرا در پست بعدی قرار خواهم داد ( البته لینک اصلی آنرا نیز قرار میدهم تا به کدهای ارایه شده در آنجا نیز دسترسی داشته باشید )
موفق باشید

hamid-nice
سه شنبه 26 شهریور 1392, 22:06 عصر
با سلام
از آنجا که در این سایت جوابی برای باز کردن فایلهای accdr و یا باز شدن فایلها در حالت runtime به طور مطلوبی حاصل نشد سوال را در سایت مایکروسافت مطرح کردم که خوشبختانه نتیجه داد که جواب را برای دوستان به همراه لینک مربوطه آوردم که امید است مفید واقع شود : (البته من تغییراتی را در آن داده ام ولی برای دیدن کدهای ارائه شده به لینک زیر مراجعه کنید )
کدهای زیر را برای یک دگمه به نام Command43 روی فرمی قرار دهید و یک فایل با نام sa.accdr با پسورد 123 را در درایو D قرار دهید و نتیجه را ببینید ( اگر ایراد یا نکاتی جهت بهبود هم به نظرتان رسید ممنون میشیم بیان کنید )

Private Sub Command43_Click()
Call CreateDummyfile
StartPasswordedDatabaseRuntime "D:\sa.accdr", 123
End Sub

Sub StartPasswordedDatabaseRuntime( _
strPathToDatabase As String, _
Optional strPassword As String, _
Optional strPathToRuntime As String, _
Optional blnQuit As Boolean)
' Start a runtime database that has a database password.
Dim appRT As Access.Application
Dim strPathToDummy As String
Dim blnStillOpen As Boolean
Const Q As String = """"
If Len(strPassword) = 0 Then
strPassword = InputBox("Please enter password:")
End If
If Len(strPathToRuntime) = 0 Then
strPathToRuntime = SysCmd(acSysCmdAccessDir) & "msaccess.exe"
End If
strPathToDummy = CurrentProject.path & "\Dummy.accdb"
Shell _
Q & strPathToRuntime & Q & " " & Q & strPathToDummy & Q & " /runtime", vbMinimizedFocus
Set appRT = GetObject(strPathToDummy)
With appRT
.CloseCurrentDatabase
.OpenCurrentDatabase strPathToDatabase, , strPassword
End With
On Error Resume Next
blnStillOpen = True
Do While blnStillOpen
DoEvents
Err.Clear
If appRT Is Nothing Then
blnStillOpen = False
ElseIf Len(appRT.CurrentProject.Path) = 0 Then
blnStillOpen = False
End If
If Err.Number <> 0 Then
blnStillOpen = False
End If
Loop
If blnQuit Then
Application.Quit ' if we're done here.
End If
End Sub

Private Sub CreateDummyfile()
Dim obj As Object
Set obj = CreateObject("access.application")
If Dir("D:\Dummy.accdb") = "" Then
obj.NewCurrentDatabase ("D:\Dummy.accdb")
End If
End Sub
لینک مایکروسافت :
http://answers.microsoft.com/en-us/office/forum/office_2010-access/open-accdr-file-protected-with-database-password/0c363087-577e-4888-a970-d2a67276bae5

توجه :
1-از این روش هم برای باز کردن فایلهای mdb , accdb , accdr می توان استفاده کرد که برای منظور این تاپیک به روشهای فوق اما به طرز فراگیرتری اضافه می شود
2- فایل Dummy یک فایل خالی بدون پسورد است که ضرورتا برای اجرای محیط runtime لازم است و توسط کدها ساخته می شود و شما نیازی به تغییر در آن نمی باشید و شما کافی است که در خط سوم ، نام ، آدرس و پسورد مورد نظر را مطابق فایلی که می خواهید باز کنید تغییر دهید
موفق باشید

hamid-nice
جمعه 19 مهر 1392, 00:28 صبح
با سلام

دستورات پست قبل اگرچه خوب بود اما هنوز مسایل زیر در آن وجو داشت که اینک برطرف شده اند :
1- مشکل پرش برنامه اکسس که ابتدا نمایش و سپس hide می شود نیز برطرف شد
2- مشکل ناتوانی در استفاده از VbHide در دستور Shell هم برطرف شد و اینک به خوبی می توان از آن استفاده کرد (البته هنوز از vbMinimize نمی توان استفاده کرد زیرا راست کلیک با آن فعال نمی شود )
3- فایل Dummy را دیگر بوسیله برنامه تولید نمی کنیم بلکه آنرا در درایو D قرار داده ایم زیرا باید ماکروی autoexec را در آن قرار دهیم

توجه :
از این روش برای باز کردن فایلهای mdb , accdb , accdr نیز می توان استفاده کرد

فایل زیر با اصلاحات فوق در ضمیمه قرار داده شده است
موفق باشید