sql crystal-reports crystal-reports-2008

Conversión de declaración SQL a campo de expresión SQL en Crystal Reports



crystal-reports crystal-reports-2008 (2)

El primer paso debería ser leer sobre cómo funcionan las expresiones SQL en Crystal. Aquí hay un buen enlace para que comiences .

Algunos de sus problemas incluyen:

  1. Usando un campo de parámetro. Las expresiones de SQL no son compatibles con los parámetros de CR y no se pueden usar en ellas.
  2. Las expresiones SQL solo pueden devolver valores escalares por fila de su informe. Eso significa que su uso de GROUP BY no tiene ningún propósito.
  3. El uso de llaves significa que está haciendo referencia a esos campos en la consulta del informe principal en lugar de hacerlo en la subconsulta que intenta crear con esta expresión.

Aquí hay un ejemplo simplificado que encontraría la lectura máxima del medidor de un medidor en particular (para Oracle, ya que eso es lo que sé y no especificó qué DB está usando):

case when {EC_METER_HISTORY_MC.Meter_Number} is null then null else (select max(Meter_Reading) from EC_METER_HISTORY_MC where Meter_Number={EC_METER_HISTORY_MC.Meter_Number} --filter by the meter number from main query and Transaction_Date < Current_Date) --filter by some date. CAN''T use parameter here. end

Tengo una declaración SQL que extrae los datos que necesito, pero no puedo obtener la sintaxis correcta en Crystal Reports.

Esta declaración funciona en SQL:

SELECT max([meter_reading]) FROM [Forefront].[dbo].[EC_METER_HISTORY_MC] WHERE [Meter_Number] = ''1'' AND [Transaction_Date] < ''20130101'' GROUP BY [Company_Code], [Equipment_Code], [Meter_Number]

Esto es en lo que lo cambié en cristal, pero no puedo obtener la sintaxis correcta.

SELECT Maximum({EC_METER_HISTORY_MC.meter_reading}) FROM [EC_METER_HISTORY_MC] WHERE {EC_METER_HISTORY_MC.Meter_Number} = ''1'' AND {EC_METER_HISTORY_MC.Transaction_Date} < {1?Startdate} GROUP BY {EC_METER_HISTORY_MC.Company_Code} ,{EC_METER_HISTORY_MC.Equipment_Code} ,{EC_METER_HISTORY_MC.Meter_Number}


No puede usar campos de parámetros en una Expresión de SQL, por desgracia. Quizás pueda correlacionar Transaction_Date con una tabla en la consulta principal. De lo contrario, sugeriría usar un comando.

Tienes dos opciones para el comando:

  1. Utilice un único objeto Command como fuente de datos para todo el informe, lo que implica (potencialmente) una cantidad considerable de reprocesos.
  2. Agregue un comando al conjunto de tablas existente (en la Base de datos ''Experto''). Vincúlelo a otras tablas como lo desee. Esto realizará una segunda SELECT y unirá los resultados en la memoria (WhileReadingRecords, si no me equivoco). El pequeño golpe de rendimiento puede que valga la pena el beneficio.