ซ้อนกัน Mail Merge กับภูมิภาค

ในบางสถานการณ์คุณอาจต้องใช้ซ้อนกัน Mail Merge กับภูมิภาค ผสานซ้อนกันเป็นคุณลักษณะที่ช่วยให้คุณสามารถผสานข้อมูลลำดับชั้นจากแหล่งข้อมูลของคุณ มสัมพันธ์ลำดับชั้นอธิบายวิธีที่รายการข้อมูลที่เกี่ยวข้องกับแต่ละอื่นๆ(รายการหนึ่งของข้อมูล.

Aspose.Words ช่วยให้คุณสามารถดำเนินการ Mail Merge การดำเนินงานที่มีภูมิภาคที่ซ้อนกัน คุณสามารถใช้คุณลักษณะนี้ถ้าคุณมีแหล่งข้อมูลที่จัดเป็นโครงสร้างเหมือนต้นไม้และคุณต้อง Mail Merge การดำเนินการเพื่อเติมแม่แบบที่มีข้อมูลลำดับชั้น.

อะไรคือสิ่งที่ซ้อนกัน Mail Merge

ร Mail Merge พื้นที่เรียกว่าซ้อนกันถ้าคุณมีสองหรือมากกว่า Mail Merge ภูมิภาคที่หนึ่งของพวกเขาอยู่ในอื่นๆในรูปแบบลำดับชั้น โปรดทราบว่าแต่ละภูมิภาคมีข้อมูลจากตารางหนึ่ง.

ตัวอย่างที่พบบ่อยที่สุดของการซ้อนกัน Mail Merge เป็นคำสั่งที่มีไม่กี่รายการที่คุณจำเป็นต้องเชื่อมโยงตารางข้อมูลจำนวนมากและนำเสนอข้.

ภาพด้านล่างแสดงสองภูมิภาคที่ซ้อนกันที่ Order Mail Merge ภูมิภาคเป็นผู้ปกครองของ Item Mail Merge region.

nested_mail_merge_with_regions

วิธีการประมวลผล Mail Merge ด้วยภูมิภาคที่ซ้อนกัน

การเขียนข้อความโฆษณา,การเขียนในนามคนอื่น,บทความ,การเขียนบทความใหม่,การเขียน XML เอกสาร ในตัวอย่างของเราเราจะใช้ SQLite การประมวลผลข้อมูล,คีย์ข้อมูล,การพิมพ์ดีดคัดลอก.

ภาพด้านล่างแสดงให้เห็นว่าข้อมูลจาก Order ตารางที่ส่งผ่านไปยังพื้นที่ผสานที่ซ้อนกันจะเชื่อมโยงกับ Item ตารางเช่นเดียวกับการส่งออกที่สร้างขึ้นในระหว่างการดำเนินการผสาน.

mail_merge_with_nested_regions

ที่คุณสามารถดูจากเอกสารที่ส่งออกแต่ละคำสั่งจาก Order ตารางจะถูกแทรกลงในเทมเพลตผสานกับรายการที่เกี่ยวข้องกับการสั่งซื้อทั้งหมดจาก Item โต๊ะ คำสั่งต่อไปจะถูกแทรกพร้อมกับรายการของพวกเขาจนกว่าคำสั่งซื้อทั้งหมดและรายการที่ ลำดับของการทำรัง Mail Merge ด้วยพื้นที่ในเทมเพลตต้องตรงกับความสัมพันธ์ของข้อมูลระหว่างตารางในแหล่งข้อมูล.

วิธีการสร้างความสัมพันธ์ข้อมูลจากแหล่งข้อมูลที่กำหนดเอง

ใช้ IMailMergeDataSource อินเทอร์เฟซเพื่อสร้างความสัมพันธ์ในโครงสร้างแม่และเด็กของแหล่งข้อมูลที่กำหนดเอง ใช้ GetChildDataSource วิธีการส่งคืนข้อมูลเด็กที่เกี่ยวข้องของระเบียนหลักปัจจุบัน.

ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นถึงวิธีการสร้างใบแจ้งหนี้โดยใช้ซ้อนกัน Mail Merge กับภูมิภาคจาก SQLite ฐานข้อมูลที่มี 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;
};