

# Servicios OData (orígenes que no son ODP)
<a name="sap-odata-non-odp-services"></a>

## Carga completa
<a name="sap-odata-non-odp-full-load"></a>

Para los sistemas que no son ODP (Aprovisionamiento de datos operativos), una **carga completa** implica extraer todo el conjunto de datos del sistema de origen y cargarlo en el sistema de destino. Dado que los sistemas que no son ODP no son compatibles de por sí con mecanismos avanzados de extracción de datos, como los deltas, el proceso es sencillo, pero puede requerir muchos recursos en función del tamaño de los datos.

## Carga incremental
<a name="sap-odata-non-odp-incremental-load"></a>

Para los sistemas o entidades que no admiten el **ODP (Aprovisionamiento de datos operativos)**, la transferencia incremental de datos se puede gestionar manualmente mediante la implementación de un mecanismo basado en marcas de tiempo para seguir y extraer los cambios.

**Transferencias incrementales basadas en marca temporal**

Para las entidades no habilitadas para ODP (o para las entidades habilitadas para ODP que no usan la marca ENABLE\_CDC), puede usar una opción `filteringExpression` en el conector para indicar el intervalo de `datetime` para el que se quiere recuperar los datos. Este método se basa en un campo de fecha y hora en los datos que representa cuándo se creó o modificó cada registro por última vez.

**Ejemplo**

Recuperar registros que se modificaron después de 2024-01-01T00:00:00.000

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "filteringExpression": "LastChangeDateTime >= 2024-01-01T00:00:00.000"
    }, transformation_ctx=key)
```

Nota: En este ejemplo, `LastChangeDateTime` es el campo que representa cuándo se modificó por última vez cada registro. El nombre real del campo puede variar en función de la entidad específica de SAP OData.

Para obtener un nuevo subconjunto de datos en las siguientes ejecuciones, debe actualizar la opción `filteringExpression` con una nueva marca de tiempo. Normalmente, sería el valor máximo de la marca de tiempo de los datos recuperados anteriormente.

**Ejemplo**

```
max_timestamp = get_max_timestamp(sapodata_df)  # Function to get the max timestamp from the previous run
next_filtering_expression = f"LastChangeDateTime > {max_timestamp}"

# Use this next_filtering_expression in your next run
```

En la siguiente sección, proporcionaremos un enfoque automatizado para gestionar estas transferencias incrementales basadas en marcas de tiempo, lo que elimina la necesidad de actualizar manualmente la expresión de filtrado entre ejecuciones.