Updates to the EnterpriseOne Adapter and TCP/IP Manager since 2011-05-01
------------------------------------------------------------------------
This file catalogs updates made to the EnterpriseOne Adapter, TCP/IP Manager and LoadODBC.

The fix pack for the adapter includes the following files:

	adapter.exe
	adptutil.dll
	cxml.dll
	jdeadptr.dll

	tcpipmgr.exe

	LoadODBC.exe

The following abbreviations are used at the start of each description below to indicate which
component is affected:

ADP:	Adapter
TCP:	TCP/IP Manager
ODB:	Load ODBC
TBL:	JDE Table tool
UTL:	Other Utility



CHRONOLOGICAL SUMMARY OF FIXES/CHANGES
--------------------------------------
2011-05-16	ODB: Added warning when no primary keys are found:

2011-05-16	ODB: Fraction for seconds always set to 0 to handle the new SQL Server 2008
		data type, datetime2, which can have its scale changed - possibly to 0.

2011-05-17	ADP: Workaround to handle audited JDE tables.  Audited tables are renamed
		with the suffix _ADT and a view is created with the original name.  Views
		do not have primary keys, so the adapter must now handle the _ADT suffix
		when it is told a 'table' has no primary keys.

2011-05-17	ADP: Log level 150 now available to get more detail about database operations.

2011-05-17	ADP: Spaces are now trimmed from the schema name sent in a logon BOD because
		if they exist, the API to get column information for a table will fail.

2011-05-24	ADP: Extra processing options are ignored when the data received from JDE
		exceeds the number of proc ops expected.

2011-05-25	ADP: Exception handling added for exception occurring on certain deletes.
		Fixes All-Logons-In-Use message caused by logons not being released
		when exception occurred.

2011-05-26	ADP: Added blank line and timestamp to screen output at the start of
		the processing of a new BOD.  Execution time output also now has a 
		timestamp.

2011-05-27	ADP: Fix for exception that occurred when no parameters are provided.

2011-05-28	ADP: Fix for looping 'waiting for Logon Mutex' message when a database
		error occurred.

2011-06-06	ADP: Added logging keyword DONT_PRINT_POINTERS = Y to use when comparing
		traces from different runs.  Pointers are almost always different; so
		when they are shown it's hard to tell what is truly different.

2011-06-07	ADP: Fixed one cause for adapter not fully shutting down even after it
		displays "Really done now" message.

2011-06-07	ADP: Fixed cause for message "Thread nnn failed to get Logfile mutex..."

2011-06-10	ADP: Fix for cycle count transaction in B7 environment.  New B9 only
		column was not being ignored for B7.

2011-06-14	TBL: JDETable tool udpdated to handle B9 environments.

2011-06-14	ADP: Confirm Workorder BOD processing was rejecting blank locations when 
		they should have just been passed on through to JDE.

2011-06-15	TCP/ADP: Fixes for cleaning up threads when shutting down; this fixes some 
		exceptions that would prevent TCPIP Manager from shutting down.

2011-06-21	TCP: TCPIP Manager now tries up to 5 minutes to resolve host name - to 
		handle the case where TCPIP Manager running as a service is started before
		the necessary network drivers/services are running to the point where a
		host name can be resolved.

2011-06-24	ADP: Passing of values between business functions was not working for a 
		Call Function BOD with multiple calls.  The first character of the
		field name was being chopped and so it could not be found.

2011-06-27	TCP: TCPIP Manager now tries for a maximum of 5 minutes to send a message
		to the target server.  After this time-to-live timeout the message is 
		discarded - the assumption being that the message is no longer being waited 
		for.   The time-to-live is based on when the message is created.  In the
		case that the message is a response to a request, the start time is based
		on when the response message was created, not when the request message
		was created.

2011-06-29	ADP: Fix for receipt route transaction in B7 environment.  New B9 only
		column for dual-UOM was not being ignored for B7.

2011-07-22	ADP: The F3112 table no longer has the following 3 columns:
		- UnacctDirectLaborHrs (wlcts1)
		- BeginningHhMmSs (wlpbtm)
		- EndingHhMmSs (wlpetm)
		as of JDE 8.10.  This is part of the Sync WorkOrder transaction.

2011-07-28	ADP: For xml instance of Receive Item PO, calling the ube for R43512 was
		not working right.  Made ube code common with code to handle the more
		generic Launch Batch code for UBEs.

		The R43512 UBE is called only if the "Print Traveler" processing option 
		is set to '1'. 

2011-08-02	ADP: JDE responses to UBE requests were not being inspected for errors.
		UBE errors are now treated like any other JDE error.  

2011-08-04	ADP: Added handling of the JDE XML error: 'Network communication is broken'.
		When encountered, the session ID is cleared and the business function is 
		retried automatically.   One case where this error can occur if the JDE 
		service on the JDE server is stopped and restarted between calls to JDE.

2011-08-05	ADP: The adapter now sets the 'role' parameter in the XML header to '*ALL'

2011-08-05	ADP: Due to a JDE error, UBE requests would often fail when the XML
		was less than 1024 characters.  The adapter now adds a 1024 byte comment
		to all UBE requests in order to get around this problem.

		When this problem occurs, the JDE reply to the UBE request gives an error
		similar to:

			Fatal XML Parse error at line 15 char 1 : 
			'Expected comment or processing instruction'

		even though the submitted XML is correctly formed.  In the Oracle
		Support forum it is noted that SAR: 8964247, Bug: 11044465 address this
		issue.  It is noted as being fixed in Product Version: 8.98.


2011-08-05	ADP: The adapter will now show and log (to the trace log if LOGLEVEL >= 10) 
		the job ID for the UBE.  For example:

			UBE launched with JOBID = 153

		Note: Other surrounding messages on the screen and in the log indicate what
		the batch name and version name were.

		Also removed the duplicate printing to the screen of some JDE errors.

2011-08-11	ADP: For certain transactions, such as Inventory Issue, a location format
		error would be returned to TC even when the underlying error was that 
		JDE was currently unavailable.  JDE unavailable error is now returned (L002)
		so that TC can act on it accordingly (e.g. delay and try transaction again).

2011-08-16	ADP: Fix for Inventory Issue BOD: the mnPartUnaccDirectLabor (CTS1) value was 
		not being set in the F3111WOIssuesEditLine XML message for JDE 8.9 and later.  
		It is now set from the F3111 record (in order to keep its value).

2011-08-18	ADP: The adapter now handles recycling of the ODBC connection for some 
		additional SQLSTATE codes: 
		- HYT01 Connection timeout expired
		- HY000 General error (but only for the following Oracle native codes)
		  - 3114 not connected to ORACLE
		  - 3135 connection lost contact
		Other SQLSTATE codes already handled include: 
		- 08003	Connection does not exist
		- 08S01 Communication link failure
		- HYT00 Timeout expired
		- 40003	Statement completion unknown

2011-08-19	ADP: Fix for contention between adapter sessions when buffering of BODs to
		prevent duplicate processing actually caused processing to be skipped in 
		some cases.   Because operating system resources such as named shared memory
		and named semaphores were not being uniquely identified between adapter 
		sessions, the same memory/semaphores could occasionally be used by mulitple
		sessions at the same time.

2011-08-19	ADP: Fix for handling imbedded single quote characters in SQL statements generated
		by the adapter - whether selects, inserts or updates.   When character data
		includes single quotes, they must be encoded as back-to-back single quotes since
		the entire character string is enclosed in a pair of single quotes.

2011-08-26	ADP: Fix for handling the JDE data type EVDT_VARSTRING for the PUT LIST BOD.
		Previously an exception occurred when trying to update a column of this type
		or any other unexpected type.  Updates were also made to gracefully handle 
		returning an error if another unexpected data type is encountered.

2011-08-30	ADP: Fixed cause of misleading message: Error! More than 1  system data source flagged!

2011-08-30	ADP: The F3111 table no longer has the following column:
		- BeginningHhMmSs (wmpbtm)
		as of JDE 8.10.  This is part of the Sync WorkOrder transaction.

2011-08-31	ADP: Added handling of the JDE XML error: 'The dispatcher gets timed out'.
		When encountered, the session ID is cleared and the business function is 
		retried automatically.

2011-08-31	ADP: The adapter now handles recycling of the ODBC connection for an 
		additional SQLSTATE code: 
		- HY000 General error (for the following additional Oracle native codes)
		  - 12541 TNS: no listener

2011-09-01	ADP: Added extra exception handling for calls to JDE.

2011-09-01	ADP: Eliminated the cause of the erroneous message: "Release of first thread 
		failed with reason code 288 for <SYNC+LOGON+xxxx;>".   (xxxx could vary based on
                the reference ID in the logon BOD).

2011-09-02	ADP: For the CONFIRM_WORKORDER BOD, an invalid location error would be returned to 
		TC even when the underlying error was that JDE was currently unavailable.  JDE 
		unavailable error is now returned (L002) so that TC can act on it accordingly 
		(e.g. delay and try transaction again).

2011-09-06	ADP: Added print out and log statements (level 0) to show when the adapter reconnects 
		and retries an SQL command after a failure.   (The failure is already being printed 
		out and logged at level 0).

2011-09-07	ADP: Some global variables for maintaining a prepared statement for getting
		column info are now uniquely maintained by thread.  A retry is also now done if there is
		an initial failure trying to get column info.

2011-09-13	ADP: Fix for setting the default item formatting - if a lookup in the F41001 table had 
		to be done to get it; it was always defaulting to the 2nd format rather than possibly 
		being short or 3rd.  Also resolved problem with Sync_SalesOrder (and possibly
		others) calling the GetPrimary function when errors had occurred with previous JDE 
		calls - but were being ignored up to the point of this call.

2011-09-14	ADP: The warning message "Unable to enter 'param' element" that was logged for the 
		JDE call GetDefaultBranch is now logged at log level 2 and higher; it was level 0.

		Also added the JDE function name to any messages that are logged or printed within the
		logic that handles sending the call to JDE and getting the response (for both XML and
		non-XML calls).

2011-09-16	ADP: Large buffer for processing UBEs removed from stack to reduce stack size required.

2011-09-21	ADP: Fixes for properly handling recovery after ODBC errors; previously handles were 
		being freed in the wrong order.

2011-09-22	ADP: Fixed exceptions on shutdown during ODBC connection disconnects

2011-09-22	ADP: New logging options DBG_ALL_JDE_XML and DBG_WARN_JDE_XML for debugging JDE XML 
		messages.  Now the XML from all JDE errors are logged to logfile (before the adapter 
		would not log XML for all errors because JDE would sometimes return 0 when the response 
		actually contained errors).  Plus not all JDE XML warnings and messages were being 
		returned in the Confirm BOD.

		Here is an example of the new logging option in use in a TC script:

			XML_AddField ( Handle, "DBG_ALL_JDE_XML", "Y")

2011-09-22	ADP: No longer log a message (LOGLEVEL 0) about missing 'session' element in response 
		for UBE requests to JDE.

2011-09-23	ADP: Some JDE Math Numeric and JDE Date variables were not being initialized.

2011-09-27	ADP: Many JDE errors (e.g. XML parse error) will be categorized as an L005 fatal 
		error.  This is returned in the response BOD's REASON_CODE element and can trigger 
		an adapter restart if the L005 related adapter parameters are configured to do so.

2011-09-28	ADP: Added support for configuring ODBC error actions via the configuration file 
		ODBCErrorActions.ini.  The .ini file can be in the directory that is considered
		the working directory or it can be in C:\.

		The file can have 3 different sections:
		
			[RESTART_ADAPTER] - In this section are listed all ODBC errors that should
			cause the adapter to be restarted if they occur.

			[RECONNECT_AND_RETRY_SQL] - In this section are listed all ODBC errors that
			should cause the adapter to reconnect to the data source and try the failing
			SQL one more time.  If it fails a second time, an error is returned.

			[NONE] = In this section are listed all ODBC errors that should not cause
			any special treatment to be done; an error is returned for the BOD.  The
			default action for most codes is to do nothing but return the error; however
			the adapter has some hard-coded default actions in the above to sections and
			if these should be overridden, then the [NONE] section can be used to do 
			this.

		In each section, one per line, should be the SQLSTATE value, optionally followed by
		a comma and a native code value.  If no native code value is specified, then only
		the SQLSTATE must match for the action to be performed.  If a native code is specified
		then both the SQLSTATE and the native error code values must match in order for
		the action to be performed.

		Leading/trailing white spaces and blank lines are allowed.  Comments can be specified
		using leading double slash (//) either on a line by itself or at the end of other
		lines.
		
		Here are sample .ini file contents which also shows what default actions are 
		hard-coded in the adapter.  If an .INI file is found, its entries will be added to
		the ones below.  If any SQLSTATE / Native error values in the .INI match a default
		combination of the same, the action in the .INI file will supersede the default action.


			[RESTART_ADAPTER]
			01000, 10054
			42S22

			[RECONNECT_AND_RETRY_SQL]
			08003
			08S01
			HYT00
			40003
			HYT01
			HY000, 03114	// Not connected to Oracle
			HY000, 03135	// Connection lost contact
			HY000, 12541	// TNS: no listener.


2011-09-28	ADP: Fix for calling UBE from Receive Item PO BOD; memory was being freed twice 
		and memory was being freed that should not have been.

2011-09-30	ADP: Fixed write to memory past end of buffer when decrypting passwords for a 
		SYNC LOGON BOD.

2011-10-13	ADP: Closed timing window where two different threads could clash accessing the
		same buffering related variable.  One of the threads could hang when the window
                existed.

2011-10-15	ADP: Addressed several memory cleanup issues - most during error processing.

2011-10-21	ADP: The adapter now distinguishes between errors and warnings for a number of
		different JDE business functions where possible errors were returned in the
		middle of other business function parameters as opposed to a special error
		section or the business function return code itself.  Now only when the JDE 
		category for the returned error code is found to be Error (and not Warning or Info)
		as specified in the JDE data dictionary F9307 table, will error processing
		be performed.   Warnings and Info error codes will result in the continuation
		of processing.

2011-10-24	ADP: Fix for handling XML system type errors vs JDE business function errors.
		L002 or L005 is returned as REASON_CODE only for XML system errors - not JDE
		business function errors.

2011-10-26	ADP: Fix for Ship SalesOrder BOD incorrectly getting the error: "Sales Order line 
		not uniquely identified."   This could happen if multiple SOLINES from the 
		incoming BOD match one of the records fetched from the F4211 table but none of the
		lot/location combinations from the BOD matched the fetched record. In addition,
		at least one other record must be fetched from the F4211 table with a line number
		that matched the other record.  (The SO number and branch didn't have to match).


2011-10-28	ADP: For processing of the SYNC SALESORDER BOD, removed column references for the 
		F4201 and F4211 tables which do not apply to JDE 8.10 and later (the references
		are still used when the adapter interfaces to earlier JDE versions):  

		For F4201:

			CommissionCode1 (shcmc1)	CommissionCode2 (shcmc2)
			DatePromisedShipJu (shpsdj)	RateCommission1 (shcmr1)	
			RateCommission2 (shcmr2)

		For F4211:

			AccountId (sdaid)		AcctNoInputMode (sdani)			
			AllocateByLot (sdcmgl)		ApplyFreight (sdfuf1)			
			ApplyFreightYN (sdaft)		CommodityCode (sdcdcd)
			ConditionsOfTransport (sdcot)	ContractBalancesUpdatedY (sdbalu)	
			DatePromisedShipJu (sdpsdj)	DiscntApplicationType (sdfapp)		
			DiscountFactor (sddspr)		DiscountFactorTypeOr (sddsft)
			DraftNumber (sddftn)		FreightCalculatedYN (sdfrtc)
			LedgerType (sdlt)		LineStatus (sdstts)
			ObjectAccount (sdobj)		PromationNumber (sdprmo)
			RateCodeFrieghtMisc (sdfrat)	RateTypeFreightMisc (sdratt)
			Salesperson1 (sdslsm)		Salesperson2 (sdslm2)			
			SalespersonCommission1 (sdslcm)	SalespersonCommission2 (sdslc2)
			Subsidiary (sdsub)

2011-10-31	ADP: Fixed one cause for "All Logons in Use" errors that persist after adapter is 
		unable to connect to the JDE database - even after the database recovery has
		completed successfully.  The fix also handles situations in which connectivity is to 
		older versions of JDE where database access was through the JDE API rather than ODBC.

2011-10-31	ADP: Fix for incomplete trace message "Unexpected exception caught for ".

2011-11-02	ADP: Several improvements to recovery after ODBC errors have occurred.

2011-11-04	ADP: Fixed problem with incorrect JDE table/structure information being cached if 
		an SQL error occurred When retrieving that information.

2011-11-15	ADP: Fix for Execute Command BOD return incorrect error about parsing BOD - caused
		by 10-31 change for "All Logons in Use".

2011-11-17	ADP: For the CALL FUNCTION BOD, a new parameter can now be specified for each function
		(same level as FNNAME and DSNAME) called IGNORE_ERRORS_IF_ZERO_RC.  If set to TRUE or
		YES, there will be no check made for any JDE error messages if the return code from
		the business function call is 0.   There are cases where the internal processing of
		a business function can cause warnings or even errors generated but the final return
		code ends up being 0.  If in this scenario, the errors should be ignored by the 
		adapter, the adapter will return no error in the BOD response.  Here is a sample
		use of this new keyword:

			XML_AddField (UV1, "FNNAME", "GetLocalComputerId")
			XML_AddField (UV1, "DSNAME", "D9800180")
			XML_AddField (UV1, "IGNORE_ERRORS_IF_ZERO_RC", "TRUE")

2012-01-01	ADP: Fixed capitalization problem with the szErrorMessageId field in the 
		F4611SuggestionEditLine call - affecting the CONFIRM WHSEMOVE BOD.  This was 
		introduced with the 2011-10-21 change above.  With the incorrect spelling,
		the true szErrorMessageId value was never retrieved.


2012-03-28	ADP: For the SYNC TEST BOD, logging to the trace log of the message:

			Executing on line nnn

		is now done at logging levels of 95 and higher.  Previously this was written to the
		log regardless of the logging level.

2012-04-24	ADP: Fixed the recovery process from ODBC errors for the GetColumnSpecs function.

2012-04-30	TCP: Fixed one cause of TCP/IP Manager "memory block" errors.  This is the failing
                scenario that would previously lead to all memory blocks being used up:
		- TC session sends request to adapter server via TCP/IP Manager which takes a bit of
		  time - e.g. 20 seconds
		- TCP/IP Manager is shut down before adapter server replies
		- TCP/IP Manager is restarted within 5 minutes of first attempt of adapter to send
		  reply to TC.
		- TCP/IP Manager thread would get caught in a loop trying to send message to TC queue
		  that no longer exists.  Even if TC session is restarted, queue name is likely to be
		  different because it is based on the process ID of the TC session.
		- Consuming all of the memory blocks could take as long as 5-6 hours at which time
		  the memory block errors would start to occur.

2012-04-30	TCP: Fixed causes of high CPU usage by the TCP/IP Manager.

2012-05-03	ADP: Change to adapter shutdown process to avoid some scenarios where it would hang.
		  
2012-05-04	TCP: Fix for problem where TCP/IP Manager would hang on shutdown when X was pressed
		to stop it.

2012-05-23	ADP: Redesigned the message buffering mechanism to resolve mutex errors that resulted
		in certain threads hanging.

		Also made a change to try to resolve hangs of the adapter on shut down on certain systems.

2012-07-12	ADP 3.0.8b: When MINIMIZED is the value for the SHOWWINDOW parameter of the Execute_Command
                BOD, the adapter makes sure that the command is executed in the background so that it does
                not steal the focus from other applications.

                Version number and letter is now printed out.

2012-07-12	TCP 3.0.8b: Version number and letter is now printed out.

2012-07-26	ADP 3.0.8c: Fix for getting proper schema separator after an ODBC connection begins working,
		in the case the connection failed on the first attempt to use it.

		Also changed adapter so that it does not require any JDE logons - provided the new 
		parameter: NO_LOGONS = Y is specified in the SYNC LOGON BOD.

2012-08-28	ADP 3.0.8d: For database operations involving the JDEDATE data type, a September 2006 change
		made it such that date values that also had a time value following it would be flagged as
		an invalid date.  The code has now been changed to ignore everything after the 10th character
		provided.  The format of those first 10 characters must be YYYY-MM-DD.

2012-09-06	ADP 3.0.8e: Fix to remove attempts to buffer BODs whose verb is GET or GETLIST or the SYNC
		VALIDATION BOD.  While the attempts to buffer these BODs was harmless if they contained
		certain kinds of data (e.g. line feed), error messages would be logged.  Again these were 
		harmless but did write unnecessary data to the logs.  The erroneous buffering problem was
		introduced with the 2012-05-23 redesign of the buffering code.

2012-09-13	TCP 3.0.8c: Corrected display of certain IP addresses - when followed by colon and queue name.

2012-09-21	TCP 3.0.8c (cont'd) / ADP 3.0.8f: Improved logging of the passing of messages between queues.

		Fixed problem that slowed communication because transfer between internal queues was not
		acted on right away.

		DebugOn.exe now shows the current settings (use ? as the parameter if you don't want
                anything changed after the parameters are shown.

		Fix for one cause of mutex errors related to logging.  Message received before was:

		"Thread nnn failed to get LogFile mutex ..."

2012-10-15	ADP 3.0.8g: Corrected problem with Receive_ItemPO BOD handling partial quantity receipts.

		ADP 3.0.8g (cont'd) / TCP 3.0.8d: Another improvement to mutex errors related to logging;
		retries are now attempted if the mutex cannot be obtained within 5 seconds.

2012-10-22	ADP 3.0.8h: Fix for truncation of lot and location fields to 13 characters for the
		XML implementation of the Ship SO and Confirm Ship BODs.

		Corrected exception that could occur if no logon BOD provided to adapter before other
		BODs are sent for processing.   This could happen when UseODBC was in effect.

		Corrected the display of the "Location: <>" on the screen for the Ship SO BOD - in the
		case the Location was passed in the BOD.

2012-10-25	ADP 3.0.8i: Improved the error logging for JDB database function failures.

2012-10-29	ODB: LoadODBC now gives more accurate errors when writing to the output table fails.  
		Previously you might see a non-specific error such as "Function sequence error" rather 
		than the appropriate error for the actual failure (e.g. Data longer than column size).

2012-11-05	ADP 3.0.8j: L003, "No logons exist" is now returned for GetList and PutList BODs if, 
		when the adapter is processing these BODs, it has not yet received a SYNC LOGON BOD with
		a SYSTEM=Y attribute set for one of the databases.  This was also the behavior of the adapter
		prior to release 3.0.8c.  But in 3.0.8c, with the introduction of the new NO_LOGONS parameter
		in the SYNC LOGON BOD, the behavior changed such that an L005 error was returned instead.

		Minor wording change for startup message about registry key failing to be opened; it's no 
		longer flagged as an error - just informational.

2013-01-30	ADP 3.0.8k: Improvements to messages that are logged and written to the screen.  More
                values in messages and more information about errors logged.

2013-01-30	TCP 3.0.8e: Fix for duplicate message IDs which caused messages or responses to be
		ignored.  Improvements to logged messages.  Fix for one cause of a mutex error.

2013-02-11	ADP 3.0.8L / TCP 3.0.8f: Fix for mutex errors related to ReadQueue or WriteQueue
		such as the following:

		  ReadQueue::GetMutex failed for 'OWMQXA' line 565 because of wait timeout (1000) or failure (258).
		  ReadQueue::ReceiveMessage failed, unable to get mutex after 1000 ms wait.

2013-03-13	ADP 3.0.8m: Corrected the padding of leading blanks for WorkCenter / Branch / CostCenter /
		PlanningDepot / BusinessUnit that is required by some JDE business functions.  The removal of this
		padding was an inadvertent side effect from the 2012-10-22 change to fix a truncation problem
		for location and lot.  This affects only the XML interface to JDE.  This could affect the following
		BODs: Confirm Load / WO / Warehouse, Cycle Count, Issue Inv, Item Transfer, Rcv Item PO, Rev Ship, 
		Scrap Cmp, Sync Asset / Item / Lot / PO / SO / Test / Time / WO, Tag Count and Update Inventory / Route.

2013-03-20	ADP 3.0.8n: Fixed display to screen of indexed fields read from BOD - such as SITELEVEL1, SITELEVEL2

                Also for the handling of the Ship SO BOD, fixed exception that could occur when trying to log message
                about invalid order/line because of the line type and inventory values.  And improved logging,
                printing to the screen when one or more SO lines from the input BOD could not be found in the set
                of records retrieved from JDE.

2013-04-03	ADP 3.0.8o: Fixed possible cause of exception if any JDE database column name is longer than 10 
		characters.

2013-04-16	ADP 3.0.8p: Fixed incorrect comparison to 0 for Ship SO BOD processing when the quantity to ship (SDSOQS)
		is between 0 and 1.

2013-04-30	ADP 3.0.8q: The adapter was not properly picking up the configured Windows locale and thus not
		handling the decimal part of line numbers such as 72,001 when the comma was set to be the 
		decimal point - for locales such as French-Canada.  When the adapter starts it now prints to
		the screen the locale it is using.

2013-05-08	ADP 3.0.8r: More locale related changes.

		Also added fix for potential exception with the SYNC SO BOD when unable to get szSalesOrderFlags.

2013-05-31	ADP 3.0.8s / TCP 3.0.8g Made the following enhancements to logging for both the adapter and TCPIP Manager:
		- One key enhancement is that the LogLevel can now be set differently for different adapter sessions and even the
		  TCPIP Manager - using the .INI file scheme described in the following bullets.
		- The following logging parameters can now be read from an .INI file:  LogLevel, LogFile, DebugFile, LogCount,
		  DebugCount, LogSize, DebugSize, Debug, Dont_Print_Pointers, DBG_ALL_JDE_XML and DBG_WARN_JDE_XML.
		- Both the adapter and TCPIP Manager will first look for COMMON.INI in the current directory and if found will
		  read and process any of the above listed logging parameters.   It is not an error if the file does not exist.
		- Next the adapter / TCPIP Manager will look for an .INI file specific to itself, based on the input queue name.
		  For the adapter this is the first parameter, which defaults to OneWorld01 if not provided (so the .INI file would
		  be called OneWorld01.INI.  For TCPIP Manager the queue name is always TCPIPQUEUE.INI.  Again it is not an error if 
		  this file does not exist.
		- Parameters in these .INI files should be in the form:

		    parameter = value

		  such as:

		    LogLevel = 8

		- Lines starting with double slashes (//) are treated as comments and ignored.  Blank lines are also ignored.
		- The keywords TraceFile, TraceCount and TraceSize can be used in place of LogFile, LogCount and LogSize - since
		  these apply to the trace (*.TRC.*) output files (as opposed to the debug (*.DBG.*) output files.
		- The .INI file is read as soon as the adapter / TCPIP Manager starts and processes its command line parameters -
		  which should be before any logging is attempted - unless some error occurs while processing those command
		  line options.  
		- When either COMMON.INI or <queuename>.INI is processed, the parameters that are read will be printed to the
		  screen so they can be viewed for validation.
		- After the Adapter / TCPIP Manager are started, the R key can be pressed to trigger the Adapter / TCPIP Manager
		  to reread the .INI file. So a parameter could be changed in the appropriate .INI file and the R key pressed to
		  affect the logging output for a particular adapter without having to shut down and restart that adapter.  Whenever
		  R is pressed, the processed parameters will again be written to the screen.
		- The use of the .INI files and R key should replace the tools DebugOn / DebugOff as the way to change 
		  the logging settings for a running adapter / TCPIP Manager.  In fact DebugOn / DebugOff would only affect parameters
		  that were being shared between the adapters - such as the loglevel.  But that no longer works.
		- Note that changes to logging parameters that are received by the adapter in SYNC_LOGON or SYNC_ADAPTER BODs
		  will still be acted on even if the parameters had previous been read from an .INI file.

2013-07-26:     ADP 3.0.8t: For the ODBC implementation of the GET LIST BOD, the maximum data size supported was increased 
                from 255 to 4096 characters.

                Improved details of error reporting in Confirm BOD when errors occur retrieving database column information.

2013-09-12:     ADP 3.0.8u: For partial receipts the processing of the ROUTE_RECEIPT BOD was setting the quantity-at-operation
                value (pxqtyo) to the move total rather than the actual quantity available. 
                
2013-10-01:     ADP 3.0.8v / 3.0.9:  A new command line option 'UseF98611' can be specfied to indicate that the adapter should further
                map a DATP data path found for a table in the F986101 to a 'real' ODBC data source name and library found in
                the F98611's DATB and DATB2 columns, respectively, for that DATP value.  This would be set to 'Y' in a 
                JDE 9.x environment with the data on an IBM iSeries (AS400).  This can greatly reduce the number of ODBC DSNs
                that need to be configured, and reduce the total number of connections that the adapter opens.                              

2013-12-09:     ADP 3.0.9a / TCP 3.0.9a: Eliminated the use of inter-process sharing of logging parameters.  With the use of the .INI 
                file for logging parameters, introduced in version ADP 3.0.8s / TCP 3.0.8g, this should prevent the cross-logging of
                messages into logfiles for a different adapter.  The logging of messages starts only after the check for the .INI file
                containing logging parameters.  In the past some logging could actually have been attempted before that - in particular,
                the trace message about "CheckAvailableLogons".   

                Note that if .INI files are not used, then the default trace file TRACE.LOG and/or default debug file DEBUG.LOG could 
                still be written to by any adapter session until a SYNC_LOGON or SYNC_ADAPTER BOD is received by that adapter session.  
                The TCP/IP Manager process will also write to TRACE.LOG / DEBUG.LOG if it does not get alternate logging parameters from 
                an .INI file.

2014-02-03:     ADP 3.0.9b: Added new RestartForOldThreads command line option as an alternative to KillOldThreads because if
                a thread has to be killed, any resources it owned remain locked and any flags it had set are not cleared when
                it is killed.   So it is better to restart the adapter if any thread is deemed to have taken too long to complete
                its work.   This results in a cleaner recovery.   Note that upon shut down of the adapter, the adapter will
                wait up to the default of 30 minutes (or the ThreadDeath value specified on the command line) for threads to
                end themselves.   So when using RestartForOldThreads, you should also explicitly set ThreadDeath to a very low value 
                such as 1 or 2 minutes so that the adapter does not wait the additional 30 minutes before shutting down - on top of
                the time it waited for the old thread to complete its work (i.e. the value specified for RestartForOldThreads).

                Also fixed writing to unallocated memory that could occur when trying to access JDE tables via ODBC when JDE has 
                configured them as views.  For example, when auditing is turned on the F4108 table will have a view created for it
                and given the F4108 name.  But the underlying table can still be accessed directly using the name F4108_ADT.

2014-02-14:     ADP 3.0.9c: Removed the cause of extraneous (and harmless) messages being logged about SelectColumn failures for the 
                F4211 and the F983051 tables.

                Also two fixes for the SyncRequest BOD when running against JDE E1:
                - Fixed the updating of F4211 table for the SyncRequest BOD and the updating of the F4960 table for the UpdateShipCharge
                  BOD when connecting to JDE databases via ODBC.  Primary key columns were not part of the column selection list which
                  caused the updates to fail.
                - In the F4611Desuggest business function, we now explicitly set the mnBatchNumberRequests value and explicitly set to
                  a single blank the following flags: cDeleteFlag, cResuggestFlag, cVarianceFlagCode, cCodePhase, cDataFieldErrorCode.
                  Prior to this change, the F4611Desuggest call would return no error but it would not actually update the F4611 table
                  or perform other nested JDE functions.

2014-05-01:     ADP 3.0.9d: Fixed ODBC implementation for handling JDE types EVDT_INT and EVDT_ID for the GET_LIST and PUT_LIST BODs.

2014-05-02:	ADP 3.0.9d continued: Added support for IGNORE_BOD_LOG_PARAMETERS = Y in adapter session-specific .INI files
                (e.g. OneWorld01.INI).  If this parameter is in effect, then the adapter will ignore any logging parameters that
                are sent to it in SYNC_LOGON and SYNC_ADAPTER BODs.   This is a quick way to move logging parameters to the session
		based .INI files without having to change TC scripts.

		Added the ability to override adapter behavior in response to particular ODBC errors using the new
		ODBC_ERROR_ACTION parameter in the same adapter session-specific .INI files (e.g. OneWorld01.INI).   This is an 
		alternative to using ODBCErrorActions.ini - which affects all adapter sessions at once.   By putting 
		ODBC_ERROR_ACTION in a session-specific .INI file, only that session is affected.  The syntax is:

			ODBC_ERROR_ACTION = RESTART_ADAPTER | RECONNECT_AND_RETRY_SQL, SQLSTATE [, NATIVE_ERROR_VALUE]

		The first parameter is the action to take and can be one of two values:

			RESTART_ADAPTER	means the adapter should restart immediately if this error is encountered.

			RECONNECT_AND_RETRY_SQL means the adapter should close the ODBC connection, reestablish that 
			connection and then retry the SQL that originally failed.

		These are the default behaviors of the adapter if this keyword is not used and if ODBCErrorActions.INI is not used:

			ODBC_ERROR_ACTION = RESTART_ADAPTER, 01000, 10054
			ODBC_ERROR_ACTION = RESTART_ADAPTER, 42S22

			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, 08003
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, 08S01
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, HYT00
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, 40003
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, HYT01
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, HY000, 03114	
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, HY000, 03135	
			ODBC_ERROR_ACTION = RECONNECT_AND_RETRY_SQL, HY000, 12541	

2014-06-08:	ADP 3.0.9e: Fix for adapter aborting when trying to log a message that is longer than 10K characters.

2014-06-20:	ADP 3.0.9f: Fix for GET_LIST BOD converting linefeed characters to carriage return/linefeed combo in output text files.

2014-06-25:	ADP 3.0.9f continued: Fix for handling recovery of ODBC connection errors that result in "invalid handle" errors.
		This could affect any database operation but was observed specifically for the GET_LIST BOD which would return
		0 records from a query, not indicating any error had occurred when in fact an "invalid handle" error had occurred
		and should have caused a reconnect and retry of the selection.   The reconnect and retry is now performed and
		if both are not successful, an error is return in the reply for the BOD.

2014-06-27:	ADP 3.0.9f continued: Two fixes for reading logging parameters from .INI files:
		- Trailing blanks and other white space now removed from the end of file names (and any other parameter value)
		- Support for the BODFILE parameter was missing

2014-08-28:	ODB: Fixed cause of 22002 SQL error when fetching column information.

2014-12-03:	ADP 3.0.9g: The GET_LIST BOD now updates its 'last busy' time during processing, allowing its processing to 
		exceed the ThreadDeath / RestartForOldThreads / KillOldThreads thread timeout as long as it is actively fetching
		records and generating output.

2015-03-25:	ADP 3.0.9h: PUT_LIST BOD now supports performing multiple database operation statements in a single BOD, and/or
		multiple ROWs within an INSERT statement.   

		Also added the VERSION and VERSIONNUM attributes to the CONFIRM section of the Confirm BOD response to TC (the 
                same section where STATUSLVL is) - so that version specific differences in reply formats can be handled.

2015-05-20:	ADP 3.0.9i: Disabled the fast logging option - which is not known to be being used anywhere - because on faster
                hardware and/or multi-processors, the initialization of the code for this option might cause either of the following 
                errors to occur repeatedly and prevent the adapter from operating correctly: "Read failed because unable to obtain 
		read lock..." or "Exception in Lock for timeout...".

2015-06-10:	ADP 3.0.9j: Efficiency changes made for the set of JDE business calls made while processing the Issue Inventory BOD.
		From one third to one half of the business function calls have been eliminated by removing duplicate calls when the 
		branch or the branch / item / lot are the same for other items in the BOM.

2015-06-12:	ADP 3.0.9j continued: Fixed cause of problem where adapter would try to process an Issue Inventory BOD as if it was 
		talking to a pre JDE 8.9 environment when in fact JDE was 8.9 or later.   This would result in error 99 being returned.
		This incorrect processing would occur if the very first BOD that the adapter fully processed (i.e. not counting 
		returning a buffered response) was a Put_List, Get_List, Execute_Command or Sync_Adapter; after that all Issue 
		Inventory BODs would be processed incorrectly.

2015-06-30:	ADP 3.0.9j continued: Change to the error checking for JDE calls during processing of the RECEIVE+ITEMPO BOD.  Certain 
		cases where JDE returned errors should not have been treated as errors.  For those situations, processing now continues
		instead of returning an error to the requester.

2015-07-15:	ADP 3.0.9k: Added handling of JDE error code 99 - invalid business function call.  Prior to this change, if this
                return code was received for a JDE business function call, BOD processing would not be stopped.  This is because this
                error code is not accompanied by an error message as all others are.  But now if this return code is received, the BOD 
                will return REASONCODE set to L005 and DESCRIPTN set to "An invalid BSFN name exists".
            
2015-07-17:	ADP 3.0.9k continued: Processing of the SYNC_LOGON BOD now rejects the BOD if an attempt is made to change the JDE 
		environment.  If the JDE environment should be changed; the adapter must now be restarted.

                Also the ENVIRON element of the DBLOGONID and LOGONID elements of the SYNC_LOGON BOD can now be set at the higher 
		level, one time, and will then be applied to all DBLOGONID and LOGONID elements.
                
2015-11-09: 	ADP 3.0.9l Added ability to have the Adapter request a new JDE session ID based on a session usage time limit, upon 
		request via the Sync_Adapter BOD, or interactively by pressing the 'S' key on the console. This is intended to allow 
		JDE kernel processes to end as their last using session disconnects.  The usage time limit may be set via a command 
		line parameter (SESSIONAGELIMIT=[# minutes]) or via a SESSIONAGELIMIT element in the Sync_Logon BOD.    

                Added UNEXPECTEDWINDOWS.INI to optionally configure handling of pop-up windows.  Refer to dcbridgeug.doc. 

                Added IGNOREHOLD optional element on ship_salesorder BOD to ignore F4201 HOLD value. 

2016-04-22:	ADP 3.1.0 Fixed problem handling command line parameters enclosed in double quotes.

		Improved shut down processing while waiting for threads to complete their work; some resources were being freed right 
		away, sometimes affecting those threads.

		Fixed conversion of JDEDATE data type to wide character format; could have resulted in memory corruption.

		Added missing freeing of memory and other cleanup for certain error conditions.

		Fix for failure to ensure the FILE parameter is less than 512 bytes for the Sync_Attachments BOD.

		TCP 3.1.0 Corrected display of IP addresses in some messages.  Also adjusted some timeouts to improve efficiency.	

2016-08-03:	ADP 3.1.0a Fixed cause of exception in the Put List BOD code if a problem prevents the BOD from being processed - such
                as a logon not being available.

2016-08-10:	ADP 3.1.0a continued: Added INNERJOIN capability to Get List BOD (ODBC only).  Fixed issue in Get List in a SELECT 
                element (i.e. the WHERE predicates when multiple single-character JDE field values where listed (e.g. F4611 TYFL IN 
                ('1,'3') ) for operation with ODBC. 

2016-08-12:	ADP 3.1.0a continued: Resolved issues that slowed down the adapter shut down in certain scenarios.  Also now prevent
                an adapter that is being restarted in certain scenarios from reading incoming messages that should be handled by
                the newly started instance of the adapter.

2017-07-24:     ADP 3.1.0b: Added GetListEmptyLocations BOD.

2017-12-05:     ADP 3.1.0c: Added LOCNTYPE, LOCNUPPER, LOCNLOWER as optional fields for GetListEmptyLocations BOD. 

2018-04-21:	UTL: Fixed memory leak in the WatchService utility - used to auto-restart adapter / TC processes that end
                prematurely.

2018-08-10:	UTL: WatchService utility now will match the program name on just "adapter" and "tc2" rather
                than "adapter.exe" and "tc2.exe", allowing the program names to have "adapter" or "tc2" any
                where in the name and not just at the end.

2018-09-05:     ADP 3.1.0d: For jdeCallObject calls, changed number of retries for JDE errors such as error 14 (no connection) 
                from 3 tries to 10 tries. 

2018-10-02:     ADP 3.1.0e: For warehouse move confirm, when lot/SN differs from suggested value then submit to JDE as location detail sequence over-ride 
                (before it was getting a JDE 3488 error ).

                Added command line option "NewSessionAlways=Y" to configure the adapter to always send an empty JDE Session ID at the start of each 
                BOD process.  This is to allow JDE to assign a session per current conditions rather than have the adapter request a specific session. 

2018-11-07:     ADP 3.1.0f: Fix for Issue Inventory BOD - an exception was occurring in certain bad JDE data situations 
                involving a missing parts list.

2018-12-03:     ADP 3.1.0f continued: When the JDE response includes an <errors> section but the <returnCode code> value is 0, this is now treated
                like a warning rather than a true error.  This was done for the F3111WOIssuesEditLine call to JDE during processing of an Issue
                Inventory BOD which can give a returnCode value of 0 for the <error code='1115'>Error: Company Currency Code Invalid</error>
                and that error was not a true problem.

2019-01-17:     TCP 3.1.0a: Corrected the repeated logging of the following messages by the TCPIP Manager in situations
                where the target server disconnects and never reconnects - such as when the target server is rebooted:

                   ReadHandler::GetSocketEvent failed, connection closed
                   ReadHandler::ReadData failed, connection closed

                These messages could be generated at a rate that the trace log could consume several GBs of data in a day.

2019-04-16:     ADP 3.1.0g: Added BATCH_NUMBER to the BACKHDR section of the BACKFLUSH_WORKORDER BOD.  Use a custom function call to get
                the batch number.

2019-04-24:	ADP 3.1.0g continued: Improved the 3.1.0f change for handling JDE errors found in an <errors> section when the <returnCode>
                value is 0.  No longer are all of these kinds of errors treated as warnings.  Instead, the file JDEErrsToIgnore.ini is
                now needed to list the JDE errors that should be ignored.  The following data in that file will cause the 1115 error above
                to be ignored (following the 4 JDE error identifier must be a space; then a comment can follow that):

                   [JDE_ERRORS_TO_IGNORE]
                   1115 // Company Currency Code Invalid

2019-06-10:     ADP 3.1.0h: Fix for DB connection handle leak in GetListEmptyLocations BOD.   Encountering need to create temporary ODBC connection(s) to 
                JDE will now cause all handle-in-use flags to be cleared at the end of the BOD's processing. 

2019-07-24:     ADP 3.1.0i: The szProgramID was being set to "Adapter" for the WriteCardexRecord JDE call for the Scrap Component BOD.  It is now
                set to "EP31116".

                Fixed problem loading data from JDEErrsToIgnore.INI when the adapter is running as a service.

2019-08-27:     ADP 3.1.0i: The Scrap_Component BOD now returns error W003 rather than L005 if there is a unit of
                measure conversion error.  L005 errors are intended for situations where a retry might resolve
                the problem; that can't happen for a UOM conversion error.
 
2019-11-05:     ADP 3.1.0i continued: When a JDE error is converted to a warning (see 2019-04-24 mechanism for doing this above),
                a message is now logged (loglevel >= 2) and printed to the screen.

2019-11-07:     ADP 3.1.0i continued: Change to the handling of JDE error code 99 - invalid business function call, whose 
                handling was originally changed for the 2015-07-15 ADP 3.0.9k build.  The reason code is now set to L006
                instead of L005 because the latter causes the TC session to retry but for this kind of error, a retry 
                will never succeed.

----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------