Указатель на универсальный тип

Ваш код может использовать небольшое переформатирование, чтобы улучшить читаемость. Вы, скорее всего, получите качественный ответ, если люди смогут быстро и легко усвоить ваш вопрос и ваш код. Кроме того, у вас были дополнительные открытые скобки в предложении WHERE для внешнего запроса.

При использовании подзапроса вы должны избегать использования тех же псевдонимов таблиц, что и внешний запрос. Используйте уникальные псевдонимы.

Проблема, с которой вы столкнулись, вызвана тем, что у вас есть подзапрос, производящий столбец VENDEUR X. Чтобы подзапрос работал, он должен возвращать только одну строку при выполнении. В вашем случае он возвращает несколько строк, которые выдают сообщение об ошибке.

Для устранения проблемы запустите подзапрос независимо и проверьте возвращаемые данные. Вы группируете по столбцу ET2.ET_LIBELLE, который имеет несколько значений. Исходя из того, что, я полагаю, вы пытаетесь сделать, вы должны добавить ET2.ET_LIBELLE в предложение WHERE. Смотрите мой пример ниже.

SELECT 
    [MAGASIN] = ET2.ET_LIBELLE,
    [CA]= SUM(GL_MONTANTTTC),
    [NBR TICKET] = COUNT(DISTINCT GL_NUMERO),
    (
        SELECT [NBR TICKET] = COUNT(DISTINCT GL_NUMERO) 
        FROM 
            GCLIGNEARTDIM 
            LEFT OUTER JOIN ETABLISS ETI ON GL_ETABLISSEMENT=ETI.ET_ETABLISSEMENT 
            LEFT OUTER JOIN COMMERCIAL GCLI ON GL_REPRESENTANT=GCLI.GCL_COMMERCIAL 
        WHERE 
            (
                GL_DATEPIECE >= '20190228 00:00:00' 
                AND GL_DATEPIECE < '20190301 00:00:00' 
                AND (GCL3.GCL_LIBELLE='vendeur x')
            )
            AND GL_ETABLISSEMENT IN ('W01','W05','F10')
            AND ETI.ET_LIBELLE = ET2.ET_LIBELLE
    ) AS 'VENDEUR X'
FROM 
    GCLIGNEARTDIM 
    LEFT OUTER JOIN ETABLISS ET2 ON GL_ETABLISSEMENT=ET2.ET_ETABLISSEMENT  
    LEFT OUTER JOIN COMMERCIAL GCL3 ON GL_REPRESENTANT=GCL3.GCL_COMMERCIAL
WHERE 
    GL_DATEPIECE >= '20190228 00:00:00' 
    AND GL_DATEPIECE < '20190301 00:00:00' 
    AND GL_ETABLISSEMENT IN ('W01','W05','F10')
GROUP BY
    ET2.ET_LIBELLE
ORDER BY
    ET2.ET_LIBELLE
5
задан jpfollenius 27 April 2009 в 13:24
поделиться

4 ответа

Извините, Smasher. Указатели на открытие универсальных типов не поддерживаются, потому что универсальные типы указателей не поддерживаются, хотя возможно (ошибка компилятора) создавать их при определенных обстоятельствах (особенно указатели на вложенные типы внутри универсального типа); эта «особенность» не может быть удалена в обновлении, если мы нарушаем чей-то код. Ограничение на универсальные типы указателей должно быть снято в будущем, но я не могу давать обещания, когда. ] HashList ), ну, простейший способ воспроизвести это - изменить тип узла на класс и передать любые двойные указатели как Pointer с соответствующим приведением. Однако, если бы я писал этот блок снова сегодня, Я бы не реализовывал ведра как двоичные деревья. Я получил возможность написать словарь в модуле Generics.Collections, хотя со всеми остальными время работы компилятора Delphi было слишком коротким, прежде чем отправлять его для надежного контроля качества, а сама поддержка универсальных функций постоянно менялась.

предпочитают реализовывать сегменты карты хеш-функции как один из динамических массивов двойного хеширования, для каждого сегмента или связанных списков ячеек из непрерывного массива, в зависимости от того, что получилось лучше всего при тестировании с использованием репрезентативных данных. Логика заключается в том, что стоимость пропуска кэша для следующих ссылок в дереве / списке должна доминировать над любой разницей в поиске сегментов между деревом и списком с хорошей хэш-функцией. Текущий словарь реализован как прямолинейное зондирование прежде всего потому, что его было относительно легко реализовать и работать с доступным набором примитивных общих операций.

Тем не менее, корзины двоичного дерева должны были быть эффективным хеджированием против плохих хеш-функций; если бы они были сбалансированными двоичными деревьями ( => еще больше затрат на модификацию), они были бы в среднем O (1) и O (log n) в худшем случае.

11
ответ дан 18 December 2019 в 07:32
поделиться

Если бы Delphi вообще поддерживал универсальные типы указателей, он должен был бы выглядеть так:

type
  PHashNode<K, V> = ^THashNode<K, V>;

То есть, упомяните универсальные параметры на левой стороне, где вы объявляете имя тип, а затем используйте эти параметры при построении типа справа.

Однако Delphi не поддерживает . См. QC 66584 .

С другой стороны, я бы также поставил под сомнение необходимость иметь указатель на тип класса вообще. Общий или нет. они нужны только очень редко.

4
ответ дан 18 December 2019 в 07:32
поделиться

В модуле Generics.Collections есть общая хэш-карта с именем TDictionary. К сожалению, в настоящий момент он сильно сломан, но, по-видимому, он будет исправлен в обновлении № 3, которое должно выйти в течение нескольких дней, согласно Нику Ходжесу .

2
ответ дан 18 December 2019 в 07:32
поделиться

Чтобы действительно ответить на ваш вопрос, вы не можете сделать указатель на универсальный тип, потому что «универсальные типы» не существуют. Вы должны сделать указатель на определенный тип с заполненными параметрами типа.

К сожалению, компилятору не нравится находить угловые скобки после ^. Но он примет следующее:

   TGeneric<T> = record
      value: T;
   end;

   TSpecific = TGeneric<string>;

   PGeneric = ^TSpecific;

Но " PGeneric = ^ TGeneric ; " выдает ошибку компилятора. Звучит как глюк для меня. Я бы доложил об этом в КК на вашем месте.

В любом случае, почему вы пытаетесь сделать указатель на объект? Объекты Delphi являются ссылочным типом, поэтому они уже являются указателями. Вы можете просто привести свою ссылку на объект на Pointer, и все хорошо.

4
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: