2016-03-16 3 views
1

У меня возникает очень странный результат, когда я делаю подсчет в X ++, чего я раньше не испытывал. Я выполняю то, что, как я думал, был действительно просто счетным запросом, но я не могу получить результат, который я получил.X ++ Нечетный результат подсчета

WMSOrderTrans orderTrans; 
WMSOrderTrans orderTransChk; 
; 

select count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX'; 
info(strFmt('Count is %1', orderTrans.RecId)); 


while select orderTransChk group by shipmentid where orderTransChk.inventTransRefId == 'XXXXXX' { 
    info(strFmt('Shipment is %1', orderTransChk.shipmentId)); 
} 

Набор данных, которые я выбрать все имеют только 1 shipmentid, поэтому первый выбор я ожидал счетчик 1, а я получаю 4 (что, сколько строк для этого transrefid существуют). Если я изменю счет от «RecId» до «ShipmentId», то вместо счета, я получаю фактическую отгрузку. Я просто хочу, чтобы он возвращал количество записей, что, как я считаю, я попросил.

Я действительно не вижу, что мне не хватает.

В то время как выберите, я получаю то, что ожидаю (отгрузка), только 1 сообщение infolog для цикла. Это говорит мне, что группа с предложением where работает, но не объясняет, почему первый оператор выбора count не ведет себя так, как я ожидал.

Для справки, это система AX2012 R1.

+0

Надеюсь, вы решили это уже, но если нет, то ваш общий запрос (группа) будет искать, сколько записей имеет установленный inventTransRefId, и сколько из них передают идентификатор доставки (даже если его только один идентификатор доставки). Если вы знаете, что у вас есть 4 записи для одного inventTransRefId, как вы думаете, что они собираются, когда вы группируете их под идентификатором ShipmentID?Ваш запрос просто не настроен для подсчета количества идентификаторов доставки, но вместо этого, сколько recID (полные строки, поскольку они всегда уникальны) совместно используют inventTransRefId. –

+0

Спасибо Джеффу за то, что он указал на мой очевидный недостаток. Я знал, что, должно быть, было что-то простое, что я пропустил (не всегда так). Это настоящий момент «удар по моей голове». Я ожидал 4 разных идентификатора доставки, но это было не так. Было 4 разных предмета по одному идентификатору доставки, поэтому «группа по отгрузке» была законно консолидирована. Не могу поверить, что я пропустил это, так просто и очевидно, но я был слеп. Данные никогда не лежат, и я просто не выглядел достаточно близко. – Rat

ответ

1

Для тех, кто может быть заинтересован в зная мой ответ, он связан с ответом Джеффа. В конце дня я не смотрел на данные достаточно хорошо, и запрос вернул правильные результаты. Сначала я думал, что существует ряд уникальных поставок, но я ошибся. Мой ожидаемый результат был ошибочным. В файле было 4 строки, но строки были уникальны для элемента, а не для отправки. Все они были на одной и той же отправке. Так что, собственно, моя вина, это показывает, что действительно нужно внимательно смотреть на данные.

Спасибо всем, кто ответил, что очень благодарен.

0

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

Попробуйте получить инструкцию select с помощью этого метода (из памяти так, чтобы проверить синтаксис), а затем непосредственно просмотреть запрос на SQL. Он использует generateOnly.

select generateOnly count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX'; 

info(orderTrans.getSQLStatement()); 
+0

Спасибо за это, по крайней мере, у меня есть подтверждение, что я не схожу с ума :) SQL, который он создает: SELECT COUNT (T1.RECID), T1.SHIPMENTID FROM WMSORDERTRANS T1 WHERE ((DATAAREAID = N'aus ') AND (INVENTTRANSREFID =?)) GROUP BY T1.SHIPMENTID ORDER BY T1.SHIPMENTID – Rat

+0

Это действительно странно, теперь я выполнил синхронизацию базы данных и перезапустил AOS, и я до сих пор не получаю ожидаемых результатов. Это делает мою голову, такой простой запрос. Я не вижу ничего, что я сделал глупо неправильно (но это все еще не вне сферы возможностей). Любые другие идеи кто-нибудь ???? – Rat

0

Если я понимаю, что вы пытаетесь достичь, вы хотели бы получить что-то вроде этого SQL запроса:

select count(distinct shipmentid) from orderTrans 
where inventTransRefId = 'XXXXXX' 

«отчетливый» ключевое слово не доступен в AX выберите команду. Предложение group by позволит вам выполнять итерацию всех различных значений, но не использовать агрегат поверх него. Вы можете использовать соединение sql для точной команды sql, которую вы хотите.

В AX агрегированные значения являются хранилищами в используемом поле: Count (RecId), счетчик переходит в поле возврата, иначе система может потребоваться добавить новое поле в буфер на лету. Я не думаю, что вы можете объединиться в клаузуле group, так как важно иметь ее ценность.

Вы можете попробовать (я не имею в AX, чтобы проверить его) использовать запрос:

Query    query = new Query(); 
QueryRun    queryRun; 
QueryBuildDataSource qbd; 

qbd = query.addDataSource(tablenum(OrderTrans)); 
qbd.addRange(fieldNum(OrderTrans, InventTransId)).value("xxxx"); 
qbd.addSortField(fieldNum(OrderTrans, ShipmentId)); 
qbd.SortOrder(SortOrder::GroupBy); 
queryRun = new QueryRun(query); 

info(strfmt("Total Records in Query %1",SysQuery::countTotal(queryRun))); 
+0

Это цель в двух словах, я пытаюсь получить различные значения для данного REFID. Я пытаюсь получить уникальные поставки для данного заказа клиента (INVENTTRANSREFID). Я знаю, что отдельное ключевое слово недоступно в X ++, поэтому я использовал предложение group by with count. Я пытаюсь избежать нажатия точного SQL. Это не должно быть так сложно. Предложенный X ++ запрос должен работать. Если вы заметили что-то не так, я все уши. – Rat

Смежные вопросы