Нужен Left Join, а получаю Inner Join (связь)

Обсуждение Stimulsoft Reports.NET
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Нужен Left Join, а получаю Inner Join (связь)

Сообщение compositum »

Изображение
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Нужен Left Join, а получаю Inner Join (связь)

Сообщение Edward »

Для датабэндов-родителей, установите, пожалуйста, свойство PrintIfDetailEmpty(Печатать, если нет детальных) в true.

Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Нужен Left Join, а получаю Inner Join (связь)

Сообщение compositum »

Edward писал(а):Для датабэндов-родителей, установите, пожалуйста, свойство PrintIfDetailEmpty(Печатать, если нет детальных) в true.

Спасибо.
Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Нужен Left Join, а получаю Inner Join (связь)

Сообщение compositum »

в дизайнере установлено свойство:

Изображение

Но тем не менее разделы, в которых нет записей все равно печатаются. Почему?

Изображение




Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Нужен Left Join, а получаю Inner Join (связь)

Сообщение Edward »

В случае Вашего отчета имеем структутру Master-Detail - SubDetail1, SubDetail2.

Принять решение о необходимости печати Master бэнда возможно лишь проанализировав наличие подчиненных записей в SubDetail1, SubDetail2. Полное отсутсвие записей в SubDetail1 и SubDetail2 означает отсутствие необходимости печатать Master.

Вот код для BeforePrintEvent для датабэнда ДанныеtblPartsSmet, который и выступает Master ом.

Код: Выделить всё

bool subDetailPresent = false;
foreach (DataRow masterRow in tblPartsSmet.DataTable.Select("PartID=" + tblPartsSmet.PartID.ToString()))
{
    foreach (DataRow curDetailRow in masterRow.GetChildRows(masterRow.Table.ChildRelations[0]))
    {
        if (curDetailRow != null)
        {
            foreach (DataRow curSubDetailRow1 in curDetailRow.GetChildRows(curDetailRow.Table.ChildRelations[0]))
            {
                if (curSubDetailRow1 != null)
                {
                    subDetailPresent = true;
                    break;
                }
            }
            if (!subDetailPresent)
            {
                foreach (DataRow curSubDetailRow2 in curDetailRow.GetChildRows(curDetailRow.Table.ChildRelations[1]))
                {
                    if (curSubDetailRow2 != null)
                    {
                        subDetailPresent = true;
                        break;
                    }
                }
            }
        }
    }
ДанныеtblPartsSmet.Enabled = subDetailPresent;
}

P.S. Если для отображения Master достаточно наличия одной из деталей и после этого нет нужды проверять присутствие записей в SubDetail1 и SubDetail2, то код выглядит следующим образом:

Код: Выделить всё

bool subDetailPresent = false;
foreach (DataRow masterRow in tblPartsSmet.DataTable.Select("PartID=" + tblPartsSmet.PartID.ToString()))
{
    foreach (DataRow curDetailRow in masterRow.GetChildRows(masterRow.Table.ChildRelations[0]))
    {
        if (curDetailRow != null)
        {
              subDetailPresent = true;
              break;
        }
    }
ДанныеtblPartsSmet.Enabled = subDetailPresent;
}

Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Нужен Left Join, а получаю Inner Join (связь)

Сообщение compositum »

Возникли трудности с формулой...
Мне нужно получить усредненную единичную расценку материалов по работе, в состав которой они входят.
Создал переменную, присваиваю ей значение так:

Код: Выделить всё

public void ДанныеtblWorksSm_BeforePrint(object sender, System.EventArgs e)
        {
            {WorkID = tblWorksSm.WorkSmID;};
        }
Формула выглядит так:

Код: Выделить всё

{CountIf(Данныеtbl_sm_Mat,tbl_sm_Mat.MatID,WorkID == tbl_sm_Mat.smWorkID)>0 ? 
SumIf(Данныеtbl_sm_Mat,(tbl_sm_Mat.MatCost * tbl_sm_Mat.MatValue),
WorkID == tbl_sm_Mat.smWorkID)/CountIf(Данныеtbl_sm_Mat,tbl_sm_Mat.MatID,
WorkID == tbl_sm_Mat.smWorkID) : 0}
Однако результат получаю не верный.

Данный фрагмент работает правильно:

Код: Выделить всё

SumIf(Данныеtbl_sm_Mat,(tbl_sm_Mat.MatCost * tbl_sm_Mat.MatValue),
WorkID == tbl_sm_Mat.smWorkID)
Данный фрагмент кода дает не верные результаты (причем единое число для всех работ):

Код: Выделить всё

CountIf(Данныеtbl_sm_Mat,tbl_sm_Mat.MatID,WorkID == tbl_sm_Mat.smWorkID)

Изображение

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

Так же не смог пока что реализовать такой момент: Раздел содержит работы, работы содержат материалы и механизмы, но...
в Конце каждого раздела должны отображаться записи начислений на этот раздел, т.е. в датабенд хвоста
группировки нужно закинуть необходимые поля. Если я это делаю - получаю только первую запись начислений. Остальные
не отображаются. Скорее всего это нужно делать как-то иначе. Но пока не смого разобраться как.

Если не сложно, могли бы пояснить как работать с вашими вложенными отчетами? я могу создать еще одну страницу, в ней оформить лист,
но как связать его с первым листом так и не разобрался. ?
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Нужен Left Join, а получаю Inner Join (связь)

Сообщение Edward »

Посмотрите, пожалуйста, Ваш модифицированный отчет:

http://forumru.stimulsoft.com/Upload/st ... dified.zip

По Вашему предыдущему вопросу для скрытия Master бэндов код, о котором я писал выше, был добавлен в BeforePrintEvent GroupHeader-a "Заголовок1". Чтобы заголовок группы скрывался по условию, вместо
ДанныеtblPartsSmet.Enabled = subDetailPresent;
указано
ЗаголовокГруппы1.Enabled = subDetailPresent;

остальной код - без изменений.

По последнему вопросу я изменил во всех формулах вычисление функции CountIf:

CountIf(Данныеtbl_sm_Mat,WorkID == tbl_sm_Mat.smWorkID)

Остальное осталось без изменений.

Спасибо.

Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Нужен Left Join, а получаю Inner Join (связь)

Сообщение compositum »

Edward писал(а):Посмотрите, пожалуйста, Ваш модифицированный отчет:

http://forumru.stimulsoft.com/Upload/st ... dified.zip

По Вашему предыдущему вопросу для скрытия Master бэндов код, о котором я писал выше, был добавлен в BeforePrintEvent GroupHeader-a "Заголовок1". Чтобы заголовок группы скрывался по условию, вместо
ДанныеtblPartsSmet.Enabled = subDetailPresent;
указано
ЗаголовокГруппы1.Enabled = subDetailPresent;

остальной код - без изменений.

По последнему вопросу я изменил во всех формулах вычисление функции CountIf:

CountIf(Данныеtbl_sm_Mat,WorkID == tbl_sm_Mat.smWorkID)

Остальное осталось без изменений.

Спасибо.
ОГРОМНОЕ ВАМ СПАСИБО!!!!! СУПЕР!!!!
Изображение
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Нужен Left Join, а получаю Inner Join (связь)

Сообщение Edward »

И Вам хорошего настроения и удачи! Ваши подробные объяснения проблемы и примеры помогают найти решение достаточно быстро с минимальными потерями времени на воспроизводство проблемы. Спасибо Вам за экономию нашего времени!

Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Нужен Left Join, а получаю Inner Join (связь)

Сообщение compositum »

Продолжаю конструирование своего отчета...
создаю отчет по объекту:

Изображение

но получаю странный результат:

Изображение

разместил данный отчет здесь. Не могу понять, в следствие чего происходит это смещение, а так же почему не верно считает колонка Стоимость Цена за ед., ведь в ней я просто сложил две формулы (указал как 1 и 2).

Так же, после каждой группы работ нужно выводить начисления на эту группу. Решил закинуть их через вложенный отчет, т.к. если просто забросить на бэнд итога группы поля, то получаю лишь первое.
Однако возникла проблема. Записи начислений не напрямую связаны с таблицей разделов, а через таблицу групп начислений.
Т.о. в обеих таблицах имеется ID группы начислений...
Учитывая этот факт, я создал в таблице разделов дополнительную связь, которая минуя таблицу групп начислений связывает записи разделов с записями начислений на этот раздел... Но... мне повезло, что между ними была посредником лишь одна таблица, а если бы их было больше - этот номер не прошел бы...

Изображение

Правильно ли я поступил, или есть другой, более рациональный способ решения этой задачи? Кроме того, задача все же не решена... записи разделов добавились, но... Как=то странно (по одной записи на лист, размещаясь непосредственно на др. записях отчета... Почему так получилось? Так же для данной таблицы не удастся установить свойство ReconnectonEachRow = true, поскольку у нее оно отсутствует...
Ответить