вторник, 25 ноября 2014 г.

ireport return value from subreport to master

Возвращаем значение переменой из подотчета в главный отчет, в JasperReport используя iReport.

Задача - отобразить значение(в моем случае итоговое), которое получилось в подотчете (subreport) в главном отчете (master report).

В главном отчете создадим переменную (Variables), назовем ее NET_MARGIN_RETURNED.
Откроем подотчет, правой кнопкой щелкаем по нему на форме и выбираем Open subreport.
В нем есть переменная, которую я добавил ранее NET_MARGIN

Так как у меня тип значений везде BigDecimal, то и Variable Class выбран в обеих java.math.BigDecimal. Если нужно передать текст и исходные данные текстовые, то и выбираем для обеих java.lang.String

У переменной в подотчете NET_MARGIN параметры следующие:
У переменной в главном отчете NET_MARGIN_RETURNED куда будем передавать значение, такие:
обращаю внимание на Calculation, сначала я поставил System, так как везде где читал, ставят именно так. Но на самом деле этот параметр для передачи значения не важен (я (п)оставил Nothing), хотя многие ставят именно System, скорее всего в специфических ситуациях.

И так есть у нас отчет с подотчетом, выбираем в списке слева наш подотчет, ну или напрямую щелкаем по нему в "Дизайнере". Смотрим на Subreport properties, видим Return Values.


Щелкаем по троеточию и добавляем нашу переменную.

В списке Subreport variables переменной NET_MARGIN почему-то не оказалось, видимо косяк iReport, поэтому вписываем вручную.
Local distanation variable выбираем, если она не единственная и уже не выбрана, нашу переменную в мастер-отчете.
Если хотим передать только значение без изменений, то выбираем в пункте Calculation type значение Nothing.

С переменными все. Теперь надо отобразить значение нашей переменной в отчете.
Создаем Text Field. В его свойствах указываем нашу переменную в Text Field Expression.
Есть у него такой проперти как Evalution Time. Пока искал как передать переменную, наткнулся на то, что многие видят проблему именно в этом параметре. Кто-то пишет, что надо поставить там не Now, а Auto. Кто-то ставит Band.
Не заморачиваясь на том, что значит то или другое и вообще что за такой Evalution Time, я оставил Now, хотя работает и если поставить Band. Просто хотел обратить внимание, что при другой структуре отчета может возникнуть проблема в этом месте.

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











четверг, 11 сентября 2014 г.

Netbeans, Vaadin 7, maven и апдейт темы(styles.css). Как его отключить.

Решил со сборщика Ant в своем новом проекте перейти на Maven.
Разобрался с репозитарием, были традности, но в итоге все решилось, подробнее об этом в следующий раз.
Гораздо больше меня смутило то, что при запуске проекта, он берет и обновляет мою тему до значений по дефолту, что не есть гуд, так как в моем styles.css есть много моих собственных классов, которые удаляются и в итоге не применяются в итоге к запущенному приложению.
Решение оказалось довольно-таки банальным.
Открываем наш pom.xml, ищем там

                         1 <goal>clean</goal>
               2 <goal>resources</goal>
               3 <!--<goal>update-theme</goal>-->
               4 <!--<goal>update-widgetset</goal>-->
               5 <!--<goal>compile-theme</goal>-->
               6 <goal>compile</goal>

Строки 3, 4 и 5 я закомментировал. Это пришлось сделать в двух местах:
У плагина org.eclipse.m2e и com.vaadin
Теперь редактируем наш css файлик и запускаем проект.

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

Теперь остался открытым еще один вопрос. Как сделать так, чтобы в контекстном меню при щелчке правой кнопкой мыши появился бы пункт Deploy? Будем разбираться :)


пятница, 25 апреля 2014 г.

Количество срабатываний затвора Canon 6d (пробег камеры)

Всем привет! Решил тут проверить сколько же нащелкано у меня уже кадров.
Оказалось что не все так просто, перебрал несколько вариантов, как узнать пробег.
И платный через какой-то сайт, где надо 1.74 бакса кинуть и просто EOSInfo.
В итоге нашел все-таки нужную версию программы EOSInfo и вот выкладываю ее сюда, дабы не потерялась и, возможно, пригодилась кому-нибудь.

Мой Canon 6D программа определила и все показала.














Прошел почти год... 17 марта 2015, пробег немного увеличился.











Так же исправил ссылку на файл, она была не рабочей, потому как я случайно удалил файлы на яндекс-диске, впредь постараюсь не трогать :)
https://yadi.sk/d/2QSF6565fJwDp
а вот, на всякий случай, вторая ссылка откуда я скачивал этот же файл.
http://dropcanvas.com/jkthh/2

Если вдруг не будет здесь, нагуглите по запросу "EOS Camera Info 1.2"

Добавлено 05.09.2016: Отдельно написал пост про то как и чем измерить пробег на более современных камерах Canon, хотя прога поддерживает и другие камеры.

среда, 5 февраля 2014 г.

Vaadin 6.xx, решение проблемы с обновлением данных в таблицах

Здравствуйте!

Только что нашел решение (и успешно внедрил его в свой проект) старой (для меня) проблемы.

Суть заключалась в следующем.
Пользователь переводил таблицу в режим редактирования и менял в ней значения.
При этом, каждое изменение тут же записывалось в БД и сохранялось в ней.
Так же это значение сохранялось и на экране пользователя, в его таблице.
Но!
Как только пользователь переходил (к примеру в таблице 3 строчки) сначала от первой ко второй, от второй к третьей и затем обратно к первой, но значения менял уже в другой ячейке, данные в первой строчке первой редактируемой ячейке визуально оставались измененными, а в реальности, в представлении модели таблицы, значение в выбранной строке были все теми же. В результате, после выхода из режима редактирования, данные в ячейках, не сохранялись.
А точнее они сначала обновлялись, но затем обновлялись вновь на старые значения.

Мне удалось найти тикет, который описывает данный баг http://dev.vaadin.com/ticket/10993
Приведу скрины таблицы от исходных данных, до момента редактирования и его последовательности и получившийся результат.














Как вы видите, данные в первых двух столбцах не изменились, хотя в процессе они менялись, но при выборе первой строки, данные для объекта подтягивались не обновленные, а старые, то есть значения "1". В результате только данные из последнего столбца сохранялись в БД нужным образом.

Решение нашлось на форуме Vaadin, там же я нашел и ссылку на тикет с багом.
Я сделал просто - создал отдельный класс и стал вызывать его при каждом создании таблицы.
Привожу код класса:

import com.vaadin.data.Container;
import com.vaadin.data.Container.ItemSetChangeEvent;
import com.vaadin.ui.Table;
import java.util.Collection;

import java.util.Collections;
/**
 *
 * @author nix
 */
public class UpdateTableSelectionOnItemSetChange implements Container.ItemSetChangeListener {

    private Table table;
    
    
    public  UpdateTableSelectionOnItemSetChange(final Table table) {
        super();
        this.table = table;
    }

    @Override
    public void containerItemSetChange(ItemSetChangeEvent event) {
        final Collection<Object> itemIds = (Collection<Object>) table.getContainerDataSource().getItemIds();
        if (itemIds.isEmpty()) {
            // a previously filled table is now empty ==> remove its value since its selection is outdated this also
            // updates dependent forms via a resulting value change event
            table.setValue(null);
        } else {
            final Object tableVal = table.getValue();
            if (tableVal instanceof Collection && tableVal != null && !((Collection) tableVal).isEmpty()) {
                final Object selectedItemId = ((Collection<Object>) tableVal).iterator().next();
                // FIXME: needs to be adapted for multiselect tables

                for (final Object itemId : itemIds) {
                    if (itemId.equals(selectedItemId) && itemId != selectedItemId) {
                        table.setValue(null); // otherwise the next set value will be discarded since
                        // oldVal.equals(newVal)
                        table.setValue(Collections.singleton(itemId));
                        break;
                    }
                }
            }
        }
    }
}

Теперь в класс где у нас создается табличка просто добавляем создание экземпляра этого класса. Конечно, лучше его указывать сразу в списке переменных и затем вызывать только конструктор.

UpdateTableSelectionOnItemSetChange onItemSetChange =  new UpdateTableSelectionOnItemSetChange(table);

Можно найти более элегантное применение, если у вас оно есть - поделитесь, лишним не будет. Я же пока оставлю так. Главное, что данные теперь всегда "свежие" :)