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. ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------