PDA

View Full Version : سوال: تهیه بک آپ از بانک لینک شده



azadich
چهارشنبه 09 اسفند 1391, 11:02 صبح
در برنامه ای که درست کردم جدول ها یم به صورت لینک هست حالا چطوری تو برنامه ام از بانکی که جداول داخلش هست بک آپ بگیرم.بک آپ از برنامه نه بلکه از فایلی که جداول داخلش هست.ممنون

hamid-nice
چهارشنبه 09 اسفند 1391, 17:32 عصر
سلام به همه دوستان

من هم به این مساله گیر کرده ام لطفا کمک کنید

با تشکر

azadich
چهارشنبه 09 اسفند 1391, 18:51 عصر
سلام به همه دوستان

من هم به این مساله گیر کرده ام لطفا کمک کنید

با تشکر
یعنی هیچ راهی نیست؟!...

Abbas Amiri
چهارشنبه 09 اسفند 1391, 19:07 عصر
سلام
کدهای زیر رو دریک ماژول کپی کنید . چنانچه روال GetBackup را صدا بزنید بطور خودکار عملیات بکاپ از فایل BackEnd شما رو بصورت زیپ شده درپوشه BackUp در پوشه جاری انجام می دهد. اینها کدهایی است که خودم استفاده میکنم و تغییرات اندکی داده شده.


Public Enum FileNameAttr
ExtentionOnly
NameAndExtention
NameOnly
PathOnly
End Enum

Sub GetBackup()
Dim sDate As String, src, dest, tdf As TableDef
If MsgFar("ازبرنامه پشتیبان گرفته شود؟", "", vbYesNo + vbQuestion + vbDefaultButton1) = vbNo Then Exit Sub
sDate = Shamsi(Date)
sDate = Replace(sDate, "/", "-")
For Each tdf In CurrentDb.TableDefs
If Len(tdf.Connect) > 8 Then
src = tdf.Connect
End If
Next
If Len(CStr(src)) = 0 Then
MsgBox "جدول لینک شده وجودندارد"
Exit Sub
End If
src = Replace(src, ";DATABASE=", "")
dest = CurrentProject.Path & "\Backup\" & GetFileFromPath(src, NameOnly) & sDate & ".zip"
If Dir(CurrentProject.Path & "\Backup", vbDirectory) = "" Then
MkDir CurrentProject.Path & "\Backup"
End If
ZipFile src, dest
End Sub

Sub ZipFile(SourceFile, FileNameZip)
On Error GoTo errzip
Dim oApp As Object
If Len(Dir(FileNameZip)) > 0 Then Kill FileNameZip
NewZip FileNameZip
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(FileNameZip).CopyHere SourceFile
Set oApp = Nothing
Exit Sub
errzip:
MsgBox Err.Number & " - " & Err.Description
End Sub

Sub NewZip(sPath)
If Len(Dir(sPath)) > 0 Then Kill sPath
Open sPath For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1
End Sub

Public Function GetFileFromPath(sFileLoc, Optional PathPart As FileNameAttr = NameAndExtention) As String
Dim a As Integer, s As String, Result As String
a = InStrRev(sFileLoc, "\")
Result = Right(sFileLoc, Len(sFileLoc) - a)
If PathPart = NameOnly Then
a = InStrRev(Result, ".")
Result = Left(Result, a - 1)
ElseIf PathPart = OnlyExtention Then
a = InStrRev(Result, ".")
Result = Right(Result, Len(Result) - a)
ElseIf PathPart = PathOnly Then
Result = Replace(sFileLoc, Result, "")
End If
GetFileFromPath = Result
End Function



لازم به ذکر است بدلیل نیاز خودم این روال در هرروز فقط یک بکاپ ایجاد میکند و درصورت بکاپ گیری دوباره درهمان روز ، قبلی راپاک وجدیدرا جایگزین میکند.

azadich
چهارشنبه 09 اسفند 1391, 21:22 عصر
سلام
کدهای زیر رو دریک ماژول کپی کنید . چنانچه روال GetBackup را صدا بزنید بطور خودکار عملیات بکاپ از فایل BackEnd شما رو بصورت زیپ شده درپوشه BackUp در پوشه جاری انجام می دهد. اینها کدهایی است که خودم استفاده میکنم و تغییرات اندکی داده شده.


Public Enum FileNameAttr
ExtentionOnly
NameAndExtention
NameOnly
PathOnly
End Enum

Sub GetBackup()
Dim sDate As String, src, dest, tdf As TableDef
If MsgFar("ازبرنامه پشتیبان گرفته شود؟", "", vbYesNo + vbQuestion + vbDefaultButton1) = vbNo Then Exit Sub
sDate = Shamsi(Date)
sDate = Replace(sDate, "/", "-")
For Each tdf In CurrentDb.TableDefs
If Len(tdf.Connect) > 8 Then
src = tdf.Connect
End If
Next
If Len(CStr(src)) = 0 Then
MsgBox "جدول لینک شده وجودندارد"
Exit Sub
End If
src = Replace(src, ";DATABASE=", "")
dest = CurrentProject.Path & "\Backup\" & GetFileFromPath(src, NameOnly) & sDate & ".zip"
If Dir(CurrentProject.Path & "\Backup", vbDirectory) = "" Then
MkDir CurrentProject.Path & "\Backup"
End If
ZipFile src, dest
End Sub

Sub ZipFile(SourceFile, FileNameZip)
On Error GoTo errzip
Dim oApp As Object
If Len(Dir(FileNameZip)) > 0 Then Kill FileNameZip
NewZip FileNameZip
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(FileNameZip).CopyHere SourceFile
Set oApp = Nothing
Exit Sub
errzip:
MsgBox Err.Number & " - " & Err.Description
End Sub

Public Function GetFileFromPath(sFileLoc, Optional PathPart As FileNameAttr = NameAndExtention) As String
Dim a As Integer, s As String, Result As String
a = InStrRev(sFileLoc, "\")
Result = Right(sFileLoc, Len(sFileLoc) - a)
If PathPart = NameOnly Then
a = InStrRev(Result, ".")
Result = Left(Result, a - 1)
ElseIf PathPart = OnlyExtention Then
a = InStrRev(Result, ".")
Result = Right(Result, Len(Result) - a)
ElseIf PathPart = PathOnly Then
Result = Replace(sFileLoc, Result, "")
End If
GetFileFromPath = Result
End Function



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

hamid-nice
پنج شنبه 10 اسفند 1391, 20:01 عصر
سلام
با تشکر از کدی که گذاشتید

جناب Abbas Amiri (http://barnamenevis.org/member.php?189381-Abbas-Amiri)
کدی که گذاشتید در هنگام compile کردن خط های 10 و 34 و 35 ایراد میگیره

لطف کنید کدتون را طوری قرار دهید که اگر در محل فایل قبلی بود یک پیغام بده و دخواست نام جدید کنه

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


جناب Azadich
شما برای صدا زدن تابع به جای call اشتباها cal نوشتید

azadich
پنج شنبه 10 اسفند 1391, 21:19 عصر
سلام
با تشکر از کدی که گذاشتید

جناب Abbas Amiri (http://barnamenevis.org/member.php?189381-Abbas-Amiri)
کدی که گذاشتید در هنگام compile کردن خط های 10 و 34 و 35 ایراد میگیره

لطف کنید کدتون را طوری قرار دهید که اگر در محل فایل قبلی بود یک پیغام بده و دخواست نام جدید کنه

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


جناب Azadich
شما برای صدا زدن تابع به جای call اشتباها cal نوشتید
تغییراتی در ماژول ایجاد کردم حالا پوشه خالی ایجاد می کنه اما فایل ایجاد نمی کنه

hamid-nice
پنج شنبه 10 اسفند 1391, 22:45 عصر
شاید جدولی را که لینکی درست کردید به صورت یک object تعریف نکردید و نمی شناسه ؟

Abbas Amiri
جمعه 11 اسفند 1391, 00:21 صبح
در برنامه ای که درست کردم جدول ها یم به صورت لینک هست حالا چطوری تو برنامه ام از بانکی که جداول داخلش هست بک آپ بگیرم.بک آپ از برنامه نه بلکه از فایلی که جداول داخلش هست.ممنونسلام
فرم و ماژولهای فایل زیر را به فایل اصلی خودتان ایمپورت و استفاده کنید.
ایجاد پیغام جهت پشتیبان گیری در زمان بازیابی فایل پشتیبان هم بعهده خودتان.

hamid-nice
جمعه 11 اسفند 1391, 06:22 صبح
سلام

جناب Abbas Amiri (http://barnamenevis.org/member.php?189381-Abbas-Amiri)

واقعا دستتون درد نکنه مشکل را عالی حل کردید فقط اگه مسیر فایل بک آپ و نام آن را هم بشه توسط کار بر تعیین کرد خیلی عالی می شود به طوریکه هر بک آپ overwrite نشود زیرا در طول سال نیاز به گرفتن بک آپ های متفاوتی است
که اگر فایل را این چنین اصلاح قرمایید بسیار سپاسگذار یم



من هم به دو صورت دیگری به جواب رسیدم (البته با استفاده از راهنمایی های خوبتان در تاپیکهای دیگه و فایل های دیگران ) تنها ایراد کار اینه که درفایل ضمیمه back-1 وقتی فرم باز میشه عامل warnning security نمیذاره کد این فرم اجرا بشه
آیا راهی براش هست ؟ ( در واقع اگر بشه کدی نوشت که یک فایل اکسس دیگری را از یک فایل اکسس دیگه به صورت low security در آورد مشکل حل می شود )

و فایل ضمیمه back-2 از روش دیگری است که باز به خاطر مساله فوق هنوز کاملا اجرایی نشده و اینکه چندین بار پیام هایی میدهد که عکس آن را ضمیمه کردم ، چرا در فایل اولی این پیامها نمی آید ولی برای این فایل Back-2 می اید ؟ آیا راهی برای برطرف کردن اینها هم هست که هنگام اجرای آن نیایند ؟

(مثلا اگر همین پیغام security خود اکسس با باز شدن form1 هم ظاهر شود و بتوان آنرا به عنوان دگمه تایید کاربر فعال کرده و با زدن آن یک عمل بسته و باز شدن form1 یا حتی خود فایل بک آپ آنرا اجرایی کرد یا ...
البته اگر ما فایل اکسسمان را با فایلی مثل فایل ضمیمه open.rar که باید آدرس فایل را با ادیت کردن اون با راست کلیک کردن روی فایل بنویسم این مشکل حل می شه ولی پطور میشه این را با اکسس اتوماتیک انجام داد یا دستورات داخل اون را در اکسس نوشت که نیازی به این فایل نباشه
یا میشه یک فایل متنی در فرم بک آپ شاخت که آدرس را به این متن اضافه کنه و محتویات را به صورت فایلی با پسوند vbs. در کنار فایل بک آپ گرفته شده ذخیره و اجرا کنه
یا با برنامه setup ساز کل هارد را برای اکسس رجیستر کرد که نمی دونم میشه یا نه که البته به ورژن اکسس هم محدودیت نداشته باشه ؟ )
اگر ممکنه روی اینها هم یک فکری کنید

یک سوال دیگه :
در فایل ضمیمه back-1 از دستور copyfile استفاده شده که کل فایل را کپی می کند آیا میشه اون را طوری نوشت که بتونیم جدول و فرمهای دلخواه را فقط کپی کند نه همه اشیاء آن فایل را ؟

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

azadich
جمعه 11 اسفند 1391, 06:31 صبح
سلام
فرم و ماژولهای فایل زیر را به فایل اصلی خودتان ایمپورت و استفاده کنید.
ایجاد پیغام جهت پشتیبان گیری در زمان بازیابی فایل پشتیبان هم بعهده خودتان.
با تشکر خیلی خیلی فراوان ازAbbas Amiri واقعا دررود برشما.فقط اگه موقع پشتیبان گیری مسیر را بپرسه عالی میشه.ممنون

Abbas Amiri
جمعه 11 اسفند 1391, 12:43 عصر
سلام
برای تعیین محل ایجاد بک آپ ،
دوستان بعداز این همه مثال وتاپیک .... دیگه چی بگم !!!

nazanin_90
جمعه 11 اسفند 1391, 17:05 عصر
سلام
فرم و ماژولهای فایل زیر را به فایل اصلی خودتان ایمپورت و استفاده کنید.
ایجاد پیغام جهت پشتیبان گیری در زمان بازیابی فایل پشتیبان هم بعهده خودتان.
سلام
باتشکر از شما جناب امیری بخاطر نمونه خوبتون
یک سوال:
اگر در برنامه ما جداول لینک شده ای از دو یا چند دیتابیس باشد میتوان در پوشه backup از همه آنها به تفکیک بک آپ گرفت ؟
با تشکر

hamid-nice
شنبه 12 اسفند 1391, 01:31 صبح
سلام
خودم را کشتم تا مساله تقریبا حل شد

حالا هم می شه جای بک آپ را تعیین کرد وهم میشه شماره گذاری کرد یعنی در پنجره باز شده هر عددی بدی قبل از تاریخ آن می اندازه و ذخیره میکنه

اما چند تا کار مونده که نتونستم

1- وقتی پنجره باز می شه اگر دگمه کنسل را بزنیم یک پیغام error میده

2- آیا میشه دگمه Open در پنجره باز شده به کلمه Save تغییر کنه یا اگه بشه فارسی بشن که خیلی خوب میشه حتی عنوان پنجره و ...؟

3- تاریخی که در نام می اندازه به شمسی ( با احتساب سال کبیسه و ... ) تغییر کنه

4- که خیلی مهم هست اینکه اگر بخوایم روی بک آپ قبلی ذخیره کنیم overwrite نمی کنه و یک فایل جدید می سازه

لطفا فایل ضمیمه را ببینید

جناب Abbas Amiri (http://barnamenevis.org/member.php?189381-Abbas-Amiri) خدا قوت



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

hamid-nice
دوشنبه 14 اسفند 1391, 02:11 صبح
حالا هم می شه جای بک آپ را تعیین کرد وهم میشه شماره گذاری کرد یعنی در پنجره باز شده هر عددی بدی قبل از تاریخ آن می اندازه و ذخیره میکنه

اما چند تا کار مونده که نتونستم

1- وقتی پنجره باز می شه اگر دگمه کنسل را بزنیم یک پیغام error میده

2- آیا میشه دگمه Open در پنجره باز شده به کلمه Save تغییر کنه یا اگه بشه فارسی بشن که خیلی خوب میشه حتی عنوان پنجره و ...؟

3- تاریخی که در نام می اندازه به شمسی ( با احتساب سال کبیسه و ... ) تغییر کنه

4- که خیلی مهم هست اینکه اگر بخوایم روی بک آپ قبلی ذخیره کنیم overwrite نمی کنه و یک فایل جدید می سازه



با سلام

مشکلات 1 و 3 و 4 حل شد
برای نام هم تنها کافی عدد بدیم خودش تاریخ شمسی را اضافه میکنه


فقط مونده دو تا مشکل


1- وقتی دگمه " بازیابی فایل پشتیبان " را می زنیم اگر کاربر هر فایلی زیپ شده را که با فرمت نام ذخیره شده نبا شه انتخاب کنه کلا فایل Backend حذف می شود و این مشکل در فایل اصلی جناب جناب Abbas Amiri (http://barnamenevis.org/member.php?189381-Abbas-Amiri) هم بود

2- آیا میشه دگمه Open در پنجره باز شده به کلمه Save تغییر کنه یا اگه بشه فارسی بشن که خیلی خوب میشه حتی عنوان پنجره و ...؟ ( که البته این مورد خیلی هم مهم نیست )

G.hemati
دوشنبه 14 اسفند 1391, 19:17 عصر
با سلام
دوستان روند خوبی برای تکمیل شدن نسخه پشتیبان گیری در پیش گرفتن که از همشون کمال تشکر رو دارم
خواستم یه پیشنهادی برای بهبود این روند بدم
اگه به جای دادن شماره , قبل از تاریخ شمسی بشه از ساعت سیستم استفاده کرد و اون رو در نام فایل ذخیره کرد ،عالی میشه (ترجیحاً بعد از تاریخ شمسی باشه) در اینصورت در هر مرحله نام فایل قبلی رو تکراری نمیشناسه و در ضمن به صورت دقیق مشخصه چه زمانی فایل پشتیبان گرفته شده
ممنون

hamid-nice
سه شنبه 15 اسفند 1391, 12:07 عصر
سلام
عزیز اگر کسی بخواد تو یک ساعت چند بار بک آپ بگیره اون وقت به ثانیه هم نیاز داره و گرنه رو فایل قبلیش تو یک ساعت overwrite می شه

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


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

چه کدی باید بنویسیم تا در قسمت file name در پنجره open file dialog وقتی باز می شه

1- به طور پیش فرض نام فایل نوشته شده باشه مثلا 14/2/91-#
و
2- روی فقط قسمت # را فوکوس کنه یا هایلایت کنه یا رنگیش کنه

3- چه کدی باید بنویسیم تا ارتباط جداول لینک شده reconnect بشه چون اگر مثلا جداول داخل برنامه را حذف کنیم برنامه نمی فهمه و هنوز فکر می کنه ارتباط برقرا هست و بک آپ میگیره ولی عملا فایلی در فایل زیپ شده وجود نخواهد داشت
می خوام روی دگمه بک آپ این را تعبیه کنم که اول reconnect بعد اگه جداول نبودند پیغام بده ارتباط برقرار نیست


4- دگمه های open , cancel را در پنجره هایی که برای انتخاب فایل ها باز می شن را می شه فارسی کرد ؟


با تشکر

Abbas Amiri
چهارشنبه 16 اسفند 1391, 23:14 عصر
سلام
درمورد شیء FileDialog شما بغیر از خصوصیات و متدهایی که در Object Browser میتوانید لیستی ازآنها راببینید ، کار دیگری نمیتوانید بکنید وباید به همین قناعت کنید . مگر اینگه قادرباشید درمحیطهای توسعه ای دیگر مثل ویژوال استودیو یک اکتیو ایکس بسازید و در اکسس ازآن استفاده کنید. ضمن اینکه عنوان دکمه Open ویا Save رو میتونید از طریق خصوصیت ButtonName تغییر دهید

hamid-nice
پنج شنبه 17 اسفند 1391, 21:38 عصر
با سلام

از سوالات بالا سوال 3 را جواب بدید تا نسخه تصحیح شده را بذارم گیر این سوالم بقیش خیلی مهم نیست بعدا دوستان هرکس تونست تکمیل تر می کنه

به عبارت دیگه :

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

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

توجه شود منظورم این نیست که فایل Backend پاک شود بلکه جداول داخل front پاک شوند


با تشکر

Abbas Amiri
پنج شنبه 17 اسفند 1391, 22:03 عصر
با سلام

از سوالات بالا سوال 3 را جواب بدید تا نسخه تصحیح شده را بذارم گیر این سوالم بقیش خیلی مهم نیست بعدا دوستان هرکس تونست تکمیل تر می کنه

به عبارت دیگه :

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

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

توجه شود منظورم این نیست که فایل Backend پاک شود بلکه جداول داخل front پاک شوند


با تشکر

سلام
درمورد ازبین رفتن لینک جداول ، اصلا چرا برنامه شما این اجازه را به کاربر بدهد؟ پس شما چکاره هستید؟
و اما برای چک کردن آسانترین راه ایجاد استفاده از کد زیر است.


If DCount("*", "MSysobjects", "Type=6") < LinkedTableCount Then
' type your code
End If

hamid-nice
پنج شنبه 17 اسفند 1391, 23:53 عصر
سلام دوست گرامی
دلیل های زیادی می تونه داشته باشه از جمله اینکه خیلی ها در برنامشون بوسیله کد جداولشون را حذف و دوباره به فایل دیگری متصل می کنند و در این بین ....

اما در مورد کدی که گذاشتید :
من یک دگمه و یک textbax ساختم که با زدن دگمه آدرس فایل backend را نشون بده پس حتی نه با پاک کردن جداول بلکه با تغییر لینک به یک فایل backend دیگری باید آدرس اون تغییر کنه که نمی کنه و در واقع اصلا ارتباط از نو refresh نمی شه و آدرس قبلی در حافظه برنامه مونده و

در واقع اگه بشه مقدار strBackendPath را همونطور که وقتی برنامه تازه باز می شود خالی هست با یک دستور خالی کرد می تونم از این تکنیک استفاده کنم و روی دگمه Backup در ابتدای فرمانهاش این دستور رو قرار بدم که مشکل حل می شه

دستور زیر را هم که می ذارم در نبود جداول پیغام نمیاد

یعنی این کد عمل نمی کنه یا من منظور شما را درست متوجه نشدم ؟

در ضمن
آیا کدی هم هست که بشه با جرای اون مثل این باشه که کلا فایل برنامه را بسته و دوباره باز کرده باشیم بدون اینکه واقعا برنامه بسته شود ؟
If DCount("*", "MSysobjects", "Type=6") < LinkedTableCount Then
MsgBox ("No exist Backend file")
End If

Abbas Amiri
جمعه 18 اسفند 1391, 23:55 عصر
سلام در مورد کد فوق LinkedTableCount تعداد جداول لینک شده به دیتابیس است که باید مقدار آن را بنویسید . فرض کنیم 20 جدول اینک شده داریم و چند تا از آنها پاک شده اند در آن صورت شرط If محقق شده و عبارت داخل آن اجرا میشود
در مورد مقدار دهی به آدرس لینک جداول هم کافیست مانند زیر عمل کنید:


CurrentDb.TableDefs ("MyTable").Connect = ";DATABASE=" & strBackendPath
CurrentDb.TableDefs ("MyTable").RefreshLink

hamid-nice
شنبه 19 اسفند 1391, 16:04 عصر
CurrentDb.TableDefs ("MyTable").Connect = ";DATABASE=" & strBackendPath
CurrentDb.TableDefs ("MyTable").RefreshLink




سلام
1- کد جدید عمل می کند ولی استفاده از آن مستلزم نوشتن این کد برای تک تک جداول هست بنابراین ترجیح
می دم از همان کد اول استفاده شود که
برای یک فایلی که 3 جدول لینکی در آن باشد به صورت زیر نوشتم

If DCount("*", "MSysobjects", "Type=6") < 3 Then
MsgBox ("No exist Backend file")
End If

یعنی هنوز وقتی جدولی حذف یا اضافه می شود پیغام ظاهر نمی شود

2- یک دستور دیگه هست به صورت

................. CurrentDb.TableDefs.Count

که نمی دونم چه طور باید ادامه اون رو نوشت به نظر شما استفاده از این کدنسبت به کدهایی که دادید نقص داره اگه نه چطور باید برای منظور ما نوشت؟

توجه :
اگه کدی هست که بشه این هدف را بدون نیاز به ریفرنس ارضا کنه لطفا اون رو بگید و همچنین آیا می شه برای تابع
strBackendPath که تعریف کرده اید هم با کدی که نیاز به ریفرنس نداشته باشه جایگزین کرد چون تا اینجا همه ریفرنس ها را حذف کردم فقط ریفرنس مربوط به دستورات DAO مونده که اون هم فقط برای این تابع لازم هست اگر هم نه که لطف کنید بگید از خیر کار کردن روی حذف ریفرنس بگذرم و کد فوق اصلاح بشه کار تمومه انشاالله.

با تشکر

Abbas Amiri
شنبه 19 اسفند 1391, 18:48 عصر
درمورد کدی که تعداد جداول لینک شده برمیگرداند بصورت زیر تغییر دهید :


If DCount("*", "MSysobjects", "Type=6 AND Left(Name,1)<>'~' ") < 3 Then
MsgBox ("No exist Backend file")
End If

درمورد کد لینک ها هم مسلما منظور من بصورت تک تک نبود . آنها را دریک حلقه آپدیت کنید.

hamid-nice
شنبه 19 اسفند 1391, 23:56 عصر
درمورد کدی که تعداد جداول لینک شده برمیگرداند بصورت زیر تغییر دهید :


If DCount("*", "MSysobjects", "Type=6 AND Left(Name,1)<>'~' ") < 3 Then
MsgBox ("No exist Backend file")
End If

درمورد کد لینک ها هم مسلما منظور من بصورت تک تک نبود . آنها را دریک حلقه آپدیت کنید.


با سلام و تشکر فراوان از شما دوست گرامی

توجه ، پی گیری و صبر و حوصله و پاسخ های خوبتان خیلی کمک کرد تا روی فایلی که از ابتدا زحمتش را کشیدید و ارایه کردی با کمک خودتون تغییراتی به انجام برسد که فایل حاصله را در ضمیمه قرار داده ام

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

نیاز :
درصورتی که ما یکی از فایل های بک آپ را بازیابی کرده باشیم و نخواهیم فایل بک آپ دیگری را جایگزین کنیم بلکه مثلا بخواهیم اطلاعات فایل بک آپ دیگر چند ماه قبل را به آن اضافه کنیم ، چطور می توان با زدن دگمه ای این کار را انجام دهیم(با اطمینان و بدون ریسک )
ضمنا لطف کنید فایل زیر را هم چک کنید اگه کدی کم یا زیاد یا نیاز به اصلاح دارد مخصوصا کدی که در قسمت zipکردن برای error نوشتم (چون این را اگه برداریم وقتی پنجره backup گیری باز می شود و دگمه کنسل را یزنیم error می ده )
اگه احتمال خطا دارد رفع بفرمایید یا تذکر دهید تا اصلاح کنم


با تشکر

azadich
یک شنبه 20 اسفند 1391, 10:41 صبح
با سلام و تشکر فراوان از شما دوست گرامی

توجه ، پی گیری و صبر و حوصله و پاسخ های خوبتان خیلی کمک کرد تا روی فایلی که از ابتدا زحمتش را کشیدید و ارایه کردی با کمک خودتون تغییراتی به انجام برسد که فایل حاصله را در ضمیمه قرار داده ام

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

نیاز :
درصورتی که ما یکی از فایل های بک آپ را بازیابی کرده باشیم و نخواهیم فایل بک آپ دیگری را جایگزین کنیم بلکه مثلا بخواهیم اطلاعات فایل بک آپ دیگر چند ماه قبل را به آن اضافه کنیم ، چطور می توان با زدن دگمه ای این کار را انجام دهیم(با اطمینان و بدون ریسک )
ضمنا لطف کنید فایل زیر را هم چک کنید اگه کدی کم یا زیاد یا نیاز به اصلاح دارد مخصوصا کدی که در قسمت zipکردن برای error نوشتم (چون این را اگه برداریم وقتی پنجره backup گیری باز می شود و دگمه کنسل را یزنیم error می ده )
اگه احتمال خطا دارد رفع بفرمایید یا تذکر دهید تا اصلاح کنم


با تشکر
با سلام،نمونه را ملاحظه فرمایید از بانک بدون پسورد بک آپ می گیره اما موقعی که بانک پسورد داشته باشه بک آپ نمی گیره یعنی یعنی فقط پوشه خالی بک آپ میگیره.پسورد فایل ارسالی 1 هست ببینید وقتی بانک پسورد داره چه کار باید کرد.متشکر

azadich
یک شنبه 20 اسفند 1391, 18:02 عصر
با سلام،نمونه را ملاحظه فرمایید از بانک بدون پسورد بک آپ می گیره اما موقعی که بانک پسورد داشته باشه بک آپ نمی گیره یعنی یعنی فقط پوشه خالی بک آپ میگیره.پسورد فایل ارسالی 1 هست ببینید وقتی بانک پسورد داره چه کار باید کرد.متشکر
یعنی نمیشه دوستان؟!

hamid-nice
یک شنبه 20 اسفند 1391, 21:34 عصر
سلام
اگه نشه که همه زحمت ها بی فایده می شه

امیدوارم یه راه حلی ارایه دهند


با تشکر

Abbas Amiri
یک شنبه 20 اسفند 1391, 21:58 عصر
سلام
با اصلاح تابع strBackendPath امکان پذیر است


Function strBackendPath(Optional PathPart As FileNameAttr = -1) As String
Dim tdf As TableDef, sPath As String, k As Integer
For Each tdf In CurrentDb.TableDefs
If Len(tdf.Connect) > 8 Then
sPath = tdf.Connect
Exit For
End If
Next
If Len(CStr(sPath)) = 0 Then
MsgBox "جدول لینک شده وجودندارد"
Exit Function
End If
If Left(sPath, 10) = ";DATABASE=" Then
sPath = Replace(sPath, ";DATABASE=", "")
ElseIf Left(sPath, 14) = "MS Access;PWD=" Then
k = InStr(sPath, ":") - 2
sPath = Right(sPath, Len(sPath) - k)
End If
If PathPart <> -1 Then
sPath = GetFileFromPath(sPath, PathPart)
End If
strBackendPath = sPath
End Function

hamid-nice
یک شنبه 20 اسفند 1391, 22:29 عصر
ب
نیاز :
درصورتی که ما یکی از فایل های بک آپ را بازیابی کرده باشیم و نخواهیم فایل بک آپ دیگری را جایگزین کنیم بلکه مثلا بخواهیم اطلاعات فایل بک آپ دیگر چند ماه قبل را به آن اضافه کنیم ، چطور می توان با زدن دگمه ای این کار را انجام دهیم(با اطمینان و بدون ریسک )


با تشکر

با سلام
جناب امیری من هنوز منتظر راه حلتون برای نیاز ی که مطرح کردم هستم ( در واقع اضافه کردن اطلاعات جداول از یک فایل به جداول جاری )

با تشکر

Abbas Amiri
یک شنبه 20 اسفند 1391, 22:50 عصر
با سلام
جناب امیری من هنوز منتظر راه حلتون برای نیاز ی که مطرح کردم هستم ( در واقع اضافه کردن اطلاعات جداول از یک فایل به جداول جاری )

با تشکر

سلام
اضافه کردن اطلاعات جداول از فایل به فایل دیگر چندان منطقی بنظر نمیرسد .
ولی برای جایگزین کردن جداول فایل جاری با جداول فایل دیگر پست زیر را ببینید.

http://barnamenevis.org/showthread.php?300895-%D8%B3%D9%88%D8%A7%D9%84-%D8%B7%D8%B1%DB%8C%D9%82%D9%87-%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84-%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%DA%A9%D8%B3%D8%B3-%D8%A8%D9%87-%D8%A8%D8%A7%D9%86%DA%A9%DB%8C-%D8%AF%DB%8C%DA%AF%D8%B1-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%DB%8C%D9%86-%D8%A2%D9%86%D9%87%D8%A7-(relationship)&p=1706051&viewfull=1#post1706051

hamid-nice
دوشنبه 21 اسفند 1391, 00:55 صبح
با سلام

چرا منطقی نیست !!!!

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

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

حال چه راه حلی برای انجام این کار پیشنهاد می کنید ؟

با تشکر

azadich
دوشنبه 21 اسفند 1391, 07:49 صبح
سلام
با اصلاح تابع strBackendPath امکان پذیر است


Function strBackendPath(Optional PathPart As FileNameAttr = -1) As String
Dim tdf As TableDef, sPath As String, k As Integer
For Each tdf In CurrentDb.TableDefs
If Len(tdf.Connect) > 8 Then
sPath = tdf.Connect
Exit For
End If
Next
If Len(CStr(sPath)) = 0 Then
MsgBox "جدول لینک شده وجودندارد"
Exit Function
End If
If Left(sPath, 10) = ";DATABASE=" Then
sPath = Replace(sPath, ";DATABASE=", "")
ElseIf Left(sPath, 14) = "MS Access;PWD=" Then
k = InStr(sPath, ":") - 2
sPath = Right(sPath, Len(sPath) - k)
End If
If PathPart <> -1 Then
sPath = GetFileFromPath(sPath, PathPart)
End If
strBackendPath = sPath
End Function

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

hamid-nice
دوشنبه 21 اسفند 1391, 12:48 عصر
خیلی ممنون، اما من این تابع را بکار بردم باز هم از بانک پسورد دار بک آپ نگرفت یعنی پوشه خالی بک آپ گرفت لطف کنید ببینید اشکال کار کجاست.

سلام

اشتباه می کنید من این کد را جایگزین کردم و بک آپ درست گرفته می شود (شما ابتدا جداول را حذف کنید سپس دوباره import کنید که از شما پسورد را بپرسد و وارد کنید بعد backup بگیرید اگه نشد وقتی جناب امیری دو تا مشکل زیر را حل کنند من فایل نهایی را که بذارم می تونید ازش استفاده کنید که این مشکل در اون حل شده است )
در ضمن فایلتون را اصلاح کردم در ضمیمه می تونید بردارید


و لی مشکل را اشتباه تشخیص دادید

چون یک مشکل جدید بوجود اومده و اینکه موقع بازیابی اطلاعات کنار فایل بک آپ فایل backend را از حالت زیپ شده در می یاره و کنار فایل بک آپ گیری شده قرار میده

جناب امیری حالا دو تا مساله داریم یکی این مشکل بوجود اومده و دیگری همونکه در پست 33 گفتم

منتظر پاسخ شما برای تکمیل کار هستم

با تشکر

Abbas Amiri
دوشنبه 21 اسفند 1391, 20:11 عصر
سلام
زمانی که ازمنطقی نبودن صحبت میشود ، مثلا میتوان از رفتار ماژول فوق در مورد رکوردهای تکراری نام برد دراینصورت آیا این رکوردها جایگزین شوند ویا نادیده گرفته شوند . ضمن اینکه همیشه ارائه راه حل راحت نیست وگاهی اوقات به ملاحظاتی برمیخورد که شخص باید وقت روی آن بگذارد . بااین حال در اولین فرصت بنده و اگر هم دوستان دیگر مشارکت کنند جوابگویی خواهد شد تا برای اعضای محترم تالار نتیجه بخش باشد .
ناگفته نماند که آقا حمید هم بدجوری پیله است .و ایشان بواسطه پیگیریها و جمع آوری مطالب ، تاپیک را به جلوبرده اند .

hamid-nice
دوشنبه 21 اسفند 1391, 20:58 عصر
با سلام


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

ضمن اینکه منتظر ارایه راهکار خوبتان هستیم اما برای اینکه کار بعضی ها که شاید نیازی به این اضافه شدن ندارند و صرفا به بک آپ گیری نیاز دارند هم زودتر راه بیافته مشکل از زیپ خارج شدن هنگام بازیابی اطلاعات را رفع بفرمایید که با تغییر کد در بالا بوجود اومده است

با تشکر

azadich
دوشنبه 21 اسفند 1391, 21:01 عصر
سلام
زمانی که ازمنطقی نبودن صحبت میشود ، مثلا میتوان از رفتار ماژول فوق در مورد رکوردهای تکراری نام برد دراینصورت آیا این رکوردها جایگزین شوند ویا نادیده گرفته شوند . ضمن اینکه همیشه ارائه راه حل راحت نیست وگاهی اوقات به ملاحظاتی برمیخورد که شخص باید وقت روی آن بگذارد . بااین حال در اولین فرصت بنده و اگر هم دوستان دیگر مشارکت کنند جوابگویی خواهد شد تا برای اعضای محترم تالار نتیجه بخش باشد .
ناگفته نماند که آقا حمید هم بدجوری پیله است .و ایشان بواسطه پیگیریها و جمع آوری مطالب ، تاپیک را به جلوبرده اند .
درسته بک آپ می گرفت اشتباه من این بود که جلو pwd رمز فایلم را وارد کرده بودم.بی نهایت تشکر

hamid-nice
چهارشنبه 15 خرداد 1392, 12:18 عصر
با سلام
یک مشکل اساسی هنوز باقی مانده :

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

با تشکر

hamid-nice
سه شنبه 21 خرداد 1392, 23:50 عصر
با سلام
یک مشکل اساسی هنوز باقی مانده :

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

با تشکر
برای مشکل فوق می توان دستورات بازیابی فایل پشتیبان را به صورت زیر جایگزین کرد :
On Error Resume Next
'On Error GoTo ErrH
Dim sFileName As String, strZipPath As String
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = False
.InitialFileName = CurrentProject.Path & "\Backup\"
.Title = "ÇäÊÎÇÈ ÝÇíá ÔÊíÈÇä ÌåÊ ÈÇÒíÇÈí"
.Filters.Add "zip Files", "*.zip", 1
If .Show Then
strZipPath = .SelectedItems(1)
Else
Exit Sub
End If
End With
sFileName = UnZip(GetFileFromPath(strZipPath, PathOnly), CVar(strZipPath), True)
If StrComp(sFileName, strBackendPath(NameAndExtention), vbTextCompare) <> 0 Then Exit Sub
sFileName = GetFileFromPath(strZipPath, PathOnly) & sFileName
If Dir(sFileName) <> "" Then
Kill sFileName
End If
UnZip GetFileFromPath(strZipPath, PathOnly), CVar(strZipPath)
' Kill strBackendPath
FileCopy sFileName, strBackendPath
'ImportTablesAndRelations sFileName
MsgBox "ÚãáíÇÊ ÈÇÒíÇÈí ÈÇ ãæÝÞíÊ ÇäÌÇã ÔÏ"
If sFileName = strBackendPath Then
Exit Sub
Else
Kill sFileName
End If
Exit Sub
'ErrH:
' MsgBox "Error"


نمونه ضمیمه زیر هم نمونه ای با امکانات بیشتر از فایل های قبلی است مثلا امکان ذخیره فایل پشتیبان با نام همراه با تاریخ شمسی و بدون تاریخ شمی به انتخاب کاربر است که امید است مفید واقع شود
موفق باشید

توجه : در دستورات فوق اگر On Error Resume Nex را حذف کنیم وقتی فایل بک آپ کنار فایل Back End باشد در هنگام کپی پیغام ... Access denided می دهد ولی عمل بازیابی انجام می گیرد
اگر هم ، کسی به ایرادی برخورد لطفا مطرح نماید تا به کمک دوستان رفع شود
با تشکر

hamid-nice
جمعه 24 خرداد 1392, 01:14 صبح
با سلام
در فایل ضمیمه پست قبل ایرادی وجود داشت که تصحیح شد و در پست قبل تصحیح شده آن ، جایگزین شد

در ضمن در ضمیمه زیر امکانات دیگر زیر نیز اضافه شده است
1- compact کردن فایل Back End (که می تواند در شماره گذاری فیلد Auto Number هم سودمند باشد) با اضافه کردن ماژول Modulecompact(که از همین سایت گرفتم) که اگر فایل back end پسورد دارد باید در این ماژول پسورد آن را به جای 1 در "p="1 که در این ماژول در حال حاضردر نظر گرفته شده ، جایگزین کنید
2-اضافه شدن دستورات زیر قبل از بک آپ گیری به منظور چک کردن وجود جداول (که در اینجا عدد 3 هست که شما باید تعداد جداولتان را جایگزین آن کنید)
Dim TDF As TableDef
For Each TDF In CurrentDb.TableDefs
CurrentDb.TableDefs.Refresh
Next
src = strBackendPath
If src = "" Then Exit Sub
If DCount("*", "MSysobjects", "Type=6 AND Left(Name,1)<>'~' ") < 3 Then
MsgBoxFa ("ÌÏæá áíä˜ ÔÏå æÌæÏ äÏÇÑÏ")
Exit Sub
End If

موفق باشید

Nazir Ahmad
چهارشنبه 27 فروردین 1393, 10:38 صبح
با سلام
در فایل ضمیمه پست قبل ایرادی وجود داشت که تصحیح شد و در پست قبل تصحیح شده آن ، جایگزین شد

در ضمن در ضمیمه زیر امکانات دیگر زیر نیز اضافه شده است
1- compact کردن فایل Back End (که می تواند در شماره گذاری فیلد Auto Number هم سودمند باشد) با اضافه کردن ماژول Modulecompact(که از همین سایت گرفتم) که اگر فایل back end پسورد دارد باید در این ماژول پسورد آن را به جای 1 در "p="1 که در این ماژول در حال حاضردر نظر گرفته شده ، جایگزین کنید
2-اضافه شدن دستورات زیر قبل از بک آپ گیری به منظور چک کردن وجود جداول (که در اینجا عدد 3 هست که شما باید تعداد جداولتان را جایگزین آن کنید)
Dim TDF As TableDef
For Each TDF In CurrentDb.TableDefs
CurrentDb.TableDefs.Refresh
Next
src = strBackendPath
If src = "" Then Exit Sub
If DCount("*", "MSysobjects", "Type=6 AND Left(Name,1)<>'~' ") < 3 Then
MsgBoxFa ("ÌÏæá áíä˜ ÔÏå æÌæÏ äÏÇÑÏ")
Exit Sub
End If

موفق باشید

سلام hamid-nice (http://barnamenevis.org/member.php?156506-hamid-nice) عزیز
واقعا نمونة جالبی برای بکاپ تهیه کردید.
حالا من با این نمونه چند تا مشکل دارم که اگز لطف کنید و فایل رو به ترتیب زیر اصلاح کنید ممنون میشم.
در اصل من میخوام زمانی که از فرم اصلی خارج میشیم یعنی در رویداد On Close فرم اصلی و یا با کلیک روی دکمة خروج که تهیه شده بکاپ به طور خودکار گرفته بشه .
1- من میخوام که پیغام‌هایی که بعد از کلیک روی دکمه بکاپ میاد غیر فعال بشه (مثل "آیا از برنامه بکاپ گرفته شود" یا "آیا از تاریخ شمسی استفاده شود") . البته این مشکل آسون حل میشه.
2- آدرس فایل دیگه پرسیده نشه و مستقیم یه آدرس پیش‌فرض معرفی کنیم که همیشه بره همونجا بکاپ گرفته شه.
3- در صورت امکان فایل زیپی که ساخته میشه دارای پسورد باشه (یعنی ما یه پسورد پیش فرض معرفی کنیم و همیشه زمان بکاپ گرفتن فایل بکاپ زیب شده پسورد داشته باشه)
4- به جای نامی که خودمون برای فایل بکاپ انتخاب میکنیم نام پیش فرض همون تاریخ شمسی باشه + ساعت ویندوز

پیشاپیش از همکاری شما ممنون
یا حق

Nazir Ahmad
شنبه 30 فروردین 1393, 10:18 صبح
سلام خدمت اساتید گرامی
فایلی که در پست قبلی توسط دوست عزیز hamid-nice (http://barnamenevis.org/member.php?156506-hamid-nice) گذاشته شده، به طور کامل از بانک BadkEnd در یه فایل زیپ شده پشتیبان میگیره.
یه مشکل اساسی داره اونم اینه که وقتی عملیات فشرده سازی و پشتیبان‌گیری تمام میشه، فایل BackEnd رو پسورد میده که پیش فرض "1" است؛ حالا مشکل اینه که فایلی که درحال استفاده هست هم پسورد داره میشه و حتی جداول لینک شده در فایل FronEnd دیگه باز نمیشه.

اما من دوتا مشکل دیگه‌ هم دارم. ا ول که میخوام دیگه پیغامهای اضافی مثل پرسش برای تاریخ شمسی و یا پرسش برای محل ذخیره سازی فایل دیگه نیاد و مستقیم در یه محل تعیین شده پشتیبان گرفته بشه (البته به طور ناقص مشکل رو حل کردم اما فقط بکاپ رو در محل فایل اصلی به صورت یه فایل زیپ شده خالی میگیره). و دوم اینکه از اجزای فایل Front End هم پشتیبان گرفته بشه. (و در صورت امکان تمام اجزای فایل FrontEnd تو خود فایل پشتیبان‌گرفته شده اضافه بشه)
ممنون میشم اگر اساتید محترم در فایل ضمیمه همکاری کنند.

یا حق

sh.shahrokh
سه شنبه 03 تیر 1393, 13:30 عصر
ببخشید تمام لینک هایی که گذاشتید مربوط به نسخه های 32 بیتی است می شه برای 64 بیتی هم یک لینک بگذارید.
ممنون