Aggiorna frequentemente i tuoi prodotti

La sotto-API Products ti consente di apportare aggiornamenti parziali ai tuoi prodotti esistenti. È ideale per i dati che cambiano di frequente, come prezzo e disponibilità, in quanto evita di dover inviare nuovamente l'intero prodotto per una piccola modifica. Tuttavia, devi reinserire regolarmente i prodotti per assicurarti che tutti i dati di prodotto siano sincronizzati.

Questa guida spiega come utilizzare il metodo productinputs.patch per aggiornare i tuoi prodotti.

Prerequisiti

Prima di poter aggiornare un prodotto, devi disporre di quanto segue:

Aggiornare dettagli specifici del prodotto

Per modificare alcuni dettagli di un prodotto, come il prezzo o la disponibilità, senza inviare nuovamente tutte le informazioni, utilizza il metodo productInputs.patch.

Puoi specificare i campi che stai modificando nel parametro updateMask. updateMask è un elenco separato da virgole dei campi che vuoi aggiornare. Il metodo patch si comporta nel seguente modo:

  • Campi in updateMask e nel corpo:questi campi vengono aggiornati con i nuovi valori.
  • Campi in updateMask ma non nel corpo:questi campi vengono eliminati dall'input del prodotto.
  • Campi non presenti in updateMask: questi campi rimangono invariati.
  • Parametro updateMask omesso: vengono aggiornati tutti i campi forniti nel corpo della richiesta. I campi non forniti nel corpo della richiesta non vengono eliminati dall'input del prodotto.

Ecco un esempio di dati di prodotto prima di un aggiornamento:

{
  "name": "accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345",
  "product": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
  "offerId": "SKU12345",
  "contentLanguage": "en",
  "feedLabel": "US",
  "productAttributes": {
    "title": "Classic Cotton T-Shirt",
    "description": "A comfortable, durable, and stylish t-shirt made from 100% cotton.",
    "link": "https://www.example.com/p/SKU12345",
    "availability": "IN_STOCK",
    "price": {
      "amountMicros": "15990000",
      "currencyCode": "USD"
    },
    "condition": "NEW",
    "gtins": [
      "9780007350896"
    ],
    "imageLink": "https://www.example.com/image/SKU12345"
  }
}

Questo esempio aggiorna title e availability di un prodotto ed elimina il relativo imageLink. description e price non si trovano in updateMask e rimarranno invariati.

PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,productAttributes.availability,productAttributes.imageLink&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
{
 "productAttributes": {
   "title": "Classic Cotton T-Shirt - New Edition",
   "availability": "OUT_OF_STOCK",
    "description": "A comfortable T-shirt from premium cotton, newer edition.",
    "price": {
      "amountMicros": "9990000",
      "currencyCode": "USD"
    }
 }
}

Una chiamata riuscita restituisce la risorsa ProductInput aggiornata. title e availability vengono aggiornati e imageLink viene rimosso perché si trovava in updateMask ma non nel corpo della richiesta. description e price rimangono invariati perché non erano elencati in updateMask.

{
  "name": "accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345",
  "product": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
  "offerId": "SKU12345",
  "contentLanguage": "en",
  "feedLabel": "US",
  "productAttributes": {
    "title": "Classic Cotton T-Shirt - New Edition",
    "description": "A comfortable, durable, and stylish t-shirt made from 100% cotton.",
    "link": "https://www.example.com/p/SKU12345",
    "availability": "OUT_OF_STOCK",
    "price": {
      "amountMicros": "15990000",
      "currencyCode": "USD"
    },
    "condition": "NEW",
    "gtins": [
      "9780007350896"
    ],
  }
}

I seguenti esempi di codice mostrano come aggiornare un prodotto.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.products.v1.Availability;
import com.google.shopping.merchant.products.v1.Condition;
import com.google.shopping.merchant.products.v1.ProductAttributes;
import com.google.shopping.merchant.products.v1.ProductInput;
import com.google.shopping.merchant.products.v1.ProductInputName;
import com.google.shopping.merchant.products.v1.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1.UpdateProductInputRequest;
import com.google.shopping.type.CustomAttribute;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to update a product input */
public class UpdateProductInputSample {

  public static void updateProductInput(Config config, String productId, String dataSourceId)
      throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductInputsServiceSettings productInputsServiceSettings =
        ProductInputsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates product name to identify product.
    String name =
        ProductInputName.newBuilder()
            .setAccount(config.getAccountId().toString())
            .setProductinput(productId)
            .build()
            .toString();

    // Just productAttributes and customAttributes can be updated
    FieldMask fieldMask =
        FieldMask.newBuilder()
            .addPaths("product_attributes.title")
            .addPaths("product_attributes.description")
            .addPaths("product_attributes.link")
            .addPaths("product_attributes.image_link")
            .addPaths("product_attributes.availability")
            .addPaths("product_attributes.condition")
            .addPaths("product_attributes.gtins")
            .addPaths("custom_attributes.mycustomattribute")
            .build();

    // Calls the API and catches and prints any network failures/errors.
    try (ProductInputsServiceClient productInputsServiceClient =
        ProductInputsServiceClient.create(productInputsServiceSettings)) {

      ProductAttributes attributes =
          ProductAttributes.newBuilder()
              .setTitle("A Tale of Two Cities")
              .setDescription("A classic novel about the French Revolution")
              .setLink("https://exampleWebsite.com/tale-of-two-cities.html")
              .setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
              .setAvailability(Availability.IN_STOCK)
              .setCondition(Condition.NEW)
              .addGtins("9780007350896")
              .build();

      // The datasource can be either a primary or supplemental datasource.
      String dataSource =
          DataSourceName.newBuilder()
              .setAccount(config.getAccountId().toString())
              .setDatasource(dataSourceId)
              .build()
              .toString();

      UpdateProductInputRequest request =
          UpdateProductInputRequest.newBuilder()
              .setUpdateMask(fieldMask)
              // You can only update product attributes and custom_attributes
              .setDataSource(dataSource)
              .setProductInput(
                  ProductInput.newBuilder()
                      .setName(name)
                      .setProductAttributes(attributes)
                      .addCustomAttributes(
                          CustomAttribute.newBuilder()
                              .setName("mycustomattribute")
                              .setValue("Example value")
                              .build())
                      .build())
              .build();

      System.out.println("Sending update ProductInput request");
      ProductInput response = productInputsServiceClient.updateProductInput(request);
      System.out.println("Updated ProductInput Name below");
      // The last part of the product name will be the product ID assigned to a product by Google.
      // Product ID has the format `contentLanguage~feedLabel~offerId`
      System.out.println(response.getName());
      System.out.println("Updated Product below");
      System.out.println(response);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // An ID assigned to a product by Google. In the format
    // contentLanguage~feedLabel~offerId
    String productId = "en~label~sku123"; // Replace with your product ID.

    // Identifies the data source that will own the product input.
    String dataSourceId = "{INSERT_DATASOURCE_ID}"; // Replace with your datasource ID.

    updateProductInput(config, productId, dataSourceId);
  }
}

PHP

use Google\ApiCore\ApiException;
use Google\Protobuf\FieldMask;
use Google\Shopping\Merchant\Products\V1\Availability;
use Google\Shopping\Merchant\Products\V1\Condition;
use Google\Shopping\Merchant\Products\V1\ProductAttributes;
use Google\Shopping\Merchant\Products\V1\Client\ProductInputsServiceClient;
use Google\Shopping\Merchant\Products\V1\ProductInput;
use Google\Shopping\Merchant\Products\V1\UpdateProductInputRequest;
use Google\Shopping\Type\CustomAttribute;

/**
 * This class demonstrates how to update a product input.
 */
class UpdateProductInputSample
{
    // An ID assigned to a product by Google. In the format
    // contentLanguage~feedLabel~offerId
    // Please ensure this product ID exists for the update to succeed.
    private const PRODUCT_ID = "online~en~label~sku123";

    // Identifies the data source that will own the product input.
    // Please ensure this data source ID exists.
    private const DATASOURCE_ID = "<INSERT_DATASOURCE_ID>";

    /**
     * Helper function to construct the full product input resource name.
     *
     * @param string $accountId The merchant account ID.
     * @param string $productInputId The product input ID (e.g., "online~en~label~sku123").
     * @return string The full product input resource name.
     */
    private static function getProductInputName(string $accountId, string $productInputId): string
    {
        return sprintf("accounts/%s/productInputs/%s", $accountId, $productInputId);
    }

    /**
     * Helper function to construct the full data source resource name.
     *
     * @param string $accountId The merchant account ID.
     * @param string $dataSourceId The data source ID.
     * @return string The full data source resource name.
     */
    private static function getDataSourceName(string $accountId, string $dataSourceId): string
    {
        return sprintf("accounts/%s/dataSources/%s", $accountId, $dataSourceId);
    }

    /**
     * Updates an existing product input in your Merchant Center account.
     *
     * @param array $config The configuration array containing the account ID.
     * @param string $productId The ID of the product input to update.
     * @param string $dataSourceId The ID of the data source.
     */
    public static function updateProductInput(
        array $config,
        string $productId,
        string $dataSourceId
    ): void {
        // Gets the OAuth credentials to make the request.
        $credentials = Authentication::useServiceAccountOrTokenFile();

        // Creates options config containing credentials for the client to use.
        $options = ['credentials' => $credentials];

        // Creates a ProductInputsServiceClient.
        $productInputsServiceClient = new ProductInputsServiceClient($options);

        // Construct the full resource name of the product input to be updated.
        $name = self::getProductInputName($config['accountId'], $productId);

        // Define the FieldMask to specify which fields to update.
        // Only 'attributes' and 'custom_attributes' can be specified in the
        // FieldMask for product input updates.
        $fieldMask = new FieldMask([
            'paths' => [
                "product_attributes.title",
                "product_attributes.description",
                "product_attributes.link",
                "product_attributes.image_link",
                "product_attributes.availability",
                "product_attributes.condition",
                "product_attributes.gtin",
                "custom_attributes.mycustomattribute" // Path for a specific custom attribute
            ]
        ]);

        // Calls the API and handles any network failures or errors.
        try {
            // Define the new attributes for the product.
            $attributes = new ProductAttributes([
                'title' => 'A Tale of Two Cities 3',
                'description' => 'A classic novel about the French Revolution',
                'link' => 'https://exampleWebsite.com/tale-of-two-cities.html',
                'image_link' => 'https://exampleWebsite.com/tale-of-two-cities.jpg',
                'availability' => Availability::IN_STOCK,
                'condition' => Condition::PBNEW,
                'gtins' => ['9780007350896'] // GTIN is a repeated field.
            ]);

            // Construct the full data source name.
            // This specifies the data source context for the update.
            $dataSource = self::getDataSourceName($config['accountId'], $dataSourceId);

            // Create the ProductInput object with the desired updates.
            // The 'name' field must match the product input being updated.
            $productInput = new ProductInput([
                'name' => $name,
                'product_attributes' => $attributes,
                'custom_attributes' => [ // Provide the list of custom attributes.
                    new CustomAttribute([
                        'name' => 'mycustomattribute',
                        'value' => 'Example value'
                    ])
                ]
            ]);

            // Create the UpdateProductInputRequest.
            $request = new UpdateProductInputRequest([
                'update_mask' => $fieldMask,
                'data_source' => $dataSource,
                'product_input' => $productInput
            ]);

            print "Sending update ProductInput request\n";
            // Make the API call to update the product input.
            $response = $productInputsServiceClient->updateProductInput($request);

            print "Updated ProductInput Name below\n";
            // The name of the updated product input.
            // The last part of the product name is the product ID (e.g., contentLanguage~feedLabel~offerId).
            print $response->getName() . "\n";
            print "Updated Product below\n";
            // Print the full updated product input object.
            print_r($response);

        } catch (ApiException $e) {
            printf("ApiException caught: %s\n", $e->getMessage());
        }
    }

    /**
     * Executes the UpdateProductInput sample.
     */
    public function callSample(): void
    {
        $config = Config::generateConfig();
        $productId = self::PRODUCT_ID;
        $dataSourceId = self::DATASOURCE_ID;

        self::updateProductInput($config, $productId, $dataSourceId);
    }
}

// Run the script.
$sample = new UpdateProductInputSample();
$sample->callSample();

Python

"""A module to update a product input."""

from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping.merchant_products_v1 import Availability
from google.shopping.merchant_products_v1 import Condition
from google.shopping.merchant_products_v1 import ProductAttributes
from google.shopping.merchant_products_v1 import ProductInput
from google.shopping.merchant_products_v1 import ProductInputsServiceClient
from google.shopping.merchant_products_v1 import UpdateProductInputRequest
from google.shopping.type import CustomAttribute


# Fetches the Merchant Center account ID from the authentication examples.
# This ID is needed to construct resource names for the API.
_ACCOUNT_ID = configuration.Configuration().read_merchant_info()


def update_product_input(account_id: str, product_id: str, data_source_id: str):
  """Updates an existing product input for a specific account.

  Args:
    account_id: The Merchant Center account ID.
    product_id: The ID of the product input to update. This ID is assigned by
      Google and has the format `contentLanguage~feedLabel~offerId`.
    data_source_id: The ID of the data source that owns the product input.
  """

  # Obtains OAuth credentials for authentication.
  credentials = generate_user_credentials.main()

  # Creates a ProductInputsServiceClient instance.
  client = ProductInputsServiceClient(credentials=credentials)

  # Constructs the full resource name for the product input.
  # Format: accounts/{account}/productInputs/{productinput}
  name = f"accounts/{account_id}/productInputs/{product_id}"

  # Defines the FieldMask to specify which fields of the product input
  # are being updated. Only 'attributes' and 'custom_attributes' can be updated.
  field_mask = field_mask_pb2.FieldMask(
      paths=[
          "product_attributes.title",
          "product_attributes.description",
          "product_attributes.link",
          "product_attributes.image_link",
          "product_attributes.availability",
          "product_attributes.condition",
          "product_attributes.gtins",
          "custom_attributes.mycustomattribute",
      ]
  )

  # Prepares the new attribute values for the product.
  attributes = ProductAttributes(
      title="A Tale of Two Cities updated",
      description="A classic novel about the French Revolution",
      link="https://exampleWebsite.com/tale-of-two-cities.html",
      image_link="https://exampleWebsite.com/tale-of-two-cities.jpg",
      availability=Availability.IN_STOCK,
      condition=Condition.NEW,
      gtins=["9780007350896"],  # GTIN is a repeated field.
  )

  # Constructs the full resource name for the data source.
  # The data source can be primary or supplemental.
  # Format: accounts/{account}/dataSources/{datasource}
  data_source = f"accounts/{account_id}/dataSources/{data_source_id}"

  # Prepares the ProductInput object with the updated information.
  product_input_data = ProductInput(
      name=name,
      product_attributes=attributes,
      custom_attributes=[
          CustomAttribute(
              name="mycustomattribute", value="Example value"
          )
      ],
  )

  # Creates the UpdateProductInputRequest.
  request = UpdateProductInputRequest(
      update_mask=field_mask,
      data_source=data_source,
      product_input=product_input_data,
  )

  # Sends the update request to the API.
  try:
    print("Sending update ProductInput request")
    response = client.update_product_input(request=request)
    print("Updated ProductInput Name below")
    # The response includes the name of the updated product input.
    # The last part of the product name is the product ID assigned by Google.
    print(response.name)
    print("Updated Product below")
    print(response)
  except RuntimeError as e:
    # Catches and prints any errors that occur during the API call.
    print(e)


if __name__ == "__main__":
  # The ID of the product to be updated.
  # This ID is assigned by Google and typically follows the format:
  # contentLanguage~feedLabel~offerId
  # Replace with an actual product ID from your Merchant Center account.
  product_id_to_update = "online~en~label~sku123"

  # The ID of the data source that will own the updated product input.
  # Replace with an actual data source ID from your Merchant Center account.
  data_source_id_for_update = "<INSERT_DATA_SOURCE_ID>"

  update_product_input(
      _ACCOUNT_ID, product_id_to_update, data_source_id_for_update
  )

cURL

curl --location --request PATCH 'https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,productAttributes.description&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}' \
--header 'Authorization: Bearer <API_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
   "productAttributes": {
       "title": "A Tale of Two Cities",
       "description": "A classic novel about the French Revolution"
   }
}'

Aggiornamento tramite attributi personalizzati

Puoi aggiornare gli attributi standard e personalizzati in un'unica chiamata. Per aggiornare un attributo personalizzato, aggiungi il prefisso customAttributes al nome nell'updateMask.

Questo esempio esegue diverse azioni in un'unica richiesta:

  • Aggiorna direttamente l'attributo standard title.
  • Aggiorna un attributo personalizzato esistente (myCustomAttrToBeUpdated).
  • Inserisce un nuovo attributo personalizzato (myCustomAttrToBeInserted).
  • Elimina un attributo personalizzato esistente (myCustomAttrToBeDeleted).
PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,customAttributes.myCustomAttrToBeInserted,customAttributes.myCustomAttrToBeUpdated,customAttributes.myCustomAttrToBeDeleted&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
{
  "productAttributes": {
    "title": "ProductTitle Updated"
  },
  "customAttributes": [
    {
      "name": "description",
      "value": "A newly updated description."
    },
    {
      "name": "myCustomAttrToBeUpdated",
      "value": "myCustomAttrToBeUpdated updated value"
    },
    {
      "name": "myCustomAttrToBeInserted",
      "value": "new from update"
    }
  ]
}

Una richiesta riuscita restituisce il ProductInput aggiornato che riflette tutte le modifiche specificate.

Informazioni sugli aggiornamenti degli attributi personalizzati

Puoi utilizzare il campo customAttributes per aggiornare gli attributi che hai definito personalmente. Questi non vengono mappati alla specifica standard e verranno memorizzati come attributi personalizzati nel prodotto finale.

Come vengono elaborati gli aggiornamenti dei prodotti

Quando invii una richiesta patch, l'aggiornamento viene applicato ai dati ProductInput specifici prima che vengano applicate le regole. Ciò comporta un comportamento coerente tra l'inserimento e l'aggiornamento dei prodotti.

Ecco come viene elaborato l'aggiornamento:

  1. Aggiornamento input: la tua richiesta patch modifica lo specifico ProductInput associato all'origine dati che hai fornito.

  2. Elaborazione e unione:dopo l'aggiornamento dell'input, inizia l'elaborazione:

    • Regole dei feed e origini dati supplementari:le regole configurate nell'origine principale del prodotto combinano ProductInput delle origini principali e supplementari. Queste regole possono modificare gli attributi o derivarne di nuovi. Per saperne di più sulla configurazione delle regole, consulta l'articolo https://support.google.com/merchants/answer/14994083.
    • Altre origini dati:anche i dati provenienti da altre origini (ad esempio i miglioramenti automatici) vengono uniti all'input dell'origine dati principale.
    • Convalida:i dati uniti vengono convalidati in base alla specifica dei dati di prodotto e alle norme di Google Shopping.
  3. Prodotto finale:il risultato di questa pipeline è la risorsa Product finale elaborata che può essere restituita utilizzando products.get o products.list. Questa è anche la versione del prodotto mostrata in Merchant Center ed è idonea a essere visualizzata in diverse destinazioni.

A causa di questa procedura in più passaggi, si verifica un ritardo, in genere di alcuni minuti, tra il momento in cui invii una richiesta di aggiornamento e il momento in cui le modifiche vengono riflesse nella risorsa Product finale che puoi recuperare con products.get.

Esempio: aggiornamento di un prodotto con un unico input principale

Questo è il caso d'uso più comune. Un prodotto esiste in una singola origine dati principale e vuoi aggiornare alcuni dei suoi attributi.

  1. Stato iniziale:un prodotto en~US~SKU12345 esiste nell'origine dati principale con title: "Classic T-Shirt" e price: 15.99 USD.
  2. Richiesta di aggiornamento:invii una richiesta patch per aggiornare price a 14.99 USD e impostare availability su out of stock.
  3. Elaborazione:
    • Il ProductInput per SKU12345 è aggiornato.
  4. Prodotto finale: il Product finale ora ha title: "Classic T-Shirt", price: 14.99 USD e availability: "out of stock".

Esempio: aggiornamento di un prodotto con dati e regole supplementari

Questo esempio mostra come le regole dei feed possono influire su un aggiornamento, causando l'applicazione di alcune modifiche mentre altre vengono ignorate.

  1. Stato iniziale:
    • Input principale: en~US~SKU12345 ha title: "Great T-Shirt" e description: "A great short-sleeve t-shirt.".
    • Input supplementare:lo stesso prodotto ha una voce in un'origine dati supplementare con title: "Awesome T-Shirt" e description: "An awesome short-sleeve t-shirt.".
    • Regola del feed:una regola è impostata per estrarre title dall'origine dati supplementare. Non esiste una regola per description.
    • Risultato:il Product finale elaborato ha title: "Awesome T-Shirt" e description: "A great short-sleeve t-shirt.".
  2. Richiesta di aggiornamento:invii una richiesta patch per aggiornare l'origine dati principale, impostando title su "Fantastic T-Shirt" e description su "A fantastic short-sleeve t-shirt.".
  3. Elaborazione:
    • Il valore ProductInput nell'origine dati principale viene aggiornato in modo da includere title: "Fantastic T-Shirt" e description: "A fantastic short-sleeve t-shirt.".
    • Viene eseguita la pipeline di elaborazione.
    • Per title, la regola del feed stabilisce che il valore dell'origine dati supplementare (Awesome T-Shirt) ha la precedenza, ignorando l'aggiornamento.
    • Per description, poiché non esiste una regola di override, viene utilizzato il valore aggiornato dell'input principale (A fantastic short-sleeve t-shirt.).
  4. Prodotto finale: il titolo del Product finale rimane Awesome T-Shirt (il tuo aggiornamento è stato ignorato), ma la descrizione è ora A fantastic short-sleeve t-shirt. (il tuo aggiornamento è stato applicato).

Scegliere tra aggiornamenti e origini dati supplementari

Puoi modificare i dati di prodotto utilizzando productinputs.patch o inserendo i dati nelle origini dati supplementari. La scelta migliore dipende dalla tua strategia di gestione dei dati.

Per evitare risultati imprevedibili, ti consigliamo di non utilizzare sia productinputs.patch sia le origini dati supplementari per gestire gli stessi dati di prodotto per lo stesso prodotto.

Ecco un confronto dettagliato:

Funzionalità productinputs.patch (Aggiornamenti) Origini dati supplementari
Ideale per Modifiche rapide, frequenti e parziali ai dati esistenti (ad es. prezzo, disponibilità). Sovrapposizione di dati logicamente separati, gestione di attributi diversi da parte di sistemi diversi o override complessi basati su regole.
Meccanismo Modifica un ProductInput esistente sul posto. Crea un nuovo ProductInput separato in un'origine dati supplementare.
Granularità dei dati Opera su campi specifici di un singolo ProductInput. Opera sull'intero ProductInput all'interno dell'origine supplementare.
Persistenza Le modifiche vengono mantenute fino a quando lo stesso ProductInput non viene sovrascritto da un insert completo o da un altro patch. La persistenza è controllata dalle regole del feed. Può sostituire i dati principali a tempo indeterminato se le regole lo prevedono.
Interazione con le regole Può essere utilizzato senza le regole del feed in quanto aggiorna un'origine dati esistente e ProductInput. Richiede la configurazione esplicita di una regola nell'origine principale per collegare l'origine supplementare.
Configurazione origine dati Opera su un'origine dati esistente. Non sono necessarie nuove fonti. Richiede la creazione e la gestione di origini dati supplementari separate e il loro collegamento tramite regole dei feed.