Improved CRUD sample

This commit is contained in:
Daniele Teti 2020-11-05 15:42:31 +01:00
parent 4a65b78fb5
commit 11c7b397d4
16 changed files with 296 additions and 14 deletions

View File

@ -23,9 +23,13 @@ type
FPrice: Currency;
FCode: string;
FDescription: String;
FUpdatedAt: TDateTime;
FCreatedAt: TDateTime;
procedure SetCode(const Value: string);
procedure SetDescription(const Value: String);
procedure SetPrice(const Value: Currency);
procedure SetCreatedAt(const Value: TDateTime);
procedure SetUpdatedAt(const Value: TDateTime);
public
procedure CheckInsert; override;
procedure CheckUpdate; override;
@ -36,6 +40,10 @@ type
property Description: String read FDescription write SetDescription;
[MVCColumn('PREZZO')]
property Price: Currency read FPrice write SetPrice;
[MVCColumn('CREATED_AT')]
property CreatedAt: TDateTime read FCreatedAt write SetCreatedAt;
[MVCColumn('UPDATED_AT')]
property UpdatedAt: TDateTime read FUpdatedAt write SetUpdatedAt;
end;
implementation
@ -94,6 +102,11 @@ begin
FCode := Value;
end;
procedure TArticle.SetCreatedAt(const Value: TDateTime);
begin
FCreatedAt := Value;
end;
procedure TArticle.SetDescription(const Value: String);
begin
FDescription := Value;
@ -104,4 +117,9 @@ begin
FPrice := Value;
end;
procedure TArticle.SetUpdatedAt(const Value: TDateTime);
begin
FUpdatedAt := Value;
end;
end.

View File

@ -104,7 +104,7 @@ end;
function TArticlesService.GetMeta: TJSONObject;
begin
FDM.dsArticles.Open('SELECT ID, CODICE as CODE, DESCRIZIONE as DESCRIPTION, PREZZO as PRICE FROM ARTICOLI WHERE TRUE = FALSE');
FDM.dsArticles.Open('SELECT ID, CODICE as CODE, DESCRIZIONE as DESCRIPTION, PREZZO as PRICE, CREATED_AT as CREATEDAT, UPDATED_AT as UPDATEDAT FROM ARTICOLI WHERE TRUE = FALSE');
Result := FDM.dsArticles.MetadataAsJSONObject();
end;

View File

@ -1,7 +1,6 @@
[FDConnectionDefs.ini]
Encoding=UTF8
;this is the default connection used by DMSContainer - all the others connection will be ignored
[articles_crud_db]
DriverID=FB
Pooling=True

View File

@ -135,6 +135,18 @@ object MainForm: TMainForm
FieldName = 'price'
Title.Caption = 'Price'
Visible = True
end
item
Expanded = False
FieldName = 'createdat'
ReadOnly = True
Visible = True
end
item
Expanded = False
FieldName = 'updatedat'
ReadOnly = True
Visible = True
end>
end
object dsArticles: TFDMemTable
@ -167,6 +179,14 @@ object MainForm: TMainForm
object dsArticlesprice: TCurrencyField
FieldName = 'price'
end
object dsArticlescreatedat: TDateTimeField
AutoGenerateValue = arDefault
FieldName = 'createdat'
end
object dsArticlesupdatedat: TDateTimeField
AutoGenerateValue = arDefault
FieldName = 'updatedat'
end
end
object dsrcArticles: TDataSource
DataSet = dsArticles

View File

@ -28,6 +28,8 @@ type
EditFilter: TEdit;
Label1: TLabel;
btnFilter: TButton;
dsArticlescreatedat: TDateTimeField;
dsArticlesupdatedat: TDateTimeField;
procedure FormCreate(Sender: TObject);
procedure dsArticlesBeforePost(DataSet: TDataSet);
procedure dsArticlesBeforeDelete(DataSet: TDataSet);

View File

@ -1,6 +1,6 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{B180E3D7-5F42-49CE-84F1-042196300A37}</ProjectGuid>
<ProjectGuid>{C3AD62C8-92C8-4742-A585-69B14E177684}</ProjectGuid>
<ProjectVersion>19.1</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>articles_crud_vcl_client.dpr</MainSource>

View File

@ -136,6 +136,22 @@ object MainForm: TMainForm
FieldName = 'price'
Title.Caption = 'Price'
Visible = True
end
item
Expanded = False
FieldName = 'createdat'
ReadOnly = True
Title.Caption = 'Created At'
Title.Color = clBtnShadow
Visible = True
end
item
Expanded = False
FieldName = 'updatedat'
ReadOnly = True
Title.Caption = 'Updated At'
Title.Color = clBtnShadow
Visible = True
end>
end
object dsArticles: TFDMemTable
@ -163,6 +179,14 @@ object MainForm: TMainForm
object dsArticlesprice: TCurrencyField
FieldName = 'price'
end
object dsArticlescreated_at: TDateTimeField
AutoGenerateValue = arDefault
FieldName = 'createdat'
end
object dsArticlesupdated_at: TDateTimeField
AutoGenerateValue = arDefault
FieldName = 'updatedat'
end
end
object dsrcArticles: TDataSource
DataSet = dsArticles

View File

@ -28,6 +28,8 @@ type
EditFilter: TEdit;
Label1: TLabel;
btnFilter: TButton;
dsArticlescreated_at: TDateTimeField;
dsArticlesupdated_at: TDateTimeField;
procedure FormCreate(Sender: TObject);
procedure dsArticlesBeforePost(DataSet: TDataSet);
procedure dsArticlesBeforeDelete(DataSet: TDataSet);

View File

@ -2,8 +2,7 @@ program articles_crud_vcl_client_api_binder;
uses
Vcl.Forms,
MainFormU in 'MainFormU.pas' {MainForm},
MVCFramework.Serializer.Defaults in '..\..\sources\MVCFramework.Serializer.Defaults.pas';
MainFormU in 'MainFormU.pas' {MainForm};
{$R *.res}

View File

@ -1,7 +1,7 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{B180E3D7-5F42-49CE-84F1-042196300A37}</ProjectGuid>
<ProjectVersion>18.8</ProjectVersion>
<ProjectVersion>19.1</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>articles_crud_vcl_client_api_binder.dpr</MainSource>
<Base>True</Base>
@ -100,7 +100,6 @@
<Form>MainForm</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="..\..\sources\MVCFramework.Serializer.Defaults.pas"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
@ -527,6 +526,32 @@
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iOS_AppStore1024">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon152">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon167">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1024">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
@ -659,6 +684,16 @@
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch768">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
@ -681,6 +716,66 @@
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_SpotLight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon180">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1125">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
@ -780,6 +875,16 @@
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch320">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
@ -791,6 +896,16 @@
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
@ -835,6 +950,86 @@
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification60">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting87">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
@ -882,6 +1077,16 @@
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSLaunchScreen">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="iOSSimulator">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>

View File

@ -1,6 +1,6 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{B180E3D7-5F42-49CE-84F1-042196300A37}</ProjectGuid>
<ProjectGuid>{24032D46-0747-4390-A3B3-70CF1A3EB327}</ProjectGuid>
<ProjectVersion>19.1</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>articles_crud_vcl_client_meta.dpr</MainSource>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1384,10 +1384,10 @@ begin
TFieldType.ftDate:
Field.AsDateTime := ISODateToDate(AJsonObject.S[lName]);
TFieldType.ftDateTime:
TFieldType.ftDateTime, TFieldType.ftTimeStamp:
Field.AsDateTime := ISOTimeStampToDateTime(AJsonObject.S[lName]);
TFieldType.ftTimeStamp, TFieldType.ftTime:
TFieldType.ftTime:
Field.AsDateTime := ISOTimeToTime(AJsonObject.S[lName]);
{$IFDEF TOKYOORBETTER}

View File

@ -247,6 +247,8 @@ type
[Test]
//[Category('this')]
procedure TestStringToDateTime_Local;
procedure TestStringToDateTime_NewYork;
procedure TestStringToDateTime_Mumbai;
end;
implementation
@ -2021,13 +2023,24 @@ begin
12 + TTimeZone.Local.UtcOffset.Hours,
12 + TTimeZone.Local.UtcOffset.Minutes, 12, 0), lDate);
// UTC "05:00" for New York on standard time (UTC-05:00)
lDate := ISOTimeStampToDateTime('2020-11-04T12:12:12-05:00');
Assert.areEqual(DateTimeToStr(EncodeDateTime(2020, 11, 4, 17, 12, 12, 0)), DateTimeToStr(lDate));
end;
procedure TTestUTC.TestStringToDateTime_Mumbai;
var
lDate: TDateTime;
begin
// UTC "+05:30" for Mumbai (UTC+05:30)
lDate := ISOTimeStampToDateTime('2020-11-04T12:12:12+05:30');
Assert.areEqual(DateTimeToStr(EncodeDateTime(2020, 11, 4, 6, 42, 12, 0)), DateTimeToStr(lDate));
Assert.areEqual(DateTimeToStr(EncodeDateTime(2020, 11, 4, 7, 42, 12, 0)), DateTimeToStr(lDate));
end;
procedure TTestUTC.TestStringToDateTime_NewYork;
var
lDate: TDateTime;
begin
// UTC "05:00" for New York on standard time (UTC-05:00)
lDate := ISOTimeStampToDateTime('2020-11-04T12:12:12-05:00');
Assert.areEqual(DateTimeToStr(EncodeDateTime(2020, 11, 4, 18, 12, 12, 0)), DateTimeToStr(lDate));
end;
initialization