Как оценить дату только в поле Datetime в App Engine PeopleCode

просто хотел предисловие, сказав, что я новичок в разработке PeopleSoft AppEngine и PeopleCode.

У меня есть следующий шаг в программе PeopleSoft App Engine (шаг OnExecute), который извлекает записи в таблице, а затем берет эти существующие значения и создает новые строки с новой ценой товара.

Программа выполняет оператор SQLExec из таблицы «PS_ITM_VNDR_UOM_PR» и использует EFFDT как часть критериев предложения WHERE. Для EFFDT он заполняет значение переменной в формате «ГГГГ-ММ-ДД». Проблема в том, что в таблице PS_ITM_VNDR_UOM_PR есть некоторые строки, которые для EFFDT имеют дату и время: (например, 2018-03-19 10:04:03.040), а не просто дату с пустым временем по умолчанию: (например, 2018-03 -16 00:00:00.000).

Вот еще один взгляд на проблему, это SQL, который запускает программа, и его результаты:

Код SQL/результаты с использованием стандартного EFFDT в предложении WHERE (не находит ни одной строки):

введите здесь описание изображения

Тот же код SQL/результаты с логикой преобразования даты EFFDT (подбирает строку): введите здесь описание изображения

Есть ли способ изменить оператор SQL в коде, аналогично тому, что я сделал в собственном SQL Server выше, или способ определить программную переменную только для даты, которую я могу использовать в коде SQLExec?

Я прокомментировал приведенный ниже код, где, как я полагаю, находится строка с рассматриваемым оператором SQL, который необходимо изменить.

Local SQL &SQL;
Local string &VendorId, &InvItemId, &ItmIdVndr, &UOM, &ConvRate, &PriceVndr, 
&Oprid, &PriceStatus, &VendorId_check, &insert_cols, &insert_select, 
&insert_where, &insert_sql, &Error, &MaxEffdt;
Local date &Effdt;
Local Record &ITM_VNDR_UOM_PR, &REC;

&Oprid = "'SYSUSER'";
&PriceStatus = "2";
&Error = "N";

MessageBox(0, "", 0, 0, "**** BEGINING OF VALIDATION ERRORS ****");

&SQL = CreateSQL("SELECT VENDOR_ID, INV_ITEM_ID, ITM_ID_VNDR, 
UNIT_OF_MEASURE, CONVERSION_RATE, PRICE_VNDR, %DateOut(EFFDT) FROM 
PS_GH_ITM_PR_UPDT ORDER BY VENDOR_ID, INV_ITEM_ID, ITM_ID_VNDR", &VendorId, 
&InvItemId, &ItmIdVndr, &UOM, &ConvRate, &PriceVndr, &Effdt);

While &SQL.Fetch(&VendorId, &InvItemId, &ItmIdVndr, &UOM, &ConvRate, 
&PriceVndr, &Effdt)

   SQLExec("SELECT A.VENDOR_ID FROM PS_ITM_VENDOR A, PS_ITM_VNDR_UOM B WHERE 
A.SETID = B.SETID AND A.INV_ITEM_ID = B.INV_ITEM_ID AND A.VENDOR_SETID = 
B.VENDOR_SETID AND A.VENDOR_ID = B.VENDOR_ID AND A.VENDOR_ID = :1 AND 
A.INV_ITEM_ID = :2 AND A.ITM_ID_VNDR = :3 AND A.ITM_VNDR_PRIORITY = 1 AND 
B.UNIT_OF_MEASURE = :4 AND B.CONVERSION_RATE = :5", &VendorId, &InvItemId, 
&ItmIdVndr, &UOM, &ConvRate, &VendorId_check);

   If None(&VendorId_check) Then;
      &Error = "Y";
      MessageBox(0, "", 0, 0, &VendorId | " " | &InvItemId | " " | &ItmIdVndr 
| " " | &UOM | " " | &ConvRate | " " | &PriceVndr | " " | &Effdt);
   Else;
      &CurrentDateTime = %Datetime;
      &Oprid = %OperatorId;
      &RECITEM = CreateRecord(Record.ITM_VNDR_UOM_PR);    
      SQLExec("SELECT C.EFFDT FROM PS_ITM_VNDR_UOM_PR C WHERE C.INV_ITEM_ID = 
:1 AND C.VENDOR_ID = :2 AND C.UNIT_OF_MEASURE = :3 AND C.EFFDT = (SELECT 
MAX(C1.EFFDT) FROM PS_ITM_VNDR_UOM_PR C1 WHERE C.SETID = C1.SETID AND 
C.INV_ITEM_ID = C1.INV_ITEM_ID AND C.VENDOR_SETID = C1.VENDOR_SETID AND 
C.VENDOR_ID = C1.VENDOR_ID AND C.VNDR_LOC = C1.VNDR_LOC AND C.UNIT_OF_MEASURE 
= C1.UNIT_OF_MEASURE AND C.CURRENCY_CD = C1.CURRENCY_CD AND C.QTY_MIN = 
C1.QTY_MIN)  ", &InvItemId, &VendorId, &UOM, &MaxEffdt);
/* **NEXT SECTION OF CODE IS WHERE THE ISSUE IS OCCURING I BELIEVE** */
SQLExec("%SelectAll(:1) WHERE INV_ITEM_ID = :2 AND VENDOR_ID = :3 AND 
UNIT_OF_MEASURE = :4 AND EFFDT = :5", &RECITEM, &InvItemId, &VendorId, &UOM, 
&MaxEffdt, &RECITEM);
/* **** END OF ISSUE CODE IN QUESTION **** */
      &new_UNIT_OF_MEASURE = &RECITEM.UNIT_OF_MEASURE.Value;
      &REC = CreateRecord(Record.ITM_VNDR_UOM_PR);
      &REC.SETID.Value = &RECITEM.SETID.Value;
      &REC.INV_ITEM_ID.Value = &RECITEM.INV_ITEM_ID.Value;
      &REC.VENDOR_SETID.Value = &RECITEM.VENDOR_SETID.Value;
      &REC.VENDOR_ID.Value = &RECITEM.VENDOR_ID.Value;
      &REC.VNDR_LOC.Value = &RECITEM.VNDR_LOC.Value;
      &REC.UNIT_OF_MEASURE.Value = &RECITEM.UNIT_OF_MEASURE.Value;
      &REC.CURRENCY_CD.Value = &RECITEM.CURRENCY_CD.Value;
      &REC.QTY_MIN.Value = &RECITEM.QTY_MIN.Value;
      &REC.EFFDT.Value = &Effdt; 
      &REC.EFF_STATUS.Value = &RECITEM.EFF_STATUS.Value;
      &REC.PRICE_VNDR.Value = &PriceVndr;
      &REC.PCT_UNIT_PRC_TOL.Value = &RECITEM.PCT_UNIT_PRC_TOL.Value;
      &REC.PCT_EXT_PRC_TOL.Value = &RECITEM.PCT_EXT_PRC_TOL.Value;
      &REC.USE_STD_TOLERANCES.Value = &RECITEM.USE_STD_TOLERANCES.Value;
      &REC.QTY_RECV_TOL_PCT.Value = &RECITEM.QTY_RECV_TOL_PCT.Value;
      &REC.UNIT_PRC_TOL_L.Value = &RECITEM.UNIT_PRC_TOL_L.Value;
      &REC.PCT_UNIT_PRC_TOL_L.Value = &RECITEM.PCT_UNIT_PRC_TOL_L.Value;
      &REC.EXT_PRC_TOL_L.Value = &RECITEM.EXT_PRC_TOL_L.Value;
      &REC.PCT_EXT_PRC_TOL_L.Value = &RECITEM.PCT_EXT_PRC_TOL_L.Value;
      &REC.BU_PRICE_STATUS.Value = "2";
      &REC.STD_PRICE_STATUS.Value = "2";
      &REC.LEAD_TIME.Value = &RECITEM.LEAD_TIME.Value;
      &REC.OPRID_MODIFIED_BY.Value = &Oprid;
      &REC.LAST_DTTM_UPDATE.Value = &CurrentDateTime;
      &REC.PRICE_CHANGE.Value = &RECITEM.PRICE_CHANGE.Value;
      &REC.Insert();
   End-If;
End-While;
MessageBox(0, "", 0, 0, "**** END OF VALIDATION ERRORS ****");
MessageBox(0, "", 0, 0, " ");

Я ценю любой вклад, который вы можете предоставить!


person Nick    schedule 09.07.2018    source источник


Ответы (2)


Если это БД Oracle, возможно, вы сможете использовать TRUNC в поле EFFDT.

...UNIT_OF_MEASURE = :4 AND TRUNC(EFFDT) = :5

Не совсем уверен, что эквивалент будет в SQLServer или другой базе данных. Я думаю, что это проигнорирует время и просто присоединится к дате. Хотя у вас могут возникнуть проблемы с возвратом нескольких строк или другие проблемы с повторяющимися строками. Поле EFFDT обычно не должно содержать компонент времени, поэтому в этой среде может возникнуть проблема с данными.

person otherted    schedule 09.07.2018
comment
Это база данных MS SQL Server. Могу ли я использовать ...UNIT_OF_MEASURE = :4 AND (CONVERT(CHAR(10),EFFDT,121)) = :5 - person Nick; 09.07.2018
comment
Я думаю, вам нужно, чтобы он оставался типом данных даты. Нечто подобное может работать, если SQLServer 2008... Cast (EFFDT как дата). Информация из docs.microsoft.com/en-us/sql/t-sql/functions/ - person otherted; 10.07.2018

Определите &MaxEffdt как дату.

У вас он определен как строка, но вы выбираете в него дату, вызывая неявные преобразования.

person Based    schedule 18.07.2018
comment
вы говорите, что если я изменю переменную &MaxEffdt на локальную дату, мне не придется выполнять преобразование SQL? Итак, когда SQLExec запускает оператор SQL, переменная &MaxEffdt (: 5) будет заполнена в операторе только как дата (в отличие от datetime)? Спасибо еще раз. - person Nick; 14.08.2018