dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #05423
[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