Цикл по таблице в crystal-reports

У меня есть 2 связанные таблицы для отчета: - 1-я содержит решения и ссылки на 2-ю. Важными полями являются решение, тип, typeID — второе содержит информацию о категориях. Используемые поля: typeID, type, parentTypeID, treeLvl. parentTypeID относится к typeID более высокого уровня в структуре.

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

Я думаю о чем-то в этом роде, но мне нужно, чтобы это сработало:

numberVar level := {KBTYPES.TREELVL};
stringVar currentType;
numberVar type;
while level >= 1 do 
(
currentType := {KBTYPES.TYPE} & currentType;
type := {KBTYPES.ParentKBTypeId};
{KBTYPES.KB_TYPEID} := type;
level -1;
);
currentType

person GRegorious13    schedule 28.05.2012    source источник
comment
можете ли вы уточнить - вы надеетесь избавиться от 5 псевдонимов таблицы?   -  person Lee Tickett    schedule 28.05.2012
comment
да, я хотел бы иметь только 1 псевдоним из таблицы "Решения" в таблицу "Типы", а затем выполнить цикл по типам, чтобы получить полную древовидную структуру.   -  person GRegorious13    schedule 28.05.2012


Ответы (1)


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

Какой у вас источник данных? У вас, вероятно, будет гораздо больше шансов добиться этого в источнике (с помощью sproc/function/view)

Я не проверял это, но это первый результат Google с использованием общего табличного выражения: http://mycodingexperience.blogspot.co.uk/2011/04/common-table-expression-cte-and-tree.html

person Lee Tickett    schedule 28.05.2012
comment
Там не так много данных, около 140 записей в таблице типов. Вся база данных в значительной степени статична, там мало что происходит, думаю, я просто отсортирую все это вручную в электронной таблице. Я новичок в отчетах о кристаллах, и у меня нет большого опыта в кодировании, я пытаюсь выяснить, что можно сделать с этим. Я подумал, что можно будет взять значение из одного поля (parenttypeID), сохранить его в переменную, а затем использовать это значение для поиска другой записи в таблице (присвоив его typeID). Думаете, там такое невозможно? - person GRegorious13; 28.05.2012
comment
Нет, вы не можете искать разные записи таким образом (вы должны связать таблицы в эксперте базы данных. Я ненавижу идею жесткого кодирования функции в Crystal, даже если она довольно статична. Вы не ответили на вопрос о : Источник данных?Для достижения этого в источнике, если мне не изменяет память, можно использовать довольно простое общее табличное выражение (CTE). - person Lee Tickett; 28.05.2012
comment
Источником является MS SQL 2005. Похоже, что CTE может делать то, что я хочу, но как вы используете его в Crystal Report? Будет ли работать код, подобный приведенному ниже: ГДЕ TypeTreeCTE.ParentId ‹› -1 И TypeTreeCTE.TypeId = TypeTreeCTE.ParentId ) ВЫБЕРИТЕ TypeTreeCTE.Type из TypeTreeCTE, ГДЕ TypeTreeCTE.KB_TypeID = Solutions.KB_TypeID - person GRegorious13; 28.05.2012
comment
Я бы, вероятно, создал представление с помощью CTE, а затем указал Crystal Report на представление. Вам нужно будет запустить CTE в SQL Server Management Studio или Query Analyzer или аналогичном, чтобы убедиться, что вывод соответствует вашим потребностям. Если вы боретесь, я бы задал еще один вопрос специально для помощи с CTE. - person Lee Tickett; 28.05.2012
comment
Большое спасибо, я поиграю с этим. - person GRegorious13; 28.05.2012