На прошлой неделе у меня был клиент, который спросил меня, как вы можете поместить условный оператор вокруг функции расширения данных, где, если расширение данных не существует, тогда не обрабатывайте код внутри него. AMPscript используется в электронной почте.

Есть много сценариев, почему вы хотели бы сделать это. Например, возможно, расширение данных было удалено из-за назначенной политики хранения данных.

Следующий код ...

%%[
var @rows
set @rows = LookupRows('DE Name', 'Field', 'Value')
]%%

... возвращает ошибку:

Недопустимое имя расширения данных для вызова функции LookupRows. Расширение данных с таким названием не существует

Вы также не можете попытаться подсчитать строки. Например, следующий код также возвращает ту же ошибку.

%%[
if RowCount(LookupRows('DE Name', 'Field', 'Value')) == 0 then
/* do something */
endif
]%%

Я подумал, что, возможно, вы могли бы сначала использовать функции WSProxy или API платформы, чтобы попытаться получить внешний ключ имени DE, и если он возвращает значение, то вы могли бы установить имя DE в качестве переменной в функции DE AMPscript, но это невозможно, так как вы не можете использовать функции WSProxy или API платформы в контексте отправки.

Есть ли этому решение?

5
Eliot Harper 23 Сен 2018 в 09:30
Вы пробовали это? salesforce.stackexchange.com/questions/210109/…
 – 
Brad Sapkota
24 Сен 2018 в 02:48

2 ответа

Лучший ответ

Поскольку подход аналогичен предыдущему post, я повторно использовал тот же код и внес небольшие изменения.

Я использовал смесь SSJS и AMPscript, чтобы охватить этот вариант использования строк LookUp.

Сценарий ниже использует try и catch в SSJS для выполнения AMPscript и SET переменную, которую затем можно использовать позже в вашем электронном письме для запуска логики на основе значения этой результирующей переменной.

Если вы скопируете и запустите это прямо в сообщении электронной почты, результатом будет false, предполагая, что это DE не существует в вашем BU. Однако, если вы измените его на действительное имя DE и допустимое поле в SSJS и отобразите электронное письмо, результатом будет true.

Примере:

<script runat="server" language="javascript">
    Platform.Load("core", "1");
    try {
        var CheckDE = DataExtension.Init("DE_Name_TO_Check");
        var CheckDEStatus = CheckDE.Rows.Lookup(["FieldName"], [Value]);
</script>

    %%[SET @DEExists = "true"]%%

<script runat="server" language="javascript">
Platform.Load("core", "1");
    }
    catch (e) {
</script>

    %%[SET @DEExists = "false"]%%

<script runat="server" language="javascript">
Platform.Load("core", "1");
    }
</script>

This is to confirm if DE Exists: %%=v(@DEExists)=%%
4
Brad Sapkota 24 Сен 2018 в 04:53
3
Вы также можете установить переменную @DEExists с помощью SSJS, чтобы сохранить логику в пределах одного языка, например Variable.SetValue("@DEExists", "true");
 – 
Travis Naughton
24 Сен 2018 в 05:07
Хотя это проверяет, существует ли DE, это не решает проблему. Согласно второму примеру кода в моем вопросе, я все еще хочу выполнить операцию LookupRows, если @DEExists == true, но функция LookupRows все еще оценивается, даже если она заключена в условный оператор, как эту суть.
 – 
Eliot Harper
24 Сен 2018 в 05:08
1
LookUpRows уже выполняется на шаге try, так что вообще зачем вам делать LookUpRows дважды? или если вам нужно снова выполнить LookUpRows, вы не можете сделать это в блоке try, где установлен AMPscript? Поскольку эта часть AMPScript будет выполняться только в том случае, если DE и поля действительны.
 – 
Brad Sapkota
24 Сен 2018 в 05:15
1
Конечно имеет смысл. Однако я подумал, что OP может захотеть запустить больше логики, используя AMPscript в блоке try and catch :)
 – 
Brad Sapkota
24 Сен 2018 в 05:25
1
- Чтобы ускорить это, вам не нужно объявлять библиотеку CORE или инициировать DE, вы можете использовать Platform.Function.LookupRows('DE_Name_To_Check','FieldName',value');, который не требует CORE. Это будет лишь небольшое улучшение скорости обработки, но при обработке электронной почты на счету каждая миллисекунда. А в остальном отличная работа по поиску простого решения сложной проблемы!
 – 
Gortonington
24 Сен 2018 в 15:50

ИЗМЕНИТЬ

Я бы использовал ответ @BradSapkota (используя SSJS try/catch) для этой проблемы, но хотел оставить это здесь для справки на случай, если этот ответ может помочь другому связанному варианту использования.


Я бы порекомендовал делать это через WSProxy, но даже в этом случае он может работать немного медленнее и никогда не должен использоваться в среде с возможностью отправки.

Поскольку он вам нужен внутри электронного письма, единственным реальным выбором будет размещение этого кода на CloudPage, а затем выполнение HTTPGET для этой страницы и отправка через DE в качестве параметра в get. Затем вы можете заставить страницу возвращать значение «Существует» или «Пусто» через GET, которое вы затем можете проанализировать.

Облачная страница

Вы можете выполнить отфильтрованный запрос на получение, а затем выполнить подсчет строк в ответе, чтобы увидеть, вернулся ли он пустым или возвращает информацию о DE.

Например:

var prox = new Script.Util.WSProxy();
var cols = ["Name"];
var filter = {
    Property: "Name",
    SimpleOperator: "equals",
    Value: "yourDE"
};
var desc = prox.retrieve("DataExtension", cols, filter); 

Пример пустого ответа:

{
  "Status":"OK",
  "RequestID":"d1db75de-5736-4634-ab71-297e7e7d1571",
  "Results":[],
  "HasMoreRows":false
}

Пример существующего ответа:

{
  "Status":"OK",
  "RequestID":"d333fcc9-8b0d-4799-ace6-50340fbe482d",
  "Results":[{"Name":"yourDE"}],
  "HasMoreRows":false
}

И оттуда вы анализируете массив «Результаты», чтобы увидеть, содержит ли он информацию о расширении данных. Если его нет, то вы знаете, что его не существует.

Например:

 if(desc.Results.length > 0) {

     Write('Exists');

} else {

    Write('Empty')

}

Внутренняя электронная почта

Вы должны поместить следующий GET-скрипт в электронное письмо, чтобы вернуть результаты из CP.

%%[
    SET @deExist = HTTPGet(@yourURL)

    IF @deExist == "Exists" THEN

      /* Your stuff if it exists*/

    ELSE

      /* Your stuff if empty */

    ENDIF

]%%
2
Gortonington 24 Сен 2018 в 15:54
Я упомянул в своем вопросе, что мне нужно это по электронной почте. Что касается моего последнего абзаца в моем вопросе, я тоже рассматривал этот подход, но вы не можете использовать WSProxy в электронной почте :-/
 – 
Eliot Harper
23 Сен 2018 в 22:43
Вы правы, вы сделали - я извиняюсь! Это то, что я получаю за просмотр :( Я отредактировал свой вопрос, чтобы отразить использование внутри электронного письма.
 – 
Gortonington
23 Сен 2018 в 22:51
Мое единственное колебание сейчас, когда я принимаю этот ответ в его текущей форме, заключается в том, что это будет делать один запрос для каждого электронного письма (и другие могут столкнуться с этой проблемой, если попытаются ответить на этот вопрос). Если вы отправляете тысячи электронных писем, это может быть проблематично. Было бы идеально, если бы мы могли использовать синдикацию контента, чтобы отправить запрос один раз в начале send (при условии, что имя расширения данных не изменится, а в этом сценарии, скажем, не изменится). Однако мне не удалось заставить Before;HTTPGet работать внутри блока AMPscript.
 – 
Eliot Harper
24 Сен 2018 в 02:26
Если вы можете придумать решение, я был бы рад принять это, но я не чувствую себя комфортно, принимая его в его нынешнем виде, поскольку я не хотел бы, чтобы другие реализовали его и столкнулись с проблемами ограничения скорости на CloudPages ( которые я уже видел).
 – 
Eliot Harper
24 Сен 2018 в 02:28
1
Спасибо @Gortonington. Попытка и улов недооценены и могут использоваться во многих различных сценариях.
 – 
Brad Sapkota
24 Сен 2018 в 04:55