spences10
10/17/2016 - 7:00 PM

I used this back when the company I worked at had an incredibly slow file server so I made this, it relies on the tables having date time st

I used this back when the company I worked at had an incredibly slow file server so I made this, it relies on the tables having date time stamps

Option Compare Database
Option Explicit




Public Sub ReplicateTableFromServerDownToClient(strTableName As String, cn As ADODB.Connection, blnRetrieveArchive As Boolean)
    
    On Error GoTo errUnableToReplicateToClient
    
    '// Define a query which will retrieve all rows from the server database table
    Set rsServer = New ADODB.Recordset
    Set rsClient = New ADODB.Recordset
    If strTableName = "tblTechnicalLog" And blnRetrieveArchive = False Then
        strLookup = DLookup("[StatusID]", "tblStatus", "[StatusName]=" & Chr(39) & "Open" & Chr(39))
        strSQL = "SELECT * FROM tblTechnicalLog WHERE StatusID = " & Chr(39) & strLookup & Chr(39)
    ElseIf strTableName = "tblXrefLogManager" And blnRetrieveArchive = False Then
        strSQL = "SELECT t1.TechnicalLogID, t1.TechManagerID, t1.LeadTechManager " & _
                    "FROM tblXrefLogManager AS t1, tblTechnicalLog AS t2, tblStatus AS t3 " & _
                    "WHERE t1.TechnicalLogID = t2.TechnicalLogID AND t2.StatusID = t3.StatusID AND t3.StatusName = 'Open'"
    Else
        strSQL = "SELECT * FROM " & strTableName
    End If
    rsServer.Open strSQL, cn, adOpenStatic, adLockOptimistic '// adOpenDynamic
    rsClient.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
  
    '// Identify how many rows are in the server database table
    If rsServer.EOF = False Then
        rsServer.MoveLast
        lngNumberOfRows = rsServer.RecordCount
        rsServer.MoveFirst
    End If
  
    '// Dont attempt to replicate if the table is empty
    If lngNumberOfRows = 0 Then
        GoTo skipProcessing
    End If
  
    '// Empty the table on the client database
    DoCmd.SetWarnings False
    DoCmd.RunSQL ("DELETE FROM " & strTableName)
    DoCmd.SetWarnings True
    
    '// START : loop around all rows in the server database table
    For lngRowNumber = 0 To (lngNumberOfRows - 1)

    '// Create an empty row - later used to insert into the client database table
    rsClient.AddNew
  
    '// START : loop around all columns in the current row from the server database table
    For lngColumnNumber = 0 To (rsServer.Fields.Count - 1)
  
    '// Fill the column in the client database table with the contents of the column
    '// In the server database table
    If IsNull(rsServer.Fields(lngColumnNumber)) = False Then
        rsClient.Fields(lngColumnNumber) = rsServer.Fields(lngColumnNumber)
    End If
  
    '// END : loop around all columns in the current row from the server database table
    Next lngColumnNumber
  
    '// Insert the formatted row into the client database table
    rsClient.Update

    '// Get the next row from the server database table
    rsServer.MoveNext
  
    '// END : loop around all rows in the server database table
    Next lngRowNumber
    
    rsServer.Close
    rsClient.Close
    Set rsServer = Nothing
    Set rsClient = Nothing

Exit Sub

skipProcessing:

    '// Close recordsets
    Set rsClient = Nothing
    Set rsServer = Nothing
    cn.Close
    Set cn = Nothing
    
    Exit Sub
    
errUnableToReplicateToClient:

    MsgBox "Unexpected Error : " & Err.Number & vbNewLine & Err.description
    GoTo skipProcessing
    
End Sub




Public Sub ReplicateRowFromClientUpToServerDB(strTableName As String, strNameValuePair As Variant, cn As ADODB.Connection)
        
    '// Determine whether a row already exists with this primary key in the server database
    Set rsServer = New ADODB.Recordset
              
    '// Build SQL Statement
    strSQL = "SELECT * FROM " & strTableName
            
    For i = 0 To UBound(strNameValuePair)
    
    If strNameValuePair(i, 1) = "True" Or strNameValuePair(i, 1) = "False" Then
        '// Do nothing
    Else
        strNameValuePair(i, 1) = Chr(39) & strNameValuePair(i, 1) & Chr(39)
    End If
    
        If i = 0 Then
            strSQL = strSQL & " WHERE " & _
                                strNameValuePair(i, 0) & " = " & strNameValuePair(i, 1)
        Else
            strSQL = strSQL & " AND " & _
                                strNameValuePair(i, 0) & " = " & strNameValuePair(i, 1)
        
        End If
        
    Next i
            
    rsServer.Open strSQL, cn, adOpenDynamic, adLockOptimistic
    If rsServer.EOF = True Then
        blnRowAlreadyExists = False
    ElseIf rsServer.EOF = False And strTableName = "tblXrefLogManager" Then
        '// Delete related xref details
        strSQL = "DELETE * FROM " & strTableName & " WHERE TechnicalLogID = " & strNameValuePair(0, 1)
        cn.Execute strSQL
        blnRowAlreadyExists = False
    ElseIf strTableName = "tblXrefManagerTeam" Then
        '// Delete related xref details
        strSQL = "DELETE * FROM " & strTableName & " WHERE TechnicalLogID = " & strNameValuePair(2, 1)
        cn.Execute strSQL
        blnRowAlreadyExists = False
    Else
        blnRowAlreadyExists = True
    End If
    rsServer.Close
    Set rsServer = Nothing
  
    '// Build SQL Statement
    strSQL = "SELECT * FROM " & strTableName
            
    For i = 0 To UBound(strNameValuePair)
    
        If i = 0 Then
            strSQL = strSQL & " WHERE " & _
                                strNameValuePair(i, 0) & " = " & strNameValuePair(i, 1)
        Else
            strSQL = strSQL & " AND " & _
                                strNameValuePair(i, 0) & " = " & strNameValuePair(i, 1)
        
        End If
        
    Next i
    
    '// Open client database
    Set rsClient = New ADODB.Recordset
    rsClient.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    '// Open server database
    Set rsServer = New ADODB.Recordset
    If blnRowAlreadyExists = True Then

        '// Build SQL Statement
        strSQL = "SELECT * FROM " & strTableName
                
        For i = 0 To UBound(strNameValuePair)
            
            If i = 0 Then
                strSQL = strSQL & " WHERE " & _
                                    strNameValuePair(i, 0) & " = " & strNameValuePair(i, 1)
            Else
                strSQL = strSQL & " AND " & _
                                    strNameValuePair(i, 0) & " = " & strNameValuePair(i, 1)
            
            End If
            
        Next i
        rsServer.Open strSQL, cn, adOpenDynamic, adLockOptimistic
    
    Else
        strSQL = "SELECT * FROM " & strTableName
        rsServer.Open strSQL, cn, adOpenDynamic, adLockOptimistic
    End If
        
    '// If the row doesn't already exists then create a new record in the recordset
    If blnRowAlreadyExists = False Then
        rsServer.AddNew
    End If
        
    '// Format all of the columns in the row
    For lngColumn = 0 To (rsClient.Fields.Count - 1)
        rsServer.Fields(lngColumn) = rsClient.Fields(lngColumn)
    Next lngColumn
       
    '// Insert/update the row into the server database table
    rsServer.Update
    
    '// Close the client database
    rsClient.Close
    Set rsClient = Nothing
    
    '// Close the server database
    rsServer.Close
    Set rsServer = Nothing
    
End Sub