details:   https://code.openbravo.com/erp/devel/pi/rev/78d28661d80a
changeset: 16489:78d28661d80a
user:      Guillermo Álvarez de Eulate <guillermo.alvarez <at> openbravo.com>
date:      Thu May 10 17:43:01 2012 +0200
summary:   Fixed issue 20221: If too many linked items exists they will not be 
shown.

In order to avoid problems with oracle (only accepts 1000 items for in 
expession) and to preserve the performance, the tabs which are related with too 
many columns (more than 999) will not show the linked items. A new message has 
been created to be shown.

diffstat:

 src-db/database/sourcedata/AD_MESSAGE.xml           |   11 +
 src/org/openbravo/erpCommon/utility/UsedByLink.java |  191 ++++++++++---------
 2 files changed, 113 insertions(+), 89 deletions(-)

diffs (251 lines):

diff -r d989dee41c4e -r 78d28661d80a src-db/database/sourcedata/AD_MESSAGE.xml
--- a/src-db/database/sourcedata/AD_MESSAGE.xml Thu May 10 16:01:40 2012 +0200
+++ b/src-db/database/sourcedata/AD_MESSAGE.xml Thu May 10 17:43:01 2012 +0200
@@ -15136,6 +15136,17 @@
 <!--1C68A76422C94FEC882C1E576C9F4F28-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
 <!--1C68A76422C94FEC882C1E576C9F4F28--></AD_MESSAGE>
 
+<!--1CF066F6A68F419CA5241635305B9B77--><AD_MESSAGE>
+<!--1CF066F6A68F419CA5241635305B9B77-->  
<AD_MESSAGE_ID><![CDATA[1CF066F6A68F419CA5241635305B9B77]]></AD_MESSAGE_ID>
+<!--1CF066F6A68F419CA5241635305B9B77-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--1CF066F6A68F419CA5241635305B9B77-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--1CF066F6A68F419CA5241635305B9B77-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--1CF066F6A68F419CA5241635305B9B77-->  
<VALUE><![CDATA[TooManyColumnsLinked]]></VALUE>
+<!--1CF066F6A68F419CA5241635305B9B77-->  <MSGTEXT><![CDATA[Linked items cannot 
be shown. There are too many columns linked with this item.]]></MSGTEXT>
+<!--1CF066F6A68F419CA5241635305B9B77-->  <MSGTYPE><![CDATA[I]]></MSGTYPE>
+<!--1CF066F6A68F419CA5241635305B9B77-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--1CF066F6A68F419CA5241635305B9B77--></AD_MESSAGE>
+
 <!--1D9A15F68BC447C68725A544F8ED1719--><AD_MESSAGE>
 <!--1D9A15F68BC447C68725A544F8ED1719-->  
<AD_MESSAGE_ID><![CDATA[1D9A15F68BC447C68725A544F8ED1719]]></AD_MESSAGE_ID>
 <!--1D9A15F68BC447C68725A544F8ED1719-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r d989dee41c4e -r 78d28661d80a 
src/org/openbravo/erpCommon/utility/UsedByLink.java
--- a/src/org/openbravo/erpCommon/utility/UsedByLink.java       Thu May 10 
16:01:40 2012 +0200
+++ b/src/org/openbravo/erpCommon/utility/UsedByLink.java       Thu May 10 
17:43:01 2012 +0200
@@ -308,91 +308,103 @@
       String keyColumn, String keyId, String tableId) throws IOException, 
ServletException {
 
     final String keyColumnId = UsedByLinkData.selectKeyColumnId(this, tableId);
-
+    int numOfRelatedColumns = 0;
     boolean nonAccessible = false;
 
     UsedByLinkData[] data = null;
 
-    // Obtain the list of tables that are linked to the current one using DAL, 
this list will return
+    // Obtain the list of columns that are linked to the current one using 
DAL, this list will
+    // return
     // any reference including user defined ones. It will be joined with the 
old ones because
     // currently it doesn't support views.
-    StringBuffer linkedTablesQuery = new StringBuffer();
+    StringBuffer linkedColumnsQuery = new StringBuffer();
     for (LinkedTable linkedTable : getLinkedTables(tableId)) {
-      if (linkedTablesQuery.length() != 0) {
-        linkedTablesQuery.append(", ");
+      if (linkedColumnsQuery.length() != 0) {
+        linkedColumnsQuery.append(", ");
       }
-      linkedTablesQuery.append(linkedTable.toQueryString());
+      linkedColumnsQuery.append(linkedTable.toQueryString());
     }
-    if (linkedTablesQuery.length() == 0) {
-      linkedTablesQuery.append("'--'");
+    if (linkedColumnsQuery.length() == 0) {
+      linkedColumnsQuery.append("'--'");
+      numOfRelatedColumns = 0;
+    } else {
+      numOfRelatedColumns = linkedColumnsQuery.toString().split(",").length;
     }
 
-    data = UsedByLinkData.select(this, vars.getClient(), vars.getLanguage(), 
vars.getRole(),
-        keyColumnId, keyColumn, tableId, linkedTablesQuery.toString());
+    if (numOfRelatedColumns < 1000) {
+      data = UsedByLinkData.select(this, vars.getClient(), vars.getLanguage(), 
vars.getRole(),
+          keyColumnId, keyColumn, tableId, linkedColumnsQuery.toString());
 
-    if (data != null && data.length > 0) {
-      final Vector<UsedByLinkData> vecTotal = new Vector<UsedByLinkData>();
-      for (int i = 0; i < data.length; i++) {
-        String keyValue = keyId;
-        if (!data[i].referencedColumnId.equals(keyColumnId)) {
-          try {
-            keyValue = UsedByLinkData.selectKeyValue(this,
-                UsedByLinkData.selectColumnName(this, 
data[i].referencedColumnId),
-                data[i].tablename, data[i].columnname, keyId);
-          } catch (Exception e) {
-            // TODO: handle exception
+      if (data != null && data.length > 0) {
+        final Vector<UsedByLinkData> vecTotal = new Vector<UsedByLinkData>();
+        for (int i = 0; i < data.length; i++) {
+          String keyValue = keyId;
+          if (!data[i].referencedColumnId.equals(keyColumnId)) {
+            try {
+              keyValue = UsedByLinkData.selectKeyValue(this,
+                  UsedByLinkData.selectColumnName(this, 
data[i].referencedColumnId),
+                  data[i].tablename, data[i].columnname, keyId);
+            } catch (Exception e) {
+              // TODO: handle exception
+            }
+          }
+          if (log4j.isDebugEnabled())
+            log4j.debug("***Referenced tab: " + data[i].adTabId);
+          final UsedByLinkData[] dataRef = UsedByLinkData.windowRef(this, 
data[i].adTabId);
+          if (dataRef == null || dataRef.length == 0)
+            continue;
+          String strWhereClause = getWhereClause(vars, strWindow, 
dataRef[0].whereclause);
+          if (log4j.isDebugEnabled())
+            log4j.debug("***   Referenced where clause (1): " + 
strWhereClause);
+          strWhereClause += getAditionalWhereClause(vars, strWindow, 
data[i].adTabId,
+              data[i].tablename, keyColumn, data[i].columnname,
+              UsedByLinkData.getTabTableName(this, tableId));
+          if (log4j.isDebugEnabled())
+            log4j.debug("***   Referenced where clause (2): " + 
strWhereClause);
+          if (!nonAccessible) {
+            final String strNonAccessibleWhere = strWhereClause + " AND 
AD_ORG_ID NOT IN ("
+                + vars.getUserOrg() + ")";
+            if (!UsedByLinkData.countLinks(this, data[i].tablename, 
data[i].columnname, keyValue,
+                strNonAccessibleWhere).equals("0")) {
+              nonAccessible = true;
+            }
+          }
+          strWhereClause += " AND AD_ORG_ID IN (" + vars.getUserOrg() + ") AND 
AD_CLIENT_ID IN ("
+              + vars.getUserClient() + ")";
+          int total = Integer.valueOf(
+              UsedByLinkData.countLinks(this, data[i].tablename, 
data[i].columnname, keyValue,
+                  strWhereClause)).intValue();
+
+          if (log4j.isDebugEnabled())
+            log4j.debug("***   Count: " + total);
+
+          data[i].total = Integer.toString(total);
+
+          if (data[i].accessible.equals("N") && total > 0) {
+            nonAccessible = true;
+          } else if (total > 0 && !existsInVector(data[i], vecTotal)) {
+            vecTotal.addElement(data[i]);
           }
         }
-        if (log4j.isDebugEnabled())
-          log4j.debug("***Referenced tab: " + data[i].adTabId);
-        final UsedByLinkData[] dataRef = UsedByLinkData.windowRef(this, 
data[i].adTabId);
-        if (dataRef == null || dataRef.length == 0)
-          continue;
-        String strWhereClause = getWhereClause(vars, strWindow, 
dataRef[0].whereclause);
-        if (log4j.isDebugEnabled())
-          log4j.debug("***   Referenced where clause (1): " + strWhereClause);
-        strWhereClause += getAditionalWhereClause(vars, strWindow, 
data[i].adTabId,
-            data[i].tablename, keyColumn, data[i].columnname,
-            UsedByLinkData.getTabTableName(this, tableId));
-        if (log4j.isDebugEnabled())
-          log4j.debug("***   Referenced where clause (2): " + strWhereClause);
-        if (!nonAccessible) {
-          final String strNonAccessibleWhere = strWhereClause + " AND 
AD_ORG_ID NOT IN ("
-              + vars.getUserOrg() + ")";
-          if (!UsedByLinkData.countLinks(this, data[i].tablename, 
data[i].columnname, keyValue,
-              strNonAccessibleWhere).equals("0")) {
-            nonAccessible = true;
-          }
-        }
-        strWhereClause += " AND AD_ORG_ID IN (" + vars.getUserOrg() + ") AND 
AD_CLIENT_ID IN ("
-            + vars.getUserClient() + ")";
-        int total = Integer.valueOf(
-            UsedByLinkData.countLinks(this, data[i].tablename, 
data[i].columnname, keyValue,
-                strWhereClause)).intValue();
+        data = new UsedByLinkData[vecTotal.size()];
+        vecTotal.copyInto(data);
+      }
 
-        if (log4j.isDebugEnabled())
-          log4j.debug("***   Count: " + total);
-
-        data[i].total = Integer.toString(total);
-
-        if (data[i].accessible.equals("N") && total > 0) {
-          nonAccessible = true;
-        } else if (total > 0 && !existsInVector(data[i], vecTotal)) {
-          vecTotal.addElement(data[i]);
-        }
+      if (nonAccessible) {
+        final OBError myMessage = new OBError();
+        myMessage.setType("Info");
+        myMessage.setMessage(Utility.messageBD(this, "NonAccessibleRecords", 
vars.getLanguage()));
+        myMessage.setTitle(Utility.messageBD(this, "Info", 
vars.getLanguage()));
+        return new SearchResult(data, myMessage);
+      } else {
+        return new SearchResult(data);
       }
-      data = new UsedByLinkData[vecTotal.size()];
-      vecTotal.copyInto(data);
-    }
-
-    if (nonAccessible) {
+    } else {
       final OBError myMessage = new OBError();
       myMessage.setType("Info");
-      myMessage.setMessage(Utility.messageBD(this, "NonAccessibleRecords", 
vars.getLanguage()));
+      myMessage.setMessage(Utility.messageBD(this, "TooManyColumnsLinked", 
vars.getLanguage()));
       myMessage.setTitle(Utility.messageBD(this, "Info", vars.getLanguage()));
       return new SearchResult(data, myMessage);
-    } else {
-      return new SearchResult(data);
     }
   }
 
@@ -501,32 +513,33 @@
     final OBError msg = searchResult.getMessage();
 
     final List<JSONObject> usedByLinkDataJsonObjects = new 
ArrayList<JSONObject>();
+    if (usedByLinkData != null) {
+      for (UsedByLinkData data : usedByLinkData) {
+        final JSONObject usedByLinkDataJsonObj = new JSONObject();
+        usedByLinkDataJsonObj.put("accessible", data.accessible);
+        usedByLinkDataJsonObj.put("adMenuName", data.adMenuName);
+        usedByLinkDataJsonObj.put("adTabId", data.adTabId);
+        usedByLinkDataJsonObj.put("adWindowId", data.adWindowId);
+        usedByLinkDataJsonObj.put("columnName", data.columnname);
+        usedByLinkDataJsonObj.put("elementName", data.elementName);
+        usedByLinkDataJsonObj.put("fullElementName", data.elementName + " - " 
+ data.tabname + " ("
+            + data.total + ")");
+        usedByLinkDataJsonObj.put("hasTree", data.hastree);
+        usedByLinkDataJsonObj.put("id", data.id);
+        usedByLinkDataJsonObj.put("name", data.name);
+        usedByLinkDataJsonObj.put("referencedColumnId", 
data.referencedColumnId);
+        usedByLinkDataJsonObj.put("tableName", data.tablename);
+        usedByLinkDataJsonObj.put("tabName", data.tabname);
+        usedByLinkDataJsonObj.put("total", data.total);
+        usedByLinkDataJsonObj.put("whereClause", data.whereclause);
+        usedByLinkDataJsonObj.put("windowName", data.windowname);
+        usedByLinkDataJsonObj.put("singleRecord", "SR".equals(data.uipattern));
+        usedByLinkDataJsonObj.put("readOnly", "RO".equals(data.uipattern));
+        usedByLinkDataJsonObjects.add(usedByLinkDataJsonObj);
+      }
 
-    for (UsedByLinkData data : usedByLinkData) {
-      final JSONObject usedByLinkDataJsonObj = new JSONObject();
-      usedByLinkDataJsonObj.put("accessible", data.accessible);
-      usedByLinkDataJsonObj.put("adMenuName", data.adMenuName);
-      usedByLinkDataJsonObj.put("adTabId", data.adTabId);
-      usedByLinkDataJsonObj.put("adWindowId", data.adWindowId);
-      usedByLinkDataJsonObj.put("columnName", data.columnname);
-      usedByLinkDataJsonObj.put("elementName", data.elementName);
-      usedByLinkDataJsonObj.put("fullElementName", data.elementName + " - " + 
data.tabname + " ("
-          + data.total + ")");
-      usedByLinkDataJsonObj.put("hasTree", data.hastree);
-      usedByLinkDataJsonObj.put("id", data.id);
-      usedByLinkDataJsonObj.put("name", data.name);
-      usedByLinkDataJsonObj.put("referencedColumnId", data.referencedColumnId);
-      usedByLinkDataJsonObj.put("tableName", data.tablename);
-      usedByLinkDataJsonObj.put("tabName", data.tabname);
-      usedByLinkDataJsonObj.put("total", data.total);
-      usedByLinkDataJsonObj.put("whereClause", data.whereclause);
-      usedByLinkDataJsonObj.put("windowName", data.windowname);
-      usedByLinkDataJsonObj.put("singleRecord", "SR".equals(data.uipattern));
-      usedByLinkDataJsonObj.put("readOnly", "RO".equals(data.uipattern));
-      usedByLinkDataJsonObjects.add(usedByLinkDataJsonObj);
+      jsonObject.put("usedByLinkData", usedByLinkDataJsonObjects);
     }
-
-    jsonObject.put("usedByLinkData", usedByLinkDataJsonObjects);
     if (msg != null) {
       jsonObject.put("msg", msg.getMessage());
     }

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to