![]() |
Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
HAllo Zusammen,
puh Intraweb is doch ganz schön anders als Delphi. Also hier die Rahmenbedingungen: Delphi XE Enterprise In einer MS SQL DB 2008 R2 liegen die Daten. Zugriff über ADO (dbGo Komponenten). Hier meine DataModuleUnit
Delphi-Quellcode:
Hier meine ServerControler Unit
unit DataModuleUnit;
interface uses Forms, SysUtils, Classes, DB, ADODB; type TDataModule1 = class(TDataModule) Con_srvsqlprod01: TADOConnection; QR_orders_heute: TADOQuery; DS_QR_orders_heute: TDataSource; procedure DataModuleCreate(Sender: TObject); private public procedure querry_orders_heute; end; var DataModule1: TDataModule1; implementation {$R *.dfm} procedure TDataModule1.querry_orders_heute; begin QR_orders_heute.SQL.Clear; QR_orders_heute.SQL.Add( 'select DISTINCT orders_0800 ' + 'FROM tLog WITH(NOLOCK) ' + ); QR_orders_heute.Active := true; end; procedure TDataModule1.DataModuleCreate(Sender: TObject); begin Con_srvsqlprod01.ConnectionString := 'Provider=sqloledb;' + 'Data Source=XXX;'+ 'Initial Catalog=XXX;'+ 'User Id=XXX;' + 'Password=XXX'; Con_srvsqlprod01.LoginPrompt := False; Con_srvsqlprod01.Open; querry_orders_heute; end; end.
Delphi-Quellcode:
Hier meine UserSessionUnit
unit ServerController;
interface uses SysUtils, Classes, IWServerControllerBase, IWBaseForm, HTTPApp, // For OnNewSession Event UserSessionUnit, IWApplication, IWAppForm, DataModuleUnit, IWDataModulePool; type TIWServerController = class(TIWServerControllerBase) Pool: TIWDataModulePool; procedure IWServerControllerBaseNewSession(ASession: TIWApplication; var VMainForm: TIWBaseForm); procedure IWServerControllerBaseCreate(Sender: TObject); procedure PoolCreateDataModule(var ADataModule: TDataModule); procedure PoolFreeDataModule(var ADataModule: TDataModule); private public end; function UserSession: TIWUserSession; function IWServerController: TIWServerController; function LockDataModule: TDataModule1; procedure UnlockDataModule(ADataModule: TDataModule1); implementation {$R *.dfm} uses IWInit, IWGlobal; function UserSession: TIWUserSession; begin Result := TIWUserSession(WebApplication.Data); end; function IWServerController: TIWServerController; begin Result := TIWServerController(GServerController); end; procedure TIWServerController.IWServerControllerBaseNewSession( ASession: TIWApplication; var VMainForm: TIWBaseForm); begin ASession.Data := TIWUserSession.Create(nil); end; procedure TIWServerController.IWServerControllerBaseCreate(Sender: TObject); begin Pool.Active := True; end; procedure TIWServerController.PoolCreateDataModule(var ADataModule: TDataModule); begin ADataModule := TDataModule1.Create(nil); end; procedure TIWServerController.PoolFreeDataModule(var ADataModule: TDataModule); begin FreeAndNil(ADataModule); end; function LockDataModule: TDataModule1; begin Result := TDataModule1(TIWServerController(GServerController).Pool.Lock); end; procedure UnlockDataModule(ADataModule: TDataModule1); var LTemp: TDataModule; begin LTemp := ADataModule; TIWServerController(GServerController).Pool.Unlock(LTemp); end; initialization TIWServerController.SetServerControllerClass; end.
Delphi-Quellcode:
Hier die Unit von meinem Main Formular
unit UserSessionUnit;
{ This is a DataModule where you can add components or declare fields that are specific to ONE user. Instead of creating global variables, it is better to use this datamodule. You can then access the it using UserSession. } interface uses IWUserSessionBase, SysUtils, Classes, DataModuleUnit; type TIWUserSession = class(TIWUserSessionBase) procedure IWUserSessionBaseCreate(Sender: TObject); private { Private declarations } public { Public declarations } DataModule1: TDataModule1; end; implementation {$R *.dfm} procedure TIWUserSession.IWUserSessionBaseCreate(Sender: TObject); begin inherited; Datamodule1 := TDatamodule1.Create(Self); end; end.
Delphi-Quellcode:
Hierin liegt nun der Knackpunkt
unit main;
interface uses Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWGrids, IWDBGrids, IWCompButton; type TFMain = class(TIWAppForm) IWDBGrid1: TIWDBGrid; IWGOrders: TIWGrid; IWButton1: TIWButton; procedure IWButton1Click(Sender: TObject); public procedure IWGOrders_fuellen; end; implementation uses DataModuleUnit; {$R *.dfm} procedure TFMain.IWButton1Click(Sender: TObject); begin IWGOrders_fuellen; end; procedure TFMain.IWGOrders_fuellen; var test: string; begin //IWGOrders.Cell[1,1].Text := '15'; //IWGOrders.Cell[1,1].Text := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; test := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; end; initialization TFMain.SetAsMainForm; end.
Delphi-Quellcode:
IWGOrders.Cell[1,1].Text := '15'; Das funktioniert
//IWGOrders.Cell[1,1].Text := '15';
//IWGOrders.Cell[1,1].Text := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; test := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; IWGOrders.Cell[1,1].Text := DataModule1.QR_orders_heute.FieldByName('orders_08 00').AsString; das test := DataModule1.QR_orders_heute.FieldByName('orders_08 00').AsString; und das hingegen nicht. Leider habe ich im Netz nichts gefunden wie ich nun unter Intraweb die Daten aus meiner Datenquelle in dieses verfixte Grid bekomme. Ich kann hier kein IWDBGrid nehmen da meine Daten in der finalen Version aus unterschiedlichen Datenquellen kommen die ich nicht mit einem Statement abfragen kann. Kann mir hier irgendeiner helfen ??? Viele Grüße Andreas |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Hi,
Zitat:
wenn ich mal nur die drei Zeilen anschaue, dann würde ich mal schlicht vermuten, dass das Problem auf der rechten Seite der Zuweisung steht und nicht links. Zudem wäre es hilfreich etwas mehr Infos zu geben, was denn genau nicht geht, denn "geht nicht" ist ein ziemlich weites Feld. ;-) |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Jep da hast Du recht.
Ich kann das Projekt erfolgreich kompilieren und starten. Wenn ich dann im Browser den Button betätige der die Procedure "IWGOrders_fuellen" aufruft erhalte ich folgende Fehlermeldung "Im Projekt... ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletztung bei Adresse 0066EDDD im Modul XXX lesen von Adresse 00000064 aufgetreten." Ich habe auf des Main Formular mal eine IWDBGrid Komponente gelegt in dieser werden die Daten einwandfrei angezeigt |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
siehst Du, ist doch gar nicht schwer. Und jetzt seh ich auch den Fehler (zumindest glaub ich das):
UserSessionUnit: HIer definierst Du ein DataModule1: TDataModule1; und erzeugst das dann auch. Im MainForm machst Du aber ein uses DataModuleUnit; d.h. Du greifst da auf das nicht initialisierte DataModule zu. Grüße |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
ok, ich habe das dann geändert auf
Delphi-Quellcode:
ich hoffe Du meintest das so. Leider kommt immer noch der gleiche Fehler (bzw der gleiche mit anderen Adressen 0066EDE1 und 00000069)
IWGOrders.Cell[1,1].Text := usersession.DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString;
|
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
hm..
kannst Du mal etwas Debugcode einbauen? Oder geht IW irgend wie direkt debuggen? Überprüf bitte mal ob Assigned(Usersession) Assigned(Usersession.DataModule1) Assigned(Usersession.DataModule1.QR_orders_heute) Wie schaut es mit der Compilersetting "Optimierung" aus - die falls an mal ausschalten. Hat IW nicht einen eingebauten Debugger/Debugconsole? Grüße |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
puh,
was für einen Debugcode meinst Du ??? bin in IW auch blutiger Anfänger weis daher auch nicht ob man das direkt debuggen kann. wie prüfe ich das ?? Assigned(Usersession) Assigned(Usersession.DataModule1) Assigned(Usersession.DataModule1.QR_orders_heute) Compilersettings sind alle auf standard (nix geändert nach der Installation) |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Delphi-Quellcode:
procedure TFMain.IWGOrders_fuellen;
var test: string; begin //IWGOrders.Cell[1,1].Text := '15'; //IWGOrders.Cell[1,1].Text := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; { ############### nachdem man mit dem Debugger über die folgende Zeile "drüberstept" ist die Variable "test" out-of-scope daher wird im Debugger auch kein Wert mehr angezeigt wenn man den Mauszeiger über "test" schweben lässt Ursache könnte z.B. die Optimierung oder auch der fehlende Stackframe sein ################# } test := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; end; |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Zitat:
Delphi-Quellcode:
Alternativ einen Brakepoint auf die Zeile mit dem Auslesen des DB Wertes und dann durchdebuggen (F9).
procedure TFMain.IWGOrders_fuellen;
var test: string; begin if Assigned(Usersession) then iwLabel1.Caption := 'Usersession ist da'; if Assigned(Usersession.DataModule1) then iwLabel2.Caption := 'DataModule1.QR_orders_heute ist da'; if Assigned(Usersession.DataModule1.QR_orders_heute) then iwLabel3.Caption := 'Usersession.DataModule1.QR_orders_heute ist da'; iwLabel4.Caption := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; end; Zitat:
|
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Liste der Anhänge anzeigen (Anzahl: 1)
ok, habe es dann so gemacht
Delphi-Quellcode:
Compilersettings im Debug-mode bei der Option "Optimierung" auf false ... Wo stelle ich das ein?? Unter Projekt/Optionen gibt es diese Einstellung nicht ich habe das mal als Bild angehangen
procedure TFMain.IWGOrders_fuellen;
var test: string; begin if Assigned(Usersession) then //er springt von hier nach iwLabel1.Caption := 'Usersession ist da' else iwLabel1.Caption := 'Usersession ist nicht da'; // hier if Assigned(Usersession.DataModule1) then //hier kommt die Exception. Den Rest macht er dann erst gar nicht iwLabel2.Caption := 'DataModule1.QR_orders_heute ist da' else iwLabel2.Caption := 'DataModule1.QR_orders_heute ist nicht da'; if Assigned(Usersession.DataModule1.QR_orders_heute) then iwLabel3.Caption := 'Usersession.DataModule1.QR_orders_heute ist da' else iwLabel3.Caption := 'Usersession.DataModule1.QR_orders_heute ist nicht da'; iwLabel4.Caption := DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString; end; |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
was mich so ein bischen irretiert ist das das IWDBGrid mit den Daten aus der Query gefüllt wird. Ich sehe die Daten also direkt beim Öffnen der Seite im Browser. die DataSource des IWDBGrid ist "DataModule1.DS_QR_orders_heute". die DS zeigt auf die Query "QR_orders_heute"
|
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Ich muss sagen, ich habe von Intraweb keine Ahnung, nutze selber UniGui. Aber folgendes
Delphi-Quellcode:
wäre in UniGui fatal (wahrscheinlich auch in Intraweb ?). Denn "DataModule1" existiert dadurch im ganzen Projekt nur 1 mal und bei mehreren Sessions würden mehrere Threads gleichzeitig auf das gleiche Dataset zugreifen.
unit DataModuleUnit;
... var DataModule1: TDataModule1; Jede Session sollte ihre eigene Datenbankverbindung (Datenmodul-Instanz) haben, bei Verwendung von ADO/COM sollte außerdem ein CoInitialize() aufgerufen werden. |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Wo erzeugst du denn deine Usersession?
Wenn diese schon nicht assigned ist, kanllt's naturlich auch beim Zugriff auf Usersession.Datamodule ... |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
hmm, das (DataModule1: TDataModule1)stand so in einem Tuorial. Sonst kann ich ja das Datenmodul nicht mit DataModule1.XXX ansprechen. das habe ich so aber auch schon öfters gesehen.
|
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
die Usersession und das Datamodule wird im ServerControler erzeugt
Delphi-Quellcode:
Das ganze Rahmenprogramm habe ich nicht selber erfunden das erstellt Delphi größtenteils selbst. Ich habe eigentlich nur die Sachen mit dem Grid und dem DBGrid und dem DB Zugriff selber gemacht
procedure TIWServerController.IWServerControllerBaseNewSession(
ASession: TIWApplication; var VMainForm: TIWBaseForm); begin ASession.Data := TIWUserSession.Create(nil); end; procedure TIWServerController.IWServerControllerBaseCreate(Sender: TObject); begin Pool.Active := True; end; procedure TIWServerController.PoolCreateDataModule(var ADataModule: TDataModule); begin ADataModule := TDataModule1.Create(nil); end; Wenn das Programm startet sehe ich auch auf der DB ca. 15 Sessions |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Zitat:
Hier wird also ein Datamodule für die bzw. pro Session erstellt (bzw. ein Pool ?):
Delphi-Quellcode:
Und im folgenden ertstellst du dann nochmals eine Instanz pro Session:
procedure TIWServerController.PoolCreateDataModule(var ADataModule: TDataModule);
begin ADataModule := TDataModule1.Create(nil); end;
Delphi-Quellcode:
Und auch an CoInitialize() denken.
procedure TIWUserSession.IWUserSessionBaseCreate(Sender: TObject);
begin inherited; Datamodule1 := TDatamodule1.Create(Self); end; |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
ich habe es auch so versucht
Delphi-Quellcode:
es kam aber der gleiche Fehler.
IWGOrders.Cell[1,1].Text := usersession.DataModule1.QR_orders_heute.FieldByName('orders_0800').AsString;
Ich habe das dann mal rausgenommen
Delphi-Quellcode:
der Fehler bleibt der geiche.
procedure TIWUserSession.IWUserSessionBaseCreate(Sender: TObject);
begin inherited; Datamodule1 := TDatamodule1.Create(Self); end; Wofür brauche ich das CoInitialize() ??? und wo muss das hin ??? |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
hat das denn noch wirklich keiner gemacht ???
In einer Windowsanwendug ist das doch Gang und Gebe. Kann doch eingentlich mit dem Intraweb nicht so schwer sein oder?????? |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Aus deinem Beitrag #10:
Zitat:
Zu ![]() ![]() Das wird benötigt, wenn COM (ADO) innerhalb von Threads aufgerufen wird; in jedem Thread zu Beginn 1 mal aufrufen. |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
OK, ich habe ja wie gesagt das Projekt von Delphi erstellen lassen. Daher dachte ich das die Usersession korrekt erzeugt ist und zur Verfügung steht. Auf dem Formular werden die Daten ja auch in dem DBGrid angezeigt. Was muss ich also nun tun damit die Usersession zur verfügung steht???
|
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
hi,
kannst Du eben das Testprojekt (ohne DB) hier als zip einstellen? Grüße |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Lemmy,
ich habe das Projekt angehangen Gruß Andreas |
AW: Intraweb Datenbankdaten in ein IWGrid legen (kein IWDBGrid
Liste der Anhänge anzeigen (Anzahl: 1)
Jubel, irgendwie habe ich es dann selbst hinbekommen. Es lag bestimmt an dem Zusammenspiel mit der Usersession und dem Datamodule.
Dieser Artiklel hat mir dabei geholfen: ![]() ![]() Ich habe das komplette Projekt dann nochmal so wie es bei mir funktioniert in den Anhang gelegt. Vielen Dank an alle die mir mit Rat und Tat zur Seite standen. Viele Grüße Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz