2017-07-03 1 views
0

Ich habe viele Tage versucht alles, was ich im Forum/Samples/github gefunden habe, was ich tun möchte: - Ich habe eine Tabelle in Sql Server - Ich habe einen Bericht Designer in meiner Einzelseitenanwendung (Stimulsoft reports.js) - Ich muss den Bericht mit den Zeilen der Tabelle füllen (damit der Benutzer eine Vorschau des Berichts anzeigen kann).Bind Stimulsoft Bericht zu einer Tabelle von MSSQL

Derzeit ist die Berichtsvorlage serverseitige erstellt (asp.net Kern), mit diesem Code:

[HttpPost] 
public override async Task Post([FromBody] Report[] elements) 
{ 
var report = new StiReport(); 

var ds = GetDocumentDataSet(); 
report.RegData(AppName, ds); 
report.Dictionary.Synchronize(); 
foreach (var element in elements) 
element.Layout = report.SaveToJsonString(); 
return await base.Post(elements); 
} 
private DataSet GetDocumentDataSet() 
{ 
DataSet ds = new DataSet(); 
using (var connection = Use().GetConnection()) 
{ 
using (var command = connection.CreateCommand()) 
{ 
var table = new DataTable($"{nameof(Document)}"); 
command.CommandText = $"select top 1 * from {nameof(Document)}"; 

connection.Open(); 
table.Load(command.ExecuteReader()); 
ds.Tables.Add(table); 
} 
} 
return ds; 
} 

Dieser Code setzt die Tabelle, die Spalten mit ihren Typen in der Dictionnary, es funktioniert. Client-Seite, wenn ich den Bericht mit diesem Code zu laden:

report.load(dataReport.Layout); 

Das kann ich sehen, in der Dictionnary: http://imgur.com/a/SJ4Yr

Das ist cool, ich habe nur jetzt die Daten zur Verfügung zu stellen, ich Server-Seite erhalte die Daten auf diese Weise:

public async Task ReportSearch() 
{ 
var rows = new List(); 
var columns = new List(); 
var types = new List(); 
using (var connection = Use().GetConnection()) 
using (var command = connection.CreateCommand()) 
{ 
command.CommandText = $"select * from {nameof(Document)}"; 
connection.Open(); 
var reader = await command.ExecuteReaderAsync(); 
while (await reader.ReadAsync()) 
{ 
var values = new object[reader.FieldCount]; 
reader.GetValues(values); 
rows.Add(values); 
} 
foreach (DataRow c in reader.GetSchemaTable().Rows) 
{ 
columns.Add((string)c["ColumnName"]); 
types.Add(((Type)c["DataType"]).FullName); 
} 
} 

return new // As seen in your github sample 
{ 
columns = columns, 
notice = "", 
types = types, 
rows = rows, 
success = true 
}; 
} 

und Client-Seite, ich versuche diese Weise in fill-:

const report = new Stimulsoft.Report.StiReport(); 
if (dataReport.Layout != null && dataReport.Layout != "") { 
report.load(dataReport.Layout); 
} 
$.ajax({ 
type: "Post", 
url: "api/Search/ReportSearch", 
dataType: "json", 
contentType: "application/json", 
success: (data) => { 

var dataSet = new Stimulsoft.System.Data.DataSet(appName); 
dataSet.readJson(JSON.stringify(data)); 

report.regData(dataSet.dataSetName, dataSet.dataSetName, dataSet); 
report.dictionary.synchronize(); 
designer.report = report; 
} 
}); 

Aber ich bekomme das :(: http://imgur.com/a/FQ9kQ

Vertrauen Sie mir, ich habe alles versucht, was ich gefunden habe. Ich würde es vorziehen, die Daten als eine Tabelle (Array von Array von Objekten) lieber als ein Array von JSON-Objekte senden, da jedes Objekt die gleichen Eigenschaften hat, so dass die erste Methode ligher als die zweite ist und es wäre schneller zu übertragen analysieren.

Könnte jemand bitte helfen?

Antwort

0

Sie eine Probe aus GitHub Linien verwenden sollte (74-86):

 if (requestParams.Connection.Type == StiConnectionType.MSSQL) 
     { 
      string connectionString = requestParams.Connection.ConnectionString; 
      string queryString = requestParams.Connection.QueryString; 

      StiDataResult result = new StiDataResult() 
      { 
       Columns = new string[2] { "Column1", "Column2" }, 
       Types = new string[2] { "number", "string" }, 
       Rows = new string[3][] { new string[2] { "1", "Row1" }, new string[2] { "2", "Row2" }, new string[2] { "3", "Row3" } } 
      }; 
      return StiNetCoreViewer.GetReportDataResult(this, result); 
     } 
Verwandte Themen