24.06.2010, 10:51 | #21 |
Участник
|
Для проверки расширенных диапазонов не надо писать джобов.
Достаточно открыть любую форму с датами и в запросе прописать нужное условие. К примеру, у меня прекрасно фильтруется по такому запросу в складских журналах по полю "Идентификатор записи" X++: ((transdate >= 01\01\2010) && (transdate <=01\01\2010)) || ((createddate >= 01\01\2010) && (createddate <=01\01\2010))
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
24.06.2010, 11:31 | #22 |
Участник
|
Иихо, в джобе запрос выглядет наглядней, чисто с точки зрения удобства написания и отображения. Понятное дело, что работать будет и в расширенном фильтре.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
18.08.2014, 13:21 | #23 |
Участник
|
Всем доброго дня.
У меня подобная проблема. Есть справочник учета холодильников, в нем указывается "дата установки" и "дата выбытия". Если холодильник еще не выбил, то "дата выбытия" пуская, т.е dateNull(). Пытаюсь в query наложить условие периода дат но безрезультатно. X++: queryLocal = new Query(); qbds1 = queryLocal.addDataSource(tableNum(SalesTable)); qbds1.addGroupByField(fieldNum(SalesTable, ShipmentPointCode)); qbds2 = qbds1.addDataSource(tableNum(RegistrationRefrigerationTable)); qbds2.joinMode(JoinMode::InnerJoin); qbds2.fetchMode(QueryFetchMode::One2One); qbds2.relations(false); qbds2.addLink(fieldNum(SalesTable, ShipmentPointCode), fieldNum(RegistrationRefrigerationTable, ShipmentPointCode)); queryRunLocal = new QueryRun(queryLocal); .... queryLocal = queryRunLocal.query(); qbds1 = queryLocal.dataSourceTable(tableNum(SalesTable)); qbds1.clearRange(fieldNum(SalesTable, ShippingDateRequested)); qbds1.addRange(fieldNum(SalesTable, ShippingDateRequested)).value(strfmt("%1 .. %2", startDate, endDate)); qbds2 = queryLocal.dataSourceTable(tableNum(RegistrationRefrigerationTable)); qbds2.clearRanges(); qbds2.addRange(fieldNum(RegistrationRefrigerationTable, DateInsert)).value(strfmt("..%1", endDate)); /* работает, выводит 2 строки*/ /*добавляю фильтр по дате выбытия, ожидаю в выводе 1 строку, а получаю много много*/ rangeDate = strfmt('((DateRemove>="%1") OR (DateRemove=="%2"))', startDate, dateNull()); // с этими строками qbds2.addRange(fieldNum(RegistrationRefrigerationTable, DateRemove)).value(rangeDate); // выводит чушь queryRunLocal = new QueryRun(queryLocal); Дайте совет как правильно прописать условие. |
|
18.08.2014, 13:32 | #24 |
Молодой, подающий надежды
|
Expressions in query ranges
Даты должны быть отформатированы с помощью Date2StrXpp() X++: rangeDate = strfmt('((DateRemove >= %1) || (DateRemove == %2))', date2StrXpp(startDate), date2StrXpp(dateNull()))
__________________
Кононов Пётр Последний раз редактировалось pedrozzz; 18.08.2014 в 13:35. |
|
18.08.2014, 13:49 | #25 |
Участник
|
Замените OR на ||
__________________
// no comments |
|
18.08.2014, 13:52 | #26 |
Участник
|
X++: rangeDate = strfmt('((DateRemove >= %1) || (DateRemove == %2))', date2StrXpp(startDate), date2StrXpp(dateNull())); qbds2.addRange(fieldNum(RegistrationRefrigerationTable, DateRemove)).value(rangeDate); queryRunLocal = new QueryRun(queryLocal); while (queryRunLocal.next()) { salesTable = queryrunLocal.get(tableNum(SalesTable)); registrationRefrigerationTable = queryRunLocal.get(tableNum(RegistrationRefrigerationTable)); info (strfmt("%1 %2", salesTable.ShipmentPointCode, registrationRefrigerationTable.DateInsert)); } в registrationRefrigerationTable две записи с 01.08.2014 по 05.08.2014 и с 01.08.2014 по <пусто>. создан специально тестовый заказ от 04.08.2014. В отладчике запрос выглядит так : SELECT FIRSTFAST * FROM RegistrationRefrigerationTable WHERE SalesTable.ShipmentPointCode = RegistrationRefrigerationTable.ShipmentPointCode AND ((DateInsert<={ts '2014-08-06 00:00:00.000'})) AND ((((DateRemove >= 04\08\2014) || (DateRemove == 01\01\1900)))) Может правую часть привести к такому же виду что и левую? |
|
18.08.2014, 13:59 | #27 |
Участник
|
написал
X++: queryLocal = new Query(); qbds1 = queryLocal.addDataSource(tableNum(RegistrationRefrigerationTable)); qbds1.addRange(fieldNum(RegistrationRefrigerationTable, DateInsert)).value(strfmt("..%1", endDate)); rangeDate = strfmt('((DateRemove >= %1) || (DateRemove == %2))', date2StrXpp(startDate), date2StrXpp(dateNull())); qbds1.addRange(fieldNum(RegistrationRefrigerationTable, DateRemove)).value(rangeDate); queryRunLocal = new QueryRun(queryLocal); while (queryRunLocal.next()) { .... } |
|
18.08.2014, 14:00 | #28 |
Участник
|
У вас же группировка по ShipmentPointCode. Поэтому во второй таблице пусто. Используйте статистические функции.
__________________
// no comments |
|
18.08.2014, 14:20 | #29 |
Участник
|
Немного Вас не понял. В заказах на продажу ShipmentPointCode и в учете холодильников ShipmentPointCode (т.е то где стоит холодильник). В заказах на продажу за определенный период может быть несколько заказов с одной и той же ShipmentPointCode, поэтому я их группирую. Если в указанном диапазоне в ShipmentPointCode не было холодильника, мне запись из salesTable не нужна. К этому всему безобразию хочу прикрутить холодильник. Расскажите по подробнее о каких статических функциях Вы говорите?
|
|
18.08.2014, 16:38 | #30 |
Участник
|
Во-первых, не статические функции, а статистические, по-другому агрегатные (MIN, MAX, SUM, COUNT, AVG). Тут уж они не нужны, простите, не знал чего вы хотели добиться.
Во-вторых, вы хотите выбирать записи из SalesTable, а потом накладываете группировку по ShipmentPointCode. Это неправильно. У вас теряются все значения, а остается лишь поле, по которому идет группировка. Третий пункт вытекает из второго: Цитата:
Мой совет: уберите группировку, сделайте соединение OUTER JOIN и будет вам счастье.
__________________
// no comments |
|
18.08.2014, 16:54 | #31 |
Участник
|
Цитата:
В случае с OUTER JOIN, я получу конкретные заказы (100, 200, 300 штук). Потом конечно можно бегать по ним, предварительно их отсортировав, но еще надо будет сделать механизм группировки данных. В идеале я делаю отчет по продажам номенклатуры в ShipmentPointCode в которой стоят холодильники. Последний раз редактировалось smailik; 18.08.2014 в 16:58. |
|
18.08.2014, 17:40 | #32 |
Участник
|
Тогда у меня к вам такие вопросы:
1. Нужно ли выбирать из SalesTable другие поля, помимо ShipmentPointCode? 2. Имеются ли записи в SalesTable с незаполненным ShipmentPointCode? Что вы собираетесь делать с набором записей, сгруппированных по пустому полю? 3. Я не совсем понимаю, что хранится в таблице RegistrationRefrigerationTable и как вы определяете, что нужный товар - это холодильники, а не утюги или стиральные машины. Если вам нужны холодильники и именно код холодильника указан в ShipmentPointCode, то почему бы не забить это в Range?
__________________
// no comments |
|
20.08.2014, 00:20 | #33 |
Участник
|
|
|
20.08.2014, 18:45 | #34 |
Участник
|
Цитата:
Сообщение от dech
Тогда у меня к вам такие вопросы:
1. Нужно ли выбирать из SalesTable другие поля, помимо ShipmentPointCode? 2. Имеются ли записи в SalesTable с незаполненным ShipmentPointCode? Что вы собираетесь делать с набором записей, сгруппированных по пустому полю? 3. Я не совсем понимаю, что хранится в таблице RegistrationRefrigerationTable и как вы определяете, что нужный товар - это холодильники, а не утюги или стиральные машины. Если вам нужны холодильники и именно код холодильника указан в ShipmentPointCode, то почему бы не забить это в Range? 2. В идеале с незаполненным ShipmentPointCode записей быть не должно, но могут и быть. 3. В таблице RegistrationRefrigerationTable указан марка модель, тип, инвентарный номер, ShipmentPointCode (точка доставки), дата установки, дата выбытия. Записи с незаполненным ShipmentPointCode исключены. При соединении SalesTable и RegistrationRefrigerationTable, записи из SalesTable с пустым ShipmentPointCode выбраться не должны. Цитата:
X++: // до этого момента query которая выдаст только ShipmentPointCode queryLocal = queryRun.query(); qbds1 = queryLocal.dataSourceTable(tableNum(SalesTable)); qbds1.clearRange(fieldNum(SalesTable, ShippingDateRequested)); qbds1.clearRange(fieldNum(SalesTable, ShipmentPointCode)); qbds1.addRange(fieldNum(SalesTable, ShippingDateRequested)).value(strfmt("%1 .. %2", startDateLocal, endDateLocal)); qbds1.addRange(fieldNum(SalesTable, ShipmentPointCode)).value(salesTable.ShipmentPointCode); queryRun = new QueryRun(queryLocal); while (queryRun.next()) { // тыгыдым тыгыдым } |
|