الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

كيف اعمل اجمالى لقيم عمود فى اخر الجدول

Featured Replies

بتاريخ:

السلام عليكم و رحمة الله
بحثت كثيرا فى هذا الموضوع و لم اجد حل و ان شاء الله اجد له حل فى هذا المنتدى.

عندى 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
مرفق صورة لاهم خصائص الجدول
أرجو المساعد و جذاكم الله خيرا

post-2550-0-77451900-1329993226_thumb.jpg

تم تعديل بواسطة tarek_fathi

بتاريخ:

 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

بتاريخ:
  • كاتب الموضوع

شكرا على المشاركة الحل فعلا منطقى جدا و اما هجربة و ان شاء الله يشتعل صح

بتاريخ:

الأخ طارق:
أولاً يجب دائماً التحقق من القيمة null وإلا سيتسبب ذلك في NullPointerException.
أيضاً إذا كنت تريد جمع كافة القيم فيجب أن يكون range size هو -1 حتى يجمع كافة القيم سواء المعروضة او الغير معروضة

بتاريخ:
  • كاتب الموضوع

شكرا جزيلا اخى miro_aer

على الحل الرائع




و شكرا بشمهندس مصطفى على التوضيح



جزاكم الله خيرا المشكلة اتحلت و مفيش اى اخطاء الحمد لله

  • بعد 2 أسابيع...
بتاريخ:

اخ / طارق

فى مثال كامل عشان تخلى مجموع القيم يظهر dynamic على حسب المعروض على الصفحة رفعته من قبل حمله من المشاركه دى شوف الطريقه التانية والمثال بتاعها

بتاريخ:

You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code


below post explain how to do it


بتاريخ:

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

بتاريخ:
  • كاتب الموضوع

You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code


below post explain how to do it




فعش الحل دة لانها readonly view object و مفيش اصلا view accessorمين
بتاريخ:


You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code


below post explain how to do it




فعش الحل دة لانها 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

بتاريخ:
  • كاتب الموضوع



You can use groovy aggregare function <ViewLinkAccessor>.sum(Groovyexpression) without writing any code


below post explain how to do it




فعش الحل دة لانها 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 بتاعك.
بتاريخ:
  • كاتب الموضوع

اخ / طارق

فى مثال كامل عشان تخلى مجموع القيم يظهر dynamic على حسب المعروض على الصفحة رفعته من قبل حمله من المشاركه دى شوف الطريقه التانية والمثال بتاعها

بشمهندسة هاله الحل بتاعك ممتاز جدا مشوفتوش حتى فى منتديات اوراكل . انا هغير الاسلوب اللى عملت بيه ال method هخلية نفس الاسلوب اللى فى المثال بتاعك
شكرا جدا جدا
بتاريخ:

You can use groovy aggregare function .sum(Groovyexpression) without writing any code

below post explain how to do it

فعش الحل دة لانها 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 Tarek
You misunderstand Over (partition by cols) as you mentioned that it is can't do with filter
you can handle to to execute your requirement
Kindly , read about it before saying it isn't wotking
بتاريخ:

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

  • بعد 2 سنة...
بتاريخ:

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

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.