2014-10-06 4 views
1

Я запускаю запрос обновления в ms-access 2013. Но этот запрос обновления будет выполняться для разных строк при разных условиях. Я знаю, что в Access мы не можем использовать условие «CASE ... WHEN». В доступе мы должны идти на коммутаторе() function.Below мой Update Query:Слишком мало параметров. Ожидаемый 2 В Talend

UPDATE T_Generated_OpportunityLine SET IsUploadable = Switch(
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c>=5000,"Y", 
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c<5000,"N", 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c>=5000,"Y", 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c<5000,"N", 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c>=30000,"Y", 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c<30000,"N", 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c>=25000,"Y", 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c<25000,"N", 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c>=15000,"Y", 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c<15000,"N"); 

этот запрос работает должным образом от доступа 2013.But, когда я использую этот запрос в Talend5.4 в " tAccessRow "элемент, то я получаю следующий фрагмент ошибки:

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2 

Перед Update моей Строка таблицы выглядит следующим образом:

LowestLevelInPyramid_c Lowestlevelvalue_c   LineStatus_c Quantity_c Amount_c LineClosedate_c IsUploadable 
    ProductLine    PTLRC -Swiss CCO Standards Pending   1   9600  11/21/2013 

После обновления он будет

LowestLevelInPyramid_c Lowestlevelvalue_c   LineStatus_c Quantity_c Amount_c LineClosedate_c IsUploadable 
    ProductLine    PTLRC -Swiss CCO Standards Pending   1   9600  11/21/2013  Y/N 

это "Y/N" будет оцениваться на основе условие, как описано в вышеупомянутом запросе. Каждая строка обозначает возможностьLine. Через обновление я определяю, является ли конкретная строка загружаемой к системе CRM клиента или нет. Если ее «Y», то она будет загружаемой, если ее «N» тогда она не будет загружаемой.

Может ли кто-нибудь предоставить какое-либо подходящее решение для этого?

+0

Не делайте этого в tAccessRow. Вместо этого поместите логику в tMap. – ydaetskcoR

+0

, насколько я знаю, tMap обычно используется для сопоставления целей. И я пытаюсь обновить конкретный столбец таблицы через этот запрос. Как я могу реализовать это с помощью tMap? –

+0

Ваше заявление об обновлении выглядит неясным для меня. Можете ли вы представить пример своих данных перед обновлением и как он будет выглядеть после этого? – ydaetskcoR

ответ

1

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

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

Очень простая ETL установка работа может выглядеть примерно так:

Sample job layout

Эта работа подключается к базе данных MySQL, а затем вытаскивает все данные из таблицы в схеме.

Основная часть работы происходит в TMAP, который имеет конфигурацию, как это:

tMap variable configuration

В скриншоте выше, я создал переменную, которая вычисляет ли что-то загружаемая и настолько это true. Это повторяется для каждого типа LowestLevelValue_c.

И, наконец, мы используем тройной оператор в значении для IsUploadable:

IsUploadable ternary operator

Если какой-либо из переменных true затем IsUpload устанавливается как «Y», в противном случае он установлен в положение «N» ,

Остальная часть моей работы затем использует tLogRow для вывода результатов на консоль, но вы можете использовать компонент tAccessOutput для обновления вашей базы данных Access. Обязательно настройте свою схему на наличие уникального ключа для обновления (в этом случае вы, вероятно, можете использовать LowestLevelValue_c и Amount_c, если вам не хватает уникального первичного ключа для таблицы).

0

Как вы правильно догадались, проблема связана с функцией Switch(). Это функция VBA, а не родная функция Jet/ACE SQL. Вот почему он работает от Access и не работает от Talend.

Для осуществления этой работы вам необходимо перевести инструкцию Switch() во вложенный файл IIf(). IIf() - это собственный оператор Jet/ACE. Это будет немного уродливее, чем функция Switch(), но на самом деле лучше работать, потому что использует логическую логику короткого замыкания.

+0

. Я все равно буду беспокоиться о том, что логика вложенная IIF() вместо использования Talend чтобы придерживаться логики для этого. Если бы вы говорили о миллионах записей в традиционной СУБД, то были бы оговорки о производительности, но это Access и, вероятно, будет составлять не более тысячи/десятков тысяч строк. – ydaetskcoR

0

Я решил проблему problem.The был с "Y/N" .в Talend мы должны использовать 'Y' или 'N' .My Изменение структуры запроса выглядит следующим образом:

UPDATE T_Generated_OpportunityLine SET IsUploadable = Switch(
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c>=5000,'Y', 
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c<5000,'N', 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c>=5000,'Y', 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c<5000,'N', 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c>=30000,'Y', 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c<30000,'N', 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c>=25000,'Y', 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c<25000,'N', 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c>=15000,'Y', 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c<15000,'N'); 
Смежные вопросы