28.11.2006, 17:07 | #1 |
Участник
|
знатокам select
Коллеги - подскажите плиз почему не работает нижеприведенная конструкция:
почему не джойнится тока единственная запись ??? то есть при обработке у меня выскакивает throw errror static void Job1(Args _args) { salesTable salesTable; custInvoiceJour custInvoiceJour; container cont; ; while select salesTable where salesTable.SalesStatus == SalesStatus::Invoiced join firstonly firstfast custInvoiceJour order by invoiceId desc where custInvoiceJour.SalesId == salesTable.SalesId { if (! confind(cont, salesTable.salesId)) { info(salesTable.salesID); cont += salesTable.SalesId; } else throw error('Повтор !!! ' + salesTable.SalesId); } } |
|
28.11.2006, 17:19 | #2 |
Участник
|
вместо join firstonly firstfast напиши exists join и будет щастие
__________________
любитель портвейна и снов с прокисшей капустой в усах |
|
28.11.2006, 17:25 | #3 |
Злыдни
|
Потому, что в первую ветку if система никогда не попадет. Контейнер надо инициализировать до проверки
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
28.11.2006, 17:28 | #4 |
Участник
|
ах если было бы так просто, до exists join я и сам догадался.
В том то и дело что в теле цикла надо потом юзать как данные переменной salesTable так и custInvoiceJour, что при примении exists join невозможно |
|
28.11.2006, 17:29 | #5 |
Участник
|
что значит не попадет ? попадет и еще как - запустите код на исполнение
|
|
28.11.2006, 17:42 | #6 |
Злыдни
|
Работает. Я понял. У Вас первая запись идет с двойным инвойсом. Попробуйте сделать order by по номеру заказа. У меня в инфолог заказы вывелись
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
28.11.2006, 18:06 | #7 |
Участник
|
Гм.. а разве join firstonly вообще должно работать? Оно и в нормальном скуле не работает.. вообще в чем смысл даного запроса - найти заказы, по которым более одной накладной?
В скуле если только такую конструкцию придумать, если именно нужен джоин первой записи select st.*, CustInvJ.* from dbo.salesTable st inner join (select top 1 * from dbo.CustInvoiceJour) as CustInvJ on CustInvJ.SalesId = st.SalesId В Ахапке только вложенным подзапросом наверное |
|
28.11.2006, 20:07 | #8 |
Участник
|
Может так ?
Код: while select salesTable where salesTable.SalesStatus == SalesStatus::Invoiced join count(recId) from custInvoiceJour group by SalesId where custInvoiceJour.SalesId == salesTable.SalesId { Последний раз редактировалось Delfins; 28.11.2006 в 20:09. |
|
28.11.2006, 20:51 | #9 |
Участник
|
Хинт firstonly - это внутренняя "фишка" AXAPTA. Это вовсе не аналог TOP 1 в MS SQL.
Работает это примерно так: AXAPTA посылает обычный SELECT серверу и начинает считывать результат порциями по несколько записей. Если встречается хинт firstonly, то после первой записи процесс чтения останавливается. Это все работает, если firstonly стоит сразу за select, но после join он не имеет смысла. Поскольку это хинт не собственно отправленной на сервер конструкции SELECT, а способ разбора результата этого запроса. Уже на стороне AXAPTA. И как она будет "выковыривать" первую запись подчиненной таблицы? В данном случае придется либо отказаться от объединения твух таблиц в одном запросе и делать вложенные запросы, либо отсекать дубли вручную внутри цикла (добавив сортировку по SalesId). |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
29.11.2006, 08:49 | #10 |
Участник
|
А такой метод не подойдет?
X++: static void Job150(Args _args) { custInvoiceJour custInvoiceJour; while select count(recid) from custInvoiceJour group by salesid where custInvoiceJour.InvoiceDate > mkdate(1,10,06) { if (custInvoiceJour.RecId > 1) info(strFmt('%1 %2 ', custInvoiceJour.SalesId, custInvoiceJour.RecId)); } } |
|