بتاريخ: 23 فبراير 201213 سنة comment_221116 السلام عليكم و رحمة اللهبحثت كثيرا فى هذا الموضوع و لم اجد حل و ان شاء الله اجد له حل فى هذا المنتدى.عندى ReadOnly View تسترجع بيانات اجازات الموظف كلها. قمت بعرض ناتج هذا الاستعلام فى af:table و هو يظهر بشكل سليم المطلوب بكل بساطة هو انا اظهر فى outpu text اجمالى عدد ايام الاجازات . حاولت باكتر من طريقة لكنى فشلت كالعادة لانى لسة جديد فى ال ADFو اليكم شرح مفصل لما قمت به. اولا عملت Readonly view based on this query [/size] [size=5]SELECT[/size] [size=5] v_emv.ID emv_id,[/size] [size=5] v_emp.EMP_ID emp_id,[/size] [size=5] v_emp.EMP_NAME_AR ar_name_full,[/size] [size=5] v_emp.EMP_NUM,[/size] [size=5] v_vat.NAME_AR,[/size] [size=5] v_emv.START_DATE,[/size] [size=5] v_emv.END_DATE,[/size] [size=5] v_emv.NUMBER_OF_DAYS,[/size] [size=5] v_set.ACTUAL_END_DATE set_end_date,[/size] [size=5] v_emv.HOLIDAYS,[/size] [size=5] v_emv.VACATION_STATUS,[/size] [size=5] v_set.ACTUAL_NUMBER_OF_DAYS - NVL(v_set.ACTUAL_HOLIDAYS, 0) - NVL(v_set.MISSION_DAYS, 0) actual_number_of_days[/size] [size=5]WHERE[/size] [size=5] v_emv.EMP_ID = v_emp.EMP_ID AND v_set.EMV_ID(+) = v_emv.ID AND v_emv.VAT_ID = v_vat.ID[/size] [size=5]AND v_emv.STATUS = 'A'[/size] [size=5]ORDER BY start_date[/size] [size=5] و الاستعلام متاكد منه و يعمل بشكل صحيحبعد ان قمت باضافة ال Emp Vacations view object الى Application module و اختبارها جيدا قمت بعمل صفحة بسيطة jspx و اضفت فيها PannelCollection و داخلها قمت بسحب ال VO من ال Data control و ادرجتها كجدول Readonly tableو اليكم الكود <af:panelCollection id="pc2"> <f:facet name="menus"/> <f:facet name="statusbar"> <af:toolbar id="t7"> <af:panelLabelAndMessage label="#{viewcontrollerBundle.TOTAL_VACATION_DAYS}" id="plam13" inlineStyle="color:Red; font-weight:bold;"> <af:outputText id="ot38" inlineStyle="font-weight:bold;" value="#{common.totalVacationDays}"> <af:convertNumber groupingUsed="false" pattern="#{bindings.TotalDays.format}"/> </af:outputText> </af:panelLabelAndMessage> </af:toolbar> </f:facet> <af:table value="#{bindings.empVacations1.collectionModel}" var="row" rows="#{bindings.empVacations1.rangeSize}" emptyText="#{bindings.empVacations1.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.empVacations1.rangeSize}" rowBandingInterval="0" filterModel="#{bindings.empVacations1Query.queryDescriptor}" queryListener="#{bindings.empVacations1Query.processQuery}" filterVisible="true" varStatus="vs" selectedRowKeys="#{bindings.empVacations1.collectionModel.selectedRow}" selectionListener="#{bindings.empVacations1.collectionModel.makeCurrent}" rowSelection="single" id="t3" columnStretching="column:c1"> <af:column sortProperty="NameAr" filterable="true" sortable="true" headerText="#{viewcontrollerBundle.VACATION_TYPE}" id="c1"> <af:outputText value="#{row.NameAr}" id="ot2"/> </af:column> <af:column sortProperty="StartDate" filterable="true" sortable="true" headerText="#{viewcontrollerBundle.START_DATE}" id="c7"> <f:facet name="filter"> <af:inputDate value="#{vs.filterCriteria.StartDate}" id="id1"/> </f:facet> <af:outputText value="#{row.StartDate}" id="ot5"> <af:convertDateTime pattern="#{bindings.empVacations1.hints.StartDate.format}"/> </af:outputText> </af:column> <af:column sortProperty="SetEndDate" filterable="true" sortable="true" headerText="#{viewcontrollerBundle.END_DATE}" id="c8"> <f:facet name="filter"> <af:inputDate value="#{vs.filterCriteria.SetEndDate}" id="id3"/> </f:facet> <af:outputText value="#{row.SetEndDate}" id="ot8"> <af:convertDateTime pattern="#{bindings.empVacations1.hints.SetEndDate.format}"/> </af:outputText> </af:column> <af:column sortProperty="Holidays" filterable="true" sortable="true" headerText="#{viewcontrollerBundle.HOLYDAYS_COUNT}" id="c9"> <af:outputText value="#{row.Holidays}" id="ot10"> <af:convertNumber groupingUsed="false" pattern="#{bindings.empVacations1.hints.Holidays.format}"/> </af:outputText> </af:column> <af:column sortProperty="ActualNumberOfDays" filterable="true" sortable="true" headerText="#{viewcontrollerBundle.ACTUAL_DAYS}" id="c6"> <af:outputText value="#{row.ActualNumberOfDays}" id="ot9"> <af:convertNumber groupingUsed="false" pattern="#{bindings.empVacations1.hints.ActualNumberOfDays.format}"/> </af:outputText> </af:column> </af:table> </af:panelCollection> لاحظ value="#{common.totalVacationDays المكتوبة باللون الاحمر الكود بتاعها كالتالي public int getTotalVacationDays() { totalVacationDays = 0; oracle.jbo.domain.Number total; int rowcount = 0; DCBindingContainer bc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry(); DCIteratorBinding iter = bc.findIteratorBinding("empVacations1Iterator"); RowSetIterator rowset = iter.getRowSetIterator(); rowcount = rowset.getRowCount(); for (int i = 0; i < rowcount; i++) Row currentRow = iter.getRowAtRangeIndex(i); total = (oracle.jbo.domain.Number)currentRow.getAttribute("ActualNumberOfDays"); totalVacationDays += total.intValue(); } return totalVacationDays; } الكود يعمل بشكل جيد جدا فى حالة واحدة فقط و هى عندما يكون عدد السجلات المسترجعة من الاستعلام اقل من او يساوى 25 سجل اما فى حالة ذيادة عدد السجلات عن ذلك يظهر خطأ و هو javax.el.ELException: java.lang.NullPointerException at javax.el.BeanELResolver.getValue(BeanELResolver.java:266) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:173) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:200) .....[/b] [b]Caused By: java.lang.NullPointerException at org.dhaman.es.bean.DhamanCommon.getTotalVacationDays(DhamanCommon.java:617) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) Truncated. see log file for complete stacktrace[/b] [b] قمت بعمل debug للكود و مشيت معاه سطر سطر و اتشفت فعلا ان الخطا بيحصل بعد السجل 25لاحظت ان خاصية fetch size = #{bindings.empVacations1.rangeSize} و خاصية Rangesize =25غيرت ال rangesize ل30 حصل نفس المشكلة انه خرج برده بعد 25اية هو الغلط فى الكود بتاعي و هل فى حل تاني غير دة بس بشرط ان يكون الشغل مبنى على Readonly view مرفق صورة لاهم خصائص الجدولأرجو المساعد و جذاكم الله خيرا تم تعديل 23 فبراير 201213 سنة بواسطة tarek_fathi تقديم بلاغ
بتاريخ: 24 فبراير 201213 سنة comment_221144 public int getTotalVacationDays() { int totalVacationDays = 0; oracle.jbo.domain.Number total; int rowcount = 0; DCBindingContainer bc = (DCBindingContainer) BindingContext.getCurrent().getCurrentBindingsEntry(); DCIteratorBinding iter = bc.findIteratorBinding("empVacations1Iterator"); rowcount = iter.getViewObject().getRowCount(); for (int i = 0; i < rowcount; i++) { Row currentRow = iter.getRowAtRangeIndex(i); if(currentRow != null) { total = (oracle.jbo.domain.Number) currentRow.getAttribute("ActualNumberOfDays"); if(total != null) { totalVacationDays += total.intValue(); } } } return totalVacationDays; } or public int getTotalVacationDay() { int totalVacationDays = 0; oracle.jbo.domain.Number total; int rowcount = 0; DCBindingContainer bc = (DCBindingContainer) BindingContext.getCurrent().getCurrentBindingsEntry(); DCIteratorBinding iter = bc.findIteratorBinding("empVacations1Iterator"); iter.setRangeSize(-1); Row[] rows = iter.getAllRowsInRange(); if(rows == null) { return 0; } rowcount = rows.length; for (int i = 0; i < rowcount; i++) { Row currentRow = rows[i]; if(currentRow != null) { total = (oracle.jbo.domain.Number) currentRow.getAttribute("ActualNumberOfDays"); if(total != null) { totalVacationDays += total.intValue(); } } } return totalVacationDays; } لاحظ انك فيما بعد يجب ان تغير الميثود لكى ترجع متغير اكبر من int تقديم بلاغ
بتاريخ: 24 فبراير 201213 سنة كاتب الموضوع comment_221145 شكرا على المشاركة الحل فعلا منطقى جدا و اما هجربة و ان شاء الله يشتعل صح تقديم بلاغ
بتاريخ: 24 فبراير 201213 سنة comment_221160 الأخ طارق:أولاً يجب دائماً التحقق من القيمة null وإلا سيتسبب ذلك في NullPointerException.أيضاً إذا كنت تريد جمع كافة القيم فيجب أن يكون range size هو -1 حتى يجمع كافة القيم سواء المعروضة او الغير معروضة تقديم بلاغ
بتاريخ: 28 فبراير 201213 سنة كاتب الموضوع comment_221272 شكرا جزيلا اخى miro_aer على الحل الرائع و شكرا بشمهندس مصطفى على التوضيح جزاكم الله خيرا المشكلة اتحلت و مفيش اى اخطاء الحمد لله تقديم بلاغ
بتاريخ: 9 مارس 201213 سنة comment_221608 اخ / طارقفى مثال كامل عشان تخلى مجموع القيم يظهر dynamic على حسب المعروض على الصفحة رفعته من قبل حمله من المشاركه دى شوف الطريقه التانية والمثال بتاعها تقديم بلاغ
بتاريخ: 9 مارس 201213 سنة comment_221622 You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code below post explain how to do it http://www.mahmoudoracle.blogspot.com/2011/07/summary-functions-in-adf-business.html تقديم بلاغ
بتاريخ: 9 مارس 201213 سنة comment_221628 Advice Don't write Data Model code in Bean as you should make ur code separte If you want to use programatically solution, then write getTotalVacationDays method in Data Model and call it from bean تقديم بلاغ
بتاريخ: 10 مارس 201213 سنة كاتب الموضوع comment_221653 You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code below post explain how to do it http://www.mahmoudoracle.blogspot.com/2011/07/summary-functions-in-adf-business.html فعش الحل دة لانها readonly view object و مفيش اصلا view accessorمين تقديم بلاغ
بتاريخ: 10 مارس 201213 سنة comment_221664 You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code below post explain how to do it http://www.mahmoudor...f-business.html فعش الحل دة لانها readonly view object و مفيش اصلا view accessorمين You can add transient attributes to readonly view object normally without any problem If you haven't view accessor to get total of vacation from it (As you mentioned), you can use below query to get ur result set from database SELECT employee_id, department_id, SUM (salary) OVER (PARTITION BY 1) total_salaries FROM employees You can use same syntax in ur example تقديم بلاغ
بتاريخ: 11 مارس 201213 سنة كاتب الموضوع comment_221680 You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code below post explain how to do it http://www.mahmoudor...f-business.html فعش الحل دة لانها readonly view object و مفيش اصلا view accessorمين You can add transient attributes to readonly view object normally without any problem If you haven't view accessor to get total of vacation from it (As you mentioned), you can use below query to get ur result set from database SELECT employee_id, department_id, SUM (salary) OVER (PARTITION BY 1) total_salaries FROM employees You can use same syntax in ur example دة اول حل انا اصلا جربته و طلع مش عملى بالمرة لان بكل بساطة الجدول عندى af:table اللى بعرض فيه الداتا فيه filter و اليوزر يقدر يعمل فلتر بالسنة مثلا يقول عاوز اجازاتى اللى فى 2009 مثلا و بالتالي الاجمالى اللى هيتعرض مش هيبقى اجمالى 2009 بس دة هيبقى اجمالى كل حاجة حسب ال query بتاعك. تقديم بلاغ
بتاريخ: 11 مارس 201213 سنة كاتب الموضوع comment_221681 اخ / طارقفى مثال كامل عشان تخلى مجموع القيم يظهر dynamic على حسب المعروض على الصفحة رفعته من قبل حمله من المشاركه دى شوف الطريقه التانية والمثال بتاعها بشمهندسة هاله الحل بتاعك ممتاز جدا مشوفتوش حتى فى منتديات اوراكل . انا هغير الاسلوب اللى عملت بيه ال method هخلية نفس الاسلوب اللى فى المثال بتاعكشكرا جدا جدا تقديم بلاغ
بتاريخ: 11 مارس 201213 سنة comment_221686 You can use groovy aggregare function .sum(Groovyexpression) without writing any code below post explain how to do it http://www.mahmoudor...f-business.html فعش الحل دة لانها readonly view object و مفيش اصلا view accessorمين You can add transient attributes to readonly view object normally without any problem If you haven't view accessor to get total of vacation from it (As you mentioned), you can use below query to get ur result set from database SELECT employee_id, department_id, SUM (salary) OVER (PARTITION BY 1) total_salaries FROM employees You can use same syntax in ur example دة اول حل انا اصلا جربته و طلع مش عملى بالمرة لان بكل بساطة الجدول عندى af:table اللى بعرض فيه الداتا فيه filter و اليوزر يقدر يعمل فلتر بالسنة مثلا يقول عاوز اجازاتى اللى فى 2009 مثلا و بالتالي الاجمالى اللى هيتعرض مش هيبقى اجمالى 2009 بس دة هيبقى اجمالى كل حاجة حسب ال query بتاعك. Dear TarekYou misunderstand Over (partition by cols) as you mentioned that it is can't do with filteryou can handle to to execute your requirementKindly , read about it before saying it isn't wotking تقديم بلاغ
بتاريخ: 11 مارس 201213 سنة comment_221688 I noticed that most of participants in this post resort to use programatically solution to loop through iterator and calculate the summation What about performance If we work with huge database and previous view object expect to return hundreds thousands of records Always take performance in consideration تقديم بلاغ
بتاريخ: 22 يوليو 201411 سنة comment_253091 make an transient attaribute in your view then make its default value expression and type ('object.getRowSet().count('yourtId then drag this attribute as text output text تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.