Compile function Copy_Record_To_SQL(Table, Key, LogError, pKey)

/*****************************************************************************\
	Copies the given record to the MSSQL database. Since every table differs
	from the next, it's not really possible to use the same code base for all
	tables. Therefore, common functionality has been moved into separate
	stored procedures. Supported tables are ones that have a stored procedure
	that handles the copy request. These are called the Handlers. A Handler
	is identified by the following naming convention:
	
	COPY_XYZ_RECORD_TO_SQL
	
	XYZ is a placeholder for a table name. For example, the ASM_PART table has
	a handler called COPY_ASM_PART_RECORD_TO_SQL. If a table does not have a
	handler, then it is not supported by this procedure.
	
	History
	-------
	03/22/2010    KRF   Original Programmer
	04/05/2010    KRF   Modified to lookup handler in SYSOBJ instead of using
						large Locate list 
	09/23/2010    KRF   Added logic to set @DICT, @ID, and @RECORD so handlers
	                    can use symbolics
\*****************************************************************************/
$insert Microsoft_Ado_Equates

If Assigned(LogError) else LogError = 0

Declare subroutine SRP_Com, Sql_Services
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services
Ans = ""

// Make sure table is uppercase
Convert @LOWER_CASE to @UPPER_CASE in Table

TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
Locate Table in TablesToSkip by "AL" using "," setting ListPos else
    
    // The expected name of the handler
    Handler = "COPY_":Table:"_RECORD_TO_SQL"
    
    // Find the stored procedure that handles this table
    Open "SYSOBJ" to hSysObj then
        Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
            // Connect to the ODBC
            If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
                ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
                If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then   
                    // Read the record and call the handler
                    Open Table to hTable then
                        Read @RECORD from hTable, Key then
                            If Key NE "" then
                                Open "DICT.":Table to @DICT then null
                                @ID = Key
                                Ans = Function(@Handler(Connection, Key, @RECORD))
                                If Ans EQ '' then
                                	If Assigned(pKey) then
										If pKey NE '' then
											Open 'SQL_PENDING' to pTable then
												Delete pTable, pKey else null
											end
										end
                                	end
                                end
                            end
                        end else
                            Ans = 'Unable to read ':Key:' from ':Table:' table.'
                        end
                    end
                end else
                    Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
                end
                SRP_Com(Connection, "CALL", "Close")
                SRP_Com(Connection, "RELEASE")
            end else
                Ans = "Unable to create ADO connection."
            end
        end
        
        If LogError and Len(Ans) then    
            Open "SQL_ERROR" to hSqlError then
                ErrorKey  = OConv(Date(), "D4-J")
                Timestamp = OConv(Datetime(), 'DT')
                Read Errors from hSqlError, ErrorKey then
                    Errors := @FM:Table:@VM:Key:@VM:Timestamp:@VM:Ans
                    Write Errors to hSqlError, ErrorKey
                end else
                    Errors = Table:@VM:Key:@VM:Timestamp:@VM:Ans
                    Write Errors to hSqlError, ErrorKey
                end
            end
        end
        
        If Assigned(pKey) then
        	If (pKey NE '') then 
				// Always log the result
				Open 'SQL_LOG' to hLog then
					If Ans EQ '' then
						Result = 'PROCESSED'
					end else
						Result = Ans
					end
					CurrDate = Date()
					Read Log from hLog, CurrDate then
						Log := @FM:pKey:@VM:Result
					end else
						Log = pKey:@VM:Result
					end
					Write Log to hLog, CurrDate
				end
			end
        end
    end
end
    
Return Ans



