Цикл Coldfusion для вставки значений запроса

Я пытаюсь зациклить запрос на вставку. Я перебираю значения для возвращаемых результатов в списке.

<cfquery datasource="#OLMSdatasourceWrite#" result="myResult">
    INSERT INTO OLMS_Data_RatioScenarios
    (
        OLMS_Account_ID,
        OLMS_RatioScenario_Name
    )
    VALUES
    (
    <cfloop list="#AccountListWithSettings#" index="CurrentAccount">
        (<cfqueryparam cfsqltype="cf_sql_numeric" value="#CurrentAccount#" maxlength="255">, <cfqueryparam cfsqltype="cf_sql_clob" value="#requestBody.value#" maxlength="255">)
        <cfif CurrentAccount GT 1>
           ,
        </cfif>
    </cfloop>
    )
</cfquery>

<cfoutput>Inserted ID is: #myResult.generatedkey#</cfoutput>

Проблема, с которой я сталкиваюсь здесь, заключается в том, что он продолжает ставить "," после последней итерации

VALUES ( ( (param 1) , (param 2) ) , ( (param 3) , (param 4) ) , ( (param 5) , (param 6) ) , ) 

Мне нужна помощь в определении оператора cfif, чтобы предотвратить это (ПРИМЕЧАНИЕ: если я помещу cfif выше параметров запроса, он запустит цикл, например (, (параметр 1), (параметр 2),


person Charles L.    schedule 06.02.2017    source источник
comment
У вас есть ответ. Я просто хочу указать, что вы должны дважды проверить, что на самом деле представляет атрибут index цикла по списку. Кроме того, если вы вставите более одной записи, вы уверены, что myResult.generatedkey даст вам то, что вам нужно?   -  person Dan Bracuk    schedule 06.02.2017


Ответы (1)


Вам нужно отслеживать количество элементов в списке и проверять, что позиция текущего элемента меньше длины списка:

<cfset numItems = ListLen(AccountListWithSettings)>
<cfset i = 1>

<cfloop list="#AccountListWithSettings#" index="CurrentAccount">
  <!--- Stuff inside of loop --->

  <!--- ...and then --->
  <cfif i lt numItems>
    ,
  </cfif>

  <cfset i++>
</cfloop>

Обновление, согласно комментарию @Leigh: вы также можете использовать этот подход. Я добавляю его как второй подход, потому что, несмотря на то, что он проще, обычно мой разум не думает об этой конкретной проблеме. Каждому свое. :)

<cfset i = 1>

<cfloop list="#AccountListWithSettings#" index="CurrentAccount">
  <cfif i gt 1>
    ,
  </cfif>

  <!--- Stuff inside of loop --->

  <cfset i++>
</cfloop>
person Chris Peters    schedule 06.02.2017
comment
это для быстрой обратной связи, я изменил его, и он выдал эту ошибку: Тип: Выражение Сообщение: Вы попытались разыменовать скалярную переменную класса типа java.lang.String как структуру с членами. Поймал исключение, тип = выражение - person Charles L.; 06.02.2017
comment
Упс, я смотрел на это как на запрос. Нужно закончить этот кофе. Обновлю свой ответ. - person Chris Peters; 06.02.2017
comment
Совет: вы можете немного упростить и исключить проверку numItems, используя <cfif i gt 1>,</cfif> и переместив его в начало цикла. - person Leigh; 07.02.2017
comment
@ChrisPeters - Достаточно честно. Я использую его так долго, что нахожу его более читабельным, но согласен, что это одна из тех субъективных вещей :) Кстати, они наконец-то добавили поддержку отслеживания позиции с помощью циклов массива и списков в CF2016. Так что больше никакого ручного увеличения переменных-счетчиков (ура!). trycf.com/gist/0e76e27359cf1b2d4f875fa84194eb50/ - person Leigh; 07.02.2017
comment
@Ли Круто! Я говорю Adobe: слишком мало, слишком поздно. :) - person Chris Peters; 07.02.2017
comment
@ChrisPeters - Лол, клянусь, запрос был в том или ином воплощении примерно с CF9, возможно, CF7 ;-) - person Leigh; 07.02.2017