我有一个包含450个字段的PDF表单,我将使用我的数据库中的数据填写它。 PDF中的每个字段都有一个唯一的名称,我可以执行以下映射:
switch (fieldname)
{
case "Name":
value = GetData(Name);
break; // Etc...
case "Date":
value = Date();
break;
default:
value = "";
break;
}
现在看起来这将变得非常复杂,快速拥有450个分支,如果添加其他文档,它可能会大量增长。有哪些潜在的模式可以解决这类问题?基本上我想将PDF字段绑定到数据库字段。
*编辑 * 因此,我只想说我有一个巨大的switch语句~450个分支,它将PDF字段名称(如'Name''Address''Phone')路由到正确的数据库查询以供执行。除了根据最终用户选择的文档而变量字段名称时,还可以通过其他方式解决此问题。
*最终修改 * 我想了一天,并提出了解决方案,感谢所有的建议。我有一个名为GetElement()的函数。它将PDF字段名称作为参数,并执行将数据库列和另一个过程名称作为映射返回的存储过程。然后使用一些动态SQL我传递我正在寻找的过程名称和列并返回结果。很难在这里选择正确的答案,但我会赞扬那个让我最接近的人。
答案 0 :(得分:4)
从我对你的整体问题知之甚少,似乎最容易将字段名称与数据库中的值一起存储。这是一个简单的名称 - 值对循环结构,并且您也不会在代码中硬编码名称字符串。更通用?希望这会有所帮助。
答案 1 :(得分:1)
我认为你正在尝试实现一个Object-Property-Value系统,这里的对象是一个具有各种属性的文档......在不同的实例中具有不同的值。
这是一个非常常见的模型,但最好是保存在除传统RDBMS之外的存储中,可能是xml数据库。
答案 2 :(得分:1)
不仅仅是一种设计模式,我会采用更简单的方法,如果我做出错误的假设,请纠正我:
一个选项是拥有一系列地图(带有键,值对),用于保存文档的配置。
当从某些配置文件(某些属性或xml文件)启动应用程序时,地图会初始化,并且地图会被缓存,因此您无需一直重新创建它们。
处理文档时,只需选择正确的地图对象并进行循环:foreach($field in $document): $field['value'] = getData(pdfMap.getValue($field));
如果您需要更改或添加某些配置,只需更改映射文件并重新启动应用程序(如果您不想重新启动,则更新地图)
答案 3 :(得分:0)
作为结构化文档,我认为Visitor将是您的最佳选择。
答案 4 :(得分:0)
您是否可以使用SELECT从数据库返回所有450个数据项,然后使用fieldname
将其编入索引?你使用哪种语言?
例如
datarow dr = GetAllData();
foreach field in document {
field.value = dr[field.Name];
};
答案 5 :(得分:0)
您可以使用与pdf字段名称相同的名称创建数据库表。然后,您可以使用此一对一映射来填充pdf文件中的值。我假设你在pdf中设置的所有内容都是字符串。
另一种方式: 如果需要关注数据类型,则需要在某处进行field->数据类型映射(例如java中的ENUM)。然后创建一个名为getValue(fieldName)的函数,该函数根据数据类型调用getString(fieldName)或getDate(fieldName)或getCurrency(fieldName)。
您的数据类型的开关案例最多为5-10。