Crystal сообщает формулу имени группы, используя запись из другой строки таблицы

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

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

Моя таблица, из которой я извлекаю записи для этого имени группы, имеет:

  • {GroupSection.Group} Группы элементов в нашей базе данных инвентаря
  • Разделы {GroupSection.Section} (это как подгруппы, вложенные в каждую группу инвентаря).
  • {GroupSection.Description} Проблемы начинаются здесь, потому что здесь хранятся описания для {GroupSection.Group} и {GroupSection.Section}.

Это образец моей таблицы:

    {GroupSection.Group}    {GroupSection.Section}     {GroupSection.Description}
    3.00                      0.00                      PRECAST CONCRETE PRODUCT
    3.00                     50.00                      MISC PRECAST CONCRETE PRODUCT
    3.00                     99.00                      *Z* MISC PRECAST CONCRETE PRODUC
    4.00                      0.00                      CEMENT SUPPLIES
    4.00                     50.00                      MISC CEMENT SUPPLIES
    4.00                     99.00                      *Z* MISC CEMENT SUPPLIES

Первая и четвертая строки в этой таблице являются описаниями для {GroupSection.Group} (у них есть 0,00 в строке {GroupSection.Section}), а остальные — описания для {GroupSection.Section}. Фактические данные, содержащиеся в этом отчете, находятся в другой таблице и имеют те же два поля, что и первые два в этой таблице, но не третье поле, поэтому необходимо ссылаться на эту таблицу и использовать ее для создания описаний. названия групп. В другой таблице нет записей, ссылающихся на строки с 0.00.

Я хочу, чтобы мое дерево групп выглядело так:

    3.  PRECAST CONCRETE PRODUCT
          50  MISC PRECAST CONCRETE
          99  *Z* MISC PRECAST CONCRETE
    4.  CEMENT SUPPLIES
          50  MISC CEMENT SUPPLIES
          99  *Z* MISC CEMENT SUPPLIES

Это ошибочная формула, которую я сейчас использую в формуле имени группы для верхней группы:

ToText (left(Cstr({GroupSection.Group}),2))+ " " + ToText (If {GroupSection.Section} <> 0 then {GroupSection.Description} Else " ")

Это формула имени группы для внутренней вложенной группы (работает нормально):

ToText (left(Cstr({GroupSection.Section}),2))+ " " + ToText ({GroupSection.Description})

Вот как сейчас выглядит мое дерево групп:

    3.  MISC PRECAST CONCRETE
          50  MISC PRECAST CONCRETE
          99  *Z* MISC PRECAST CONCRETE
    4.  MISC CEMENT SUPPLIES
          50  MISC CEMENT SUPPLIES
          99  *Z* MISC CEMENT SUPPLIES

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

Я пробовал использовать в формуле предыдущую(), но выдает следующую ошибку: Эту функцию нельзя использовать, поскольку ее нужно вычислить позже.

Изменить: я также просто попытался снова добавить ту же таблицу и связать ее один раз с группой и один раз с разделом, и это сработало для имен групп, но теперь у меня 1.9 миллион записей, что-то действительно дублируется. Так что это не сработает, если я не придумаю, как исправить несколько записей.

"." в описании имени группы это несвязанная проблема. Лучшее, что я могу сделать, это заставить 3,00 отображаться как 3, а 50,00 — как 50.

Спасибо за любую помощь!


Изменить 30 декабря 2013 г. для пользователя @Promethean:

Извините, я новичок в таблицах команд SQL. Я взял командную таблицу из другого отчета и внес в нее некоторые изменения. Вот как далеко я продвинулся:

SELECT 
"GroupSection"."Group",
"GroupSection"."Section",
"GroupSection"."Description"

 FROM   ("SpruceDotNet"."dbo"."InventoryCommon" "InventoryCommon" with (nolock)

INNER JOIN 
"SpruceDotNet"."dbo"."GroupSection" "GroupSection" with (nolock)
ON "InventoryCommon"."Group"="GroupSection"."Group")

WHERE
"GroupSection"."Section"=0

ORDER BY 
"InventoryCommon"."Group"

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

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

Любая помощь приветствуется.


person user3088736    schedule 10.12.2013    source источник


Ответы (2)


Это может быть очень просто, если вы сделаете это с помощью SQL в таблице команд:

select a.Group, a.Section, a.Description,
       b.GroupName

from GroupSection a

left outer join
    (
       select concat( format(b.Group, 0), '. ', a.Description) as GroupName, b.Group
       from GroupSection b
       where b.Section = 0
    ) c
on a.Group = b.Group

concat может меняться в зависимости от поставщика вашей базы данных. Это отражает MySQL. выполнение этого против таблицы, которая отражает ваши образцы данных, приведет к следующему:

{GroupSection.Group}|{GroupSection.Section}|{GroupSection.Description}       |{GroupSection.GroupName}
3.00                |  0.00                | PRECAST CONCRETE PRODUCT        | 3. PRECAST CONCRETE PRODUCT
3.00                | 50.00                | MISC PRECAST CONCRETE PRODUCT   | 3. MISC PRECAST CONCRETE PRODUCT
3.00                | 99.00                | *Z* MISC PRECAST CONCRETE PRODUC| 3. *Z* MISC PRECAST CONCRETE PRODUC
4.00                |  0.00                | CEMENT SUPPLIES                 | 4. CEMENT SUPPLIES
4.00                | 50.00                | MISC CEMENT SUPPLIES            | 4. MISC CEMENT SUPPLIES
4.00                | 99.00                | *Z* MISC CEMENT SUPPLIES        | 4. *Z* MISC CEMENT SUPPLIES

Это можно легко сгруппировать в Crystal для получения желаемых результатов.

НАЧАТЬ РЕДАКТИРОВАНИЕ:

Проверь это. Это рабочий SQLfiddle, использующий структуру вашей таблицы. Для выполнения этой части необходим только GroupSection, поэтому я проигнорировал остальные. Вы можете поэкспериментировать с различными запросами, чтобы увидеть, что происходит, но как есть, он передаст в Crystal необходимое производное поле для группировки в Crystal. Вам все равно придется группировать по новому полю GroupName в Crystal.

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

Вот скрипка: http://sqlfiddle.com/#!2/aa88d/5/0

и на случай, если комментарии сделают код слишком запутанным, вот он с моими аннотациями:

SELECT gs2.GroupName,
       gs.sGroup, gs.Section, gs.Description

FROM GroupSection gs

left outer join
    (
     SELECT concat( format(inn.sGroup, 0), '. ', inn.Description) as GroupName, inn.sGroup

     FROM GroupSection inn

     WHERE inn.Section = 0
    ) gs2
    ON gs.sGroup = gs2.sGroup
person Odj fourth    schedule 21.12.2013
comment
Я не мог правильно разместить код здесь в комментариях, поэтому я отредактировал свой вопрос, указав, как далеко я продвинулся с таблицей команд. Смотрите нижнюю часть моего вопроса. Спасибо за любую помощь. Вы можете списать меня со счетов за новичка, которым я и являюсь. - person user3088736; 31.12.2013
comment
В конце концов я попросил компанию-разработчика программного обеспечения, которая была знакома с данными, составить для меня отчет. Они использовали таблицу команд, поэтому я бы сказал, что это правильный ответ. Не могу точно сказать, насколько он похож на этот. - person user3088736; 11.02.2014

Это совсем немного! Похоже, ваша проблема в базе данных, как вы указали в начале. Если вы сгруппируете по {GroupSection.Group} и поместите {GroupSection.Description} в заголовок группы рядом с ним, вы должны получить 3. MISC PRECAST CONCRETE. А затем вы поместите {GroupSection.Section} в раздел «Подробности» и {GroupSection.Description} рядом с ним, вы должны получить 50 MISC PRECAST CONCRETE. Так что на данный момент я бы не использовал формулу для группировки, а использовал бы поля. Итак, только одна группа ({GroupSection.Group}), а остальные в разделе «Подробности». Пожалуйста, попробуйте это предложение и дайте мне знать, как это работает.

РЕДАКТИРОВАТЬ:

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

  1. Создайте новую таблицу и разделите описания.
  2. Добавьте таблицу в отчет во второй раз и используйте один псевдоним для основной группы и второй псевдоним для второй группы.

CR выдаст вам сообщение о том, что у вас уже есть таблица в вашем отчете, но вы можете игнорировать это. Я бы попробовал № 2 и посмотрел, как это работает. Это определенно меньше работы, чем создание новой таблицы.

person campagnolo_1    schedule 10.12.2013
comment
Я уже использую поля для группировки, а не формулы. Что я пытаюсь сделать с формулой, так это изменить имя группы, чтобы у нее было описание в дереве групп. Дерево групп находится слева от отчета. Он экспортируется в PDF в виде закладок, чтобы облегчить навигацию по большому документу. - person user3088736; 11.12.2013
comment
Я группирую по {GroupSection.Group}, а затем встраиваю в него, группируя по {GroupSection.Section}. Это отлично отображает числа в дереве групп, когда я пытаюсь добавить {GroupSection.Description}, у меня возникает проблема. - person user3088736; 11.12.2013
comment
Потому что у вас есть описания всего в одной таблице. Он всегда будет показывать вам описание первого элемента. Посмотрите мой пересмотренный ответ и попробуйте добавить одну и ту же таблицу дважды в отчет, а затем используйте один псевдоним для группы 1 и второй псевдоним для группы 2. - person campagnolo_1; 11.12.2013
comment
Да, это то, что я пробовал вчера. См. мой отредактированный вопрос: Редактировать: я также только что попытался снова добавить ту же таблицу и связать ее один раз с группой и один раз с разделом, и это сработало для имен групп, но теперь у меня есть 1,9 миллиона записей, что-то действительно дублируется . Так что это не сработает, если я не придумаю, как исправить несколько записей. - person user3088736; 11.12.2013
comment
Эта проблема может быть связана с тем, как вы связываете две таблицы. Мне кажется, что вам придется создать вторую таблицу, чтобы разделить описания. Может показаться, что сейчас много работы, но это может сэкономить вам много времени и головную боль в будущем. - person campagnolo_1; 12.12.2013
comment
Мне нужно выяснить, как создать псевдоним и связать таблицы, не получая дубликатов записей, потому что я не могу создать новую таблицу из-за того, что таблицы используются с проприетарным программным обеспечением. - person user3088736; 12.12.2013
comment
CR обычно создает для вас псевдоним, когда вы добавляете таблицу в отчет более одного раза в Database Expert. - person campagnolo_1; 12.12.2013