Przeglądaj źródła

field、引用列名时,前缀中不再包含表别名;修复sql拼接错误

sunyj 8 lat temu
rodzic
commit
5850f4385d

+ 5 - 9
src/main/java/com/uas/report/crystal2jasper/CrystalToJasper.java

@@ -491,7 +491,7 @@ public class CrystalToJasper {
 			for (Element columnElement : columnElements) {
 				String columnName = columnElement.attribute("name").getText();
 				// 实际使用过的列才拼接到sql中
-				if (usedFields.contains((alias + "." + columnName).toUpperCase())) {
+				if (usedFields.contains(columnName.toUpperCase())) {
 					columns.add(columnName);
 				}
 			}
@@ -662,15 +662,11 @@ public class CrystalToJasper {
 		for (Join join : joins) {
 			String fromTableAlias = join.getFromTableAlias();
 			String fromTableName = join.getFromTableName();
-			try {
-				if (!tableNameBuilder.toString().contains(fromTableName)) {
-					tableNameBuilder.append(fromTableName);
+			if (!tableNameBuilder.toString().contains(fromTableName)) {
+				tableNameBuilder.append(fromTableName);
+				if (!fromTableAlias.equals(fromTableName)) {
+					tableNameBuilder.append(" ").append(fromTableAlias);
 				}
-			} catch (Throwable e) {
-				e.printStackTrace();
-			}
-			if (!fromTableAlias.equals(fromTableName)) {
-				tableNameBuilder.append(" ").append(fromTableAlias);
 			}
 			tableNameBuilder.append(" ").append(join.getExpression());
 		}

+ 2 - 2
src/main/java/com/uas/report/crystal2jasper/Join.java

@@ -83,8 +83,8 @@ public class Join {
 			if (i++ != 0) {
 				builder.append(" and ");
 			}
-			builder.append(fromTableName).append(".").append(link.getFromColumnName()).append(" ")
-					.append(link.getJoinType().getExpression()).append(" ").append(toTableName).append(".")
+			builder.append(fromTableAlias).append(".").append(link.getFromColumnName()).append(" ")
+					.append(link.getJoinType().getExpression()).append(" ").append(toTableAlias).append(".")
 					.append(link.getToColumnName());
 		}
 		return builder.toString();

+ 22 - 4
src/main/resources/crystal2jasper.xsl

@@ -80,8 +80,9 @@
 			<xsl:for-each select="Datasource/Tablesource/Column">
 				<xsl:variable name="tableNameAlias" select="../@alias" />
 				<field>
-					<xsl:attribute name="name"><xsl:value-of
-						select="concat($tableNameAlias,'.',@name)" /></xsl:attribute>
+					<xsl:attribute name="name">
+						<xsl:value-of select="@name" />
+					</xsl:attribute>
 					<xsl:attribute name="class">
 						<xsl:call-template name="typeToClass">
 							<xsl:with-param name="type">
@@ -454,7 +455,9 @@
 						<textFieldExpression>
 							<xsl:choose>
 								<xsl:when test="$type='DatabaseField'">
-									<xsl:value-of select="concat('$F{',$value,'}')" />
+									<xsl:call-template name="removeTableName">
+										<xsl:with-param name="field" select="$value" />
+									</xsl:call-template>
 								</xsl:when>
 								<xsl:when test="$type='FormulaField'">
 									<xsl:value-of select="concat('$V{',substring($value,2),'}')" />
@@ -511,7 +514,9 @@
 										<xsl:value-of select="$value" />
 									</xsl:attribute>
 									<subreportParameterExpression>
-										<xsl:value-of select="concat('$F{',$value,'}')" />
+										<xsl:call-template name="removeTableName">
+											<xsl:with-param name="field" select="$value" />
+										</xsl:call-template>
 									</subreportParameterExpression>
 								</xsl:when>
 								<xsl:otherwise>
@@ -576,4 +581,17 @@
 			<xsl:when test="$type='15'">java.sql.Timestamp</xsl:when>
 		</xsl:choose>
 	</xsl:template>
+	
+	<!-- remove table's name in field -->
+	<xsl:template name="removeTableName">
+		<xsl:param name="field" />
+		<xsl:choose>
+			<xsl:when test="substring-after($field,'.')">
+				<xsl:value-of select="concat('$F{',substring-after($field,'.'),'}')" />
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:value-of select="concat('$F{',$field,'}')" />
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
 </xsl:stylesheet>