The code at the end of this post is for backing up the database silently (without the backup dialog popping up). It can be cut and pasted into the code editor and run directly.... maybe... read on...
The problem is in Line 26:
OK. Besides that there is no documentation for this function, the first parameter, which sets the file path for the backup zip file, is the problem. I cannot get this script to run from a button call from a main menu form using a variable for the file location. When the path is hard coded, a form button call works, and running from Code Editor works. When the variable generated in lines 3-9, backup_path, is used directly:
it will not run from either the button call or from the Code Editor. BUT, if the path variable is evaluated:
it will run from the Code editor, but not from a form button call.
I'd like to have the app I'm distributing have a user-chosen, silent backup to a subfolder within the folder where the app resides. I can't hard code that. What to do, what to do?? Thanks for any help!
The problem is in Line 26:
zipfilename = a5_backup_filename("C:\Databases\DC\backups",a5.get_name(),comment_text)
zipfilename = a5_backup_filename(backup_path,a5.get_name(),comment_text)
zipfilename = a5_backup_filename(a5_evaluate_expression(backup_path),a5.get_name,comment_text)
I'd like to have the app I'm distributing have a user-chosen, silent backup to a subfolder within the folder where the app resides. I can't hard code that. What to do, what to do?? Thanks for any help!
Code:
'Set backup location as to folder where app loaded. If app is loaded as a shadowed application (get_master_path) dim backup_path as C="" IF a5.Get_Master_Path() = "" backup_path = a5.Get_Path() + chr(92) ELSE backup_path = a5.Get_Master_Path() + chr(92) END IF backup_path=alltrim(backup_path)+"backups" 'msgbox(backup_path) ' start code for backup code_to_execute = <<%code% dim files_to_backup as c files_to_backup = filefind.get(a5.get_path()+chr(92)+"*.dbf") files_to_backup = files_to_backup+crlf()+filefind.get(a5.Get_Path()+chr(92)+"*.cdx") 'convert relative filenames to absolute filenames files_to_backup = *for_each(x,filename_absolute(x),files_to_backup) DIM comment_text as c comment_text = "" DIM zipfilename as C 'Generate a filename for the backup using a special naming sequence zipfilename = a5_backup_filename("C:\Databases\DC\backups",a5.get_name(),comment_text) if files_to_backup <> "" then a5_zip_files_w_fback(files_to_backup,zipfilename,.t.,.t.,.f.) dim message_confirmation as c message_confirmation = "Selected Database files were backed up to: '"+zipfilename+"'" confirm_result = ui_dlg_box("Note",<<%dlg% {lf}; {text=80,3:message_confirmation}; {line=1,0}; <View backup Log!view> <Close>; %dlg%) if confirm_result = "view" then dim flag_temp as l flag_temp = file.unzip(zipfilename,"Database",file.temp_path_get()) if flag_temp = .t. then dim temp_text as c temp_text = get_from_file(file.temp_path_get()+"Database") ui_dlg_box("backup Log - "+zipfilename,"[%M%.120,30temp_text];<10&OK>;") ELSE ui_msg_box("Error","Could not open the backup log.",UI_STOP_SYMBOL) END IF end if else UI_msg_box("Error","No files were specified to backup.") end if %code% dim cmd_initial as c cmd_initial = code_to_execute dim msg as c msg = "In order to backup files, all open Windows must first be closed. OK to close all open Windows?" dim cmd_result as c 'get list of all open windows........................................... dim open_windows as c open_windows = a5_list_open_windows() dim current_window as c if is_object(topparent.this) if topparent.class() = "form" .or. topparent.class() = "browse" then current_window = topparent.name() 'remove the current window from the list open_windows = word_subtract(open_windows,current_window,crlf()) end if end if 'generate the xbasic to close all of the open windows (excepting the current window).................... dim cmd_close as c dim cmd_result as c cmd_result = "" flagOpenThenCloseCP = .f. if open_windows <> "" then cmd_close = *for_each(x,x+".close()" , open_windows) ''now execute the xbasic cmd_result = evaluate_template(cmd_close) end if if cmd_result <> "" then ui_msg_box("Error",cmd_result) else 'was successfull in closing down all open windows.... so proceed if is_object(topparent.this) then if topparent.class() = "form" .or. topparent.class() = "browse" then dim q_msg as n q_msg = ui_msg_box("Notice",msg,UI_ATTENTION_SYMBOL+UI_OK_CANCEL) if q_msg = ui_ok_selected then dim topparent_name as c dim cmd as c dim condition as c dim open_sessions as c open_sessions = session_enum() dim open_session_count as n open_session_count = line_count(open_sessions) if topparent.class() = "form" then cmd = "dim tempP as p; tempP = form.view(" + quote(topparent.name(1)+"@" + topparent.Dictionary_Get(1))+")" else cmd = "dim tempP as p; tempP = browse.view(" +quote( topparent.name(1)+"@" + topparent.Dictionary_Get(1))+")" end if if a5_IsMaximized() = .t. then cmd = cmd + crlf() +"xbasic_wait_for_idle()" + crlf() + "tempP.maximize()" + crlf() end if 'when the number of sessions is one less than the number before the layout is closed then 'the session that the form/browse was based on has been closed, and it is safe to run the 'command. condition = "line_count(session_enum()) = " + (open_session_count - 1 ) cmd = cmd_initial + crlf() + cmd 'is the control panel hidden? if so then you have to temporarily show it, or else the database will close 'after you close this form. if ControlPanel.IsVisible() = .f. then ControlPanel.Minimize() cmd = cmd + crlf() + "controlpanel.hide()" if a5_IsMaximized() then topparent.restore() end if end if on_condition(condition,cmd) topparent.close() end if else 'topparent is an object, but it is not a form or browse cmd_result = evaluate_template(cmd_initial) if cmd_result <> "" then ui_msg_box("Error",cmd_result) end if end if else ' topparent is not an object cmd_result = evaluate_template(cmd_initial) if cmd_result <> "" then ui_msg_box("Error",cmd_result) end if end if end if
Comment