Alpha Software Mobile Development Tools:   Alpha Anywhere    |   Alpha TransForm subscribe to our YouTube Channel  Follow Us on LinkedIn  Follow Us on Twitter  Follow Us on Facebook

Announcement

Collapse

The Alpha Software Forum Participation Guidelines

The Alpha Software Forum is a free forum created for Alpha Software Developer Community to ask for help, exchange ideas, and share solutions. Alpha Software strives to create an environment where all members of the community can feel safe to participate. In order to ensure the Alpha Software Forum is a place where all feel welcome, forum participants are expected to behave as follows:
  • Be professional in your conduct
  • Be kind to others
  • Be constructive when giving feedback
  • Be open to new ideas and suggestions
  • Stay on topic


Be sure all comments and threads you post are respectful. Posts that contain any of the following content will be considered a violation of your agreement as a member of the Alpha Software Forum Community and will be moderated:
  • Spam.
  • Vulgar language.
  • Quotes from private conversations without permission, including pricing and other sales related discussions.
  • Personal attacks, insults, or subtle put-downs.
  • Harassment, bullying, threatening, mocking, shaming, or deriding anyone.
  • Sexist, racist, homophobic, transphobic, ableist, or otherwise discriminatory jokes and language.
  • Sexually explicit or violent material, links, or language.
  • Pirated, hacked, or copyright-infringing material.
  • Encouraging of others to engage in the above behaviors.


If a thread or post is found to contain any of the content outlined above, a moderator may choose to take one of the following actions:
  • Remove the Post or Thread - the content is removed from the forum.
  • Place the User in Moderation - all posts and new threads must be approved by a moderator before they are posted.
  • Temporarily Ban the User - user is banned from forum for a period of time.
  • Permanently Ban the User - user is permanently banned from the forum.


Moderators may also rename posts and threads if they are too generic or do not property reflect the content.

Moderators may move threads if they have been posted in the incorrect forum.

Threads/Posts questioning specific moderator decisions or actions (such as "why was a user banned?") are not allowed and will be removed.

The owners of Alpha Software Corporation (Forum Owner) reserve the right to remove, edit, move, or close any thread for any reason; or ban any forum member without notice, reason, or explanation.

Community members are encouraged to click the "Report Post" icon in the lower left of a given post if they feel the post is in violation of the rules. This will alert the Moderators to take a look.

Alpha Software Corporation may amend the guidelines from time to time and may also vary the procedures it sets out where appropriate in a particular case. Your agreement to comply with the guidelines will be deemed agreement to any changes to it.



Bonus TIPS for Successful Posting

Try a Search First
It is highly recommended that a Search be done on your topic before posting, as many questions have been answered in prior posts. As with any search engine, the shorter the search term, the more "hits" will be returned, but the more specific the search term is, the greater the relevance of those "hits". Searching for "table" might well return every message on the board while "tablesum" would greatly restrict the number of messages returned.

When you do post
First, make sure you are posting your question in the correct forum. For example, if you post an issue regarding Desktop applications on the Mobile & Browser Applications board , not only will your question not be seen by the appropriate audience, it may also be removed or relocated.

The more detail you provide about your problem or question, the more likely someone is to understand your request and be able to help. A sample database with a minimum of records (and its support files, zipped together) will make it much easier to diagnose issues with your application. Screen shots of error messages are especially helpful.

When explaining how to reproduce your problem, please be as detailed as possible. Describe every step, click-by-click and keypress-by-keypress. Otherwise when others try to duplicate your problem, they may do something slightly different and end up with different results.

A note about attachments
You may only attach one file to each message. Attachment file size is limited to 2MB. If you need to include several files, you may do so by zipping them into a single archive.

If you forgot to attach your files to your post, please do NOT create a new thread. Instead, reply to your original message and attach the file there.

When attaching screen shots, it is best to attach an image file (.BMP, .JPG, .GIF, .PNG, etc.) or a zip file of several images, as opposed to a Word document containing the screen shots. Because Word documents are prone to viruses, many message board users will not open your Word file, therefore limiting their ability to help you.

Similarly, if you are uploading a zipped archive, you should simply create a .ZIP file and not a self-extracting .EXE as many users will not run your EXE file.
See more
See less

Can't ZAP File - In Use

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    #16
    Re: Can't ZAP File - In Use

    Hi Robert,

    Originally posted by SNusa View Post
    I think I've got it figured out: Closing a form also closes an underlying table. (But you can't close the table that a form is based on, without closing the form itself.) ~ On this premise, there is no bug, but the [no table found] error returned is a bit misleading, and "subject to misinterpretation."[/INDENT]
    (This is based upon testing in V8)

    When you enumerate all open tables, you are getting a list of all tables (actually their aliases) from all sessions (threads) that have tables open. Almost all layouts (forms, browses, etc) are run in different sessions. When you do a table.get(tablenameAlias), it only gets a table from the current session. If you select a tablenameAlias that is not open in the current session (like the interactive window), it will not get the pointer to a non-open anything (and will error as well), hence you can't close that object either.

    I'll add, that you probably can change the session effectively using a With/End With construct using a pointer to the other session's variable space, although I have not tried it with table.get(), so I can't say this as a fact. You can also do this in the Interactive Window by

    Now suppose you got the pointer to another sessions table, using the menu "Set Interactive Window Session..." choice, table.get() should work with tables from that session, again untested as of this time.

    However, leaving the session setting alone, here is what happens;
    tbl=formname.Table_Get()
    ?tbl.name_get()
    = "tablename"

    Now that you have the form's table, try to close it. THIS WILL HANG ALPHA!!!
    tbl.close()

    When you switch to the form, it will display "Table not open" or similar message in a modal dialog box, that you will not be able to close, at which point you will need to close Alpha Five with the task manager.

    Which basically comes down to the similar thing I preach about variables, do not delete/close resources that you did not create/invoke etc. While you can reference them all you want, and within reason, modify values of other threads, you must be careful when deleting it's required resources.

    So you can close the form (which will delete the thread, table opens and other resources of it's thread), but you can't just go and delete it's underlying table.

    So the next question is whether ?TABLE.enum_open() is checking to see if any of the tables attached to the database are open, or whether it is any table that is opened by Alpha, attached or not.

    The answer is that it doesn't matter if it is attached, just whether it is open. Now Alpha has a function
    a5_ForceCloseTables()

    that will close all tables everywhere if they are not associated with a session (MDI window), but there is a fair amount of code done to enumerate all tables of other sessions and not delete those that are in other sessions. An orphan table will, however, be closed.

    So there is really nothing special happening here, Alpha is acting in a reasonable way. It would have been nice for TABLE.enum_open() to return the associated window pointer object name (as an option), but they did not.
    Last edited by csda1; 05-04-2012, 04:51 PM. Reason: Added Session changing info
    Regards,

    Ira J. Perlow
    Computer Systems Design


    CSDA A5 Products
    New - Free CSDA DiagInfo - v1.39, 30 Apr 2013
    CSDA Barcode Functions

    CSDA Code Utility
    CSDA Screen Capture


    Comment


      #17
      Re: Can't ZAP File - In Use

      Originally posted by csda1 View Post
      It would have been nice for TABLE.enum_open() to return the associated window pointer object name (as an option), but they did not.
      Thanks Ira;

      Understood & thank you. ~I see how TABLE.enum_open() (if it returned a pointer) could have enabled one's code to (albeit dangerously) gain access to all the tables in other threads/sessions (forms,browses, scripts etc.) ~ "Feeling better now about this, as I'm seeing the light."

      Hey, Ira, could you help me replace my Lenovo T61 BIOS with a working copy of Alpha5 v.11 Developer via remote desktop?
      (Seriously though: I truly appreciate your responses here on this forum.)

      PS everyone: I think that Ira just solved the OP's "ZAP" problem with the a5_ForceCloseTables() function!
      Last edited by SNusa; 05-04-2012, 09:06 AM.
      Robert T. ~ "I enjoy manipulating data... just not my data."
      It's all about the "framework." (I suppose an "a5-induced" hard drive crash is now in order?)
      RELOADED: My current posting activity here merely represents a "Momentary Lapse Of Reason."

      Comment


        #18
        Re: Can't ZAP File - In Use

        I know this is a little late for this discussion but I have a generic function that addresses this issue.

        I've working on a project that used several scripts that required exclusive access to tables, ZAP's imports stuff like that. However I wanted to run them from a button on a form that used the same table. I finally came up with the following generic function that allows this to happens. The original idea came from a xBasic code generated by the Genie for a backup operation. I think the code is well explained so I don't plan to say more other then;

        Attach the following code to the OnPush event of your button on the form. Where ScriptToRun is your script that you want to run.

        CloseAllWindowsRun("ScriptToRun")

        Code:
        'Date Created: 06-Feb-2013 11:57:47 AM
        'Last Updated: 28-Jun-2013 08:59:23 AM
        'Created By  : verboopa2
        'Updated By  : verboopa2
        FUNCTION CloseAllWindowsRun AS C (Script as C)
        '---------------
        'CloseAllWindowsRun
        '---------------
        	'This function closes all windows including the form or
        	'browse it was launch from. The main menu is not closed.
        	'It will then play the optional script specified as a 
        	'parameter and finally reopen the form or browse it was lunched
        	'from.
        
        	'Normally it is not possible for a script launched from a 
        	'form or browse to close that form or browse while it is
        	'still running. The promper command can be executed but,
        	'the window will not close till the script which is 
        	'child of the form or browse is completed.
        	'Sometimes a script needs exclusive access to a table that
        	'is displayed by the underlying form. This is what this
        	'script is for
        	
        	'The calling script must end after calling this function.
        	'The script must be called from a form or browse.
        	'This function can be used in the button OnPush Event to
        	'launch the script in question.
        	
        	dim open_windows as c 		'List of open windows on system
        	dim current_window as c 	'Current window that ran tis cript
        	DIM varP_Window as p		'pointer to window about to be close
        	
        	dim topparent_name as c 	'used to close top parent
        	dim cmd as c 
        	dim condition as c 
        	dim open_sessions as c 
        	dim open_session_count as n 
        	
        	'Verify the top Parent is a form or browse
        	if is_object(topparent.this) then 
        		if topparent.class() <> "form" .and. topparent.class() <> "browse" then 
        			ui_msg_box("Internal Error","CloseAllWindowRun was not called from a form or browse")
        		end if
        	else
        		ui_msg_box("Internal Error","CloseAllWindowRun was not called from a form or browse")
        	end if		
        
        	'Tell the user what is about to happen give them a change to abort
        	text = <<%text%
        	You have selected an operation that requires exclusive access to all/some tables.
        	
        	If you are using eSum on multiple workstations this operation may fail if other users have the required tables open.
        	
        	If you proceeed all open windows will be closed. All edits in progress will be saved. No data will be lost!
        	
        	More information on the select operation will be given after this screen.
        	
        	The window you seolect the operation from will close if you proceed but it will be reopened at the end of the operation.
        	%text%
        	
        	Dialog = <<%dlg%
        	{region}
        	{text=55,17:text};
        	{endregion};
        	{line=1,0};
        	{region}
        		 <*15&Proceed!Proceed>	 	<15&Cancel!CANCEL>
        	{endregion};
        	%dlg%
        	
        	Result = ui_dlg_box("eSum",Dialog)
        	if Result <>"Proceed" then
        	    end
        	end if	
        
        	
        	'get list of open windows
        	open_windows = a5_list_open_windows()	
        	
        	'remove current browse or form from this list
        	'it is a special situation and will be treated differnently below
        	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 
        	
        	'remove menu from list
        	open_windows = word_subtract(open_windows,"menu",crlf())
        	'remove control panel from list
        	open_windows = word_subtract(open_windows,"ControlPanel",crlf())
        	
        	'now go through all windows and close them but see if they have any pending changes first
        	for each Window in open_windows
        	
        		'If the window name was specified without a leading ":", then add it.
        		if left(alltrim(Window),1) <> ":" then 
        			Window = ":"+alltrim(Window)
        		end if
        		
        		'Get a pointer to the specified window
        		varP_Window = obj(Window)
        	
        		'The window does exist, so close it
        		'Check to see that the object supports the "mode_get()" method
        		if varP_Window.has_method("mode_get") then 
        			'Save any unsaved data before closing the window
        			DIM mode as c
        			mode = varP_Window.mode_get()
        			if (mode = "ENTER" .or. mode = "CHANGE")  then
        				varP_Window.commit()
        				'Check to see if the record was successfully saved
        				if varP_Window.mode_get()<>"VIEW" then
        					error_generate("Unable to save your changes Please correct and save, or discard your changes")
        					end
        				end if
        			end if
        		end if 
        		'Close the window
        		varP_window.close(.f.)
        	
        	next
        	
        	'Set up the commands to run when this script and it's calling script are done
        
        	'Command to run before we reopen the window
        	If .NOT. isnull(Script) then
        	    cmd = cmd + crlf() + "script_play(" + quote(Script) + ")" + crlf()
        	end if
        
        	'sessions are used by expression that triggers these commands
        	'when this script finally finishes the session count will drop
        	open_sessions = session_enum()
        	open_session_count = line_count(open_sessions)
        
        	'The command needed to reopen the form or browse 
        	if topparent.class() = "form" then 
        		cmd = cmd + "dim tempP as p; tempP = form.view(" + quote(topparent.name(1)+"@" + topparent.Dictionary_Get(1))+")"
        	else
        		cmd = 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 
        	
        	'set up trigger that operates the commmands
        	'when the number of sessions is one less than the number we currently
        	'have then this script and the calling form or browse have closed
        	condition = "line_count(session_enum()) =  " + (open_session_count - 1 )
        	
        	'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.
        	'Not needed where we leave Main Menu open but left
        	'it in anyway doesn't hurt.
        	if ControlPanel.IsVisible() = .f. then 
        		ControlPanel.Minimize()
        		cmd = cmd + crlf() + "controlpanel.hide()"
        		if a5_IsMaximized() then 
        			topparent.restore()
        		end if 
        	end if 
        
        	'! Debug stuff
        	'!trace.WriteLn("Commands to run when sessions")
        	'!trace.WriteLn(cmd)
        	'!trace.WriteLn("")
        	
        	'now set commands that will run once all this is done
        	on_condition(condition,cmd)
        	
        	'finally the command that will close the calling window once these scripts are done
        	topparent.close()
        
        END FUNCTION

        Comment

        Working...
        X