You are not logged in.
thank you, but have to
[
{
"ID": 1,
"IDZakaza": 1,
"IDTipoisp": 1,
"SerNomer": "",
"Otchety_nastrk": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo0": "{\"Href\":\"\",\"Report\":\"<html></html>\",\"Result\":\"Success\",\"DateTest\":\"29.09.2015 10:35:52\"}",
"Otchety_termo8": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo16": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo24": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo36": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo48": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo72": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_Koeff": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_HtmKoeff": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_Test": "{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}"
}
]I have code from 7 july 2015
I know, the application compiles and runs. And what about the content of the file "pserver.db.json". Is it ok?
what is most interesting is that the file is valid, but it is wrong
Anybody help, compile this code and look to the file "pserver.db.json", it is wrong, how i writed above
program pServer;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils,
SynCommons,
mORMot,
SynSQlite3Static,
mORMotSQLite3,
Classes,
Forms;
var Model:TSQLModel;
Database:TSQLRest;
iId_BD:TID;
{------------------------------------------------------------------------------
Model
------------------------------------------------------------------------------}
type
TDateTermoprAll = (NoTest, Nastrk, Termo0, Termo8, Termo16, Termo24, Termo36, Termo48, Termo72, KoeffDSP, KoeffHTML, Test);
TDateTermopr = Nastrk..Test;
const
// Data name Blob field in DB
strDateTermopr : array[TDateTermopr] of ShortString = ('Otchety_nastrk', 'Otchety_termo0', 'Otchety_termo8',
'Otchety_termo16','Otchety_termo24','Otchety_termo36',
'Otchety_termo48','Otchety_termo72','Otchety_Koeff','Otchety_HtmKoeff','Otchety_Test');
type
/// here we declare the class containing the data
// - it just has to inherits from TSQLRecord, and the published
// properties will be used for the ORM (and all SQL creation)
// - the beginning of the class name must be 'TSQL' for proper table naming
// in client/server environnment
TDataReport = class(TPersistent)
private
fHref : RawUTF8;
fReport : RawUTF8;
fResult : RawUTF8;
fDateTest : RawUTF8;
public
procedure Clear;
published
property Href : RawUTF8 read fHref write fHref;
property Report : RawUTF8 read fReport write fReport;
property Result : RawUTF8 read fResult write fResult;
property DateTest : RawUTF8 read fDateTest write fDateTest;
end;
TSQLRecordZakaz = class(TSQLRecord)
private
fNomerZakaza : RawUTF8;
fZakazchik : RawUTF8;
fVypolnen : Boolean;
FTimeVypoln : TDateTime;
published
property NomerZakaza : RawUTF8 read fNomerZakaza write fNomerZakaza;
property Zakazchik : RawUTF8 read fZakazchik write fZakazchik;
property Vypolnen : Boolean read fVypolnen write fVypolnen;
property TimeVypoln : TDateTime read FTimeVypoln write FTimeVypoln;
end;
TSQLRecordTip = class(TSQLRecord)
private
fNameTipoisp : RawUTF8;
published
property NameTipoisp : RawUTF8 read fNameTipoisp write fNameTipoisp;
end;
TSQLRecordDevice = class(TSQLRecord)
private
fIDZakaza : TSQLRecordZakaz;
fIDTipoisp : TSQLRecordTip;
fSerNomer : RawUTF8;
fOtchety_nastrk : TDataReport;
fOtchety_termo0 : TDataReport;
fOtchety_termo8 : TDataReport;
fOtchety_termo16 : TDataReport;
fOtchety_termo24 : TDataReport;
fOtchety_termo36 : TDataReport;
fOtchety_termo48 : TDataReport;
fOtchety_termo72 : TDataReport;
fOtchety_Koeff : TDataReport;
fOtchety_HtmKoeff : TDataReport;
fOtchety_Test : TDataReport;
public
constructor Create; override;
destructor Destroy; override;
published
property IDZakaza : TSQLRecordZakaz read fIDZakaza write fIDZakaza;
property IDTipoisp : TSQLRecordTip read fIDTipoisp write fIDTipoisp;
property SerNomer : RawUTF8 read fSerNomer write fSerNomer;
property Otchety_nastrk : TDataReport read fOtchety_nastrk write fOtchety_nastrk;
property Otchety_termo0 : TDataReport read fOtchety_termo0 write fOtchety_termo0;
property Otchety_termo8 : TDataReport read fOtchety_termo8 write fOtchety_termo8;
property Otchety_termo16 : TDataReport read fOtchety_termo16 write fOtchety_termo16;
property Otchety_termo24 : TDataReport read fOtchety_termo24 write fOtchety_termo24;
property Otchety_termo36 : TDataReport read fOtchety_termo36 write fOtchety_termo36;
property Otchety_termo48 : TDataReport read fOtchety_termo48 write fOtchety_termo48;
property Otchety_termo72 : TDataReport read fOtchety_termo72 write fOtchety_termo72;
property Otchety_Koeff : TDataReport read fOtchety_Koeff write fOtchety_Koeff;
property Otchety_HtmKoeff : TDataReport read fOtchety_HtmKoeff write fOtchety_HtmKoeff;
property Otchety_Test : TDataReport read fOtchety_Test write fOtchety_Test;
end;
{ TSQLRecordDevice }
constructor TSQLRecordDevice.Create;
begin
inherited;
fOtchety_nastrk:=TDataReport.Create;
fOtchety_termo0:=TDataReport.Create;
fOtchety_termo8:=TDataReport.Create;
fOtchety_termo16:=TDataReport.Create;
fOtchety_termo24:=TDataReport.Create;
fOtchety_termo36:=TDataReport.Create;
fOtchety_termo48:=TDataReport.Create;
fOtchety_termo72:=TDataReport.Create;
fOtchety_Koeff:=TDataReport.Create;
fOtchety_HtmKoeff:=TDataReport.Create;
fOtchety_Test:=TDataReport.Create;
end;
destructor TSQLRecordDevice.Destroy;
begin
fOtchety_nastrk.Free;
fOtchety_termo0.Free;
fOtchety_termo8.Free;
fOtchety_termo16.Free;
fOtchety_termo24.Free;
fOtchety_termo36.Free;
fOtchety_termo48.Free;
fOtchety_termo72.Free;
fOtchety_Koeff.Free;
fOtchety_HtmKoeff.Free;
fOtchety_Test.Free;
inherited;
end;
{ TDataOtchet }
procedure TDataReport.Clear;
begin
fHref:='';
fReport:='';
fResult:='';
fDateTest:='';
end;
{------------------------------------------------------------------------------
Create Record
------------------------------------------------------------------------------}
procedure CreateRecordDB(sNomerZakaza,stipoisp:RawUTF8;var iId_BD:TID);
var
RecordOrder: TSQLRecordZakaz;RecordTip: TSQLRecordTip; RecordDevice: TSQLRecordDevice;
iId_Order,iId_Tip: integer;
s:RawUTF8;
begin
s:=Database.OneFieldValue(Model['Zakaz'],'ID',Format('NOMERZAKAZA=''%s''',[sNomerZakaza]));
if not TryStrToInt(s,iId_Order) then
begin
RecordOrder:=TSQLRecordZakaz.Create;
try
RecordOrder.NomerZakaza:=sNomerZakaza;
RecordOrder.Vypolnen:=False;
iId_Order := Database.Add(RecordOrder,true);
finally
RecordOrder.Free;
end;
end else
begin
RecordOrder:=TSQLRecordZakaz.Create(DataBase,iId_Order);
RecordOrder.Vypolnen:=False;
DataBase.Update(RecordOrder);
end;
s:=Database.OneFieldValue(Model['Tip'],'ID',Format('NAMETIPOISP=''%s''',[stipoisp]));
if not TryStrToInt(s,iId_Tip) then
begin
RecordTip:=TSQLRecordTip.Create;
try
RecordTip.NameTipoisp:=stipoisp;
iId_Tip := Database.Add(RecordTip,true);
finally
RecordTip.Free;
end;
end;
RecordDevice:=TSQLRecordDevice.Create;
try
RecordDevice.IDZakaza:=TSQLRecordZakaz(iId_Order);
RecordDevice.IDTipoisp:=TSQLRecordTip(iId_Tip);
iId_BD := Database.Add(RecordDevice,true);
finally
RecordDevice.Free;
end;
end;
{------------------------------------------------------------------------------
Update Record
------------------------------------------------------------------------------}
procedure LoadProtocolToDB(iId_BD:TID;aHTMLString: RawUTF8; isProverkaSuccess: Boolean; dt: TDateTermoprAll);
var
rec:TSQLRecordDevice;
procedure AssignToOtchet(ADataReport:TDataReport);
begin
ADataReport.Href:='';// StringToUTF8(dt.sHref);
ADataReport.Report:=aHTMLString;
ADataReport.Result:=ifthen(isProverkaSuccess,'Success','Errors');
ADataReport.DateTest:=DateTimeToStr(Now);
end;
begin
if (iId_BD=0) or (aHTMLString='') then Exit;
rec:=TSQLRecordDevice.Create(Database,iId_BD);
try
case dt of
Nastrk: AssignToOtchet(Rec.Otchety_nastrk);
Termo0: AssignToOtchet(Rec.Otchety_termo0);
Termo8: AssignToOtchet(Rec.Otchety_termo8);
Termo16: AssignToOtchet(Rec.Otchety_termo16);
Termo24: AssignToOtchet(Rec.Otchety_termo24);
Termo36: AssignToOtchet(Rec.Otchety_termo36);
Termo48: AssignToOtchet(Rec.Otchety_termo48);
Termo72: AssignToOtchet(Rec.Otchety_termo72);
Test: AssignToOtchet(Rec.Otchety_Test);
KoeffDSP: AssignToOtchet(Rec.Otchety_Koeff);
KoeffHTML: AssignToOtchet(Rec.Otchety_HtmKoeff);
end;
Database.Update(rec);
finally
Rec.free;
end;
end;
function CreateSampleModel: TSQLModel;
begin
result := TSQLModel.Create([TSQLRecordZakaz,TSQLRecordTip,TSQLRecordDevice]);
end;
begin
Model := CreateSampleModel;
try
Database := TSQLRestServerDB.Create(Model, ChangeFileExt(Application.ExeName,'.db'));
if not Assigned(Database) then raise Exception.Create('Error connect or create db');
try
TSQLRestServerDB(Database).CreateMissingTables(0);
TSQLRestServerDB(Database).NoAJAXJSON:=False;
CreateRecordDB('123','BE',iId_BD);
LoadProtocolToDB(iId_BD,'<html></html>',true,Termo0);
FileFromString(JSONReformat(Database.ExecuteJson([TSQLRecordDevice],'select * from Device')),'pServer.db.json');
write('Press [Enter] to close the server.');
Readln;
finally
Database.Free;
end;
finally
Model.Free;
end;
end.Today tried to compile my example with Delphi XE2 and the same bad result
I took source from http://synopse.info/files/mORMotNightlyBuild.zip yesterday. I had to take in GitHub.
Today mORMotNightlyBuild.zip have been changed for actual version. I could to compile it.
But it doesn't help.
I saw in debug when execute inside function GetJSONValues(W: TJSONSerializer) adding colnames "Otchety_nastrk" immediately added rest colnames: Otchety_termo0... Otchety_Test. Is it ok?.
winXP, Delphi 2006
i can not compile
appear error : too many actual parameters in row Call.OutBody := rec.GetJSONValues(true,true,soSelect,nil,true);
before update all worked ok
I writed new data to field "Otchety_termo0" and when I did update database, data writed
But now, when I write field "Otchety_termo0" and update database then I see that data writed to other fields record and moreover its broken
for example: "Otchety_termo8":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
Hi all
After last update, I detected strange behavior on UPDATE operation
I write data to one field with name "Otchety_termo0", but in result, I see data in many fields of database.
{
"IDZakaza":1,
"IDTipoisp":1,
"SerNomer":"",
"Otchety_nastrk":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}",
"Otchety_termo0":"{\"Href\":\"\",\"Report\":\"<html></html>\",\"Result\":\"Success\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_termo8":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_termo16":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_termo24":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_termo36":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_termo48":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_termo72":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_Koeff":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_HtmKoeff":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}",
"Otchety_Test":"{\"Href\":\"\",\"Report\":\"\",\"Result\":\"\",\"DateTest\":\"\"}cess\",\"DateTest\":\"14.09.2015 14:21:06\"}"
}
This is my TEST code model, server and client for repeat situation
MODEL
unit uModel;
interface
uses
Classes, SynCommons, mORMot, mORMotHttpServer;
type
TDateTermoprAll = (NoTest, Nastrk, Termo0, Termo8, Termo16, Termo24, Termo36, Termo48, Termo72, KoeffDSP, KoeffHTML, Test);
TDateTermopr = Nastrk..Test;
const
// Data name Blob field in DB
strDateTermopr : array[TDateTermopr] of ShortString = ('Otchety_nastrk', 'Otchety_termo0', 'Otchety_termo8',
'Otchety_termo16','Otchety_termo24','Otchety_termo36',
'Otchety_termo48','Otchety_termo72','Otchety_Koeff','Otchety_HtmKoeff','Otchety_Test');
type
/// here we declare the class containing the data
// - it just has to inherits from TSQLRecord, and the published
// properties will be used for the ORM (and all SQL creation)
// - the beginning of the class name must be 'TSQL' for proper table naming
// in client/server environnment
TDataReport = class(TPersistent)
private
fHref : RawUTF8;
fReport : RawUTF8;
fResult : RawUTF8;
fDateTest : RawUTF8;
public
procedure Clear;
published
property Href : RawUTF8 read fHref write fHref;
property Report : RawUTF8 read fReport write fReport;
property Result : RawUTF8 read fResult write fResult;
property DateTest : RawUTF8 read fDateTest write fDateTest;
end;
TSQLRecordZakaz = class(TSQLRecord)
private
fNomerZakaza : RawUTF8;
fZakazchik : RawUTF8;
fVypolnen : Boolean;
FTimeVypoln : TDateTime;
published
property NomerZakaza : RawUTF8 read fNomerZakaza write fNomerZakaza;
property Zakazchik : RawUTF8 read fZakazchik write fZakazchik;
property Vypolnen : Boolean read fVypolnen write fVypolnen;
property TimeVypoln : TDateTime read FTimeVypoln write FTimeVypoln;
end;
TSQLRecordTip = class(TSQLRecord)
private
fNameTipoisp : RawUTF8;
published
property NameTipoisp : RawUTF8 read fNameTipoisp write fNameTipoisp;
end;
TSQLRecordDevice = class(TSQLRecord)
private
fIDZakaza : TSQLRecordZakaz;
fIDTipoisp : TSQLRecordTip;
fSerNomer : RawUTF8;
fOtchety_nastrk : TDataReport;
fOtchety_termo0 : TDataReport;
fOtchety_termo8 : TDataReport;
fOtchety_termo16 : TDataReport;
fOtchety_termo24 : TDataReport;
fOtchety_termo36 : TDataReport;
fOtchety_termo48 : TDataReport;
fOtchety_termo72 : TDataReport;
fOtchety_Koeff : TDataReport;
fOtchety_HtmKoeff : TDataReport;
fOtchety_Test : TDataReport;
public
constructor Create; override;
destructor Destroy; override;
published
property IDZakaza : TSQLRecordZakaz read fIDZakaza write fIDZakaza;
property IDTipoisp : TSQLRecordTip read fIDTipoisp write fIDTipoisp;
property SerNomer : RawUTF8 read fSerNomer write fSerNomer;
property Otchety_nastrk : TDataReport read fOtchety_nastrk write fOtchety_nastrk;
property Otchety_termo0 : TDataReport read fOtchety_termo0 write fOtchety_termo0;
property Otchety_termo8 : TDataReport read fOtchety_termo8 write fOtchety_termo8;
property Otchety_termo16 : TDataReport read fOtchety_termo16 write fOtchety_termo16;
property Otchety_termo24 : TDataReport read fOtchety_termo24 write fOtchety_termo24;
property Otchety_termo36 : TDataReport read fOtchety_termo36 write fOtchety_termo36;
property Otchety_termo48 : TDataReport read fOtchety_termo48 write fOtchety_termo48;
property Otchety_termo72 : TDataReport read fOtchety_termo72 write fOtchety_termo72;
property Otchety_Koeff : TDataReport read fOtchety_Koeff write fOtchety_Koeff;
property Otchety_HtmKoeff : TDataReport read fOtchety_HtmKoeff write fOtchety_HtmKoeff;
property Otchety_Test : TDataReport read fOtchety_Test write fOtchety_Test;
end;
/// an easy way to create a database model for client and server
function CreateSampleModel: TSQLModel;
var Model:TSQLModel;
Database:TSQLRest;
Server: TSQLHttpServer;
implementation
function CreateSampleModel: TSQLModel;
begin
result := TSQLModel.Create([TSQLRecordZakaz,TSQLRecordTip,TSQLRecordDevice]);
end;
{ TSQLRecordDevice }
constructor TSQLRecordDevice.Create;
begin
inherited;
fOtchety_nastrk:=TDataReport.Create;
fOtchety_termo0:=TDataReport.Create;
fOtchety_termo8:=TDataReport.Create;
fOtchety_termo16:=TDataReport.Create;
fOtchety_termo24:=TDataReport.Create;
fOtchety_termo36:=TDataReport.Create;
fOtchety_termo48:=TDataReport.Create;
fOtchety_termo72:=TDataReport.Create;
fOtchety_Koeff:=TDataReport.Create;
fOtchety_HtmKoeff:=TDataReport.Create;
fOtchety_Test:=TDataReport.Create;
end;
destructor TSQLRecordDevice.Destroy;
begin
fOtchety_nastrk.Free;
fOtchety_termo0.Free;
fOtchety_termo8.Free;
fOtchety_termo16.Free;
fOtchety_termo24.Free;
fOtchety_termo36.Free;
fOtchety_termo48.Free;
fOtchety_termo72.Free;
fOtchety_Koeff.Free;
fOtchety_HtmKoeff.Free;
fOtchety_Test.Free;
inherited;
end;
{ TDataOtchet }
procedure TDataReport.Clear;
begin
fHref:='';
fReport:='';
fResult:='';
fDateTest:='';
end;
end.SERVER
program pServer;
{$APPTYPE CONSOLE}
uses
SysUtils,
mORMot,
SynSQlite3,
DB,
SynDBVCL,
SynDBSQLite3,
SynDB,
SynSQlite3Static,
mORMotSQLite3,
mORMotHttpServer,
Classes,
Forms,
uModel in 'uModel.pas';
begin
Model := CreateSampleModel;
try
Database := TSQLRestServerDB.Create(Model, ChangeFileExt(Application.ExeName,'.db'));
if not Assigned(Database) then raise Exception.Create('Error connect or create db');
try
TSQLRestServerDB(Database).CreateMissingTables(0);
TSQLRestServerDB(Database).NoAJAXJSON:=False;
Server := TSQLHttpServer.Create('777',[TSQLRestServerDB(Database)],'+',{useHttpSocket}useHttpApiRegisteringURI,32,secNone,'report');
Server.AccessControlAllowOrigin := '*'; // allow cross-site AJAX queries
write('Press [Enter] to close the server.');
Readln;
finally
Database.Free;
end;
finally
Model.Free;
end;
end.CLIENT
program pClient;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils,
SynCommons,
mORMot,
mORMotSQLite3,
mORMotHttpClient,
uModel;
procedure CreateRecordDB(sNomerZakaza,stipoisp:string;var iId_BD:TID);
var
RecordOrder: TSQLRecordZakaz;RecordTip: TSQLRecordTip; RecordDevice: TSQLRecordDevice;
iId_Order,iId_Tip: integer;
s:string;
begin
s:=Database.OneFieldValue(Model['Zakaz'],'ID',Format('NOMERZAKAZA=''%s''',[StringToUTF8(sNomerZakaza)]));
if not TryStrToInt(s,iId_Order) then
begin
RecordOrder:=TSQLRecordZakaz.Create;
try
RecordOrder.NomerZakaza:=StringToUTF8(sNomerZakaza);
RecordOrder.Vypolnen:=False;
iId_Order := Database.Add(RecordOrder,true);
finally
RecordOrder.Free;
end;
end else
begin
RecordOrder:=TSQLRecordZakaz.Create(DataBase,iId_Order);
RecordOrder.Vypolnen:=False;
DataBase.Update(RecordOrder);
end;
s:=Database.OneFieldValue(Model['Tip'],'ID',Format('NAMETIPOISP=''%s''',[StringToUTF8(stipoisp)]));
if not TryStrToInt(s,iId_Tip) then
begin
RecordTip:=TSQLRecordTip.Create;
try
RecordTip.NameTipoisp:=StringToUTF8(stipoisp);
iId_Tip := Database.Add(RecordTip,true);
finally
RecordTip.Free;
end;
end;
RecordDevice:=TSQLRecordDevice.Create;
try
RecordDevice.IDZakaza:=TSQLRecordZakaz(iId_Order);
RecordDevice.IDTipoisp:=TSQLRecordTip(iId_Tip);
iId_BD := Database.Add(RecordDevice,true);
finally
RecordDevice.Free;
end;
end;
procedure LoadProtocolToDB(iId_BD:TID;aHTMLString: string; isProverkaSuccess: Boolean; dt: TDateTermoprAll);
var
rec:TSQLRecordDevice;
procedure AssignToOtchet(ADataReport:TDataReport);
begin
ADataReport.Href:='';// StringToUTF8(dt.sHref);
ADataReport.Report:=aHTMLString;
ADataReport.Result:=ifthen(isProverkaSuccess,'Success','Errors');
ADataReport.DateTest:=DateTimeToStr(Now);
end;
begin
if (iId_BD=0) or (aHTMLString='') then Exit;
rec:=TSQLRecordDevice.Create(Database,iId_BD);
try
case dt of
Nastrk: AssignToOtchet(Rec.Otchety_nastrk);
Termo0: AssignToOtchet(Rec.Otchety_termo0);
Termo8: AssignToOtchet(Rec.Otchety_termo8);
Termo16: AssignToOtchet(Rec.Otchety_termo16);
Termo24: AssignToOtchet(Rec.Otchety_termo24);
Termo36: AssignToOtchet(Rec.Otchety_termo36);
Termo48: AssignToOtchet(Rec.Otchety_termo48);
Termo72: AssignToOtchet(Rec.Otchety_termo72);
Test: AssignToOtchet(Rec.Otchety_Test);
KoeffDSP: AssignToOtchet(Rec.Otchety_Koeff);
KoeffHTML: AssignToOtchet(Rec.Otchety_HtmKoeff);
end;
Database.Update(rec);
finally
Rec.free;
end;
end;
var iId_BD:TID;
begin
Model := CreateSampleModel;
try
Database := TSQLHttpClient.Create('localhost', '777',Model);
try
write('Press [Enter] to close the client.');
CreateRecordDB('123','BE',iId_BD);
LoadProtocolToDB(iId_BD,'<html></html>',true,Termo0);
Readln;
finally
Database.Free;
end;
finally
Model.Free;
end;
end.i used TSynPersistent and now its all works, though ealier i used TComponent as parent class, but it didn't work.
Thank you.
It did not solve the problem. Then problem is that function Item := ClassInstanceCreate(ItemClass) doesn't call "create" method TLine object and therefore all of its properties equals nil.
I have registred classes in initialization section
TJSONSerializer.RegisterClassForJSON([TLine, TDevice]);
this is my file
{
"ClassName":"TConfig",
"ListLines":
[{
"ClassName":"TLine",
"NameLine": "MyLine",
"ComPort": "COM1",
"IniFile": "",
"ListDevices":
[{
"ClassName":"TDevice",
"Name": "MyDevice",
"Speed": "9600",
"Adress": 1
}
]
}
]
}there is field "classname", but it did not help.
The option "woStoreClassName" adds only property "TConfig" to the root object. Other options were earlier.
I tried save instance of object with ObjectToJSON. And it's really ok. But a want to load my file, i get message "not valid". In debug i found, when parser read nested TObjectList = TDevice, it can not detect its.
Try this code.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SynCommons, mORMot, Contnrs, StdCtrls;
type
TSpeed = (s9600,s38400);
TLine = class;
TConfig = class;
TDevice = class(TPersistent)
strict private
fParentLine : TLine;
fName : string;
fSpeed : TSpeed;
fAdress : Integer;
public
constructor Create(ALine:TLine;AName:string;Adress:Integer);
property ParentLine : TLine read fParentLine write fParentLine;
published
property Name : string read fName write fName;
property Speed : TSpeed read fSpeed write fSpeed;
property Adress : Integer read fAdress write fAdress;
end;
TLine = class(TPersistent)
strict private
fParentConfig : TConfig;
fListDevices : TObjectList;
fName : string;
fComPort : string;
fIniFile : string;
public
constructor Create(AConfig:TConfig;ANameLine,AComPort:string);
destructor Destroy; override;
function AddDevice(AName:string):TDevice;
property ParentConfig : TConfig read fParentConfig write fParentConfig;
published
property NameLine : string read fName write fName;
property ComPort : string read fComPort write fComPort;
property IniFile : string read fIniFile write fIniFile;
property ListDevices : TObjectList read fListDevices write fListDevices;
end;
TConfig = class(TPersistent)
private
fListLines : TObjectList;
public
constructor Create;
destructor Destroy; override;
function AddLine(AName,AComPort:string):TLine;
procedure SaveConfig(AFileName:string);
procedure LoadConfig(AFileName:string);
published
property ListLines : TObjectList read fListLines write fListLines;
end;
TForm1 = class(TForm)
btnSave: TButton;
btnLoad: TButton;
btnCreate: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnCreateClick(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Config:TConfig;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TLine }
function TLine.AddDevice(AName: string): TDevice;
begin
Result:=TDevice.Create(Self, AName, 1);
fListDevices.Add(Result);
end;
constructor TLine.Create(AConfig:TConfig;ANameLine,AComPort:string);
begin
fParentConfig:=AConfig;
fName:=ANameLine;
fComPort:=AComPort;
fListDevices:=TObjectList.Create;
end;
destructor TLine.Destroy;
begin
fListDevices.Free;
inherited;
end;
{ TConfig }
function TConfig.AddLine(AName,AComPort: string):TLine;
begin
Result:=TLine.Create(Self,AName,AComPort);
fListLines.Add(Result);
end;
constructor TConfig.Create;
begin
inherited;
fListLines:=TObjectList.Create;
end;
destructor TConfig.Destroy;
begin
fListLines.Free;
inherited;
end;
procedure TConfig.LoadConfig(AFileName: string);
var s:RawUTF8;
isValid: Boolean;
begin
s:=StringToUTF8(StringFromFile(AFileName));
JSONToObject(Self,@s[1],isValid);
if not isValid then ShowMessage('not valid');
end;
procedure TConfig.SaveConfig(AFileName: string);
var
s: string;
begin
s:=UTF8ToString(ObjectToJSON(Self,[woDontStoreDefault,woHumanReadable]));
FileFromString(s,AFileName);
end;
procedure TForm1.btnCreateClick(Sender: TObject);
var Line:TLine; Dev:TDevice;
begin
Line:=Config.AddLine('MyLine','COM1');
Line.AddDevice('MyDevice');
end;
procedure TForm1.btnLoadClick(Sender: TObject);
begin
Config.LoadConfig('test.cnfg');
end;
procedure TForm1.btnSaveClick(Sender: TObject);
begin
Config.SaveConfig('test.cnfg');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Config:=TConfig.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Config.Free;
end;
{ TDevice }
constructor TDevice.Create(ALine: TLine; AName: string;Adress:Integer);
begin
fParentLine:=ALine;
fName:=AName;
fAdress:=Adress;
end;
initialization
TJSONSerializer.RegisterClassForJSON([TLine, TDevice]);
finalizationCode from SynCommons.pas
procedure TimeToIso8601PChar(P: PUTF8Char; Expanded: boolean; H,M,S: cardinal;
FirstChar: AnsiChar = 'T'); overload;
// we use Thhmmss format //---------------------> but not THH:MM:SS.SSS
begin
P^ := FirstChar;
inc(P);
pWord(P)^ := TwoDigitLookupW[h];
inc(P,2);
if Expanded then begin
P^ := ':';
inc(P);
end;
pWord(P)^ := TwoDigitLookupW[M];
inc(P,2);
if Expanded then begin
P^ := ':';
inc(P);
end;
pWord(P)^ := TwoDigitLookupW[s];
// -------------->here no code with milliseconds
end;
//-------------->here convert date - it's ok
procedure DateToIso8601PChar(Date: TDateTime; P: PUTF8Char; Expanded: boolean); overload;
// we use YYYYMMDD date format
var Y,M,D: word;
begin
DecodeDate(Date,Y,M,D);
DateToIso8601PChar(P,Expanded,Y,M,D);
end;
/// convert a date into 'YYYY-MM-DD' date format
function DateToIso8601Text(Date: TDateTime): RawUTF8;
begin
SetLength(Result,10);
DateToIso8601PChar(Date,pointer(Result),True);
end;
procedure TimeToIso8601PChar(Time: TDateTime; P: PUTF8Char; Expanded: boolean;
FirstChar: AnsiChar = 'T'); overload;
// we use Thhmmss format
var H,M,S,MS: word;
begin
DecodeTime(Time,H,M,S,MS); //-------------->here we have MS, but don't use it after
TimeToIso8601PChar(P,Expanded,H,M,S,FirstChar);
end;
function DateTimeToIso8601(D: TDateTime; Expanded: boolean;
FirstChar: AnsiChar='T'): RawUTF8;
// we use YYYYMMDDThhmmss format
var tmp: array[0..31] of AnsiChar;
begin
if Expanded then begin //-------------->here Expanded version TDatetime
DateToIso8601PChar(D,tmp,true);
TimeToIso8601PChar(D,@tmp[10],true,FirstChar);
SetString(result,PAnsiChar(@tmp),19);
end else begin
DateToIso8601PChar(D,tmp,false);
TimeToIso8601PChar(D,@tmp[8],false,FirstChar);
SetString(result,PAnsiChar(@tmp),15);
end;
end;How I can store milliseconds TDateTime in any kind datetime property?
thank you for quick answer
Good day. I use the following code.
TSQLRecordOtchet = class(TSQLRecord)
private
fOtchety_nastrk : Variant;
public
constructor Create; override;
published
property Otchety_nastrk : Variant read fOtchety_nastrk write fOtchety_nastrk;
constructor TSQLRecordOtchet.Create;
begin
inherited;
fOtchety_nastrk:=TDocVariant.New;
end;and when I created a record with
rec:=TSQLRecordOtchet.Create, then I get rec.Otchety_nastrk = 'null', but
when I created a record already with
rec:=TSQLRecordOtchet.Create(DataBase,ID), then I get rec.Otchety_nastrk = null, i.e. without quotes.
And if I want assign rec.Otchety_nastrk.Href:='http://...' I get exception "Invalid variant type 1 invoke"
In then first case, after create rec.Otchety_nastrk.Href:='http://...' it's ok. {Href:'http://...'}