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

UI (Not Responding) while script is running

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

  • Tom Cone Jr
    replied
    Re: UI (Not Responding) while script is running

    Keith,

    Opening or closing a table takes appreciably longer than you might think. It's often best to avoid opening and then closing the same table, over and over, each time through a FOR ... NEXT loop or each time through a WHILE ... END WHILE loop. Usually the code can be arranged to open the desired tables before the loop starts, and then close them after the loop finishes. This way the disk activity is diminished and scripts run faster.

    -- tom

    Leave a comment:


  • kvanbeek
    replied
    Re: UI (Not Responding) while script is running

    Thank you for the suggestions. I will try them asap.

    Leave a comment:


  • Stan Mathews
    replied
    Re: UI (Not Responding) while script is running

    All the above are suggestions, not intended in any way as criticism of what you presently have. They represent things I think I know to be ways to speed up script execution.

    Leave a comment:


  • Stan Mathews
    replied
    Re: UI (Not Responding) while script is running

    You have several sections that conceivably open the same table three times in quick succession.

    Code:
    'update bin jog - table: ing_bins
    			if jog_bin_1 > 0 then
    				query.filter = "name = " + s_quote(ing_name) + ".and. bin = 1"
    				result = record_update("ing_bins",query.filter,"jog_on_time =	" + str(jog_bin_1,10,4))
    			end if
    			if jog_bin_2 > 0 then
    				query.filter = "name = " + s_quote(ing_name) + ".and. bin = 2"
    				result = record_update("ing_bins",query.filter,"jog_on_time =	" + str(jog_bin_2,10,4))
    			end if
    			if jog_bin_3 > 0 then
    				query.filter = "name = " + s_quote(ing_name) + ".and. bin = 3"
    				result = record_update("ing_bins",query.filter,"jog_on_time = " + str(jog_bin_3,10,4))
    			end if
    It should be quicker to open the table once and close when done.

    Code:
    'update bin jog - table: ing_bins
    			z_tbl = table.open("ing_bins",FILE_RW_EXCLUSIVE)
    			if jog_bin_1 > 0 then
    				query.filter = "name = " + s_quote(ing_name) + ".and. bin = 1"
    				ix = z_tbl.query_create("N",query.filter)
    				z_tbl.change_begin()
    				z_tbl.jog_on_time =  str(jog_bin_1,10,4)
    				z_tbl.change_end(.T.)
    				ix.drop()
    			end if
    			if jog_bin_2 > 0 then
    				query.filter = "name = " + s_quote(ing_name) + ".and. bin = 2"
    				ix = z_tbl.query_create("N",query.filter)
    				z_tbl.change_begin()
    				z_tbl.jog_on_time = str(jog_bin_2,10,4)
    				z_tbl.change_end(.T.)
    				ix.drop()
    			end if
    			if jog_bin_3 > 0 then
    				query.filter = "name = " + s_quote(ing_name) + ".and. bin = 3"
    				ix = z_tbl.query_create("N",query.filter)
    				z_tbl.change_begin()
    				z_tbl.jog_on_time = str(jog_bin_3,10,4)
    				z_tbl.change_end(.T.)
    				ix.drop()
    			end if
    			z_tbl.close()
    The z_tbl.query_create() will be much faster if ing_bins has an index on ing_name.
    Last edited by Stan Mathews; 09-15-2016, 04:03 PM.

    Leave a comment:


  • Stan Mathews
    replied
    Re: UI (Not Responding) while script is running

    There is also another section with similar coding that can be changed similarly using word().

    All of your while sections processing table records can be speeded up by enclosing them with batch_begin() .... batch_end() as in

    Code:
    gb_tbl.batch_begin()
    while .NOT. gb_tbl.fetch_eof()
    					gb_ing_active = gb_tbl.Active
    					if gb_tbl.cust_id = cust_id .and. gb_tbl.Ingredient = ing_name .and. gb_tbl.Active = .t. then 'what if two records for the same ing??
    						gb_ing_cost = gb_tbl.Cost
    						gb_tbl.change_begin();
    						if (gb_tbl.Weight - gb_tbl.Wt_used) >= act_wt .or. (gb_tbl.Continuous = .t.)
    							gb_tbl.Wt_used = gb_tbl.Wt_used + act_wt
    							gb_inv_bal = act_wt
    						else 'weight left in bank < act_wt
    							gb_inv_bal = gb_tbl.Weight - gb_tbl.Wt_used
    							if gb_inv_bal < 0
    								gb_inv_bal = 0
    							end if
    							gb_tbl.Wt_used = gb_tbl.Weight
    							gb_tbl.Active = .f.
    						end if
    						gb_tbl.change_end()
    					end if
    					gb_tbl.fetch_next()
    				end while
    gb_tbl.batch_end()

    Leave a comment:


  • Stan Mathews
    replied
    Re: UI (Not Responding) while script is running

    If you don't mind piecemeal comments (I can't process/comprehend the whole script at one time).

    I read this section

    Code:
    start_pos = at(",",text,1) + 1;		end_pos = at(",",text,2);	mix_id = substr(text,start_pos,end_pos - start_pos);
    		start_pos = at(",",text,2) + 1;		end_pos = at(",",text,3);	order_id = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,3) + 1;		end_pos = at(",",text,4);	form_name = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,4) + 1;		end_pos = at(",",text,5);	temp_str = substr(text,start_pos,end_pos - start_pos);	date = stod(temp_str)
    		start_pos = at(",",text,6) + 1;		end_pos = at(",",text,7);	temp_str = substr(text,start_pos,end_pos - start_pos)	;
    		
    		temp_str = substr(temp_str,1,2) + ":" + substr(temp_str,3,2)	 + ":" + substr(temp_str,5,5);	time = ctodt(dtoc(date) + " " +  temp_str)
    		
    		start_pos = at(",",text,7) + 1;		end_pos = at(",",text,8);	loadout = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,8) + 1;		end_pos = at(",",text,9);	flushed = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,9) + 1;		end_pos = at(",",text,10);	batch = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,10) + 1;	end_pos = at(",",text,11);	group = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,11) + 1;	end_pos = at(",",text,12);	bin = substr(text,start_pos,end_pos - start_pos)
    		start_pos = at(",",text,13) + 1;	end_pos = at(",",text,14);	mix_status = substr(text,start_pos,end_pos - start_pos);
    to be assigning values to the variables based on the text variable by looking "in between" commas as in

    mix_id is the value between the first and second commas.

    You can do the same with

    mix_id = word(text,2,",")
    order_id = word(text,3,",")

    etc.

    Leave a comment:


  • WokingJon
    replied
    Re: UI (Not Responding) while script is running

    I've not used threads, but this example http://www.alphasoftware.com/documen...%20Example.xml suggests that you can disable the UI for a thread using
    Code:
    this_thread.ui_disable = .t.
    and lower the priority of a thread using
    Code:
    this_thread.set_priority(-2)
    which SHOULD result in a thread that doesn't interfere with the UI and doesn't stop the user doing his/her work. It also appears that you need a 'yield control' statement somewhere in the code to release control back to the foreground - see http://www.alphasoftware.com/documen...%20CONTROL.xml

    Leave a comment:


  • kvanbeek
    replied
    Re: UI (Not Responding) while script is running

    Ha Ha. I thought the same thing.

    Script has quite a bit to do. Takes around 10 sec for a 1K file. The problem is any amount of "locking up" is not acceptable to the customer.

    I was really hoping threads would solve this.

    Thank You

    Leave a comment:


  • MoGrace
    replied
    Re: UI (Not Responding) while script is running

    Something tells me I shouldn't have asked...

    Leave a comment:


  • kvanbeek
    replied
    Re: UI (Not Responding) while script is running

    Thanks for the help.

    Below is the content of the script:

    Code:
                            dim fptr as P
                            dim i_tbl as P
                            dim g_tbl as P
    			dim gp_tbl as P
    			dim fh_tbl as P
    			dim c_tbl as P
    			dim gb_tbl as P
    			dim bh_tbl as P
    			dim ih_tbl as P
    			
    			dim lot_id as C	
    			dim loadout as C	
    			dim flushed as C
    			dim batch as C
    			dim temp_str as C	
    			dim group as C	
    			dim group_id as C	
    			dim formula as C
    			dim customer as C
    			dim cust_id as C	
    			dim location as C
    			dim status as C	
    			dim s_date as C
    			dim bin as C
    			dim text as C
    			dim mix_id as C
    			dim order_id as C
    			dim mix_status as C
    			dim form_status as C
    			dim form_flushed as C
    			dim mixid_batch_ing as C
    			dim mixid_batch as C
    							
    			dim freefall as N
    			dim handadd_wt as N
    			dim	handadd_cost as N
    			dim act_wt as N
    			dim act_wt_bin_1 as N
    			dim act_wt_bin_2 as N
    			dim act_wt_bin_3 as N
    			dim tar_wt_bin_1 as N
    			dim tar_wt_bin_2 as N
    			dim tar_wt_bin_3 as N
    			dim act_wt_diff as N
    			dim freefall_bin_1 as N
    			dim freefall_bin_2 as N
    			dim freefall_bin_3 as N
    			dim jog_bin_1 as N
    			dim jog_bin_2 as N
    			dim jog_bin_3 as N	
    			dim tar_wt as N	
    			dim act_cost as N	
    			dim phase as N	
    			dim cur_phase as N	
    			dim act_total_wt as N	
    			dim act_weight_per_head as N	
    			dim head as N		
    			dim unground as N 	
    			dim cus_milling_cost as N
    			dim cus_batching_cost as N  
    			dim cus_delivery_cost as N		
    			dim loc_distance as N		
    			dim gb_ing_cost as N	
    			dim gb_inv_bal as N
    			dim start_pos as N
    			dim end_pos as N	
    			dim line_ctr as N
    			dim array_ctr as N
    			dim file_size as N
    			dim inv_left as N
    					
    			dim gb_ing_active as L	
    			dim result as L
    			dim delete_rec as L
    			
    			dim bin_2_inv as L
    			dim bin_3_inv as L
    			
    			dim bin_in_use as C	
    			dim result_mes as C
    			dim result_cnt as N
    			
    			dim date as D
    			dim time as T
    			
    			delete file_lines
    			dim file_lines[0] as C
    			
    			file.rename(ftp_path + "prodimp.dat",ftp_path + "prodimp_temp.dat")
    			
    			fptr = file.open(ftp_path + "prodimp_temp.dat",FILE_RO_SHARED)
    			file_size = fptr.bytes_get()
    			while .NOT. fptr.eof()			
    				file_lines[] = fptr.read_line()		
    			end while		        
    			fptr.close()
    				
    			line_ctr = file_lines.size()	 
    			
    			dim form_weight as N = 0
    			dim form_batches as N = 0
    			dim form_cost as N = 0
    			
    			dim batch_weight as N = 0	
    			dim batch_cost as N = 0
    			
    			dim milling_weight as N = 0
    			dim milling_cost as N = 0
    			dim batching_cost as N = 0
    			dim delivery_cost as N = 0
    			
    			dim array_size as N = 0
    			
    			FOR x = 1 to line_ctr
    				text = file_lines[x]
    				array_size = array_size + len(text) + 1 'add 1 for LF
    			NEXT
    			
    			if file_size <> array_size .and. file_size <> array_size + file_lines.size() then 'size of file is not the same as the array and the file could have been opened so a character is added for each line
    				file.rename(ftp_path + "prodimp_temp.dat",ftp_path + "errors\prodimp_error_size" + time("_MMddyyyy_0h0m0s",now()) + ".dat") 
    				'MESSAGE TO USER??		
    				end	  
    			end if
    			
    			FOR x = 1 to line_ctr
    				
    				sleep(.1)
    				
    				text = file_lines[x]
    				
    				if substr(text,1,3) = "100" then
    					
    					mix_status = "Finished" 
    					
    					start_pos = at(",",text,1) + 1;		end_pos = at(",",text,2);	mix_id = substr(text,start_pos,end_pos - start_pos);
    					start_pos = at(",",text,2) + 1;		end_pos = at(",",text,3);	order_id = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,3) + 1;		end_pos = at(",",text,4);	form_name = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,4) + 1;		end_pos = at(",",text,5);	temp_str = substr(text,start_pos,end_pos - start_pos);	date = stod(temp_str)			 						
    					start_pos = at(",",text,6) + 1;		end_pos = at(",",text,7);	temp_str = substr(text,start_pos,end_pos - start_pos)	;
    	
                                            temp_str = substr(temp_str,1,2) + ":" + substr(temp_str,3,2)	 + ":" + substr(temp_str,5,5);	time = ctodt(dtoc(date) + " " +  temp_str)			
    					
                                            start_pos = at(",",text,7) + 1;		end_pos = at(",",text,8);	loadout = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,8) + 1;		end_pos = at(",",text,9);	flushed = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,9) + 1;		end_pos = at(",",text,10);	batch = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,10) + 1;	end_pos = at(",",text,11);	group = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,11) + 1;	end_pos = at(",",text,12);	bin = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,13) + 1;	end_pos = at(",",text,14);	mix_status = substr(text,start_pos,end_pos - start_pos);
    					
    					'get formula information
    					fh_tbl = table.open("form_history") 
    					index = fh_tbl.index_primary_put("Mix_id") 
    					f_rec = fh_tbl.fetch_find(mix_id)
    					cust_id = fh_tbl.Customer_id
    					customer = fh_tbl.Customer_name
    					location = fh_tbl.Location_name			
    					formula = fh_tbl.Formula_name
    					form_loadout = fh_tbl.Loadout			
    					form_status = fh_tbl.Status
    					form_flushed = fh_tbl.Flushed
    					form_batches = fh_tbl.Batches
    					form_cost = fh_tbl.Cost
    					form_weight = fh_tbl.Weight							
    					fh_tbl.close()
    					
    					if f_rec < 0 then
    						formula = form_name
    					end if
    					
    					'get customer information
    					c_tbl = table.open("customers")
    					index = c_tbl.index_primary_put("Name") 
    					c_rec = c_tbl.fetch_find(customer)			
    					if c_rec > 0 then
    						cus_milling_cost = c_tbl.Milling_cost
    						cus_batching_cost = c_tbl.Batching_cost
    						cus_delivery_cost = c_tbl.Delivery_cost
    						cust_id = c_tbl.Customer_id
    					else
    						cus_milling_cost = set_milling
    						cus_batching_cost = set_batching
    						cus_delivery_cost = 0
    						cust_id = ""
    					end if
    					c_tbl.close()	
    					
    					'add "0" to batch if less than 100 and less than 10
    					if val(batch) < 100 then
    						batch = "0" + batch
    					end if
    						 
    					if val(batch) < 10 then
    						batch = "0" + batch
    					end if	
    					
    					mixid_batch = alltrim(mix_id) + alltrim(batch)	
    						    
    				end if
    				
    				if substr(text,1,3) = "200" then
    					
    					handadd_wt = 0	
    					freefall_bin_1 = 0
    					freefall_bin_2 = 0
    					freefall_bin_3 = 0
    					jog_bin_1 = 0
    					jog_bin_2 = 0
    					jog_bin_3 = 0
    										
    					start_pos = at(",",text,1) + 1;			end_pos = at(",",text,2);			ing_name = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,2) + 1;			end_pos = at(",",text,3); 			act_wt = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,3) + 1;			end_pos = at(",",text,4);			tar_wt = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,4) + 1;			end_pos = at(",",text,5);			bin_in_use  = substr(text,start_pos,end_pos - start_pos)			
    					start_pos = at(",",text,5) + 1;			end_pos = at(",",text,6);			act_wt_bin_1  = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,6) + 1;			end_pos = at(",",text,7);			act_wt_bin_2  = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,7) + 1;			end_pos = at(",",text,8);			act_wt_bin_3  = substr(text,start_pos,end_pos - start_pos)			
    					start_pos = at(",",text,8) + 1;			end_pos = at(",",text,9);			handadd_wt  = substr(text,start_pos,end_pos - start_pos)			
    					start_pos = at(",",text,9) + 1;			end_pos = at(",",text,10);			freefall_bin_1  = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,10) + 1;		end_pos = at(",",text,11);			freefall_bin_2  = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,11) + 1;		end_pos = at(",",text,12);			freefall_bin_3  = substr(text,start_pos,end_pos - start_pos)			
    					start_pos = at(",",text,12) + 1;		end_pos = at(",",text,13);			jog_bin_1  = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,13) + 1;		end_pos = at(",",text,14);			jog_bin_2  = substr(text,start_pos,end_pos - start_pos)
    					start_pos = at(",",text,14) + 1;		end_pos = at(",",text,15);			jog_bin_3  = substr(text,start_pos,end_pos - start_pos)
    					'start_pos = at(",",text,15) + 1;		end_pos = at(",",text,16);			micro_flush  = substr(text,start_pos,end_pos - start_pos)			
    					
    					batch_weight = batch_weight + act_wt
    				 
    					' may use the following to fix the diffence in act wt when ing is the micro flush also
    					if act_wt > (act_wt_bin_1 + act_wt_bin_2 + act_wt_bin_3) then
    						
    						act_wt_diff = act_wt - (act_wt_bin_1 + act_wt_bin_2 + act_wt_bin_3)
    						
    						if bin_in_use = "1" then
    							act_wt_bin_1 = act_wt_bin_1 + act_wt_diff
    						else if bin_in_use = "2" then
    							act_wt_bin_2 = act_wt_bin_2 + act_wt_diff	
    						else if bin_in_use = "3" then
    							act_wt_bin_3 = act_wt_bin_3 + act_wt_diff
    						end if
    						
    					end if					
    					
    					if handadd_wt > 0 then
    						
    						tar_wt = tar_wt - handadd_wt
    						
    					end if				 
    				 	
    					result = .t.
    					
    					gb_inv_bal = 0
    					gb_ing_cost = 0				
    						
    					mixid_batch_ing = alltrim(mix_id) + alltrim(batch) + alltrim(ing_name)			
    					
    					'update ingredient parameters, inventories and grain banks	'find any records with same mix id and batch and name		
    					ih_tbl = table.open("ing_history")						
    					index = ih_tbl.index_primary_put("IdBatchIng")		
    					
    					rec = ih_tbl.fetch_find(mixid_batch_ing)
    					
    					if (rec <= 0) then 'rec > 0 indicates if ingredient from this mix id and batch was downloaded before			    
    						
    						'update grain bank for ingredient
    						gb_inv_bal = 0
    						gb_ing_cost = 0
    						gb_tbl = table.open("grain_bank")
    						gb_rec = gb_tbl.fetch_first()
    						if gb_rec = 0 then
    							while .NOT. gb_tbl.fetch_eof()
    								gb_ing_active = gb_tbl.Active
    								if gb_tbl.cust_id = cust_id .and. gb_tbl.Ingredient = ing_name .and. gb_tbl.Active = .t. then 'what if two records for the same ing??
    									gb_ing_cost = gb_tbl.Cost
    									gb_tbl.change_begin();
    									if (gb_tbl.Weight - gb_tbl.Wt_used) >= act_wt .or. (gb_tbl.Continuous = .t.)
    										gb_tbl.Wt_used = gb_tbl.Wt_used + act_wt	
    										gb_inv_bal = act_wt
    									else 'weight left in bank < act_wt
    										gb_inv_bal = gb_tbl.Weight - gb_tbl.Wt_used
    										if gb_inv_bal < 0
    											gb_inv_bal = 0
    										end if
    										gb_tbl.Wt_used = gb_tbl.Weight
    										gb_tbl.Active = .f.	
    									end if
    									gb_tbl.change_end()    
    								end if
    								gb_tbl.fetch_next()	
    							end while
    						end if
    						gb_tbl.close()	
    											
    						'update parameters for ingredient
    						i_tbl = table.open("ing")
    						index = i_tbl.index_primary_put("Name")			
    						i_tbl.fetch_find(ing_name)
    						i_tbl.change_begin()				
    						if i_tbl.unground = .t. then
    							milling_weight = milling_weight + act_wt				
    						end if
    						
    						if bin_in_use = "0" then
    							bin_in_use = "1"
    						end if
    												
    						i_tbl.bin_in_use = bin_in_use				
    						if i_tbl.Inv_needed - tar_wt >= 0 then
    							i_tbl.Inv_needed = i_tbl.inv_needed - tar_wt
    						else
    							i_tbl.Inv_needed = 0
    						end if			
    						ing_desc = i_tbl.Description
    						
    						'set cost / unit to grain bank or to average cost if needed
    						if gb_ing_cost = 0 .and. i_tbl.use_ave_cost = .t. then										
    							gb_ing_cost = i_tbl.cost										
    						end if	
    															
    						i_tbl.change_end(.T.)
    						i_tbl.close()
    						
    						'get number of inventory records for current ingredient
    						inv_rec_cnt = dbcount("ing_inv","Name",ing_name)
    						delete Irec
    					 	dim Irec[inv_rec_cnt] as p
    					 	Irec.clear()			  	
    					 	Irec.initialize_from_table("ing_inv","Name = " + quote(ing_name))				
    						'if bin 2 or bin 3 have no inventory records then add bin 2 and bin 3 actual weight to bin 1 actual weight - needed because inv may only be added to bin 1
    				  		'micro come in on a pallet and the whole inventory is added to ingredient plus bin 1 may be used more than bin 2 and 3
    						bin_2_inv = .f.
    				  	bin_3_inv = .f.
    				  	for y = 1 to inv_rec_cnt		  		
    				  		if Irec[y].bin = 2 .and. Irec[y].amount <> 0 then
    				  			bin_2_inv = .t.
    				  		end if
    				  		if Irec[y].bin = 3 .and. Irec[y].amount <> 0 then
    				  			bin_3_inv = .t.
    				  		end if
    				  	next
    				  		
    				  	if bin_2_inv = .f. then
    				  		act_wt_bin_1 = act_wt_bin_1 + act_wt_bin_2
    				  		act_wt_bin_2 = 0	
    				  	end if
    				  		
    				  	if bin_3_inv = .f. then
    				  		act_wt_bin_1 = act_wt_bin_1 + act_wt_bin_3
    				  		act_wt_bin_3 = 0	
    				  	end if		
    				  		
    						'get ingredient inventory list from ing_inv table		
    						rec_cnt = dbcount("ing_inv","Name",ing_name) + 3 'extra slot in array for each bin - needed if no inventory records for bins 1, 2 or 3			
    						delete Irec
    					 	dim Irec[rec_cnt] as p
    					 	Irec.clear()			  	
    					 	Irec.initialize_from_table("ing_inv","Name = " + quote(ing_name))			 		
    					 	Irec.sort("A","ID")	'Irec.sort("A","Date")
    					 	
    					 	if rec_cnt > 3 then 'inv records for ingredient
    					 		for y = 1 to rec_cnt
    					 			Irec[y].cost = Irec[1].cost
    					 		next
    					 	else 'no inv for ingredient
    					 		for y = 1 to rec_cnt
    					 			Irec[y].cost = 0.0	
    					 		next	
    						end if
    					 	 	
    				  	'add new fields to array pointer and update cost if needed   
    				  	for y = 1 to rec_cnt	  			
    							Irec[y].actual_wt = 0
    							Irec[y].actual_cost = 0					
    							'gb_ing_cost > 0 indicates grain bank cost or average cost in use for this ingredient
    							if gb_ing_cost > 0 then 
    								Irec[y].cost = gb_ing_cost
    							end if							
    							Irec[y].target_wt = 0										
    						next
    						
    						handadd_cost = Irec[1].cost				
    				  		
    				  	'need to add amount field and bin field to last 3 records since they are not initialized from table		  		
    				  	Irec[rec_cnt - 2].amount = 0
    				  	Irec[rec_cnt - 2].bin = 1
    				  	Irec[rec_cnt - 2].lot_id = ""
    				  	Irec[rec_cnt - 1].amount = 0
    				  	Irec[rec_cnt - 1].bin = 2
    				  	Irec[rec_cnt - 1].lot_id = ""
    				  	Irec[rec_cnt].amount = 0
    				  	Irec[rec_cnt].bin = 3
    				  	Irec[rec_cnt].lot_id = ""
    				  		
    				  		'update ingredient inventories and add actual, target and mix id to list 
    						if act_wt_bin_1 > 0 then	
    											
    							act_wt_balance = act_wt_bin_1										
    							
    							'go through list of inventory records for bin 1 of ingredient
    							for y = 1 to rec_cnt						
    								
    								'record used in bin 1 
    								if Irec[y].Bin = 1 .and. Irec[y].amount > 0 then							
    						  			
    						  			inv_left = Irec[y].amount - Irec[y].used
    						  			
    						  			If inv_left >= act_wt_balance then				  				
    						  				Irec[y].used = Irec[y].used + act_wt_balance
    						  				Irec[y].actual_wt = act_wt_balance
    						  				'Irec[y].target_wt = act_wt_balance				  								  				
    						  				'update record in ing_inv table using Irec and Irec.Id				  				
    						  				query.filter = "id = " + s_quote(Irec[y].id)
    										result = record_update("ing_inv",query.filter,"used =" + str(Irec[y].used,10,2) + crlf() + "last_mix_id =" + mix_id + crlf() + "time =" + time)
    										'to exit for loop later
    						  				act_wt_balance = 0 				  			
    						  			else 'inventory left < act wt used from bin 1				  				
    						  				
    						  				'only delete record if there are more records for bin 1 so go through the rest of the list
    										delete_rec = .F.
    										for z = y + 1 to rec_cnt								
    											if Irec[z].Bin = 1 .and. Irec[z].amount > 0 then
    												delete_rec = .T.
    											end if								
    										next							
    										
    										if delete_rec then
    											'debug(1)									
    											if inv_left > 0 then																			
    												
    												Irec[y].actual_wt = inv_left	
    												act_wt_balance = act_wt_balance - inv_left
    																														
    											else 'neg_balance = abs(inv_left)									
    												
    												Irec[y + 1].used  = Irec[y + 1].used + abs(inv_left)
    																						
    											end if
    											
    											Irec[y].used = Irec[y].amount
    											
    											'delete record from ing_inv table using Irec.Id 
    							  				query.filter = "id = " + s_quote(Irec[y].id)
    							  				result = record_delete("ing_inv",query.filter)				  				
    							  				'add record to inv_use_history since all the inventory is used (use Irec[]) include mix_id field?
    							  				result = record_add("ing_inv_history",date() + crlf() + ing_name + crlf() + Irec[y].bin	+ crlf() + Irec[y].lot_id + crlf() + Irec[y].amount + crlf() + Irec[y].used + crlf() + mix_id + crlf() + time,2)
    										else								
    											Irec[y].used = Irec[y].used + act_wt_bin_1
    						  					Irec[y].actual_wt = act_wt_bin_1
    						  					'Irec[y].target_wt = act_wt_balance				  								  				
    						  					'update record in ing_inv table using Irec and Irec.Id				  				
    						  					query.filter = "id = " + s_quote(Irec[y].id)
    											result = record_update("ing_inv",query.filter,"used =" + str(Irec[y].used,10,2) + crlf() + "last_mix_id =" + mix_id + crlf() + "time =" + time)
    											act_wt_balance = 0									
    										end if	
    									
    									end if
    												  			
    						  			'put into list used to add ing_history records
    						  			Irec[y].actual_cost = Irec[y].actual_wt * Irec[y].cost			  			
    						  		end if				  		
    						  		if act_wt_balance <= 0 then	'leave at end of for loop	
    						  			exit for	
    						  		end if			  			
    					  		next
    					  		
    					  		'records in ing_inv table did not cover all of the actual weight or no records for ingredient
    					  		if act_wt_balance > 0 then
    					  			'need to add an entry for balance of ingredient actual weight to Irec[]
    					  			Irec[rec_cnt - 2].actual_wt = act_wt_balance
    					  			'Irec[rec_cnt - 2].target_wt = act_wt_balance
    					  			Irec[rec_cnt - 2].actual_cost = Irec[rec_cnt - 2].actual_wt * Irec[rec_cnt - 2].cost	
    					  		end if					
    						end if
    						
    						if act_wt_bin_2 > 0 then
    							act_wt_balance = act_wt_bin_2					
    							'go through list of inventory records for bin 2 of ingredient
    							for y = 1 to rec_cnt						
    								'record used in bin 2 
    								if Irec[y].Bin = 2 .and. Irec[y].amount > 0 then							
    						  			
    						  			inv_left = Irec[y].amount - Irec[y].used				  			
    						  			
    						  			if inv_left >= act_wt_balance then				  				
    						  				Irec[y].used = Irec[y].used + act_wt_balance
    						  				Irec[y].actual_wt = act_wt_balance
    						  				'Irec[y].target_wt = act_wt_balance				  								  				
    						  				'update record in ing_inv table using Irec and Irec.Id				  				
    						  				query.filter = "id = " + s_quote(Irec[y].id)
    										result = record_update("ing_inv",query.filter,"used =" + str(Irec[y].used,10,2) + crlf() + "last_mix_id =" + mix_id + crlf() + "time =" + time)
    										'to exit for loop later
    						  				act_wt_balance = 0 				  			
    						  			else 'inventory left < act wt used from bin 2				  				
    						  				
    						  				'only delete record if there are more records for bin 2 so go through the rest of the list
    										delete_rec = .F.
    										for z = y + 1 to rec_cnt								
    											if Irec[z].Bin = 2 .and. Irec[z].amount > 0 then
    												delete_rec = .T.
    											end if								
    										next
    										
    										if delete_rec then
    											
    											if inv_left > 0 then
    												
    												Irec[y].actual_wt = inv_left	
    												
    												act_wt_balance = act_wt_balance - inv_left
    												
    											else 'neg_balance = abs(inv_left)
    											
    												Irec[y + 1].used  = Irec[y + 1].used + abs(inv_left)
    																						
    											end if
    											
    											Irec[y].used = Irec[y].amount				  						  			
    						  						  				
    							  				'delete record from ing_inv table using Irec.Id 
    							  				query.filter = "id = " + s_quote(Irec[y].id)
    							  				result = record_delete("ing_inv",query.filter)
    							  				'add record to inv_use_history since all the inventory is used (use Irec[]) include mix_id field?
    							  				result = record_add("ing_inv_history",date() + crlf() + ing_name + crlf() + Irec[y].bin	+ crlf() + Irec[y].lot_id + crlf() + Irec[y].amount + crlf() + Irec[y].used + crlf() + mix_id + crlf() + time,2)
    							  			
    							  			else
    							  			
    							  				Irec[y].used = Irec[y].used + act_wt_bin_2
    						  					Irec[y].actual_wt = act_wt_bin_2
    						  					'Irec[y].target_wt = act_wt_balance				  								  				
    						  					'update record in ing_inv table using Irec and Irec.Id				  				
    						  					query.filter = "id = " + s_quote(Irec[y].id)
    											result = record_update("ing_inv",query.filter,"used =" + str(Irec[y].used,10,2) + crlf() + "last_mix_id =" + mix_id + crlf() + "time =" + time)
    											act_wt_balance = 0
    											
    							  			end if				  			
    						  			
    						  			end if				  			
    						  			'put into list used to add ing_history records
    						  			Irec[y].actual_cost = Irec[y].actual_wt * Irec[y].cost			  			
    						  		end if				  		
    						  		if act_wt_balance <= 0 then	'leave at end of for loop	
    						  			exit for	
    						  		end if				  					  			
    					  		next
    					  		'records in ing_inv table did not cover all of the actual weight or no records for ingredient
    						  	if act_wt_balance > 0 then
    						  		'need to add an entry for balance of ingredient actual weight to Irec[]
    						  		Irec[rec_cnt - 1].actual_wt = act_wt_balance
    						  		'Irec[rec_cnt - 1].target_wt = act_wt_balance
    						  		Irec[rec_cnt - 1].actual_cost = Irec[rec_cnt - 1].actual_wt * Irec[rec_cnt - 1].cost
    						  	end if					
    						end if
    						
    						if act_wt_bin_3 > 0 then
    							act_wt_balance = act_wt_bin_3					
    							'go through list of inventory records for bin 3 of ingredient
    							for y = 1 to rec_cnt						
    								'record used in bin 3 
    								if Irec[y].Bin = 3 .and. Irec[y].amount > 0 then	
    															
    						  			inv_left = Irec[y].amount - Irec[y].used	
    						  						  			
    						  			if inv_left >= act_wt_balance then				  				
    						  				Irec[y].used = Irec[y].used + act_wt_balance
    						  				Irec[y].actual_wt = act_wt_balance
    						  				'Irec[y].target_wt = act_wt_balance				  								  				
    						  				'update record in ing_inv table using Irec and Irec.Id				  				
    						  				query.filter = "id = " + s_quote(Irec[y].id)
    										result = record_update("ing_inv",query.filter,"used =" + str(Irec[y].used,10,2) + crlf() + "last_mix_id =" + mix_id + crlf() + "time =" + time)
    										'to exit for loop later
    						  				act_wt_balance = 0 				  			
    						  			else 'inventory left < act wt used from bin 3				  				
    						  				
    						  				'only delete record if there are more records for bin 3 so go through the rest of the list
    										delete_rec = .F.
    										for z = y + 1 to rec_cnt								
    											if Irec[z].Bin = 3 .and. Irec[z].amount > 0 then
    												delete_rec = .T.
    											end if								
    										next
    										
    										if delete_rec then
    											
    											if inv_left > 0 then
    												
    												Irec[y].actual_wt = inv_left	
    												
    												act_wt_balance = act_wt_balance - inv_left	
    												
    											else 'neg_balance = abs(inv_left)
    											
    												Irec[y + 1].used  = Irec[y + 1].used + abs(inv_left)				
    												
    											end if
    											
    											Irec[y].used = Irec[y].amount
    													  				
    							  				'delete record from ing_inv table using Irec.Id
    							  				query.filter = "id = " + s_quote(Irec[y].id) 
    							  				result = record_delete("ing_inv",query.filter)
    							  				'add record to inv_use_history since all the inventory is used (use Irec[]) include mix_id field?
    							  				result = record_add("ing_inv_history",date() + crlf() + ing_name + crlf() + Irec[y].bin	+ crlf() + Irec[y].lot_id + crlf() + Irec[y].amount + crlf() + Irec[y].used + crlf() + mix_id + crlf() + time,2)
    							  			
    							  			else
    							  			
    							  				Irec[y].used = Irec[y].used + act_wt_bin_3
    						  					Irec[y].actual_wt = act_wt_bin_3
    						  					'Irec[y].target_wt = act_wt_balance				  								  				
    						  					'update record in ing_inv table using Irec and Irec.Id				  				
    						  					query.filter = "id = " + s_quote(Irec[y].id)
    											result = record_update("ing_inv",query.filter,"used =" + str(Irec[y].used,10,2) + crlf() + "last_mix_id =" + mix_id + crlf() + "time =" + time)
    											act_wt_balance = 0
    											
    							  			end if
    							  			
    						  			end if				  			
    						  			'put into list used to add ing_history records
    						  			Irec[y].actual_cost = Irec[y].actual_wt * Irec[y].cost			  			
    						  		end if				  		
    						  		if act_wt_balance <= 0 then	'leave at end of for loop	
    						  			exit for	
    						  		end if				  					  			
    					  		next
    					  		'records in ing_inv table did not cover all of the actual weight or no records for ingredient    
    						  	if act_wt_balance > 0 then
    						  		'need to add an entry for balance of ingredient actual weight to Irec[]
    						  		Irec[rec_cnt].actual_wt = act_wt_balance
    						  		'Irec[rec_cnt].target_wt = act_wt_balance
    						  		Irec[rec_cnt].actual_cost = Irec[rec_cnt].actual_wt * Irec[rec_cnt].cost
    						  	end if					
    						end if
    						
    						'set target weight - set target_wt to tar_wt for first record with act > 0 
    						for y = 1 to rec_cnt
    							if Irec[y].actual_wt > 0 then
    								Irec[y].target_wt = tar_wt
    								exit for	
    							end if							
    						next	
    						
    						'add Irec list to ing_history table 'set new field to True
    						dim rec_ing_cnt as N = 0
    						for y = 1 to rec_cnt
    							if Irec[y].actual_wt > 0 then
    								'add to ing_history table - WHAT IF RECORD HAS LESS INV (AMOUNT - USED) FOR THE ACTUAL WEIGHT???? ' old + crlf() + Alltrim(LTRIM(TRIM(MIX_ID),"0") + batch) + crlf() + Alltrim(LTRIM(TRIM(MIX_ID),"0") + batch + ing_name) + crlf() + ".t.",2)
    								result = record_add("ing_history",date + crlf() + mix_id + crlf() + Irec[y].lot_id + crlf() + ing_name  + crlf() + str(Irec[y].target_wt,10,4)\
    								+ crlf() + str(Irec[y].actual_wt,10,4) + crlf() + str(Irec[y].actual_cost,10,2) + crlf() + ing_desc + crlf() + batch\
    								+ crlf() + mixid_batch + crlf() + mixid_batch_ing + crlf() + ".t.",2)
    								rec_ing_cnt = rec_ing_cnt + 1
    							end if
    							sleep(.1)
    							'if result = .f. then
    							'	exit for
    							'end if					 
    						next
    						
    						'if handadd used for weigh hopper ingredient then add another line to ing_history table
    						if handadd_wt > 0 then
    							
    							handadd_cost = handadd_wt * handadd_cost
    											
    							result = record_add("ing_history",date + crlf() + mix_id + crlf() + "handadd" + crlf() + ing_name  + crlf() + str(handadd_wt,10,4)\
    							+ crlf() + str(handadd_wt,10,4) + crlf() + str(handadd_cost,10,2) + crlf() + ing_desc + crlf() + batch\
    							+ crlf() + mixid_batch + crlf() + mixid_batch_ing + crlf() + ".t.",2)
    							rec_ing_cnt = rec_ing_cnt + 1
    							sleep(.1)	
    							
    						end if
    							
    						'check for rec_hist_cnt of records? if not the same redo for next loop
    						rec_hist_cnt = dbcount("ing_history","IdBatching",mixid_batch_ing)
    						
    						if rec_hist_cnt <> rec_ing_cnt then
    							for y = 1 to rec_cnt
    								if Irec[y].actual_wt > 0 then
    									'add to ing_history table - WHAT IF RECORD HAS LESS INV (AMOUNT - USED) FOR THE ACTUAL WEIGHT???? ' old + crlf() + Alltrim(LTRIM(TRIM(MIX_ID),"0") + batch) + crlf() + Alltrim(LTRIM(TRIM(MIX_ID),"0") + batch + ing_name) + crlf() + ".t.",2)
    									result = record_add("ing_history",date + crlf() + mix_id + crlf() + Irec[y].lot_id + crlf() + ing_name  + crlf() + str(Irec[y].target_wt,10,4)\
    									+ crlf() + str(Irec[y].actual_wt,10,4) + crlf() + str(Irec[y].actual_cost,10,2) + crlf() + ing_desc + crlf() + batch\
    									+ crlf() + mixid_batch + crlf() + mixid_batch_ing + crlf() + ".t.",2)
    								end if
    								sleep(.1)
    								if result = .f. then
    									exit for
    								end if					
    							next
    							
    							'if handadd used for weigh hopper ingredient then add another line to ing_history table
    							if handadd_wt > 0 then
    							
    								result = record_add("ing_history",date + crlf() + mix_id + crlf() + "handadd" + crlf() + ing_name  + crlf() + str(handadd_wt,10,4)\
    								+ crlf() + str(handadd_wt,10,4) + crlf() + str(handadd_cost,10,2) + crlf() + ing_desc + crlf() + batch\
    								+ crlf() + mixid_batch + crlf() + mixid_batch_ing + crlf() + ".t.",2)
    								sleep(.1)	
    								
    							end if
    								
    						end if				
    						
    						'record was not added
    						if result = .f. then
    							result_mes = "ing"
    						   	goto record_error
    						end if
    										
    						'update bin freefalls - table: ing_bins				
    						if freefall_bin_1 > 0 then
    							query.filter = "name = " + s_quote(ing_name) + ".and. bin = 1"
    							result = record_update("ing_bins",query.filter,"freefall =	" + str(freefall_bin_1,10,2))
    						end if
    						if freefall_bin_2 > 0 then
    							query.filter = "name = " + s_quote(ing_name) + ".and. bin = 2"
    							result = record_update("ing_bins",query.filter,"freefall =	" + str(freefall_bin_2,10,2))
    						end if
    						if freefall_bin_3 > 0 then
    							query.filter = "name = " + s_quote(ing_name) + ".and. bin = 3"
    							result = record_update("ing_bins",query.filter,"freefall = " + str(freefall_bin_3,10,2))	
    						end if	
    						
    						'update bin jog - table: ing_bins				
    						if jog_bin_1 > 0 then
    							query.filter = "name = " + s_quote(ing_name) + ".and. bin = 1"
    							result = record_update("ing_bins",query.filter,"jog_on_time =	" + str(jog_bin_1,10,4))
    						end if
    						if jog_bin_2 > 0 then
    							query.filter = "name = " + s_quote(ing_name) + ".and. bin = 2"
    							result = record_update("ing_bins",query.filter,"jog_on_time =	" + str(jog_bin_2,10,4))
    						end if
    						if jog_bin_3 > 0 then
    							query.filter = "name = " + s_quote(ing_name) + ".and. bin = 3"
    							result = record_update("ing_bins",query.filter,"jog_on_time = " + str(jog_bin_3,10,4))	
    						end if
    							
    					end if
    					
    					batch_cost = batch_cost + act_cost
    					
    					ih_tbl.close()
    								   
    				end if
    				
    				if x < line_ctr then
    					text = file_lines[x+1]
    				end if
    				
    				if (substr(text,1,3) = "100") .OR. ( x = line_ctr ) then 'download batch from previous 100 through last 200 line
    					'update group phase - check if batch has already been downloaded
    					
    					bh_tbl = table.open("batch_history")
    					index = bh_tbl.index_primary_put("IdBatch") 
    					
    					'rec = bh_tbl.fetch_find(mix_id + batch)
    					
    					rec = bh_tbl.fetch_find(mixid_batch)
    					
    					if (rec <= 0) then 'indicates if batch was downloaded before
    						if group <> "" then 'formula has a group assigned to it
    							g_tbl = table.open("Groups")
    							index = g_tbl.index_primary_put("Name")
    							g_tbl.fetch_find(group)
    							phase = g_tbl.Current_phase
    							group_id = g_tbl.Group_id
    							head = g_tbl.Total_Head
    							s_date = g_tbl.Start_date
    							if isdate(s_date) = .f. .or. s_date = "" then
    								g_tbl.change_begin()
    								g_tbl.Start_date = date()
    								g_tbl.change_end()    
    							end if				
    							gp_tbl = table.open("Group_formulas")
    							record_found = gp_tbl.fetch_first()
    							if record_found = 0 then 'there are group formulas listed
    								while .NOT. gp_tbl.fetch_eof()							
    									
    									if gp_tbl.Group_id = group_id .and. (gp_tbl.Formula = formula .or. gp_tbl.phase = phase) .and. g_tbl.Reduce_cur_phase = .t. then 'correct group and current formula ' 10/14/09
    										gp_tbl.change_begin()						
    										act_total_wt = gp_tbl.Act_total_weight
    										act_total_wt = act_total_wt + batch_weight
    										act_weight_per_head = gp_tbl.Act_weight_per_head
    										act_weight_per_head = act_weight_per_head + batch_weight/head
    										s_date = gp_tbl.Start_date
    										'update current phase for group
    										if act_total_wt > gp_tbl.Tar_total_weight - gp_tbl.Deviation then 'phase target weight is reached
    											status = "finished"
    											cur_phase = gp_tbl.Phase + 1
    											g_tbl.change_begin()
    											g_tbl.Current_phase = cur_phase
    											g_tbl.change_end()
    											gp_tbl.End_date = date()
    										else 'phase target weight has not been reached
    											status = "active"
    											if .NOT. isDate(s_date) then
    												gp_tbl.Start_date = date()
    											end if
    										end if																
    										gp_tbl.Act_weight_per_head = act_weight_per_head
    										gp_tbl.Act_total_weight = act_total_wt
    										gp_tbl.Status = status
    										gp_tbl.change_end()								
    										exit while
    									end if
    									
    									gp_tbl.fetch_next()
    								end while
    							end if
    							g_tbl.close()
    							gp_tbl.close()
    						end if				
    					end if
    					bh_tbl.close()
    					
    					'calculate milling cost
    					if set_units = "pounds" then 
    						milling_cost = (milling_weight/2000)*cus_milling_cost
    					else 
    						milling_cost = (milling_weight/1000)*cus_milling_cost 
    					end if			
    					'calculate batching cost
    					if set_units = "pounds" then 
    						batching_cost = (batch_weight/2000)*cus_batching_cost
    					else 
    						batching_cost = (batch_weight/1000)*cus_batching_cost 
    					end if			
    					
    					'put entries into ingredient history table for milling cost and batching cost ' old + crlf() + Alltrim(LTRIM(TRIM(MIX_ID),"0") + batch + "Milling Charge") + crlf() + ".t.",2)
    					if milling_cost > 0 then
    						lot_id = ""
    					 	result = record_add("ing_history",date + crlf() + mix_id + crlf() + lot_id + crlf() + "Milling Charge" + crlf() + 0 + crlf() + 0\
    					 	+ crlf() + str(milling_cost,10,2) + crlf() + "Milling Charge" + crlf() + batch + crlf() + mixid_batch\
    					 	+ crlf() + mixid_batch + "Milling Charge" + crlf() + ".t.",2)
    									
    						batch_cost = batch_cost + milling_cost
    						if result = .f. then 'if result is false than goto end
    						   	result_mes = "ing_mill"
    						   	goto record_error
    						end if
    					end if
    										
    					if batching_cost > 0 then ' old + crlf() + Alltrim(LTRIM(TRIM(MIX_ID),"0") + batch + "Batching Charge") + crlf() + ".t.",2)
    						lot_id = ""				
    						result = record_add("ing_history",date + crlf() + mix_id + crlf() + lot_id + crlf() + "Batching Charge" + crlf() + 0 + crlf()\
    						+ 0  + crlf() + str(batching_cost,10,2) + crlf() + "Batching Charge" + crlf() + batch + crlf() + mixid_batch\
    						+ crlf() + mixid_batch + "Batching Charge" + crlf() + ".t.",2)
    						
    						batch_cost = batch_cost + batching_cost
    						if result = .f. then 'if result is false than goto end
    						   	result_mes = "ing_batch"
    						   	goto record_error
    						end if
    					end if
    					
    					'download batch
    					result = record_add("batch_history",date + crlf() + order_id + crlf() + mix_id + crlf() + batch\
    					+ crlf() + alltrim(customer) + crlf() + alltrim(group) + crlf() + alltrim(location) + crlf() + loadout \     
    					+ crlf() + formula + crlf() + batch_weight + crlf() + batch_cost + crlf() + flushed + crlf() + mixid_batch,2) 
    					'debug(1)
    					if result = .f. then 'if result is false than goto end
    					    result_mes = "batch"
    					   	goto record_error
    					end if			
    					
    					'set form weight and cost using batch weight and cost  				
    					form_weight = form_weight + batch_weight
    					form_cost = form_cost + batch_cost
    								
    					'batch > 1 may be mixer flush that was sent to another loadout
    					if val(batch) > 1 then ' may have to check if this was a "flush" batch instead of number of batch
    						loadout = form_loadout
    					end if					
    												
    					'decrease batch number since last batch may be a flush batch			
    					if flushed = "yes" then
    						batch = str(val(batch) - 1)   
    					end if
    					
    					'may want to see if formula history record exist so can be added if needed
    								
    					'update record in formula history - MAY DO WHAT THE FOLLOWING 4 STATEMENTS DO IN DATABASE RULES - JUST UPDATE STATUS AND TIME HERE?
    					query.filter = "mix_id = " + s_quote(mix_id)
    					
    					'IF FIELD CALC USED
    					result = record_update("form_history",query.filter,"date =" + date + crlf() + "batches =" + batch + crlf() + "loadout =" + loadout\
    					+ crlf() + "status =" + mix_status + crlf() + "flushed =" + flushed	+ crlf() + "bin =" + bin + crlf() + "time=" + time)
    					
    					'does mix id exist in form_history
    					dim no_rec as n
    					no_rec = dbcount("form_history","Mix_Id",mix_id)
    					
    					'if record does not exist (result = .f.)
    					if result = .f. .and. no_rec = 0 then
    						'add record to form_history
    						result = record_add("form_history","date =" + date + crlf() + "mix_id =" + mix_id + crlf()+ "formula_name =" + formula + crlf() + "group_name =" + group + crlf() \
    						+ "batches =" + batch + crlf() + "loadout =" + loadout + crlf()	+ "status =" + mix_status + crlf() + "flushed =" + flushed + crlf()\
    						+ "bin =" + bin + crlf() + "time =" + time)
    						'put mix_id into inc_mix_id
    						record_update("inc_mix_id",".t.","mix_id = " + mix_id)	
    					end if			
    											
    					'if result is false than goto end		
    					if result = .f. then
    						result_mes = "formula_" + mix_id
    					    goto record_error
    					end if	
    								
    					milling_weight = 0
    					batch_weight = 0
    					batch_cost = 0		    
    				end if
    				
    			NEXT
    			
    			'completed so rename temp file with date and time stamp
    			'file.rename("C:\Users\Admin\Documents\CBX\FTP files\prodimp_temp.dat","C:\Users\Admin\Documents\CBX\FTP files\prodimp" + time("_MMddyyyy_0h0m0s",now()) + ".dat")
    			file.rename(ftp_path + "prodimp_temp.dat",ftp_path + "prodimp" + time("_MMddyyyy_0h0m0s",now()) + ".dat")
    				
    			'delete duplicate records in batch_history table
    			bh_tbl = table.open("batch_history")
    			bh_tbl.delete_dups("IdBatch + Flush")
    			bh_tbl.close()	
    			
    			'delete duplicate records in ing_history table and update field New from true to false
    			ih_tbl = table.open("ing_history")		
    			ih_tbl.delete_dups("IdBatching + Target_Wt + Actual_Wt + Lot_id")
    			query.filter = "New = .t."
    			query.order = ""
    			query.options = ""
    			indx = ih_tbl.query_create()
    			update.fields = 1
    			update.field1 = "New"
    			update.expr1 = ".f."
    			ih_tbl.update()		
    			ih_tbl.close()
    			
    			'script_play("UpdateMessages")
    			
    			'send updated ingredient parameters to batching panel		
    			'script_play("Download_Ing_New")	
    			
    			'send updated group parameters to batching panel		
    			'script_play("Download_Group_New")
    			
    			'recalculated form_history fields
    			'Dim tbl as P
    			'Tbl = table.open("form_history")
    			'Tbl.recalc_calcFields()
    			'Tbl.close() 
    			
    			end
    				
    			record_error: 
    			
    				'delete records with new field of True
    				ih_tbl = table.open("ing_history")
    				ih_tbl.delete_range("New = .t.")
    				ih_tbl.close()
    				
    				'message so user can try again - may have user initiate the uploading of the records from prodim.dat instead of CBM timer
    				res = ui_msg_box("Import file error","There was a problem with production import file" + crlf(2) + "Do you want to try again? No - The file will be placed in the errors directory",UI_QUESTION_SYMBOL+UI_YES_NO)
    				if res  = UI_YES_SELECTED
    					'file.rename("C:\Users\Admin\Documents\CBX\FTP files\prodimp_temp.dat","C:\Users\Admin\Documents\CBX\FTP files\prodimp.dat")
    					file.rename(ftp_path + "prodimp_temp.dat",ftp_path + "prodimp.dat")
    				else
    					'file.rename("C:\Users\Admin\Documents\CBX\FTP files\prodimp_temp.dat","C:\Users\Admin\Documents\CBX\FTP files\errors\prodimp_error_" + result_mes + time("_MMddyyyy_0h0m0s",now()) + ".dat")
    					file.rename(ftp_path + "prodimp_temp.dat",ftp_path + "errors\prodimp_error_" + result_mes + time("_MMddyyyy_0h0m0s",now()) + ".dat")
    				end if
    						
    			end
    			
    		end if
    Attached Files
    Last edited by Al Buchholz; 09-15-2016, 10:39 AM. Reason: added code tags and code as an attachment

    Leave a comment:


  • MoGrace
    replied
    Re: UI (Not Responding) while script is running

    Nice Stan

    BUT, if you show us your script, there may be ways to make it run faster...

    Leave a comment:


  • Stan Mathews
    replied
    Re: UI (Not Responding) while script is running

    No

    Leave a comment:


  • kvanbeek
    started a topic UI (Not Responding) while script is running

    UI (Not Responding) while script is running

    I have a script that runs when a file exists. The script parses the contents of the file and adds records to a table.

    While the script is running the UI cannot be used and says Not Responding.

    I have used the contents of the script in a thread but have the same result.

    Is there a way to run the script without interfering with the users ability to use the UI.

    Thanks,

    Keith
Working...
X