Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠœΠΈΡ€ InterBase. АрхитСктура, администрированиС ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² InterBase/FireBird/YaffilΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор А Ковязин

ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌ CategoriesTransaction Π² CategoriesReadTransaction ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ CategoriesWriteTransaction. ПослС этого Π·Π°Π΄Π°Π΄ΠΈΠΌ свойство UpdateTransaction Ρƒ CategoriesDataSet Π² CategoriesWriteTransaction. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ CategoriesDataSet ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ сразу ΠΊ Π΄Π²ΡƒΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ TpFTBTransaction (рис. 2.26).





Рис 2.26. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΈ ΠΏΠΈΡˆΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

ПослС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Post ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ CategoriesDataSet Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Commit Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° CategoriesWriteTransaction. Однако, учитывая, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π² контСкстС совсСм Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (CategoriesReadTransaction), это Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ закрытия всСго CategoriesDataSet. To Π΅ΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ FIBPlus, ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ настоящий Ρ€Π΅ΠΆΠΈΠΌ AutoCommit, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Deadlock ΠΈ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ "Π²ΠΈΠ΄Π΅Ρ‚ΡŒ" Π½Π°ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния всСх записСй. ΠŸΡ€ΠΈ использовании BDE Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ AutoCommit Π²Ρ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ значСния записСй, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ запрос.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, для InterBase Π΄ΠΎ вСрсии 6.5 слишком частый Π²Ρ‹Π·ΠΎΠ² CommitRetaining ΠΌΠΎΠ³ привСсти ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ "Π·Π°Ρ…Π²Π°Ρ‚Ρƒ" рСсурсов сСрвСром. ΠŸΡ€ΠΈ использовании ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ AutoCommit Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сСрвСра для Π»ΡŽΠ±Ρ‹Ρ… вСрсий InterBase.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ master-detail. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ TpFIBDatabase ΠΈ TpFIBDataSet

ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ катСгориях Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ вопросам, связанным с построСниСм связки master-detail. Для этого ΠΌΡ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

GoodsSource: TDataSource;

GoodsGrid: TDBGrid;

GoodsDataSet: TpFIBDataSet;

GoodsReadTransaction: TpFIBTransaction;

GoodsWriteTransaction: TpFIBTransaction;

AddGoodsButton: TButton;

EditGoodsButton: TButton;

DeleteGoodsButton: TButton;

"БвяТСм" ΠΈΡ… Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈ напишСм SelectSQL для GoodsDataSet:

SELECT * FROM "Goods"

WHERE "IdCategory" = :"Id"

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ detail-запроса Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° : "Id" Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒΡΡ ΠΈΠ· поля "Id" Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "Categories". Π§Ρ‚ΠΎΠ±Ρ‹ это происходило автоматичСски, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ свойство GoodsDataSet.DataSource Ρ€Π°Π²Π½Ρ‹ΠΌ CategoriesSource. Π’Π΅ΠΏΠ΅Ρ€ΡŒ сгСнСрируСм ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ запросы для GoodsDataSet Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ это Ρ€Π°Π½ΡŒΡˆΠ΅ для CategoriesDataSet.

ПослС автоматичСской Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ внСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ измСнСния Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ запросы. Рассмотрим, Π² частности, запрос для InsertSQL:

INSERT INTO "Goods"(

"Id",

"Name",

"Price",

"IdCategory" )

VALUES(

:"Id",

:"Name",

:"Price",

:"IdCategory"

)

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΎΠ²Π°Ρ€Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ : "IdCategory" Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ поля "Id" ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "Categories". FIBPlus позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ это автоматичСски ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ прСфикса "MAS_", ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅:

INSERT INTO "Goods"(

"Id" ,

"Name",

"Price",

"IdCategory" )

VALUES(

:"Id",

:"Name",

:"Price",

:"MAS_Id"

)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для поля "Goods"."IdCategory" Π½ΡƒΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· поля "Id" Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "Categories", которая являСтся master- Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "Goods". To ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ внСсти Π² запрос UpdateSQL

UPDATE "Goods" SET

"Id" = :"Id",

"Name" = :"Name",

"Price" = :"Price",

"IdCategory" = :"MAS_Id"

WHERE

"Id" = 'OLD_Id"

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ FormCreate:

procedure TMainForm.FormCreate(Sender: TObject);

begin

with TimFile. Create (' ib_price. mi ') do begin

pFIBDatabasel.DBName := ReadStringt'Options', 'DBPath',

'C:\IBPRICE.GDB');

Free;

end;

pFIBDatabasel.Open;

CategoriesDataSet.Open;

GoodsDataSet.Open;

end;

He Π·Π°Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ свойства AutoUpdateOptions, Ρ‡Ρ‚ΠΎΠ±Ρ‹ GoodsDataSet автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π» значСния ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° (рис 2 27)

МоТно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π”Π²ΠΈΠ³Π°ΡΡΡŒ Π²Π²Π΅Ρ€Ρ… ΠΈ Π²Π½ΠΈΠ· ΠΏΠΎ CategoriesGrid, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ автоматичСски измСняСтся содСрТимоС Π² GoodsGrid Бвязка master-detail ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

FIBPlus позволяСт Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° master-detail. Π’ частности, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈ detail-dataset (GoodsDataSet) "Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ", ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ явного Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Open Π’ случаС с простой связкой это Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ нСсколько Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ master-detail ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ - master-detail-subdetail, Ρ‚ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ всСх запросов ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ привСсти ΠΊ ошибкС. Π’Ρ‹ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹ΠΉ запрос послС основного.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ³ΠΎ кодирования, TpFEBDataSet содСрТит ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ свойство DetailConditions (рис. 2.28).





Рис 2.27. ИспользованиС AutoUpdateOptions Π΄Π»Π» Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° GoodsDdtabet





Рис 2.28. Бвойаво DetailConditions

Π—Π°Π΄Π°Π² ΠΊΠ»ΡŽΡ‡ dcForceOpen. ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ detail- запрос Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ послС открытия master-запроса. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ строку GoodsDataSet.Open ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CreateForm. Какова Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π»Π° Π³Π»ΡƒΠ±ΠΈΠ½Π° связок master-detail, всС запросы Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС.

Вторая ваТная опция - это ΠΊΠ»ΡŽΡ‡ dcWaitEndMastei Scroll ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСдвигаСтся ΠΏΠΎ CategonesGrid, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ². ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° мСняСтся тСкущая запись Π² CategoriesGrid, GoodsDataSet автоматичСски ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ запрос Π·Π°Π½ΠΎΠ²ΠΎ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ mastei-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΠΈΡŽ довольно "тяТСлых" запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ бСсполСзный сСтСвой Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π±Ρ‹Π»ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ detail-запрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ всС-Ρ‚Π°ΠΊΠΈ нашСл Π½ΡƒΠΆΠ½ΡƒΡŽ Π΅ΠΌΡƒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Π² CategoriesGrid. FIBPlus позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… запросов. Если ΠΊΠ»ΡŽΡ‡ dcWaitEndMasterScroll Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² DetailConditions, Ρ‚ΠΎ detail-запрос пСрСоткрываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°ΡƒΠ·Ρ‹ (Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ ΠΏΠ°ΡƒΠ·Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, задавая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства WaitEndMasterlnterval).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ просто пСрСдвигаСтся ΠΏΠΎ CategoriesGrid, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ записи "Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚" Ρ‚Π°ΠΉΠΌΠ΅Ρ€ detail-запроса. Если Π·Π° врСмя ΠΏΠ°ΡƒΠ·Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ успСваСт ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ запись, Ρ‚ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ сбрасываСтся. И Ρ‚Π°ΠΊ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ остановится Π½Π° Π½ΡƒΠΆΠ½ΠΎΠΉ записи. Волько послС этого detail-запрос пСрСоткрываСтся, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, GoodsDataSet выполняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ запрос вмСсто Ρ†Π΅Π»ΠΎΠΉ сСрии.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π² DetailConditions управляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ master- Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ detail-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ "Categories" сущСствуСт ΠΏΠΎΠ»Π΅ "GoodsCount", Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится количСство Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Когда ΠΌΡ‹ добавляСм ΠΈΠ»ΠΈ удаляСм Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈΠ· ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, Ρ‚ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π»Π΅Π³ΠΊΠΎ рСализуСтся ΠΏΠ°Ρ€ΠΎΠΉ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ² для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "Goods":

CREATE TRIGGER "Goods_AI" FOR "Goods" ACTIVE

AFTER INSERT POSITION 0

AS

BEGIN

update "Categories" set

"GoodsCount" = (select count("Id") from "Goods" where

"IdCategory" = New."IdCategory")

where "Id" = New."IdCategory";

END^

CREATE TRIGGER "Goods_BD" FOR "Goods" ACTIVE

BEFORE DELETE POSITION 0

AS

BEGIN

update "Categories" set

"GoodsCount" = (select count("Id") from "Goods" where

"IdCategory" = Old."IdCategory")

where "Id" = Old."IdCategory";

END^

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ происходящих дСйствий, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ наимСнования Ρ‚ΠΎΠ²Π°Ρ€Π° для ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ.

Π’ GoodsDataSet формируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ поля "Id" ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

ЗначСния ΠΏΠΎΠ»Π΅ΠΉ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

ПослС наТатия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ клавиши Enter GoodsData ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ запрос ΠΈΠ· свойства InsertSQL ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΈ заполняСт значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями ΠΏΠΎΠ»Π΅ΠΉ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ :"IdCategory" заполняСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ поля "Id" ΠΈΠ· CategoriesDataSet.

Запрос выполняСтся ΠΈ выполняСтся Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ "Goods_AI".

Вранзакция GoodsWriteTransaction автоматичСски ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ сдСланныС измСнСния ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Commit.

ВыполняСтся запрос ΠΈΠ· свойства RefreshSQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ значСния ΠΏΠΎΠ»Π΅ΠΉ вставлСнной Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ "Goods" записи, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° извСстном Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ поля "Id".

Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля "GoodsCount" ΡƒΠΆΠ΅ измСнилось, Π½ΠΎ это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отраТаСтся Π² CategoriesGrid. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ запись Π² CategoriesDataSet, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСх ΠΏΠΎΠ»Π΅ΠΉ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ явного Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CategoriesDataSet.Refresh. Однако этот ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π² случаС удалСния записи ΠΈΠ· GoodsDataSet. А Ссли Π±Ρ‹ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ master ΠΈ detail-Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ, Ρ‚ΠΎ, скорСС всСго, ΠΌΠ΅Ρ‚ΠΎΠ΄ Refresh Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ послС ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ВмСсто всСго этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ dcForceMasterRetresh. Π­Ρ‚ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Refresh Ρƒ master, Ссли detail Π±Ρ‹Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°. Если Π²Ρ‹ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ сами ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля "GoodsCount" автоматичСски измСняСтся ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ записСй Π² GoodsDataSet.

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… FIBPIus

ΠžΠΏΡ†ΠΈΠΈ ΠΈ настройки TpFIBDatabase

TpFIBDatabase содСрТит ряд ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. ΠœΡ‹ ΡƒΠΆΠ΅ описывали основныС Π²Π΅Ρ‰ΠΈ, связанныС с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности TpFIBDatabase ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ "Π·Π° ΠΊΠ°Π΄Ρ€ΠΎΠΌ".