CRUD

TsgcHTMLComponent_CRUD: tek bir tablonun listesi, araması, sayfalaması, oluşturma ve düzenleme formu, silme onayı ve yazma yolu, bir TDataSet ya da kendi SQL'iniz üzerinde tek bir bileşen olarak, Delphi, C++ Builder ve .NET'te.

TsgcHTMLComponent_CRUD

Her iş uygulamasının her tablo için yeniden yazdığı sayfa, tek bir bileşen olarak. Ona bir anahtar alan ve bir rota öneki verin, ardından bir TDataSet bağlayın ya da kendi SQL'iniz üzerinde altı yöntemden oluşan bir adaptör verin. ShowList işaretlemeyi döndürür, sayfanın geri gönderdiği ise ProcessAction üzerinden geçer.

Bileşen sınıfı

TsgcHTMLComponent_CRUD, aynı birimdeki TsgcHTMLCRUDAdapter ve TsgcHTMLCRUDAdapter_DataSet ile birlikte

İşler

Arama ve sayfalayıcı içeren liste, oluşturma ve düzenleme formu ve silme onayı

Diller

Delphi, C++ Builder, .NET

Bir veri kümesi bağlayın ya da adaptörü yazın

KeyField ve RoutePrefix değerlerini ayarlayın, etkin bir DataSet bağlayın ve ShowList(search, page) çağırın. Kendi SQL'iniz için bunun yerine bileşene SetAdapter ile bir adaptör verin. Sayfanın geri gönderdiklerini ProcessAction üzerinden yönlendirin.

uses
  Classes, sgcHTML_Component_CRUD;

var
  oCRUD: TsgcHTMLComponent_CRUD;
  vHTML: string;
begin
  oCRUD := TsgcHTMLComponent_CRUD.Create(nil);
  try
    oCRUD.CRUDID := 'customers';
    oCRUD.Title := 'Customers';
    oCRUD.RoutePrefix := '/customers';
    oCRUD.KeyField := 'ID';
    oCRUD.PageSize := 15;
    oCRUD.Actions := [caCreate, caEdit, caDelete, caView, caExport];
    oCRUD.VersionField := 'UPDATED_AT';   // optimistic locking
    oCRUD.OnValidate := CustomersValidate;

    // an active dataset: the columns are read off it
    oCRUD.DataSet := qryCustomers;

    vHTML := oCRUD.ShowList('', 1);   // search text, page number
  finally
    oCRUD.Free;
  end;
end;

// The rules that are about your data. Add a line per problem: nothing is
// written and the form comes back with the messages.
procedure TServer.CustomersValidate(Sender: TObject;
  aOperation: TsgcHTMLCRUDOperation; const aKey: string;
  aValues, aErrors: TStrings);
begin
  if Length(Trim(aValues.Values['NAME'])) < 3 then
    aErrors.Add('The name needs at least three characters.');
end;

// A message from the browser carries action, crud and key with the form fields
if oCRUD.ProcessAction(vAction, vKey, oFields, vHTML) then
  aResponse := vHTML;   // the markup to swap into the page

// Or over your own SQL: an adapter of six methods
type
  TCustomersAdapter = class(TsgcHTMLCRUDAdapter)
  public
    function Locate(const aKey: string): Boolean; override;
    function Read(const aKey: string; aValues: TStrings): Boolean; override;
    function List(const aSearch: string; aPage, aPageSize: Integer;
      aRows: TStrings): Integer; override;
    function Insert(aValues: TStrings; var aKey: string;
      aErrors: TStrings): Boolean; override;
    function Update(const aKey: string; aValues, aErrors: TStrings): Boolean;
      override;
    function Delete(const aKey: string; aErrors: TStrings): Boolean; override;
  end;

oCRUD.SetAdapter(TCustomersAdapter.Create(oCRUD));   // the component owns it
// includes: sgcHTML_Component_CRUD.hpp

TsgcHTMLComponent_CRUD *oCRUD = new TsgcHTMLComponent_CRUD(NULL);
try
{
  oCRUD->CRUDID = "customers";
  oCRUD->Title = "Customers";
  oCRUD->RoutePrefix = "/customers";
  oCRUD->KeyField = "ID";
  oCRUD->PageSize = 15;
  oCRUD->Actions = TsgcHTMLCRUDActions() << caCreate << caEdit << caDelete
    << caView << caExport;
  oCRUD->VersionField = "UPDATED_AT";   // optimistic locking
  oCRUD->OnValidate = CustomersValidate;

  // an active dataset: the columns are read off it
  oCRUD->DataSet = qryCustomers;

  String html = oCRUD->ShowList("", 1);   // search text, page number
}
__finally
{
  delete oCRUD;
}

// The rules that are about your data. Add a line per problem: nothing is
// written and the form comes back with the messages.
void __fastcall TServer::CustomersValidate(TObject *Sender,
  TsgcHTMLCRUDOperation aOperation, const String aKey,
  TStrings *aValues, TStrings *aErrors)
{
  if (aValues->Values["NAME"].Trim().Length() < 3)
    aErrors->Add("The name needs at least three characters.");
}

// A message from the browser carries action, crud and key with the form fields
String html;
if (oCRUD->ProcessAction(action, key, fields, html))
  response = html;   // the markup to swap into the page

// For your own SQL, derive from TsgcHTMLCRUDAdapter, override its six methods
// (Locate, Read, List, Insert, Update, Delete) and call oCRUD->SetAdapter().
using System.Collections.Generic;
using esegece.sgcWebSockets;

var crud = new TsgcHTMLComponent_CRUD();
crud.CRUDID = "customers";
crud.Title = "Customers";
crud.RoutePrefix = "/customers";
crud.KeyField = "ID";
crud.PageSize = 15;
crud.Actions = TsgcHTMLCRUDActions.caCreate | TsgcHTMLCRUDActions.caEdit
    | TsgcHTMLCRUDActions.caDelete | TsgcHTMLCRUDActions.caView
    | TsgcHTMLCRUDActions.caExport;
crud.VersionField = "UPDATED_AT";   // optimistic locking

// The key travels with the page: it is in neither the list nor the form
var id = crud.Columns.Add();
id.FieldName = "ID";
id.InList = false;
id.InForm = false;

var name = crud.Columns.Add();
name.FieldName = "NAME";
name.Caption = "Name";
name.Required = true;
name.MaxLength = 120;

// There is no TDataSet: read a DataTable, an IList<T> or a table behind a DbConnection
crud.SetAdapter(new TsgcHTMLCRUDAdapter_DataTable(crud, customersTable));

// The rules that are about your data
crud.OnValidate += (object sender, TsgcHTMLCRUDOperation op, string recordKey,
    List<string> values, List<string> errors) =>
{
    if (TsgcHTMLComponent_CRUD.ValueOf(values, "NAME").Trim().Length < 3)
        errors.Add("The name needs at least three characters.");
};

string html = crud.ShowList("", 1);   // search text, page number

// A message from the browser carries action, crud and key with the form fields
if (crud.ProcessAction(action, key, fields, out string reply))
    response = reply;   // the markup to swap into the page

Temel özellikler & yöntemler

En sık başvurduğunuz üyeler.

Adaptör

TsgcHTMLCRUDAdapter yazma yoludur ve altı sanal yöntemi vardır: Locate, Read, List, Insert, Update ve Delete. TsgcHTMLCRUDAdapter_DataSet bağlı veri kümesi üzerinde çalışır, SetAdapter ise bileşene kendi adaptörünüzü verir ve sahipliğini devralır. List bir sayfayı sekmeyle ayrılmış satırlar olarak, anahtarı son hücre olarak döndürür ve tüm kümenin kaç satırı olduğunu geri verir.

.NET'te

TDataSet yoktur, bu yüzden .NET portu üç adaptörle gelir: TsgcHTMLCRUDAdapter_DataTable (bir DataTable üzerinde), TsgcHTMLCRUDAdapter_List<T> (herhangi bir IList<T> üzerinde) ve TsgcHTMLCRUDAdapter_DbConnection (bir DbConnection arkasındaki tablo üzerinde); her değer parametre olarak gönderilir. Columns koleksiyonunu bildirin: sütunlar tablodan okunmaz.

Sayfa

ShowList(search, page), ShowNew, ShowEdit(key), Save(key, values, html) ve DeleteRecord(key, html) her biri, host'un yerine koyduğu işaretlemeyi döndürür. ProcessAction, gönderilen crudList, crudNew, crudEdit, crudSave ve crudDelete eylemlerini bunlara yönlendirir ve başka herhangi bir eylem için False döndürür, böylece bir sayfa birden çok bileşen barındırabilir.

Sayfa seçenekleri

Actions, caCreate, caEdit, caDelete, caView ve caExport değerlerinden oluşan bir kümedir ve yalnızca caView içeren bir sayfa bir rapordur. EditMode cemModal ya da cemPage olur, ConfirmDelete silmeden önce sorar, PageSize varsayılan olarak 25'tir ve hiçbir zaman 500'ü aşmaz, SearchFields ise arama kutusunun baktığı alanları noktalı virgülle ayırarak listeler.

Sütunlar

Bir TsgcHTMLCRUDColumn öğesinin FieldName, Caption, Visible, ReadOnly, Required, InList, InForm, Width ve MaxLength özellikleri vardır. Hiçbiri bildirilmemişse bileşen bunları etkin veri kümesinden okur: başlık DisplayLabel üzerinden, zorunlu bayrağı ve uzunluk da alandan alınır; anahtar gösterilir ama hiçbir zaman düzenlenmez. LoadColumnsFromDataSet bunu istek üzerine yapar.

Doğrulama

Boş bırakılmış zorunlu bir sütun ve MaxLength değerinden uzun bir değer önce reddedilir. Ardından OnValidate olayına sorulur: her sorun için aErrors içine bir satır ekleyin, hiçbir şey yazılmaz ve form iletilerle geri döner. OnApplyUpdates adaptörden önce çalışır ve aHandled ayarlandığında yazma işlemi size kalır. OnApplied, bir yazma işlemi tamamlandıktan sonra tetiklenir; günlüğe kaydetmek ya da listeye bakan diğer kişileri yenilemek için kullanılır.

İyimser kilitleme

VersionField içinde bir sürüm alanı belirtin. Kaydetme işlemi tarayıcının gönderdiği ile saklanan değeri karşılaştırır ve arada başka biri kaydı değiştirmişse yazmayı reddeder; böylece Kaydet düğmesine ikinci basan kişi ilkinin üzerine yazmaz.

Ana ve detay

Details bir kaydın alt listelerini tutar. Her öğe başka bir TsgcHTMLComponent_CRUD bileşenini CRUD içinde, alt kayıtta ana anahtarı tutan alanı MasterField içinde ve bir Caption belirtir. Bir kayıt düzenlenirken bunlar formun altında işlenir. SetMaster(field, value) bir listeyi tek bir ana kayda daraltır.

CSV dışa aktarma

caExport ile araç çubuğu, RoutePath('export.csv') adresine giden bir Dışa Aktar bağlantısı gösterir. Bu rotayı GetExportCSV(search) ile yanıtlayın: liste hangi aramayı gösteriyorsa onu, en fazla 500 satır olarak dışa aktarır, tablonun tamamını değil. Her değer tırnak içine alınır, bu yüzden bir virgül ya da satır sonu dosyayı bozamaz.

Anahtar önce bulunur

Her anahtar tarayıcıdan gelir. ShowEdit, Save ve DeleteRecord, herhangi bir şey düzenlenmeden ya da silinmeden önce adaptörden anahtarı Locate ile bulmasını ister; böylece bir URL'deki sayıyı değiştirmek hiçbir zaman başka bir kayda ulaşmaz. Actions da uygulanır: caDelete içermeyen bir sayfa, sahte bir form silme gönderse bile silmeyi reddeder. Hücre ve alan değerleri kaçışlanır, bu yüzden işaretleme içeren bir kayıt metin olarak gösterilir.

Soket ve HTTP

Arama kutusu, Yeni, Düzenle, Sil ve form, data-sgc-ws-send ile işaretlenmiş formlardır; her birinde gizli action, crud ve key alanları bulunur ve host bunları ProcessAction yöntemine verir. Soket üzerinden gelen bir ileti yol taşımaz ve yönlendiriciye hiçbir zaman ulaşmaz, bu yüzden yetkilendirmeyi kendiniz yapın. Delphi'de TsgcHTMX_Engine_Server.MessageSession, el sıkışma çerezlerinin arkasındaki oturumu ya da nil döndürür. HTTP için RoutePath, bir host'un motor yönlendiricisinde bildirdiği yolları oluşturur: /customers, /customers/new, /customers/{id}/edit, /customers/save ve /customers/{id}/delete.

Başlamanın yolları

Yukarıdaki gibi kodla oluşturun ya da Delphi IDE'deki sihirbazı kullanın: Tools › New sgcHTML CRUD page açık formdaki veri kümelerini listeler, seçtiğiniz veri kümesinin alanlarını okur ve forma yapılandırılmış bir bileşen ekler; iki bağlantı satırı panoya kopyalanır. Delphi 10.4 veya üstünü gerektirir. IDE dışında sgcHTMLGen komut satırı aracı, tablodan, rota önekinden ve name:flag biçiminde yazılan alanlardan sayfanın kaynağını Object Pascal ya da C# olarak yazar, örneğin ID:key veya NAME:req:60.

Kullanılabilirlik

sgcHTML'in bir parçasıdır ve sgcHTML, sgcWebSockets'ten bağımsız olarak satılır. Birim, SGC_HTML tanımlı olduğu yerde derlenir; sgcVer.inc bunu HTML paketi için Android ve iOS dışındaki tüm platformlarda tanımlar. Demo Demos\60.HTML\01.RunTime\02.AdminCRUD klasörüdür; müşteriler alanı burada, yerine geçtiği elle yazılmış sayfanın yanında bu bileşenle oluşturulmuştur.

Keşfetmeye devam edin

Çevrimiçi yardımCRUD sayfaları, adaptör ve yazma yolu için kullanım kılavuzu.
Tüm sgcHTML Bileşenleri80'den fazla bileşenin tam özellik matrisine göz atın.
Ücretsiz Deneme Sürümünü İndirin30 günlük deneme, 60.HTML demo projeleriyle birlikte gelir.
FiyatlandırmaTam kaynak kodlu Single, Team ve Site lisansları.
En avantajlı seçenek: All-AccessTüm eSeGeCe ürünleri, Premium Destek dahil, yılda €1,059'dan itibaren.
All-Access fiyatlarına bakın

Başlamaya Hazır mısınız?

Ücretsiz deneme sürümünü indirin ve Delphi, C++ Builder ve .NET'te web arayüzleri oluşturmaya başlayın.