← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 1775: Fixed bug <507435> on thinking more about performance

 

------------------------------------------------------------
revno: 1775
committer: hieu <hieu.hispvietnam@xxxxxxxxx>
branch nick: trunk
timestamp: Tue 2010-04-13 13:13:35 +0700
message:
  Fixed bug <507435> on thinking more about performance
added:
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module_vi_VN.properties
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/databrowser/DataBrowserTable.java
  dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/DefaultDataBrowserService.java
  dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/databrowser/DataBrowserTable.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/databrowser/DataBrowserTable.java	2009-11-24 08:19:08 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/databrowser/DataBrowserTable.java	2010-04-13 06:13:35 +0000
@@ -100,7 +100,7 @@
      * 
      * Adds one Column to the table structure.
      * 
-     * ResultSet contents: index 1: Id index 2: Name index 3: Count
+     * ResultSet contents: index 1: Id index 2: Name index 3: counts_of_aggregated_values
      * 
      * The ResultSet can also contain index 4: PeriodId AND index 5: ColumnName
      * if it does, this functions will add data to rows divided in new columns
@@ -208,7 +208,7 @@
 
     public void addZeroColumn()
     {
-        this.addColumnName( "Count" );
+        this.addColumnName( "counts_of_aggregated_values" );
         for ( List<Integer> rowItem : this.counts )
         {
             rowItem.add( 0 );

=== modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/DefaultDataBrowserService.java'
--- dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/DefaultDataBrowserService.java	2009-09-15 12:36:41 +0000
+++ dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/DefaultDataBrowserService.java	2010-04-13 06:13:35 +0000
@@ -38,15 +38,17 @@
 import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
+import org.hisp.dhis.system.util.DateUtils;
 
 /**
  * @author joakibj, briane, eivinhb, jetonm
  * @version $Id$
  */
-public class DefaultDataBrowserService 
+public class DefaultDataBrowserService
     implements DataBrowserService
 {
     private static final String STARTDATE = "1900-01-01";
+
     private static final String ENDDATE = "3000-01-01";
 
     // -------------------------------------------------------------------------
@@ -105,8 +107,8 @@
         List<Integer> betweenPeriodIds = getAllPeriodIdsBetweenDatesOnPeriodType( startDate, endDate, periodType );
 
         return dataBrowserStore.getOrgUnitGroupsBetweenPeriods( betweenPeriodIds );
-    }    
-    
+    }
+
     public DataBrowserTable getOrgUnitsInPeriod( Integer orgUnitParent, String startDate, String endDate,
         PeriodType periodType )
     {
@@ -122,7 +124,9 @@
 
         Integer numResults = dataBrowserStore.setCountOrgUnitsBetweenPeriods( table, orgUnitParent, betweenPeriodIds );
         if ( numResults == 0 )
+        {
             table.addZeroColumn();
+        }
 
         return table;
     }
@@ -221,7 +225,7 @@
     private List<Integer> getAllPeriodIdsBetweenDatesOnPeriodType( String startDate, String endDate,
         PeriodType periodType )
     {
-        String formatString = "yyyy-MM-dd";
+        String formatString = DateUtils.DEFAULT_DATE_FORMAT;
         SimpleDateFormat sdf = new SimpleDateFormat( formatString );
         Date date1 = new Date();
         Date date2 = new Date();
@@ -250,7 +254,7 @@
         {
             betweenPeriodIds.add( -1 );
         }
-        
+
         return betweenPeriodIds;
     }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java'
--- dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java	2009-08-24 13:55:25 +0000
+++ dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java	2010-04-13 06:13:35 +0000
@@ -15,6 +15,8 @@
 /**
  * @author joakibj, martinwa, briane, eivinhb
  * @version $Id$
+ * @modifier Dang Duy Hieu
+ * @since 2010-04-06
  */
 public class StatementManagerDataBrowserStore
     implements DataBrowserStore
@@ -22,7 +24,7 @@
     // -------------------------------------------------------------------------
     // Dependencies
     // -------------------------------------------------------------------------
-	
+
     private StatementManager statementManager;
 
     public void setStatementManager( StatementManager statementManager )
@@ -33,7 +35,7 @@
     // -------------------------------------------------------------------------
     // DataBrowserStore implementation
     // -------------------------------------------------------------------------
-    
+
     public DataBrowserTable getDataSetsBetweenPeriods( List<Integer> betweenPeriodIds )
     {
         StatementHolder holder = statementManager.getHolder();
@@ -46,13 +48,13 @@
         try
         {
             StringBuffer sqlsb = new StringBuffer();
-            sqlsb.append( "SELECT d.datasetid AS ID, d.name AS DataSet, count(*) AS Count " );
+            sqlsb.append( "(SELECT d.datasetid AS ID, d.name AS DataSet, COUNT(*) AS counts_of_aggregated_values " );
             sqlsb.append( "FROM datavalue dv " );
             sqlsb.append( "JOIN datasetmembers dsm ON (dv.dataelementid = dsm.dataelementid) " );
             sqlsb.append( "JOIN dataset d ON (d.datasetid = dsm.datasetid) " );
             sqlsb.append( "WHERE dv.periodid IN " + splitListHelper( betweenPeriodIds ) + " " );
             sqlsb.append( "GROUP BY d.datasetid, d.name " );
-            sqlsb.append( "ORDER BY Count DESC" );
+            sqlsb.append( "ORDER BY counts_of_aggregated_values DESC)" );
 
             String sql = sqlsb.toString();
 
@@ -66,7 +68,7 @@
 
             // Create the column names.
             table.addColumnName( "DataSet" );
-            table.addColumnName( "Count" );
+            table.addColumnName( "counts_of_aggregated_values" );
             table.createStructure( resultSet );
             table.addColumnToAllRows( resultSet );
         }
@@ -78,9 +80,9 @@
         {
             holder.close();
         }
- 
+
         return table;
-    }    
+    }
 
     public DataBrowserTable getDataElementGroupsBetweenPeriods( List<Integer> betweenPeriodIds )
     {
@@ -91,13 +93,14 @@
         try
         {
             StringBuffer sqlsb = new StringBuffer();
-            sqlsb.append( "SELECT d.dataelementgroupid AS ID, d.name AS DataElementGroup, count(*) AS Count " );
+            sqlsb
+                .append( "(SELECT d.dataelementgroupid AS ID, d.name AS DataElementGroup, COUNT(*) AS counts_of_aggregated_values " );
             sqlsb.append( "FROM datavalue dv " );
-            sqlsb
-                .append( "JOIN dataelementgroupmembers degm ON (dv.dataelementid = degm.dataelementid) JOIN dataelementgroup d ON (d.dataelementgroupid = degm.dataelementgroupid) " );
+            sqlsb.append( "JOIN dataelementgroupmembers degm ON (dv.dataelementid = degm.dataelementid)" );
+            sqlsb.append( "JOIN dataelementgroup d ON (d.dataelementgroupid = degm.dataelementgroupid) " );
             sqlsb.append( "WHERE dv.periodid IN " + splitListHelper( betweenPeriodIds ) + " " );
             sqlsb.append( "GROUP BY d.dataelementgroupid, d.name " );
-            sqlsb.append( "ORDER BY Count DESC;" );
+            sqlsb.append( "ORDER BY counts_of_aggregated_values DESC)" );
 
             String sql = sqlsb.toString();
 
@@ -110,7 +113,7 @@
 
             table.incrementQueryCount();
             table.addColumnName( "DataElementGroup" );
-            table.addColumnName( "Count" );
+            table.addColumnName( "counts_of_aggregated_values" );
             table.createStructure( resultSet );
             table.addColumnToAllRows( resultSet );
         }
@@ -122,7 +125,7 @@
         {
             holder.close();
         }
-        
+
         return table;
     }
 
@@ -132,18 +135,20 @@
 
         DataBrowserTable table = null;
         String sql = "";
-        
+
         try
         {
             StringBuffer sqlsb = new StringBuffer();
 
-            sqlsb.append( "SELECT oug.orgunitgroupid, oug.name, Count(*) as ant " );
-            sqlsb.append( "FROM orgunitgroup oug  " );
-            sqlsb.append( "Join orgunitgroupmembers ougm ON oug.orgunitgroupid = ougm.orgunitgroupid " );
-            sqlsb.append( "Join organisationunit ou ON  ougm.organisationunitid = ou.organisationunitid " );
-            sqlsb.append( "Join datavalue dv ON ou.organisationunitid = dv.sourceid " );
+            sqlsb
+                .append( "(SELECT oug.orgunitgroupid, oug.name AS OrgUnitGroup, COUNT(*) AS counts_of_aggregated_values " );
+            sqlsb.append( "FROM orgunitgroup oug " );
+            sqlsb.append( "JOIN orgunitgroupmembers ougm ON oug.orgunitgroupid = ougm.orgunitgroupid " );
+            sqlsb.append( "JOIN organisationunit ou ON  ougm.organisationunitid = ou.organisationunitid " );
+            sqlsb.append( "JOIN datavalue dv ON ou.organisationunitid = dv.sourceid " );
             sqlsb.append( "WHERE dv.periodid IN " + splitListHelper( betweenPeriodIds ) + " " );
-            sqlsb.append( "GROUP BY oug.orgunitgroupid, oug.name ORDER BY ant desc " );
+            sqlsb.append( "GROUP BY oug.orgunitgroupid, oug.name " );
+            sqlsb.append( "ORDER BY counts_of_aggregated_values DESC) " );
 
             sql = sqlsb.toString();
 
@@ -156,7 +161,7 @@
 
             table.incrementQueryCount();
             table.addColumnName( "OrgUnitGroup" );
-            table.addColumnName( "Count" );
+            table.addColumnName( "counts_of_aggregated_values" );
             table.createStructure( resultSet );
             table.addColumnToAllRows( resultSet );
         }
@@ -168,7 +173,7 @@
         {
             holder.close();
         }
-     
+
         return table;
     }
 
@@ -180,13 +185,13 @@
         try
         {
             StringBuffer sqlsb = new StringBuffer();
-            sqlsb.append( "SELECT de.dataelementid, de.name AS Name " );
+            sqlsb.append( "(SELECT de.dataelementid, de.name AS DataElement " );
             sqlsb.append( "FROM dataelement de JOIN datavalue dv ON (de.dataelementid = dv.dataelementid) " );
             sqlsb.append( "JOIN datasetmembers dsm ON (de.dataelementid = dsm.dataelementid) " );
-            sqlsb.append( "WHERE dsm.datasetid = " + dataSetId + " AND dv.periodid IN "
-                + splitListHelper( betweenPeriods ) + " " );
+            sqlsb.append( "WHERE dsm.datasetid = '" + dataSetId + "' " );
+            sqlsb.append( "AND dv.periodid IN " + splitListHelper( betweenPeriods ) + " " );
             sqlsb.append( "GROUP BY de.dataelementid, de.name " );
-            sqlsb.append( "ORDER BY de.name " );
+            sqlsb.append( "ORDER BY de.name) " );
 
             String sql = sqlsb.toString();
 
@@ -215,20 +220,20 @@
         StatementHolder holder = statementManager.getHolder();
 
         StringBuffer sqlsb = new StringBuffer();
-        String sql = "";       
-        
+        String sql = "";
+
         try
         {
-            sqlsb.append( "SELECT deg.dataelementgroupid, deg.name AS DataElementGroup " );
+            sqlsb.append( "(SELECT deg.dataelementgroupid, deg.name AS DataElementGroup " );
             sqlsb.append( "FROM dataelementgroup deg " );
-            sqlsb.append( "Join dataelementgroupmembers degm ON deg.dataelementgroupid = degm.dataelementgroupid " );
-            sqlsb.append( "Join datavalue dv ON degm.dataelementid = dv.dataelementid " );
-            sqlsb.append( "Join organisationunit ou ON dv.sourceid = ou.organisationunitid " );
-            sqlsb.append( "Join orgunitgroupmembers ougm ON ou.organisationunitid = ougm.organisationunitid " );
-            sqlsb.append( "WHERE ougm.orgunitgroupid =  '" + orgUnitGroupId + "' AND dv.periodid IN "
-                + splitListHelper( betweenPeriods ) + " " );
+            sqlsb.append( "JOIN dataelementgroupmembers degm ON deg.dataelementgroupid = degm.dataelementgroupid " );
+            sqlsb.append( "JOIN datavalue dv ON degm.dataelementid = dv.dataelementid " );
+            sqlsb.append( "JOIN organisationunit ou ON dv.sourceid = ou.organisationunitid " );
+            sqlsb.append( "JOIN orgunitgroupmembers ougm ON ou.organisationunitid = ougm.organisationunitid " );
+            sqlsb.append( "WHERE ougm.orgunitgroupid = '" + orgUnitGroupId + "' " );
+            sqlsb.append( "AND dv.periodid IN " + splitListHelper( betweenPeriods ) + " " );
             sqlsb.append( "GROUP BY deg.dataelementgroupid, deg.name " );
-            sqlsb.append( "ORDER BY deg.name ASC " );
+            sqlsb.append( "ORDER BY deg.name ASC) " );
 
             sql = sqlsb.toString();
 
@@ -259,13 +264,13 @@
         try
         {
             StringBuffer sqlsb = new StringBuffer();
-            sqlsb.append( "SELECT de.dataelementid, de.name AS Name " );
+            sqlsb.append( "(SELECT de.dataelementid, de.name AS DataElement " );
             sqlsb.append( "FROM dataelement de JOIN datavalue dv ON (de.dataelementid = dv.dataelementid) " );
             sqlsb.append( "JOIN dataelementgroupmembers degm ON (de.dataelementid = degm.dataelementid) " );
-            sqlsb.append( "WHERE degm.dataelementgroupid = " + dataElementGroupId + " AND dv.periodid IN "
-                + splitListHelper( betweenPeriods ) + " " );
+            sqlsb.append( "WHERE degm.dataelementgroupid = '" + dataElementGroupId + "' " );
+            sqlsb.append( "AND dv.periodid IN " + splitListHelper( betweenPeriods ) + " " );
             sqlsb.append( "GROUP BY de.dataelementid, de.name " );
-            sqlsb.append( "ORDER BY de.name " );
+            sqlsb.append( "ORDER BY de.name) " );
 
             String sql = sqlsb.toString();
 
@@ -297,9 +302,13 @@
         try
         {
             StringBuffer sqlsb = new StringBuffer();
-            sqlsb.append( "SELECT o.organisationunitid, o.name AS OrganisationUnit " );
+            sqlsb.append( "(SELECT o.organisationunitid, o.name AS OrganisationUnit " );
             sqlsb.append( "FROM organisationunit o " );
-            sqlsb.append( "WHERE o.parentid = " + orgUnitParent + "" );
+            sqlsb.append( "JOIN datavalue as dv ON (o.organisationunitid = dv.sourceid) " );
+            sqlsb.append( "WHERE o.parentid = '" + orgUnitParent + "' " );
+            sqlsb.append( "AND dv.periodid IN " + splitListHelper( betweenPeriods ) + " " );
+            sqlsb.append( "GROUP BY o.organisationunitid, o.name " );
+            sqlsb.append( "ORDER BY o.name)" );
 
             String sql = sqlsb.toString();
 
@@ -324,21 +333,23 @@
         }
     }
 
-    public void setDataElementStructureForOrgUnitBetweenPeriods( DataBrowserTable table, Integer orgUnitId, List<Integer> betweenPeriods)
+    public void setDataElementStructureForOrgUnitBetweenPeriods( DataBrowserTable table, Integer orgUnitId,
+        List<Integer> betweenPeriods )
     {
         StatementHolder holder = statementManager.getHolder();
-        
+
         try
         {
             StringBuffer sqlsb = new StringBuffer();
-            sqlsb.append( "SELECT de.dataelementid, de.name AS DataElementGroup " );
+            sqlsb.append( "(SELECT de.dataelementid, de.name AS DataElement " );
             sqlsb.append( "FROM dataelement AS de " );
-            sqlsb.append( "Inner Join datavalue AS dv ON (de.dataelementid = dv.dataelementid) " );
-            sqlsb.append( "Inner Join datasetmembers AS dsm ON (de.dataelementid = dsm.dataelementid) " );
-            sqlsb.append( "Inner Join organisationunit ON dv.sourceid = organisationunit.organisationunitid " );
-            sqlsb.append( "WHERE organisationunit.organisationunitid = " + orgUnitId + " " );
+            sqlsb.append( "INNER JOIN datavalue AS dv ON (de.dataelementid = dv.dataelementid) " );
+            sqlsb.append( "INNER JOIN datasetmembers AS dsm ON (de.dataelementid = dsm.dataelementid) " );
+            sqlsb.append( "INNER JOIN organisationunit AS o ON (dv.sourceid = o.organisationunitid) " );
+            sqlsb.append( "WHERE o.organisationunitid = '" + orgUnitId + "' " );
+            sqlsb.append( "AND dv.periodid IN " + splitListHelper( betweenPeriods ) + " " );
             sqlsb.append( "GROUP BY de.dataelementid, de.name " );
-            sqlsb.append( "ORDER BY de.name " );
+            sqlsb.append( "ORDER BY de.name) " );
 
             String sql = sqlsb.toString();
 
@@ -348,7 +359,7 @@
             TimeUtils.stop();
 
             table.incrementQueryCount();
-            table.addColumnName("DataElement");
+            table.addColumnName( "DataElement" );
             table.createStructure( resultSet );
         }
         catch ( SQLException e )
@@ -360,11 +371,12 @@
             holder.close();
         }
     }
-    
-    public Integer setCountDataElementsForDataSetBetweenPeriods( DataBrowserTable table, Integer dataSetId, List<Integer> betweenPeriodIds)
+
+    public Integer setCountDataElementsForDataSetBetweenPeriods( DataBrowserTable table, Integer dataSetId,
+        List<Integer> betweenPeriodIds )
     {
         StatementHolder holder = statementManager.getHolder();
-        
+
         // Here we uses a for loop to create one big sql statement using UNION.
         // This is done because the count and GROUP BY parts of this query can't
         // be done in another way. The alternative to this method is to actually
@@ -375,23 +387,24 @@
         StringBuffer sqlsb = new StringBuffer();
 
         int i = 0;
-        for ( Integer periodid : betweenPeriodIds )
+        for ( Integer periodId : betweenPeriodIds )
         {
             i++;
 
-            sqlsb.append( "(SELECT de.dataelementid, de.name AS DataElement, count(*) AS Count, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
+            sqlsb
+                .append( "(SELECT de.dataelementid, de.name AS DataElement, Count(dv.value) AS counts_of_aggregated_values, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
             sqlsb.append( "FROM dataelement de JOIN datavalue dv ON (de.dataelementid = dv.dataelementid) " );
             sqlsb.append( "JOIN datasetmembers dsm ON (de.dataelementid = dsm.dataelementid) " );
             sqlsb.append( "JOIN period p ON (dv.periodid = p.periodid) " );
-            sqlsb.append( "WHERE dsm.datasetid = " + dataSetId + " AND dv.periodid = " + periodid + " " );
-            sqlsb.append( "GROUP BY de.dataelementid, de.name, p.periodid, p.startDate )" );
+            sqlsb.append( "WHERE dsm.datasetid = '" + dataSetId + "' AND dv.periodid = '" + periodId + "' " );
+            sqlsb.append( "GROUP BY de.dataelementid, de.name, p.periodid, p.startDate)" );
 
             if ( i == betweenPeriodIds.size() )
-            	sqlsb.append( "ORDER BY PeriodId ");
+                sqlsb.append( "ORDER BY PeriodId " );
             else
-            	sqlsb.append( " UNION ");
+                sqlsb.append( " UNION " );
         }
-        
+
         try
         {
             TimeUtils.start();
@@ -401,7 +414,7 @@
 
             table.incrementQueryCount();
 
-            numResults = table.addColumnToAllRows( resultSet );          
+            numResults = table.addColumnToAllRows( resultSet );
         }
         catch ( SQLException e )
         {
@@ -427,16 +440,16 @@
         for ( Integer periodid : betweenPeriodIds )
         {
             i++;
-            
+
             sqlsb
-                .append( "(SELECT de.dataelementid, de.name AS DataElement, count(*) AS Count, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
+                .append( "(SELECT de.dataelementid, de.name AS DataElement, COUNT(dv.value) AS counts_of_aggregated_values, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
             sqlsb.append( "FROM dataelement de JOIN datavalue dv ON (de.dataelementid = dv.dataelementid) " );
             sqlsb.append( "JOIN dataelementgroupmembers degm ON (de.dataelementid = degm.dataelementid) " );
             sqlsb.append( "JOIN period p ON (dv.periodid = p.periodid) " );
-            sqlsb.append( "WHERE degm.dataelementgroupid = " + dataElementGroupId + " AND dv.periodid = " + periodid
-                + " " );
+            sqlsb.append( "WHERE degm.dataelementgroupid = '" + dataElementGroupId + "' " );
+            sqlsb.append( "AND dv.periodid = '" + periodid + "' " );
             sqlsb.append( "GROUP BY de.dataelementid, de.name, p.periodid, p.startDate) " );
-            
+
             if ( i == betweenPeriodIds.size() )
                 sqlsb.append( "ORDER BY PeriodId " );
             else
@@ -465,7 +478,7 @@
 
         return numResults;
     }
-    
+
     public Integer setCountDataElementGroupsForOrgUnitGroupBetweenPeriods( DataBrowserTable table,
         Integer orgUnitGroupId, List<Integer> betweenPeriodIds )
     {
@@ -473,21 +486,21 @@
 
         Integer numResults = 0;
         StringBuffer sqlsb = new StringBuffer();
-        
+
         int i = 0;
         for ( Integer periodid : betweenPeriodIds )
         {
             i++;
 
             sqlsb
-                .append( " (SELECT deg.dataelementgroupid, deg.name, Count(*) AS Count, p.periodid AS PeriodId, p.startdate AS ColumnHeader " );
+                .append( " (SELECT deg.dataelementgroupid, deg.name, COUNT(dv.value) AS counts_of_aggregated_values, p.periodid AS PeriodId, p.startdate AS ColumnHeader " );
             sqlsb.append( "FROM dataelementgroup AS deg " );
             sqlsb
-                .append( "Inner Join dataelementgroupmembers AS degm ON deg.dataelementgroupid = degm.dataelementgroupid " );
-            sqlsb.append( "Inner Join datavalue AS dv ON degm.dataelementid = dv.dataelementid " );
-            sqlsb.append( "Inner Join period AS p ON dv.periodid = p.periodid " );
-            sqlsb.append( "Inner Join organisationunit AS ou ON dv.sourceid = ou.organisationunitid " );
-            sqlsb.append( "Inner Join orgunitgroupmembers AS ougm ON ou.organisationunitid = ougm.organisationunitid " );
+                .append( "INNER JOIN dataelementgroupmembers AS degm ON deg.dataelementgroupid = degm.dataelementgroupid " );
+            sqlsb.append( "INNER JOIN datavalue AS dv ON degm.dataelementid = dv.dataelementid " );
+            sqlsb.append( "INNER JOIN period AS p ON dv.periodid = p.periodid " );
+            sqlsb.append( "INNER JOIN organisationunit AS ou ON dv.sourceid = ou.organisationunitid " );
+            sqlsb.append( "INNER JOIN orgunitgroupmembers AS ougm ON ou.organisationunitid = ougm.organisationunitid " );
             sqlsb
                 .append( "WHERE p.periodid =  '" + periodid + "' AND ougm.orgunitgroupid =  '" + orgUnitGroupId + "' " );
             sqlsb.append( "GROUP BY deg.dataelementgroupid,deg.name,p.periodid,p.startdate) " );
@@ -534,14 +547,14 @@
         for ( Integer periodid : betweenPeriodIds )
         {
             i++;
-        
+
             sqlsb
-                .append( "(SELECT o.organisationunitid, o.name AS OrganisationUnit, count(*) AS Count, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
+                .append( "(SELECT o.organisationunitid, o.name AS OrganisationUnit, COUNT(dv.value) AS counts_of_aggregated_values, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
             sqlsb.append( "FROM organisationunit o JOIN datavalue dv ON (o.organisationunitid = dv.sourceid) " );
             sqlsb.append( "JOIN period p ON (dv.periodid = p.periodid) " );
-            sqlsb.append( "WHERE o.parentid = " + orgUnitParent + " AND dv.periodid = " + periodid + " " );
-            sqlsb.append( "GROUP BY o.organisationunitid, o.name, p.periodid, p.startDate ) " );
-            
+            sqlsb.append( "WHERE o.parentid = '" + orgUnitParent + "' AND dv.periodid = '" + periodid + "' " );
+            sqlsb.append( "GROUP BY o.organisationunitid, o.name, p.periodid, p.startDate) " );
+
             if ( i == betweenPeriodIds.size() )
                 sqlsb.append( "ORDER BY PeriodId " );
             else
@@ -570,7 +583,7 @@
         }
 
         return numResults;
-    }    
+    }
 
     public Integer setCountDataElementsForOrgUnitBetweenPeriods( DataBrowserTable table, Integer orgUnitId,
         List<Integer> betweenPeriodIds )
@@ -581,21 +594,21 @@
         StringBuffer sqlsb = new StringBuffer();
 
         int i = 0;
-        for ( Integer periodid : betweenPeriodIds )
+        for ( Integer periodId : betweenPeriodIds )
         {
             i++;
-            
+
             sqlsb
-                .append( "(SELECT de.dataelementid, de.name AS DataElementGroup, count(*) AS Count, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
+                .append( "(SELECT de.dataelementid, de.name AS DataElementGroup, Count(dv.value) AS counts_of_aggregated_values, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
             sqlsb.append( "FROM dataelement AS de " );
-            sqlsb.append( "Inner Join datavalue AS dv ON (de.dataelementid = dv.dataelementid) " );
-            sqlsb.append( "Inner Join datasetmembers AS dsm ON (de.dataelementid = dsm.dataelementid) " );
-            sqlsb.append( "Inner Join organisationunit ON dv.sourceid = organisationunit.organisationunitid " );
+            sqlsb.append( "INNER JOIN datavalue AS dv ON (de.dataelementid = dv.dataelementid) " );
+            sqlsb.append( "INNER JOIN datasetmembers AS dsm ON (de.dataelementid = dsm.dataelementid) " );
+            sqlsb.append( "INNER JOIN organisationunit As o ON (dv.sourceid = o.organisationunitid) " );
             sqlsb.append( "JOIN period p ON (dv.periodid = p.periodid) " );
-            sqlsb.append( "WHERE organisationunit.organisationunitid = " + orgUnitId + " AND " );
-            sqlsb.append( "dv.periodid = " + periodid + " " );
-            sqlsb.append( "GROUP BY de.dataelementid, de.name, p.periodid, p.startDate ) " );
-            
+            sqlsb.append( "WHERE o.organisationunitid = '" + orgUnitId + "' " );
+            sqlsb.append( "AND dv.periodid = '" + periodId + "' " );
+            sqlsb.append( "GROUP BY de.dataelementid, de.name, p.periodid, p.startDate)" );
+
             if ( i == betweenPeriodIds.size() )
                 sqlsb.append( "ORDER BY PeriodId " );
             else
@@ -623,18 +636,18 @@
         }
 
         return numResults;
-    }         
-    
+    }
+
     // -------------------------------------------------------------------------
     // Supportive methods
     // -------------------------------------------------------------------------
 
     /**
-     * Splits a list of integers by by comma. Use this method if you have a 
-     * list that will be used in f.ins. a WHERE xxx IN (list) clause in SQL.
+     * Splits a list of integers by by comma. Use this method if you have a list
+     * that will be used in f.ins. a WHERE xxx IN (list) clause in SQL.
      * 
-     * @param List<Integer> list of Integers 
-     * @return the list as a string splitted by a comma. 
+     * @param List<Integer> list of Integers
+     * @return the list as a string splitted by a comma.
      */
     private String splitListHelper( List<Integer> list )
     {

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties	2010-04-13 02:28:31 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties	2010-04-13 06:13:35 +0000
@@ -49,9 +49,6 @@
 total_query_cache													= Total Query Cache
 query_cache_statistics												= Query Cache Statistics
 query_name															= Query name
-put_count															= Put count
-hit_count															= Hit count
-miss_count															= Miss count
 exec_count															= Exec count
 exec_avg_time														= Exec avg time
 exec_max_time														= Exec max time
@@ -181,8 +178,6 @@
 done_number_of_values												= done. Number of archived values is now
 min_max_validation 													= Min/Max Validation
 intro_min_max_validation  											= Generate min/max values for any combination of selected organisation unit/dataset.
-start_date															= Start date
-end_date															= End date
 available_dataset													= Available Datasets
 organisation_unit													= Organisation unit
 generate_min_max_value_success										= Generate min max value successfully.
@@ -196,12 +191,12 @@
 set_factor															= Set Factor
 factor																= Factor
 save_factory_success												= Save factory successfully
+counts_of_aggregated_values                                         = Counts of aggregated values
 unselect_all_at_level_min_max 										= Unselect all at level
 select_all_at_level_min_max											= Select all at level
-save_factory_success												= Save factory successfully
 prune_organisation_unit												= Prune Organisation Unit
 prune																= Prune
 select_the_org_unit_to_be_kept										= Select the Organisation Unit to be kept
 prune_organisation_unit_confirmation								= Are you sure to prune Organisation Unit?
 pruning																= Pruning
-pruning_done														= Pruning done!
+pruning_done														= Pruning done!
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module_vi_VN.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module_vi_VN.properties	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module_vi_VN.properties	2010-04-13 06:13:35 +0000
@@ -0,0 +1,202 @@
+apply_lock_on_all                           						= \u00c1p d\u1ee5ng Kh\u00f3a tr\u00ean t\u1ea5t c\u1ea3
+remove_all															= H\u1ee7y b\u1ecf t\u1ea5t c\u1ea3 c\u00e1c Kh\u00f3a
+select_all_at_level													= Kh\u00f3a t\u1ea1i c\u1ea5p
+unselect_all_at_level												= M\u1edf kh\u00f3a t\u1ea1i c\u1ea5p									
+data_locking_form                           						= M\u1eabu kh\u00f3a d\u1eef li\u1ec7u
+data_locking                                                        = Kh\u00f3a d\u1eef li\u1ec7u
+locked_datasets														= C\u00e1c T\u1eadp d\u1eef li\u1ec7u b\u1ecb kh\u00f3a
+unlocked_datasets													= C\u00e1c t\u1eadp d\u1eef li\u1ec7u kh\u00f4ng kh\u00f3a
+organisation_units_lock            									= \u0110\u01a1n v\u1ecb [ M\u00e0u \u0111en = Ch\u01b0a \u0111\u01b0\u1ee3c g\u00e1n ][ M\u00e0u cam = \u0110\u00e3 g\u00e1n,M\u1edf kh\u00f3a ][ M\u00e0u xanh = \u0110\u00e3 g\u00e1n,B\u1ecb kh\u00f3a ]
+save																= L\u01b0u
+cancel                                                              = H\u1ee7y b\u1ecf
+done                    											= Ho\u00e0n th\u00e0nh
+noaction                        									= Ch\u1ec9 ch\u1ecdn \u0111\u01a1n v\u1ecb \u0111\u00e3 g\u00e1n ho\u1eb7c b\u1ecb kh\u00f3a.
+loading																= \u0110ang t\u1ea3i, xin vui l\u00f2ng ch\u1edd...
+data_administration													= Qu\u1ea3n l\u00fd d\u1eef li\u1ec7u
+period_type															= Ki\u1ec3u th\u1eddi gian
+available_periods                                                   = C\u00e1c th\u1eddi \u0111i\u1ec3m hi\u1ec7n c\u00f3
+select_period_type_all												= Ch\u1ecdn ki\u1ec3u th\u1eddi gian / To\u00e0n b\u1ed9
+select_period_all													= Ch\u1ecdn th\u1eddi \u0111i\u1ec3m / To\u00e0n b\u1ed9
+select_options														= Vui l\u00f2ng ch\u1ecdn \u00edt nh\u1ea5t 1 t\u00f9y ch\u1ecdn
+performing_maintenance												= Th\u1ef1c hi\u1ec7n b\u1ea3o tr\u00ec
+maintenance_performed												= B\u1ea3o tr\u00ec th\u1ef1c hi\u1ec7n
+generating_resource_tables											= T\u1ea1o b\u1ea3ng t\u00e0i nguy\u00ean
+resource_tables_generated											= B\u1ea3ng t\u00e0i nguy\u00ean \u0111\u01b0\u1ee3c t\u1ea1o 
+maintenance															= B\u1ea3o tr\u00ec
+resource_table														= B\u1ea3ng t\u00e0i nguy\u00ean
+clear_data_mart_aggregated_datavalues								= X\u00f3a si\u00eau d\u1eef li\u1ec7u (C\u00e1c Datavalue \u0111\u01b0\u1ee3c t\u1ed5ng h\u1ee3p)
+clear_data_mart_aggregated_indicatorvalues							= X\u00f3a si\u00eau d\u1eef li\u1ec7u (C\u00e1c Indicatorvalue \u0111\u01b0\u1ee3c t\u1ed5ng h\u1ee3p)
+clear_dataset_completeness											= X\u00f3a t\u1eadp d\u1eef li\u1ec7u \u0111\u1ea7y \u0111\u1ee7
+clear_hierarchy_history												= X\u00f3a v\u1ebft c\u00e2y ph\u00e2n c\u1ea5p
+clear_zero_values													= X\u00f3a c\u00e1c gi\u00e1 tr\u1ecb 0
+group_set_structure													= Organisation unit groupset structure normalized
+organisation_unit_structure											= C\u1ea5u tr\u00fac c\u00e2y \u0111\u01a1n v\u1ecb
+data_element_category_option_combo_name								= Data element category option combo name
+generate_resource_tables											= T\u1ea1o b\u1ea3ng
+perform_maintenance													= Hi\u1ec7n th\u1ef1c b\u1ea3o tr\u00ec
+prune_periods														= Prune periods
+system_administration												= Qu\u1ea3n tr\u1ecb h\u1ec7 th\u1ed1ng
+cache_statistics													= Th\u1ed1ng k\u00ea b\u1ed9 nh\u1edb Cache
+second_level_cache_statistics										= Th\u1ed1ng k\u00ea b\u1ed9 nh\u1edb Cache c\u1ea5p \u0111\u1ed9 2
+region_name															= T\u00ean khu v\u1ef1c
+put_count															= Put count
+hit_count															= Hit count
+miss_count															= Miss count
+mem_count															= Mem count
+disk_count															= Disk count
+mem_size															= K\u00edch th\u01b0\u1edbc b\u1ed9 nh\u1edb
+total_second_level_cache											= T\u1ed5ng cache level 2
+total_query_cache													= Total Query Cache
+query_cache_statistics												= Th\u1ed1ng k\u00ea truy v\u1ea5n Cache
+query_name															= T\u00ean truy v\u1ea5n
+exec_count															= Exec count
+exec_avg_time														= Th\u1eddi gian th\u1ef1c thi trung b\u00ecnh
+exec_max_time														= Th\u1eddi gian th\u1ef1c thi t\u1ed1i \u0111a
+exec_min_time														= Th\u1eddi gian th\u1ef1c thi t\u1ed1i thi\u1ec3u
+exec_row_count														= Exec row count
+clear_cache															= X\u00f3a b\u1ed9 nh\u1edb Cache
+data_statistics														= Th\u1ed1ng k\u00ea d\u1eef li\u1ec7u
+number																= S\u1ed1
+type																= Ki\u1ec3u
+data_elements														= C\u00e1c ph\u1ea7n t\u1eed d\u1eef li\u1ec7u
+data_element_groups													= C\u00e1c nh\u00f3m ph\u1ea7n t\u1eed d\u1eef li\u1ec7u
+indicator_types														= C\u00e1c lo\u1ea1i ch\u1ec9 s\u1ed1
+indicators															= C\u00e1c ch\u1ec9 s\u1ed1
+indicator_groups													= Nh\u00f3m c\u00e1c ch\u1ec9 s\u1ed1
+data_sets															= C\u00e1c t\u1eadp d\u1eef li\u1ec7u
+data_dictionaries													= C\u00e1c t\u1eeb \u0111i\u1ec3n d\u1eef li\u1ec7u
+organisation_units													= C\u00e1c \u0111\u01a1n v\u1ecb
+validation_rules													= C\u00e1c lu\u1eadt ki\u1ec3m tra
+periods																= C\u00e1c th\u1eddi k\u1ef3
+data_values															= C\u00e1c gi\u00e1 tr\u1ecb d\u1eef li\u1ec7u
+number_of_objects													= S\u1ed1 \u0111\u1ed1i t\u01b0\u1ee3ng
+data_browser														= Data Browser
+from_date															= T\u1eeb ng\u00e0y
+to_date																= \u0111\u1ebfn ng\u00e0y
+browse_by															= T\u00ecm theo
+select_mode															= Ch\u1ecdn ch\u1ebf \u0111\u1ed9
+select_parent_organisation_unit										= Ch\u1ecdn \u0111\u01a1n v\u1ecb cha
+search_results_for													= K\u1ebft qu\u1ea3 t\u00ecm ki\u1ebfm cho
+request_returned_in													= Y\u00eau c\u1ea7u \u0111\u01b0\u1ee3c tr\u1ea3 v\u1ec1 trong
+query_took															= Truy v\u1ea5n m\u1ea5t
+number_of_queries_executed											= S\u1ed1 l\u01b0\u1ee3ng c\u00e1c truy v\u1ea5n th\u1ef1c thi
+no_data_found														= Kh\u00f4ng t\u00ecm th\u1ea5y d\u1eef li\u1ec7u
+browse																= Tr\u00ecnh duy\u1ec7t
+back																= Quay v\u1ec1
+select_period_type													= Ch\u1ecdn ki\u1ec3u d\u1eef li\u1ec7u
+data_integrity														= To\u00e0n v\u1eb9n d\u1eef li\u1ec7u
+data_elements_without_data_set										= C\u00e1c ph\u1ea7n t\u1eed d\u1eef li\u1ec7u kh\u00f4ng thu\u1ed9c t\u1eadp d\u1eef li\u1ec7u
+data_elements_without_groups										= C\u00e1c ph\u1ea7n t\u1eed d\u1eef li\u1ec7u kh\u00f4ng c\u00f3 nh\u00f3m
+data_sets_not_assigned_to_organisation_units						= C\u00e1c t\u1eadp d\u1eef li\u1ec7u ch\u01b0a \u0111\u01b0\u1ee3c g\u00e1n \u0111\u01a1n v\u1ecb
+indicators_with_blank_formulas										= C\u00e1c ch\u1ec9 s\u1ed1 c\u00f3 c\u00f4ng th\u1ee9c ch\u1ee9a kho\u1ea3ng tr\u1eafng
+indicators_with_identical_formulas									= C\u00e1c ch\u1ec9 s\u1ed1 c\u00f9ng c\u00f4ng th\u1ee9c
+indicators_without_groups											= C\u00e1c ch\u1ec9 s\u1ed1 kh\u00f4ng c\u00f3 nh\u00f3m
+organisation_units_with_cyclic_references							= C\u00e1c \u0111\u01a1n v\u1ecb tham chi\u1ebfu tu\u1ea7n ho\u00e0n
+orphaned_organisation_units											= C\u00e1c \u0111\u01a1n v\u1ecb m\u1ed3 c\u00f4i
+organisation_units_without_groups									= C\u00e1c \u0111\u01a1n v\u1ecb ch\u01b0a \u0111\u01b0\u1ee3c nh\u00f3m
+organisation_units_violating_compulsory_group_sets					= C\u00e1c \u0111\u01a1n v\u1ecb vi ph\u1ea1m t\u00ednh b\u1eaft bu\u1ed9c v\u1edbi c\u00e1c t\u1eadp \u0111\u01a1n v\u1ecb
+organisation_units_violation_exclusive_group_sets					= C\u00e1c \u0111\u01a1n v\u1ecb vi ph\u1ea1m t\u00ednh \u0111\u1ed9c quy\u1ec1n v\u1edbi c\u00e1c t\u1eadp \u0111\u01a1n v\u1ecb
+organisation_unit_groups_without_group_sets							= C\u00e1c nh\u00f3m \u0111\u01a1n v\u1ecb kh\u00f4ng c\u00f3 nh\u00f3m t\u1eadp h\u1ee3p
+no_violations														= Kh\u00f4ng vi ph\u1ea1m
+view_violations														= Xem c\u00e1c vi ph\u1ea1m
+data_integrity_checks_performed										= Th\u1ef1c hi\u1ec7n ki\u1ec3m tra t\u00ednh to\u00e0n v\u1eb9n d\u1eef li\u1ec7u
+data_elements_assigned_to_period_types_with_different_period_types	= C\u00e1c ph\u1ea7n t\u1eed d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c g\u00e1n cho t\u1eadp d\u1eef li\u1ec7u c\u00f3 ki\u1ec3u th\u1eddi gian kh\u00e1c nhau
+select_a_period_type												= H\u00e3y ch\u1ecdn 1 ki\u1ec3u th\u1eddi gian
+select_a_period														= H\u00e3y ch\u1ecdn m\u1ed9t th\u1eddi k\u1ef3
+data_element_group_set_structure									= C\u1ea5u tr\u00fac nh\u00f3m t\u1eadp h\u1ee3p c\u1ee7a ph\u1ea7n t\u1eed d\u1eef li\u1ec7u
+indicator_group_set_structure										= C\u1ea5u tr\u00fac nh\u00f3m t\u1eadp h\u1ee3p c\u1ee7a ch\u1ec9 s\u1ed1
+organisation_unit_group_set_structure								= C\u1ea5u tr\u00fac nh\u00f3m t\u1eadp h\u1ee3p c\u1ee7a \u0111\u01a1n v\u1ecb
+period																= Th\u1eddi k\u1ef3
+value																= Gi\u00e1 tr\u1ecb
+org_unit															= \u0110\u01a1n v\u1ecb
+no_values															= Kh\u00f4ng t\u00ecm th\u1ea5y d\u1eef li\u1ec7u
+found																= T\u00ecm th\u1ea5y
+values																= C\u00e1c tr\u1ecb
+data_element														= Ph\u1ea7n t\u1eed d\u1eef li\u1ec7u
+validation_rules_without_groups										= C\u00e1c quy t\u1eafc ki\u1ec3m tra ch\u01b0a c\u00f3 nh\u00f3m
+aggregated_data_values												= C\u00e1c gi\u00e1 tr\u1ecb d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c t\u1ed5ng h\u1ee3p
+aggregated_indicator_values											= C\u00e1c gi\u00e1 tr\u1ecb ch\u1ec9 s\u1ed1 \u0111\u01b0\u1ee3c t\u1ed5ng h\u1ee3p
+intro_data_locking													= D\u1eef li\u1ec7u nh\u1eadp v\u00e0o ho\u1eb7c import cho c\u00e1c t\u1eadp d\u1eef li\u1ec7u b\u1ecb t\u1eeb ch\u1ed1i
+intro_data_browser													= Tr\u00ecnh duy\u1ec7t d\u1eef li\u1ec7u v\u00e0 \u0111\u01b0a ra m\u1ed9t c\u00e1i nh\u00ecn t\u1ed5ng quan cho c\u00e1c t\u1eadp d\u1eef li\u1ec7u, c\u00e1c \u0111\u01a1n v\u1ecb, v\u00e0 c\u00e1c th\u1eddi k\u1ef3 c\u00f3 d\u1eef li\u1ec7u l\u01b0u tr\u1eef.
+intro_data_integrity												= Ch\u1ea1y ki\u1ec3m tra t\u00ednh to\u00e0n v\u1eb9n d\u1eef li\u1ec7u v\u00e0 th\u00f4ng b\u00e1o c\u00e1c d\u1ecb th\u01b0\u1eddng hay c\u00e1c v\u1ea5n \u0111\u1ec1 trong vi\u1ec7c thi\u1ebft l\u1eadp si\u00eau d\u1eef li\u1ec7u.
+intro_data_archive													= L\u01b0u tr\u1eef d\u1eef li\u1ec7u m\u00e0 hi\u1ec7n t\u1ea1i kh\u00f4ng li\u00ean quan \u0111\u1ebfn h\u1ec7 th\u1ed1ng nh\u1eb1m n\u00e2ng cao t\u00ednh th\u1ec3 hi\u1ec7n. D\u1eef li\u1ec7u c\u0169ng c\u00f3 th\u1ec3 kh\u00f4ng \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef.
+intro_maintenance													= Th\u1ef1c hi\u1ec7n nhi\u1ec7m v\u1ee5 b\u1ea3o tr\u00ec nh\u01b0 t\u1ec9a x\u00e9n d\u1eef li\u1ec7u, c\u00e1c th\u1eddi k\u1ef3 v\u00e0 d\u1ecdn d\u1eb9p trong c\u00e1c b\u1ea3ng t\u00e0i nguy\u00ean c\u1ee7a c\u01a1 s\u1edf d\u1eef li\u1ec7u.
+intro_resource_table												= T\u1ea1o c\u00e1c b\u1ea3ng t\u00e0i nguy\u00ean trong c\u01a1 s\u1edf d\u1eef li\u1ec7u cho c\u00e2y ph\u00e2n c\u1ea5p \u0111\u01a1n v\u1ecbhierarchy thi\u1ebft l\u1eadp c\u01a1 c\u1ea5u gi\u1eefa c\u00e1c nh\u00f3m ng\u01b0\u1eddi kh\u00e1c.
+intro_organisation_unit_merge										= S\u00e1t nh\u1eadp(tr\u1ed9n) 2 \u0111\u01a1n v\u1ecb v\u00e0 c\u00e1c d\u1eef li\u1ec7u c\u1ee7a ch\u00fang v\u1edbi nhau. D\u1eef li\u1ec7u \u0111\u01b0\u1ee3c tr\u1ed9n ph\u1ee5 thu\u1ed9c v\u00e0o 2 y\u1ebfu t\u1ed1 c\u01a1 b\u1ea3n, d\u1eef li\u1ec7u ph\u1ea3i t\u1ed3n t\u1ea1i v\u00e0 ng\u00e0y s\u1eeda \u0111\u1ed5i cu\u1ed1i c\u00f9ng.
+intro_data_statistics												= Tr\u00ecnh duy\u1ec7t s\u1ed1 \u0111\u1ed1i t\u01b0\u1ee3ng trong c\u01a1 s\u1edf d\u1eef li\u1ec7u.
+intro_cache_statistics												= Xem t\u00ecnh tr\u1ea1ng b\u1ed9 nh\u1edb cache trong c\u01a1 s\u1edf d\u1eef li\u1ec7u c\u1ee7a h\u1ec7 th\u1ed1ng v\u00e0 x\u00f3a cache.
+expression_is_empty 												= Bi\u1ec3u th\u1ee9c r\u1ed7ng
+dataelement_id_not_numeric 											= M\u00e3 x\u00e1c minh c\u1ee7a ph\u1ea7n t\u1eed d\u1eef li\u1ec7u ph\u1ea3i l\u00e0 m\u1ed9t con s\u1ed1
+category_option_combo_id_not_numeric		    					= M\u00e3 x\u00e1c minh Category option combo ph\u1ea3i l\u00e0 m\u1ed9t con s\u1ed1
+data_element_does_not_exist											= M\u00e3 x\u00e1c minh n\u00e0y kh\u00f4ng tham chi\u1ebfu t\u1edbi ph\u1ea7n t\u1eed d\u1eef li\u1ec7u
+category_option_combo_does_not_exist 								= M\u00e3 x\u00e1c minh n\u00e0y kh\u00f4ng tham chi\u1ebfu t\u1edbi category option combo
+expression_not_well_formed 											= Bi\u1ec3u th\u1ee9c ch\u01b0a \u0111\u00fang chu\u1ea9n
+invalid_indicator_denominators										= M\u1eabu s\u1ed1 c\u1ee7a ch\u1ec9 s\u1ed1 kh\u00f4ng h\u1ee3p l\u1ec7
+invalid_indicator_numerators										= T\u1eed s\u1ed1 c\u1ee7a ch\u1ec9 s\u1ed1 kh\u00f4ng h\u1ee3p l\u1ec7
+invalid_validation_rule_left_side_expressions						= Lu\u1eadt ki\u1ec3m tra c\u1ee7a bi\u1ec3u th\u1ee9c b\u00ean tr\u00e1i kh\u00f4ng h\u1ee3p l\u1ec7
+invalid_validation_rule_right_side_expressions						= Lu\u1eadt ki\u1ec3m tra c\u1ee7a bi\u1ec3u th\u1ee9c b\u00ean ph\u1ea3i kh\u00f4ng h\u1ee3p l\u1ec7
+category_structure													= C\u1ea5u tr\u00fac Category
+zero_storage_management												= L\u01b0u tr\u1eef gi\u00e1 tr\u1ecb 0
+intro_zero_storage_management										= X\u00e1c \u0111\u1ecbnh c\u00e1c ph\u1ea7n t\u1eed d\u1eef li\u1ec7u l\u01b0u hay kh\u00f4ng l\u01b0u gi\u00e1 tr\u1ecb 0
+ignore_zero_data_values												= Kh\u00f4ng l\u01b0u gi\u00e1 tr\u1ecb 0
+store_zero_data_values												= L\u01b0u tr\u1eef c\u00e1c gi\u00e1 tr\u1ecb 0
+all																	= L\u1ef1a ch\u1ecdn/T\u1ea5t c\u1ea3	
+organisation_unit_merge												= S\u00e1t nh\u1eadp \u0111\u01a1n v\u1ecb
+select_the_org_unit_to_eliminate									= Ch\u1ecdn \u0111\u01a1n v\u1ecb c\u1ea7n lo\u1ea1i b\u1ecf
+select_the_org_unit_to_keep                                         = Ch\u1ecdn \u0111\u01a1n v\u1ecb c\u1ea7n gi\u1eef l\u1ea1i
+not_selected														= Ch\u01b0a \u0111\u01b0\u1ee3c ch\u1ecdn
+merge																= Tr\u1ed9n(S\u00e1t nh\u1eadp)
+reset																= Thi\u1ebft l\u1eadp l\u1ea1i
+confirm																= X\u00e1c nh\u1eadn
+merging																= \u0110ang tr\u1ed9n(S\u00e1t nh\u1eadp)
+merging_done														= S\u00e1t nh\u1eadp th\u00e0nh c\u00f4ng
+eliminating															= \u0110ang x\u00f3a b\u1ecf
+elimination_done													= Qu\u00e1 tr\u00ecnh lo\u1ea1i b\u1ecf ho\u00e0n t\u1ea5t
+select_the_data_element_to_eliminate								= L\u1ef1a ch\u1ecdn ph\u1ea7n t\u1eed d\u1eef li\u1ec7u c\u1ea7n lo\u1ea1i b\u1ecf
+select_the_data_element_to_keep										= Ch\u1ecdn ph\u1ea7n t\u1eed d\u1eef li\u1ec7u c\u1ea7n gi\u1eef
+eliminate															= Lo\u1ea1i b\u1ecf
+move_all															= Ch\u1ecdn t\u1ea5t c\u1ea3
+move_selected														= Chuy\u1ec3n l\u1ef1a ch\u1ecdn
+duplicate_data_elimination											= Xo\u00e1 b\u1ecf d\u1eef li\u1ec7u tr\u00f9ng l\u1eb7p
+intro_duplicate_data_elimination									= Lo\u1ea1i b\u1ecf d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c \u0111\u0103ng k\u00fd cho c\u00e1c ph\u1ea7n t\u1eed d\u1eef li\u1ec7u tr\u00f9ng l\u1eb7p
+select_different_org_units											= H\u00e3y ch\u1ecdn 2 \u0111\u01a1n v\u1ecb kh\u00e1c nhau
+select_different_data_elements										= H\u00e3y ch\u1ecdn 2 ph\u1ea7n t\u1eed d\u1eef li\u1ec7u kh\u00e1c nhau
+filter																= B\u1ed9 l\u1ecdc
+data_archive														= L\u01b0u tr\u1eef d\u1eef li\u1ec7u
+there_are															= C\u00f3
+overlapping_values													= C\u00e1c d\u1eef li\u1ec7u ch\u1ed3ng ch\u00e9o trong b\u1ea3n l\u01b0u tr\u1eef.
+there_are_no_overlapping_values										= Kh\u00f4ng c\u00f3 d\u1eef li\u1ec7u ch\u1ed3ng ch\u00e9o trong b\u1ea3n l\u01b0u tr\u1eef
+eliminate_oldest													= Lo\u1ea1i b\u1ecf c\u00e1c b\u1ea3n sao(b\u1ea3n l\u01b0u tr\u1eef) \u0111\u00e3 qu\u00e1 c\u0169
+eliminate_from_archive												= Lo\u1ea1i b\u1ecf c\u00e1c b\u1ea3n sao(b\u1ea3n l\u01b0u tr\u1eef) t\u1eeb ngu\u1ed3n sao l\u01b0u
+eliminate_from_regular												= Lo\u1ea1i b\u1ecf c\u00e1c b\u1ea3n sao(b\u1ea3n l\u01b0u tr\u1eef) t\u1eeb ngu\u1ed3n c\u01a1 b\u1ea3n
+start_date                                                          = Ng\u00e0y b\u1eaft \u0111\u1ea7u
+end_date                                                            = Ng\u00e0y k\u1ebft th\u00fac 
+archive																= L\u01b0u tr\u1eef
+unarchive															= Kh\u00f4ng l\u01b0u tr\u1eef
+archiving															= \u0110ang l\u01b0u
+unarchiving															= Ch\u01b0a \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef
+done_number_of_values												= Ho\u00e0n t\u1ea5t. S\u1ed1 gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef hi\u1ec7n t\u1ea1i l\u00e0
+min_max_validation 													= Ki\u1ec3m tra Min/Max
+intro_min_max_validation  											= T\u1ea1o c\u00e1c tr\u1ecb Min/Max cho b\u1ea5t k\u1ef3 m\u1ed1i k\u1ebft h\u1ee3p gi\u1eefa c\u1eb7p \u0111\u01a1n v\u1ecb v\u00e0 t\u1eadp d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c ch\u1ecdn
+available_dataset													= C\u00e1c t\u1eadp d\u1eef li\u1ec7u hi\u1ec7n c\u00f3
+organisation_unit													= \u0110\u01a1n v\u1ecb
+generate_min_max_value_success										= T\u1ea1o ra gi\u00e1 tr\u1ecb Min/Max th\u00e0nh c\u00f4ng.
+not_choose_dataset													= Xin vui l\u00f2ng ch\u1ec9 \u0111\u1ecbnh m\u1ed9t t\u1eadp d\u1eef li\u1ec7u.
+not_choose_organisation												= Xin vui l\u00f2ng ch\u1ec9 \u0111\u1ecbnh m\u1ed9t \u0111\u01a1n v\u1ecb
+unselect_all														= B\u1ecf ch\u1ecdn t\u1ea5t c\u1ea3
+select_all_in_group													= Ch\u1ecdn t\u1ea5t c\u1ea3 trong nh\u00f3m
+unselect_all_in_group												= B\u1ecf ch\u1ecdn t\u1ea5t c\u1ea3 trong nh\u00f3m
+generate_min_max_values												= T\u1ea1o ra gi\u00e1 tr\u1ecb Min/Max
+generate_values_success											    = T\u1ea1o gi\u00e1 tr\u1ecb th\u00e0nh c\u00f4ng
+set_factor															= T\u1eadp h\u1ec7 s\u1ed1 nh\u00e2n
+factor																= H\u1ec7 s\u1ed1 nh\u00e2n
+save_factory_success												= L\u01b0u factory th\u00e0nh c\u00f4ng
+counts_of_aggregated_values                                         = \u0110\u1ebfm c\u00e1c gi\u00e1 tr\u1ecb t\u1ed5ng h\u1ee3p
+unselect_all_at_level_min_max                                       = B\u1ecf ch\u1ecdn t\u1ea5t c\u1ea3 t\u1ea1i c\u1ea5p
+select_all_at_level_min_max                                         = Ch\u1ecdn t\u1ea5t c\u1ea3 theo c\u1ea5p
+prune_organisation_unit                                             = T\u1ec9a x\u00e9n \u0111\u01a1n v\u1ecb
+prune                                                               = T\u1ec9a x\u00e9n
+select_the_org_unit_to_be_kept                                      = Ch\u1ecdn c\u00e1c \u0111\u01a1n v\u1ecb c\u1ea7n gi\u1eef
+prune_organisation_unit_confirmation                                = B\u1ea1n c\u00f3 ch\u1eafc mu\u1ed1n c\u1eaft b\u1ecf \u0111\u01a1n v\u1ecb n\u00e0y 
+pruning                                                             = \u0110ang c\u1eaft x\u00e9n
+pruning_done                                                        = C\u1eaft x\u00e9n ho\u00e0n t\u1ea5t!
\ No newline at end of file