Вот самые большие различия между двумя для меня, и я использовал обоих:
1) TFS скорее сильно связывается к "Visual Studio способ" выполнения разработки. Но это вовсе не значит, что TFS сильно связывается к IDE VS, это означает, что TFS изо всех сил пытается сохранить знакомую "регистрацию" / парадигма "выезда" Visual SourceSafe, даже когда это действительно больше не соответствующая модель. Понятие подрывной деятельности "фиксации" / "обновление" намного более реалистично, когда у Вас есть разработчики, которые могли бы провести время, разъединенное от сети. TFS ожидает, что разработчики всегда будут подключены к серверу. Это - большое минус. Я лично нахожу, что TFS менее, чем прозрачен о том, как файлы организованы на сервере и на Вашем локальном диске из-за трудной интеграции Visual Studio. Даже более крупные сторонники TFS признают, что его связанная модель регистрации/выезда не является востребованной опцией для разработчиков, которые работают разъединенные. В климате, где люди начинают смотреть на опции DVCS как мерзавец и Подвижный по SVN, модель "выезда" TFS немного походит на динозавра.
2) Стоимость. Те, кто говорит, что TFS не является дорогим, являются или вероятно очень небольшими магазинами или не в соответствии с условиями лицензирования TFS. Вам нужна Лицензия на клиентский доступ для штопки около всего, что Вы делаете. Действительно ли Вы - менеджер, который просто управляет ошибками? Вам нужен ~ CAL за 250$ (Существует 5 включенных с розничной Лицензией TFS). Бизнес-пользователь, который просто хочет сообщить относительно их проблем? CAL за 250$. Разработчик? 250$ (Если у них нет MSDN, в этом случае, это включено). Сервер? 500$ (Включенный, если у Вас есть MSDN). Конечно, кто-то продающий Вам, копия TFS скажет Вам, что отслеживание объекта работы является бесплатным для дополнительных пользователей, но эти дополнительные пользователи могут только видеть объекты работы, которые они сами создают, а не объекты работы целой команды, который не слишком полезен в ориентированной командой, гибкой среде. Все это складывает, когда у Вас есть организация среднего размера, и становится жестким для выравнивания по ширине, когда столько лучших среди аналогов продуктов как SVN и возрастающая стоимость CruiseControl.net составляет 0$. (Объективности ради по отношению к TFS, тем не менее, я все еще ожидаю действительно хорошая система отслеживания ошибок OSS)
3) структура Проекта. В многочисленных командах с меньшим числом проектов, TFS будет, вероятно, работать хорошо. Если Вы - много маленьких, несвязанных или свободно связанных внутренних приложений направления деятельности, структура TFS может начать становиться властной. С одной стороны, не возможно определить таксономию самих проектов - можно настроить "области" в рамках проекта, но все проблемы и документы прослежены вместе в основном контексте "проекта". Создание новых "проектов" является часто трудоемким, и является излишеством для небольших усилий. Конечно, SVN не имеет ничто подобного, так как он фокусируется только на управлении исходным кодом, но если Вам нужна хорошая гибкость маленькая проекта, SVN и другой инструмент отслеживания ошибки могли бы быть лучшим выбором.
Мое мнение, если это имеет значение:
Для многочисленных команд с большими, хорошо планируемыми проектами, в магазине Microsoft, где разработчики работают почти исключительно в IDE, TFS является победителем. TFS также побеждает, когда необходимо централизованно осуществить политику с проектами.
Для многих малочисленных команд, со многими варьировался, меньшие проекты или магазины, где стоивший проблема или команды, у которых есть разработчики, которые работают разъединенные от управления исходным кодом, идут с SVN.
Добавить атрибут вычисление = "Sum"
в имя переменной = "grandCount"
или передайте grandCount
в подотчет как параметр
<subreportParameter name="grandCount">
<subreportParameterExpression><![CDATA[$P{grandCount}]]></subreportParameterExpression>
</subreportParameter>
в объявленной переменной подотчета countItems с начальным значением параметра grantCount
<variable name="countItems" .... >
<variableExpression><![CDATA[$P{itemCount} + $P{grandCount}]]></variableExpression>
<initialValueExpression><![CDATA[$P{grandCount}]]></initialValueExpression>
</variable>
и return
<returnValue subreportVariable="countItems" toVariable="grandCount" calculation="Sum"/>
Я не совсем понимаю, как написать это в JRXML, поскольку я использую iReport. В iReport я создаю новую переменную с типом класса «Целое число» и типом расчета «Система». Здесь важен тип вычисления.
В выражении переменной вам понадобится что-то вроде $ V {grandCount} = $ V {grandCount} + $ V {itemCount}
ПРИМЕЧАНИЕ. JasperReports визуализирует построчно, поэтому вы не сможет использовать переменную grandCount в полосе перед полосой подотчета.
Надеюсь, я не слишком поздно
Вы можете попытаться увеличить свою переменную (я назвал ее totalSum) только тогда, когда диапазон (группа) равен тому, на котором находится подотчет. Для этого вам понадобится поле в отчете, чтобы указать текущую полосу (группу).
<variable name="totalSum"
class="java.lang.Integer"
resetType="Report"
incrementType="Group"
incrementGroup="ITEM_BUNDLE"
calculation="Nothing">
<variableExpression>
<![CDATA[new Boolean($F{reportPart}.equals("The_band_with_the_subreport")).booleanValue() ? $V{returnValue} : $V{totalSum}]]>
</variableExpression>
<initialValueExpression>
<![CDATA[new Integer(0)]]>
</initialValueExpression>
</variable>
Я не уверен, работает ли это, у меня нет контекста, чтобы проверить это. Но вы также можете попробовать второе решение - с тремя переменными. Например, вы сохраняете значение, возвращаемое из подотчета (скажем, returnValue ) в переменной, и вы используете еще две переменные для хранения суммы - одну до тех пор, пока не будет вызван подотчет (скажем, partialSum ), а второй - для хранения суммы между returnValue и partialSum. Назовем это totalSum. Тогда для totalSum будет что-то вроде этого:
<variable name="totalSum"
class="java.lang.Integer"
resetType="Report"
incrementType="Group"
incrementGroup="ITEM_BUNDLE"
calculation="Nothing">
<variableExpression>
<![CDATA[$V{returnValue} + $V{partialSum}]]>
</variableExpression>
<initialValueExpression>
<![CDATA[new Integer(0)]]>
</initialValueExpression>
</variable>
Для partialSum вы ' у меня будет что-то вроде этого:
<variable name="partialSum"
class="java.lang.Integer"
resetType="Report"
calculation="Sum"
incrementType="None">
<variableExpression>
<![CDATA[new Boolean($F{reportPart}.equals("The_band_with_the_subreport")).booleanValue() ? $V{returnValue} : new Integer(0)]]>
</variableExpression>
<initialValueExpression>
<![CDATA[new Integer(0)]]>
</initialValueExpression>
</variable>
Надеюсь, это немного поможет. Было бы проще выполнить все эти настройки из iRport прямо в отчете, который вы хотите использовать.