В чем дело? RapidClipse, XdevTable не показывает данных, но данные все еще находятся в контейнере
Я попытался создать кросс-таблицу с помощью встроенного запроса в RapidClipse4.
Данные были собраны и по-прежнему доступны для консоли, но назначение xDevTable не сработало.
Я создал следующий код:
private void button_buttonClick(final Button.ClickEvent event) {
try {
final String selJahr = this.cmbJahr.getSelectedItem().getBean().getJahr();
final StringBuilder sb = new StringBuilder();
sb.append("select FLOOR(RAND() * 999999) as rid, l1_Id as `l1id`, l1_GroupName as `l1GroupName`, l2_Id as `l2id`, l2_GroupName as `l2GroupName`, ");
sb.append("sum( case when (monat = 1) then dbetrag end ) AS `Jan`, ");
sb.append("sum( case when monat = 2 then dbetrag end ) AS `Feb`, ");
sb.append("sum( case when monat = 3 then dbetrag end ) AS `Mrz`, ");
sb.append("sum( case when monat = 4 then dbetrag end ) AS `Apr`, ");
sb.append("sum( case when monat = 5 then dbetrag end ) AS `Mai`, ");
sb.append("sum( case when monat = 6 then dbetrag end ) AS `Jun`, ");
sb.append("sum( case when monat = 7 then dbetrag end ) AS `Jul`, ");
sb.append("sum( case when monat = 8 then dbetrag end ) AS `Aug`, ");
sb.append("sum( case when monat = 9 then dbetrag end ) AS `Sep`, ");
sb.append("sum( case when monat = 10 then dbetrag end ) AS `Okt`, ");
sb.append("sum( case when monat = 11 then dbetrag end ) AS `Nov`, ");
sb.append("sum( case when monat = 12 then dbetrag end ) AS `Dez`, ");
sb.append("sum(dbetrag) as `Sum` ");
sb.append("from V_HibCrosUmsGiroOpaOmaReport ");
sb.append("where jahr='2019' and konto_Id in ('7,8') ");
sb.append("group by l1_Id, l1_GroupName, l2_Id, l2_GroupName; ");
final String sqlq = sb.toString();
final EntityManagerFactory emf = Persistence.createEntityManagerFactory("RC_07");
final EntityManager em = emf.createEntityManager();
System.out.print( "SQL String: " + sqlq + "/n");
final Query q = em.createNativeQuery(sqlq);
// will be later used:
//q.setParameter(1, selJahr);
//q.setParameter(2, "7,8");
// final List<VUmsCrosstbl> VUmsCrosstbl = q.getResultList();
final XdevBeanItemContainer<VUmsCrosstbl> myContainer = new XdevBeanItemContainer<>(VUmsCrosstbl.class);
myContainer.addAll(q.getResultList());
this.tblUmsCross.setContainerDataSource(myContainer);
this.tblUmsCross.setVisibleColumns(VUmsCrosstbl_.rid.getName(),VUmsCrosstbl_.l1Id.getName(),VUmsCrosstbl_.l1GroupName.getName(),VUmsCrosstbl_.l2Id.getName(),VUmsCrosstbl_.l2GroupName.getName(),VUmsCrosstbl_.jan.getName(),VUmsCrosstbl_.feb.getName(),VUmsCrosstbl_.mrz.getName(),VUmsCrosstbl_.apr.getName(),VUmsCrosstbl_.mai.getName(),VUmsCrosstbl_.jun.getName(),VUmsCrosstbl_.jul.getName(),VUmsCrosstbl_.aug.getName(),VUmsCrosstbl_.sep.getName(),VUmsCrosstbl_.okt.getName(),VUmsCrosstbl_.nov.getName(),VUmsCrosstbl_.dez.getName(),VUmsCrosstbl_.sum.getName());
this.tblUmsCross.setId(VUmsCrosstbl_.rid.getName());
this.tblUmsCross.setColumnHeaders(new String[] {"rid", "l1_Id", "l1_GroupName", "l2_Id", "l2_GroupName", "Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez", "Sum"});
this.tblUmsCross.addItems(q.getResultList());
this.tblUmsCross.getBeanContainerDataSource().refresh();
final List<Object[]> VUmsCrosstbl = q.getResultList();
for (final Object[] a : VUmsCrosstbl) {
System.out.println("Ds: " + a[0] + " " + a[1] + " " + a[2] + " " + a[3] + " " + a[4] + " " + a[5] + " " + a[6] + " " + a[7] + " " + a[8] + " " + a[9] + " " + a[10] + " " + a[11] + " " + a[12] + " " + a[13] + " " + a[14] + " " + a[15]);
}
em.close();
} catch (final Exception e) {
e.printStackTrace();
Notification.show("Do isch was falsch bei button_buttonClick ", e.getMessage(),
Notification.Type.ERROR_MESSAGE);
}
}
Процесс проходит без ошибок
строки в конце кода " System.out.println("Ds: ..."предназначены только для проверки наличия данных в контейнере. Эти строки выводят на консоль точно ожидаемый вывод и все ожидаемые данные
в приложении столбцы (Заголовки) по-прежнему создаются и отображаются, но строк с данными нет. Клетки пусты.
Где моя ошибка / что я не так сделал? Любая идея / помощь будет оценена.
Я полагаю, вы также должны знать:
Имя таблицы, которое я использую в запросе, отличается от имени объекта "VUmsCrosstbl"
Почему?
Имя сущности "VUmsCrosstbl", которое я использую, является представлением базы данных, которое включает в себя именно те поля, которые я получаю в результате, установленном запросом.
С помощью этого трюка я мог бы использовать построитель сущностей из rapidclipse, который генерирует сущность и дао автоматически.
Для представления V_HibCrosUmsGiroOpaOmaReport, которое я использую в запросе, названия месяцев Jan-Dez все еще не находятся в сущности или дао, которые я впервые использовал, и выдал другую ошибку.
Спасибо заранее RGDS OpaHeinz
1 ответ
Я нашел решение сам:
1) Я до сих пор не уверен, почему вышеприведенный код не сработал, я могу только предположить, что в процессе назначения что-то не так:
myContainer.addAll(q.getResultList());
чтобы заставить его работать, я изменил DAU и поместил следующий код:
public List<VUmsCrosstbl> getAllCrossDataforYearKonto2 ()
{ //final String pjahr, final String pKontoIDs
final StringBuilder sb = new StringBuilder();
sb.append("select FLOOR(RAND() * 999999) as rid, l1_Id, L1_GroupName, l2_Id, L2_GroupName, ");
sb.append("sum( case when (monat = 1) then dbetrag end ) AS `Jan`, ");
sb.append("sum( case when monat = 2 then dbetrag end ) AS `Feb`, ");
sb.append("sum( case when monat = 3 then dbetrag end ) AS `Mrz`, ");
sb.append("sum( case when monat = 4 then dbetrag end ) AS `Apr`, ");
sb.append("sum( case when monat = 5 then dbetrag end ) AS `Mai`, ");
sb.append("sum( case when monat = 6 then dbetrag end ) AS `Jun`, ");
sb.append("sum( case when monat = 7 then dbetrag end ) AS `Jul`, ");
sb.append("sum( case when monat = 8 then dbetrag end ) AS `Aug`, ");
sb.append("sum( case when monat = 9 then dbetrag end ) AS `Sep`, ");
sb.append("sum( case when monat = 10 then dbetrag end ) AS `Okt`, ");
sb.append("sum( case when monat = 11 then dbetrag end ) AS `Nov`, ");
sb.append("sum( case when monat = 12 then dbetrag end ) AS `Dez`, ");
sb.append("sum(dbetrag) as `Sum` ");
sb.append("from V_HibCrosUmsGiroOpaOmaReport ");
sb.append("where jahr= ? and konto_Id in ( ? ) ");
sb.append("group by l1_Id, L1_GroupName, l2_Id, L2_GroupName; ");
final String sqlq = sb.toString();
final Query nativeQuery = em().createNativeQuery(sqlq, VUmsCrosstbl.class);
nativeQuery.setParameter(1, "2019");
nativeQuery.setParameter(2, "7,8");
final List<VUmsCrosstbl> resultList = nativeQuery.getResultList();
return resultList;
}
Затем я использовал эту функцию в событии нажатия кнопки, чтобы назначить результат в XDevBeanitemContainer и в таблицу:
private void button_buttonClick(final Button.ClickEvent event) {
final XdevBeanItemContainer<VUmsCrosstbl> myContainer = new XdevBeanItemContainer<>(VUmsCrosstbl.class);
myContainer.addAll(new VUmsCrosstblDAO().getAllCrossDataforYearKonto2());
this.tblUmsCross.setContainerDataSource(myContainer);
this.tblUmsCross.setId(VUmsCrosstbl_.rid.getName());
this.tblUmsCross.setVisibleColumns(VUmsCrosstbl_.rid.getName(),VUmsCrosstbl_.l1Id.getName(),VUmsCrosstbl_.l1GroupName.getName(),VUmsCrosstbl_.l2Id.getName(),VUmsCrosstbl_.l2GroupName.getName(),VUmsCrosstbl_.jan.getName(),VUmsCrosstbl_.feb.getName(),VUmsCrosstbl_.mrz.getName(),VUmsCrosstbl_.apr.getName(),VUmsCrosstbl_.mai.getName(),VUmsCrosstbl_.jun.getName(),VUmsCrosstbl_.jul.getName(),VUmsCrosstbl_.aug.getName(),VUmsCrosstbl_.sep.getName(),VUmsCrosstbl_.okt.getName(),VUmsCrosstbl_.nov.getName(),VUmsCrosstbl_.dez.getName(),VUmsCrosstbl_.sum.getName());
this.tblUmsCross.setColumnHeaders(new String[] {"rid", "l1_Id", "l1_GroupName", "l2_Id", "l2_GroupName", "Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez", "Sum"});
}
После этого данные были видны в таблице.
Я счастлив, что это решено.
Rgds
OpaHeinz