Imbricate Mail Merge cu regiuni

În unele scenarii, poate fi necesar să utilizați imbricate Mail Merge cu regiuni. Îmbinarea imbricată este o caracteristică care vă permite să îmbinați datele ierarhice din sursa de date în șablonul de îmbinare pentru a popula cu ușurință documentul. Practic, datele ierarhice sunt reprezentate ca un set de elemente de date, iar relațiile ierarhice descriu modul în care elementele de date sunt legate între ele (un element de date este părintele altuia).

Aspose.Words vă permite să efectuați o operație Mail Merge cu regiuni imbricate. Puteți utiliza această caracteristică dacă aveți o sursă de date care este organizată într-o structură arborescentă și doriți să executați o operație Mail Merge pentru a popula un șablon cu date ierarhice.

Ce este un imbricat Mail Merge

Regiunea Mail Merge se numește imbricată dacă aveți două sau mai multe regiuni Mail Merge în care una dintre ele se află în interiorul celeilalte într-o formă ierarhică. Rețineți că fiecare regiune conține date dintr-un tabel.

Cel mai comun exemplu de Mail Merge imbricat este o comandă care conține câteva elemente în care trebuie să legați multe tabele de date și să prezentați informațiile într-un șablon.

Imaginea de mai jos prezintă două regiuni imbricate în care regiunea Order Mail Merge este părintele regiunii Item mail merge.

nested_mail_merge_with_regions

Cum se procesează Mail Merge cu regiuni imbricate

Datele care urmează să fie îmbinate într-un șablon pot proveni din diverse surse, în principal baze de date relaționale sau documente XML. În exemplul nostru, vom folosi un SQLite baza de date pentru a stoca datele noastre și încărcați-l cu punerea în aplicare sursă de date personalizate.

Imaginea de mai jos demonstrează modul în care datele din tabelul Order transmise regiunilor de îmbinare imbricate vor fi legate de tabelul Item, precum și de ieșirea generată în timpul operației de îmbinare.

mail_merge_with_nested_regions

După cum puteți vedea din documentul de ieșire, fiecare comandă din tabelul Order este inserată în șablonul de îmbinare cu toate elementele aferente Comenzii din tabelul Item. Următoarea comandă va fi inserată împreună cu articolele lor până când toate comenzile și articolele sunt listate. Ordinea cuibăririi Mail Merge cu regiunile din șablon trebuie să corespundă relațiilor de date dintre tabelele din sursa de date.

Cum se creează relații de date dintr-o sursă de date personalizată

Implementați interfața IMailMergeDataSource pentru a crea relații în structura părinte-copil a sursei dvs. de date personalizate. Utilizați metoda GetChildDataSource pentru a returna datele copil relevante ale unei înregistrări părinte curente.

Următorul exemplu de cod demonstrează modul de generare a unei facturi utilizând Mail Merge imbricate cu regiuni din SQLite baza de date cu SQLiteCpp:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
void NestedMailMerge()
{
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->InsertField(u" MERGEFIELD TableStart:Customers");
builder->Write(u"Full name:\t");
builder->InsertField(u" MERGEFIELD FullName ");
builder->Write(u"\nAddress:\t");
builder->InsertField(u" MERGEFIELD Address ");
builder->Write(u"\nOrders:\n");
builder->InsertField(u" MERGEFIELD TableStart:Orders");
builder->Write(u"\tItem name:\t");
builder->InsertField(u" MERGEFIELD ItemName ");
builder->Write(u"\n\tQuantity:\t");
builder->InsertField(u" MERGEFIELD Quantity ");
builder->InsertParagraph();
builder->InsertField(u" MERGEFIELD TableEnd:Orders");
builder->InsertField(u" MERGEFIELD TableEnd:Customers");
SQLite::Database database((std::string)(DatabaseDir + u"customers.db3"));
// To be able to mail merge from your data source,
// it must be wrapped into an object that implements the IMailMergeDataSource interface.
auto customersDataSource = MakeObject<NestedMailMergeCustom::CustomersDataSource>(database);
doc->get_MailMerge()->ExecuteWithRegions(customersDataSource);
doc->Save(ArtifactsDir + u"NestedMailMergeCustom.CustomMailMerge.docx");
}
class OrdersDataSource : public MailMerging::IMailMergeDataSource
{
public:
OrdersDataSource(SQLite::Database& database, int32_t id)
: mQuery(database, "SELECT ItemName, Quantity FROM Orders WHERE CustomerId = ?")
{
mQuery.bind(1, id);
}
String get_TableName() override
{
return u"Orders";
}
bool GetValue(String fieldName, SharedPtr<Object>& fieldValue) override
{
if (fieldName == u"ItemName")
{
fieldValue = System::ObjectExt::Box<String>(String::FromUtf8(mQuery.getColumn(0).getString()));
return true;
}
if (fieldName == u"Quantity")
{
fieldValue = System::ObjectExt::Box<int32_t>(mQuery.getColumn(1).getInt());
return true;
}
fieldValue.reset();
return false;
}
bool MoveNext() override
{
return mQuery.executeStep();
}
SharedPtr<IMailMergeDataSource> GetChildDataSource(String tableName) override
{
return nullptr;
}
private:
SQLite::Statement mQuery;
};
class CustomersDataSource : public MailMerging::IMailMergeDataSource
{
public:
CustomersDataSource(SQLite::Database& database)
: mDatabase{ database }
, mQuery{ mDatabase, "SELECT * FROM Customers" }
{
}
String get_TableName() override
{
return u"Customers";
}
bool GetValue(String fieldName, SharedPtr<Object>& fieldValue) override
{
if (fieldName == u"FullName")
{
fieldValue = System::ObjectExt::Box<String>(String::FromUtf8(mQuery.getColumn(1).getString()));
return true;
}
if (fieldName == u"Address")
{
fieldValue = System::ObjectExt::Box<String>(String::FromUtf8(mQuery.getColumn(2).getString()));
return true;
}
fieldValue.reset();
return false;
}
bool MoveNext() override
{
return mQuery.executeStep();
}
SharedPtr<IMailMergeDataSource> GetChildDataSource(String tableName) override
{
if (tableName == u"Orders")
{
return MakeObject<OrdersDataSource>(mDatabase, mQuery.getColumn(0).getInt());
}
return nullptr;
}
private:
SQLite::Database& mDatabase;
SQLite::Statement mQuery;
};