PDA

Ver la Versión Completa : Conectar Crystal Report (TCrpe) con un Ttable o TQuery


Jose_Pérez
11-07-2003, 14:36:26
Hola:

El componente TCrpe (para conectar Delphi con Crystal Report) tiene la propiedad Table[x], que a su vez contiene la variable de DataPointer (de tipo Pointer) para conectar a una fuente de datos TTable o TQuery, o similar.

Al intentar hacer la conección me da problemas. Por ejemplo:

Crpe.Tables[0].DataPointer:=@Table1;

¿Alguien podría mostrarme un ejemplo de como se hace esto?.

Saludos y gracias.

andres1569
11-07-2003, 15:48:52
Hola:

Aunque el componente TCrpe que tengo es de una versión anterior y no tiene ese propiedad que comentas (DataPointer), es posible que ahí debas pasar el Handle de la tabla o Query en cuestión, que actúa como un cursor del BDE, prueba esto:

Crpe.Tables[0].DataPointer := Table1.Handle;
ó
Crpe.Tables[0].DataPointer := Table1.DBHandle;

Jose_Pérez
14-07-2003, 10:55:04
Hola Andrés:

La versión del componente es la 7 y estoy utilizando Delphi 5.

Por cierto, tu solución no funciona. Gracias de todos modos.

Un abrazo.

andres1569
14-07-2003, 14:00:23
Hola:

La propiedad DataPointer no la conozco (tengo el componente TCrpe para Delphi 4), parece ser, por lo que comentas, que debe apuntar a un DataSet de tu aplicación para que Crystal Reports tome de ahí los datos. Si es así, es un avance importante en la filosofía de CR, al permitir tomar datos directamente desde Delphi. De todas formas, si la finalidad es esa, me extraña que se llamara DataPointer y no DataSource.

¿Es esto así? Si no es eso y lo que quieres es acceder a las tablas físicas, como venía haciendo Crystal Reports anteriormente (te hablo de la versión 6.0), la forma en que tengo esto implementado, para indicarle la ruta donde están las tablas es así:

procedure TDATAIMP.InicializaInformeCrystal (NomInforme, NomClave: String;
Preview: Boolean);
var
DirDatos : String;
begin
With CReport1 do
begin
ReportName := DirInformes + '\' + NomInforme;
DirDatos := GetPathFromAlias(':DATOS_ESCUELA:');
Connect.Password := NomClave;
DiscardSavedData := TRUE;
SendDiscardSavedData;
If Preview then Output := toWindow
Else Output := toPrinter;
Tables.Retrieve;
Tables[0].Path := DirDatos;
Tables.Path := DirDatos;
Tables.Propagate := TRUE;
With ParamFields do
begin
ShowDialog := FALSE;
Retrieve;
end;
PrintOptions.Copies := 1;
end;
end;

Jose_Pérez
14-07-2003, 15:08:37
De nuevo gracias Andrés.

Lo cierto es que habíamos comprado el Crystal Report hace tiempo y lo tenía un poco aparcado. Estoy empezando a meterme con él y aún tengo algunas dudillas, aunque a base de mirar tutoriales y buscar en internet parece que me va a entrando.

Mi intención no era otra que filtrar los datos, y por eso estaba intentando conectar el componente con el TQuery. Al final he decidido no complicarme la vida y voy a utilizar el lenguaje de fórmulas nativo del Crystal Report. No parece que sea muy complicado y, además, el propio Crystal trae una editor de fórmulas muy sencillo.

Un ejemplo para quien pueda interesas:



With Crpe Do
Begin
Selection.Formula.Clear;
Selection.Formula.Add('{Cliente.Codigo}=2');
Selection.Replace:=True;
Execute;
End;




GetPathFromAlias[list]

Jose_Pérez
14-07-2003, 15:14:16
...¡uy, he colgado el mensaje antes de tiempo!.

Andrés, me faltaba preguntarte de donde has sacado la función GetPathFromAlias. He consultado la ayuda en línea de Delphi, pero no aparece. ¡Cuantas veces he hechado de menos una función como esa!.

Gracias por todo.

andres1569
14-07-2003, 16:31:02
Hola de nuevo:

Esa función, GetPathFromAlias, es un método del componente TCrpe.

Esa información la puedes obtener también mediante esta función que hace uso del objeto Session:
function GetAliasPath (Alias: string) : String;
var
AList : TStringList;
begin
AList := TStringList.Create;
try
try
Session.GetAliasParams (Alias, AList);
result := AList.Values['PATH'];
except
result := '';
raise;
end;
finally
AList.Free;
end;
end;

Jose_Pérez
15-07-2003, 09:37:40
Ok. Gracias.

dmagui
10-11-2005, 16:39:44
Es posible que esto sea una solucion a la peticion inicial, ofrecida por la ayuda de delphi, cortesia de un gran forista (Neftali)

Crpe1.ReportName := 'c:\company.rpt';

CrpeDS1.DataSet := Table1; {the field types must be in the correct order}

Crpe1.Tables[0].DataPointer := CrpeDS1.DataPointer;

Crpe1.Show;

Larra
07-09-2006, 01:35:58
Hola:
he tenido el mismo problema con el crpeDS1, no me trabaja da un error de paso de parametros, la solucion la obtuvo un colega anteriormente aunque en su caso no le servia por usar otro componente que no es ADO.
en fin, solucion a pasar una tabla o query para el reporte, ver que tengan las mismas columnas y el mismo orden.

ADOQuery1.Open;
crpe1.Tables[0].DataPointer := @(ADOQuery1.recordset);
crpe1.Show;

espero que te ayude