2009-11-23 5 views
0

Je suis en train d'écrire un rapport Excel en utilisant une action, un contrôleur, une structure de servlets. Le rapport est très encombré et a déjà environ 10 requêtes distinctes. Je dois ajouter environ 10 autres requêtes en raison d'un changement dans le rapport. Y at-il un moyen de le faire sans avoir à continuer à imbriquer les ensembles de résultats? Voici le code existant.Java Struts Report

public TotalSalesKPIContainer totalSalesKPIQuery(String franchiseId, java.util.Date startDate, java.util.Date stopDate) { 
    String getFranIds = null; 
    ArrayList storeResultList = new ArrayList(); 
    ArrayList salesPersonResultList = new ArrayList(); 
    TotalSalesKPIContainer result = null; 
    Connection conn = null; 
    PreparedStatement pstmt1, pstmtLY, pstmtCountLY, pstmtTCount, pstmtTCountLY, pstmtCount = null; 
    PreparedStatement pstmt, ps = null; 
    ResultSet rs1, rsLY, rsCountLY, rsTCount, rsTCountLY, rsCount = null; 
    ResultSet rs = null, rsSP = null, rsBySP, rsTCount2, rsTCountLY2 = null, rsBySPLY, rsCountLY2, rsCount2; 
    java.util.Date prevStartDate; 
    java.util.Date prevStopDate; 
    try { 

     conn = getConnection(); 
     if (franchiseId.equals("0")) { 
      getFranIds = "Select id, name from vymac.organization"; 
      pstmt = conn.prepareStatement(getFranIds); 
     } else { 
      getFranIds = "Select id, name from vymac.organization where id = ? "; 
      pstmt = conn.prepareStatement(getFranIds); 
      pstmt.setString(1, franchiseId); 
     } 
     int franID = Integer.parseInt(franchiseId); 
     rs = pstmt.executeQuery(); 
     while (rs.next()) { 

      result = new TotalSalesKPIContainer(rs.getString(2), franID,startDate, stopDate, storeResultList,salesPersonResultList); 
      /* 
      * This section is for Salesperson total sales 
      */ 
      pstmt1 = conn.prepareStatement(getTotalSalesBySP); 
      pstmt1.setInt(1, rs.getInt(1)); 
      pstmt1.setDate(2, new java.sql.Date(startDate.getTime())); 
      pstmt1.setDate(3, new java.sql.Date(stopDate.getTime())); 
      rsBySP = pstmt1.executeQuery(); 

      while (rsBySP.next()) { 
       ps = conn.prepareStatement(getSalesPersons); 
       ps.setInt(1, rsBySP.getInt(1)); 
       rsSP = ps.executeQuery(); 
       if (rsSP.next()) { 
        ps = conn.prepareStatement(getPrevTotalSalesBySP); 

        // Get previous year date 
        Calendar cal = Calendar.getInstance(); 
        cal.setTime(startDate); 
        cal.add(Calendar.YEAR, -1); 
        prevStartDate = cal.getTime(); 
        cal.setTime(stopDate); 
        cal.add(Calendar.YEAR, -1); 
        prevStopDate = cal.getTime(); 

        ps.setString(1, rsBySP.getString(1)); 
        ps.setDate(2,new java.sql.Date(prevStartDate.getTime())); 
        ps.setDate(3, new java.sql.Date(prevStopDate.getTime())); 
        rsBySPLY = ps.executeQuery(); 

        if (rsBySPLY.next()) { 
         // Count Invoices for Last Year 
         ps = conn.prepareStatement(findCountBySP); 
         ps.setDate(1, new java.sql.Date(prevStartDate.getTime())); 
         ps.setDate(2, new java.sql.Date(prevStopDate.getTime())); 
         ps.setString(3, rsBySP.getString(1)); 

         rsCountLY2 = ps.executeQuery(); 

         if (rsCountLY2.next()) { 
          ps = conn.prepareStatement(findCountBySP); 
          ps.setDate(1, new java.sql.Date(startDate.getTime())); 
          ps.setDate(2, new java.sql.Date(stopDate.getTime())); 
          ps.setString(3, rsBySP.getString(1)); 

          rsCount2 = ps.executeQuery(); 
          if (rsCount2.next()) { 
           ps = conn.prepareStatement(trafficCountBySP); 
           ps.setDate(1, new java.sql.Date(startDate.getTime())); 
           ps.setDate(2, new java.sql.Date(stopDate.getTime())); 
           ps.setString(3, rsBySP.getString(1)); 
           rsTCount2 = ps.executeQuery(); 

           if (rsTCount2.next()) { 
            ps = conn.prepareStatement(trafficCountBySP); 
            ps.setDate(1, new java.sql.Date(prevStartDate.getTime())); 
            ps.setDate(2, new java.sql.Date(prevStopDate.getTime())); 
            ps.setString(3, rsBySP.getString(1)); 

            rsTCountLY2 = ps.executeQuery(); 

            if (rsTCountLY2.next()) { 



             TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson(rsSP.getString(1), rs.getString(2), rs.getInt(1),rsCount2.getInt(1), rsBySP.getDouble(2),rsBySPLY.getDouble(2),rsCountLY2.getInt(1), 
               rsTCount2.getInt(1),rsTCountLY2.getInt(1)); 
             salesPersonResultList.add(tbsp); 
            } else { 
             TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson(
               rsSP.getString(1), rs 
                 .getString(2), rs 
                 .getInt(1), 
               rsCount2.getInt(1), rsBySP 
                 .getDouble(2), 
               rsBySPLY.getDouble(2), 
               rsCountLY2.getInt(1), 
               rsTCount2.getInt(1), 0); 
             salesPersonResultList.add(tbsp); 
            } 
           } 
          } 
         } 
        } else { 
         ps = conn.prepareStatement(findCountBySP); 
         ps.setDate(1, 
           new java.sql.Date(startDate.getTime())); 
         ps 
           .setDate(2, new java.sql.Date(stopDate 
             .getTime())); 
         ps.setString(3, rsBySP.getString(1)); 
         rsCount2 = ps.executeQuery(); 
         if (rsCount2.next()) { 
          ps = conn.prepareStatement(trafficCountBySP); 
          ps.setDate(1, new java.sql.Date(startDate 
            .getTime())); 
          ps.setDate(2, new java.sql.Date(stopDate 
            .getTime())); 
          ps.setString(3, rsBySP.getString(1)); 
          rsTCount2 = ps.executeQuery(); 
          if (rsTCount2.next()) { 

           TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson(
             rsSP.getString(1), rs.getString(2), 
             rs.getInt(1), rsCount2.getInt(1), 
             rsBySP.getDouble(2), 0.00, 0, 
             rsTCount2.getInt(1), 0); 
           salesPersonResultList.add(tbsp); 
          } else { 
           TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson(
             rsSP.getString(1), rs.getString(2), 
             rs.getInt(1), rsCount2.getInt(1), 
             rsBySP.getDouble(2), 0.00, 0, 
             rsTCount2.getInt(1), 0); 
           salesPersonResultList.add(tbsp); 
          } 
         } 
        } 
       } 
      } 

Répondre

2

Il semble que vous faites dans le joint votre code, qui effectue une requête et pour chaque enregistrement retourné, l'exécution d'une requête sur certaines de ces données. Et puis, en fait, imbriquer plus de telles requêtes.

Habituellement, il est possible de faire plus de travail de jointure dans la base de données, mais je ne pense pas que nous puissions aider davantage sans voir les schémas de base de données et comprendre la signification du code.

Je suggère que vous preniez juste un niveau du problème, et considérez s'il peut être exprimé comme une seule requête, ou UNION de quelques questions connexes. Et puis construire à partir de là. En outre, le Java que vous avez pourrait être réorganisé et refactorisé pour le rendre plus facile à comprendre, retirer les sous-requêtes à leurs propres fonctions - mais il est à espérer que vous n'aurez pas besoin de code imbriqué comme celui-ci .