Выберите 30 дней назад - PullRequest
       20

Выберите 30 дней назад

0 голосов
/ 07 февраля 2019

Я пытаюсь select строк для последнего изменения даты = 30 дней.

Я пытался LAEDA = ( sy-datum -30 ) в предложении where, но всегда выдает ошибку. Я подключаюсь к sap Abap database.

enter image description here

Ошибка сообщения:

[EIS-Material 1 ] Ошибка: ERPConnect.ERPException: Ошибка при получении возвращаемых значений функции: SYSTEM_FAILURE Произошла ошибка при разборе динамической записи.в ERPConnect.RFCAPI.ReceiveFunctionResults (UInt32 connectionHandle, импорт RFC_PARAMETER [], изменение RFC_PARAMETER [], таблицы RFC_TABLE [], кодировка apiEncoding) в ERPConnect.RFCFunction.ReceiveFunctionArguments (RFCC) atCAPTFERPConnect.RFCFunction.ExecuteRFC (Byte [] tid) в XtractKernel.Extractors.TableExtractor.GetPackage (RFCFunction & func)
в XtractKernel.Extractors.TableExtractor.Extract () в XtractKernel`Extв XtractIS.XtractSourceTable.PrimeOutput (выходные данные Int32, выходные идентификаторы Int32 [], буферы PipelineBuffer []) в Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPrimeOutput (IDTSManagedComponentWraffTreads IntringPRIDT32PT32BT32), упаковщик данныхppBufferWirePacket)

Ответы [ 5 ]

0 голосов
/ 19 июня 2019

Вы не можете указать такую ​​формулу ABAP через SAP Open SQL.

Чтобы не решать проблему напрямую (поскольку у вас есть ограничения по продукту), вот как достигается динамический фильтр с помощью инструмента AecorSoft:

(DT_WSTR, 4)(DATEPART("yy" , GETDATE())) + RIGHT("0" + (DT_WSTR, 4)DATEPART("mm" , GETDATE()),2) + RIGHT("0" + (DT_WSTR, 4)DATEPART("dd" , GETDATE()),2)

Полный пример использования можно найти в блоге Извлечение таблицы Delta из SAP Table Easy через динамические фильтры

0 голосов
/ 07 февраля 2019

В интерактивной справке Xtract IS я вижу, что на стороне ABAP установлен пользовательский функциональный модуль с именем Z_THEO_READ_TABLE, который выполняет SQL, отправленный Xtract IS.Модуль поставляется в 2 вариантах, один из которых предназначен для ABAP> = 740 SP 5, так что я думаю, что это версия для строгого режима ABAP SQL.

Итак, я подумал, что, возможно, вы могли бы написать этот ABAP-подобный ГдеПредложение с использованием «выражения хоста», которое действует в строгом режиме ABAP SQL:

 LAEDA = @( sy-datum - 30 )

На основании полученного сообщения об ошибке «Произошла ошибка при разборе динамической записи», я полагаю, чтоэтот функциональный модуль делает что-то вроде SELECT (dyn-columns) FROM (dyn-table) WHERE (dyn-condition), то есть все элементы динамически определяются во время выполнения.

К сожалению, " ABAP документация sql_cond - (cond_syntax) говорит, что" Hostвыражения не допускаются в динамических логических выражениях . "

Так долго, невозможно сделать предложение where, как вы хотите.

Вероятно, существует много способов обойти это ограничение (например,создание SAPquery или BAPI в SAP и вызов его из Xtract IS и т. д.), но это другой вопрос.

0 голосов
/ 07 февраля 2019

Вы можете попробовать это, если используете базу данных SQL:

Select DATEADD(Month, -1, getdate()) 
0 голосов
/ 07 февраля 2019

Итак, вы используете сторонний инструмент для извлечения данных из системы SAP.Согласно сообщению об ошибке, он выполняет удаленный вызов функции (RFC) и передает SQL-запрос к бэкэнду ABAP.Тогда ваше условие where должно быть допустимым синтаксисом ABAP / Open SQL независимо от базы данных.

Ваш вызов (упрощенный) будет выглядеть так в ABAP (с новым @ -syntax):

DATA(lf_dat) = sy-datum - 30.

SELECT matnr
FROM mara
WHERE laeda >= @lf_dat
INTO TABLE @DATA(lt_matnr)
.

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

laeda >= '20190106' "YYYYMMDD

Вы можете добавить тег ABAP к своему вопросу впривлечь больше специалистов по этой конкретной теме ABAP.

0 голосов
/ 07 февраля 2019

В mySQL / MariaDB это работает:

select ...
from ...
where date >= DATE_ADD(CURDATE(), INTERVAL -30 DAY)

, но нам нужно знать, с какой базой данных вы работаете.

...