+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Verwendung von DbCommandSetDataProvider


(Jan Brusis) #1

Hallo,

Ich habe eine Web-Applikation in MVC.NET, die auf den Webbasierten LL-Client zurückgreift. Bei der Struktur der Applikation habe ich mich nah an das mitgelieferte Beispiel gehalten.
Mein Ziel ist es, vorgefertige Templates dynamisch generieren zu lassen, indem ich eine ID an den Webserver übergebe, die dann in ein SQL-Statement gebunden wird. Im Template sollen dann nur die Daten angezeigt werden, die von einer Query zurückgeliefert werden an die in der WHERE-Clause diese ID gebunden wird.

Ein Beispiel für eine solche Query:

SELECT * FROM VIEW_SAMPLE WHERE SAMPLE_ID = :id

Bei einem Aufruf an die Print-Methode meines ListLabel-Objektes soll nun die ID ‘5’ übergeben werden, sodass die DataSource des Objektes aus allen Spalten der View VIEW_SAMPLE besteht, eingeschränkt auf die ID 5.

Als DB verwende ich Oracle. Ein OracleConnectionDataProvider schien mir jedoch nicht das richtige Mittel zu sein, da hier immer meine gesamte DB eingelesen wird. Es fehlt mir hier die Möglichkeit nur ganz konkrete Informationen zu bestimmten Zeilen abzuholen.

Implementiert habe ich das ganze also als DBCommandSetDataProvider:

DbCommandSetDataProvider Result = new DbCommandSetDataProvider(); ... String DataProviderQuery = 'SELECT * FROM VIEW_SAMPLE WHERE SAMPLE_ID = :id' OracleCommand Command = Connection.CreateCommand(); Command.CommandText = DataProviderQuery; Command.CommandType = CommandType.Text; Command.Parameters.Add("id", 5); // Hier wird die ID gebunden Result.AddCommand(vCommand, "SAMPLE"); // Hier wird das Command an den DataProvider übergeben.

Im Designer greife ich dann auf die einzelnen Spalten zu, die mir diese Abfrage liefert und baue daraus einen Report. Im einfachsten Fall ergänze ich auf die leere Seite einfach den Wert “SAMPLE_NAME” per Drag&Drop.

Für den Webdesigner funktioniert dies auch. Ich habe im Designer eine “Tabelle” mit dem Namen “SAMPLE” in der sich meine Spalten befinden.
Wenn ich nun aber versuche den HTML5Viewer (bzw einfach LL.print()) aufzurufen, so bekomme ich die Fehlermeldung:

Hier wird anscheinend versucht in meiner Oracle-DB eine Tabelle mit dem Namen “SAMPLE” zu finden, die natürlich nicht existiert.Ich habe die Dokumentation so verstanden, dass der String-Parameter in Result.AddCommand(DBCOmmand, String) nur den Namen der Tabelle im List&Label-Objekt bezeichnet. Wieso wird hier also versucht diese Tabelle zu laden? Ist meine Herangehensweise überhaupt möglich, bzw. gibt es eine bessere Alternative?

Hier noch der Code beim Erzeugen des LL-Objektes:

combit.ListLabel22.ListLabel vLL = new combit.ListLabel22.ListLabel(); vLL.FileRepository = GetCurrentRepository(); vLL.AutoProjectFile = GetCurrentRepository().getInternalId(aReportId); vLL.AutoShowSelectFile = false; vLL.AutoShowPrintOptions = false; IDataProvider Provider = GetDataSourceForProjectType(aObjectID); //Hier wird der DBCOmmandSetProvider aus obigem Code geladen vLL.DataSource = Provider; vLL.SetDataBinding(Provider, "SAMPLE");

Vielen Dank schonmal,

Jan


(Günther Schwarze) #2

Ich würde mal versuchen, im Provider die “MinimalSelect”-Eigenschaft auf false zu setzen, also im oberen Snippet

Result.MinimalSelect = false;

Ansonsten sieht es so aus, als würde der Provider versuchen, “SAMPLE” als Schema aufzufassen, insofern könntest Du auch mal mit der PrefixTableNameWithSchema-Eigenschaft des Providers experimentieren.

HTH

G.


(Jan Brusis) #3

Super, vielen Dank! Das Ändern von MinimalSelect auf false hat geholfen.