处理多个表的工作流

Posted

技术标签:

【中文标题】处理多个表的工作流【英文标题】:Workflow dealing with multiple tables 【发布时间】:2016-10-07 21:50:00 【问题描述】:

在重新设计 CRM 时,我们需要将工作流程模块化。由于我们处理的各种活动和活动,我需要创建一个与各种案例项目具有一对多关系的主案例。但是,每个案例项目都需要有自己的关联数据。

我目前的设计涉及一组表格:

案例 Case_Calls Case_Emails 等等……

我们总共有十几个不同的项目。

我正在尝试找出一种组织表单以适应这些不同工作流程的好方法。理想的工作流程可能涉及在给定交互期间将多个项目添加到案例中,因此我需要一种理智的方式在同一个表单中处理它们。

最初,所有内容都是文本模板并添加到单个“长文本”字段中。这使得过滤数据或生成报告变得非常困难,因此对我们来说不是很有用。

下一次迭代涉及一个选项卡控件,每个案例项目都有一个不同的选项卡。然而,这会导致行为问题,并且不能很好地处理我正在寻找的不同项目类型的数量;其中额外的选项卡导致需要水平滚动,这只会让每个人都生气。

所以现在我很茫然。怎样才能最好地设计易用性?

编辑:按照建议,这里是当前(损坏的)迭代的一些屏幕截图:

在每个选项卡包含一个子表单的意义上它是损坏的,但不能保证在创建子表单记录之前创建案例。也没有直接的方法来以这种方式强制执行仅创建工作流。

【问题讨论】:

您是否尝试过使用选项卡控件的“多行”属性?这可以减少对水平滚动的需求。 仅供参考,您需要将“使用主题”属性设置为否,才能在较新版本的 Access 中使用。 你能添加几张你描述的迭代的截图吗?如果我们能看到您的目标,我们会更容易提供帮助。 @Rominus 感谢您的建议,我已经添加了截图。 您能否在创建案例之前隐藏子表单/页面,或者在打开此表单之前使用其他表单来确保创建案例。 【参考方案1】:

也许你应该完全忘记你的旧系统并重新思考。

我能想到的你目前的情景:

您的员工正在接听电话或为案例做笔记,他们目前正在将其写在纸上、Excel 或您的应用程序上!他们肯定会注意到谁打电话和打电话的时间? 这是你的重点!

作为开发人员,您必须确保用户遵循正确的流程,否则您必须准备不同的场景。

实际上,如果不存在案例记录,则不会有任何关于“案例”的电子邮件。通过遵循此规则,您的应用不应允许在没有有效案例记录的情况下发送电子邮件/做笔记。

如果在收到笔记/电子邮件时无法获得案例详细信息,您仍必须使用您拥有的任何可用数据创建“案例”记录。例如谁采取了行动?什么日期时间? 有了这些数据,您可以插入案例记录,然后让您的员工继续添加笔记、电子邮件。

假设:

您的所有子表单都有有效的链接主子值 您正在打开您的案例表单以添加新记录:
docmd.OpenForm "your_case_form",acNormal,,,acFormAdd

在您的“your_case_form”form_load 事件中,您可以检查表单是否已准备好输入新的详细信息。像这样的。

Private Sub Form_Load()
    if( Me.NewRecord) then
        me.txt_added_by.value = your_way_of_username
        me.txt_added_date.value = now()
    END IF

End Sub

上面的代码将输入用户名和当前时间戳自动生成案例记录(假设您的案例表没有任何“非空”字段并且 ID 是自动编号)

然后,您的员工可以移动到任何子表单,该子表单将自动触发案例表的保存操作您就有了您的案例记录!

在插入子表单之前,您还可以检查父/案例记录是否可用。

if (nz(me.parent!txt_case_id.value,0) =0) then
    'case id not found..
    'you can advise the user to enter anything on the case section to create a record or you can use SQL to insert a record
    'or you could cancel the insert, move/set focus to parent form. add datetime / username to create record 
end if

关键是,您需要确保在允许子记录之前创建父记录。

【讨论】:

【参考方案2】:

要解决未链接记录问题,您需要在子表单的属性中设置链接主字段和链接子字段。在下面的屏幕截图中,我的链接字段是 SUBSCRIBER_ID,您的字段是 Case ID(或任何实际的 varname)。

编辑:提问者已经完成了上述操作,因此涵盖了该步骤

您可以在“新呼叫”按钮中对空案例 ID 进行 VBA 检查(或者创建新的呼叫/电子邮件记录)。像这样的:

If IsNull(Me.Case_ID) Then
    MsgBox "Before adding a call you need to create a Case ID, please do so first"
    Me.Undo
Else
    [Whatever the button really does]
End If

根据您放置代码的位置,您可能不需要Me.Undo。如果它是 On Click 按钮,您可能不会。如果是在呼叫/电子邮件 ID 更新之前,您可能会这样做。

关于滚动,您可以为每种类型的数据设置一个按钮,而不是显示整个选项卡式子表单框,当按下该按钮时,该按钮会为该数据弹出一个表单。因此,对于呼叫,您会在覆盖窗口中弹出类似于您在上一个屏幕截图底部显示的内容,没有选项卡。您希望弹出表单上的关闭按钮返回到主表单。

【讨论】:

这似乎没有回答问题,而是回答了以前的不良行为。如问题和 cmets 所示,我想摆脱现有的设计。此外,我的表格已经像这样链接了。旧设计的问题(我希望再次摆脱)是在子表单中创建记录不会强制在主表单中创建记录。如果我先创建主表单记录,则子表单已正确链接。但是,首先创建子表单记录会分配案例 ID 0。 好吧,我误会了。如果你已经知道答案是不同的,当然。【参考方案3】:

你不会解决这个问题的:

不能保证在创建子表单记录之前创建案例

他们必须先创建案例标题行,然后才能创建相关子项。无论是通过选项卡、按钮还是子类型列表打开相关的子表单都无关紧要,它们在功能上是相同的。

如果他们真的想创建没有案例的孩子,您可以创建一个“孤儿院”案例行并让他们将它们添加到那里,但随后他们会要求一种方法将孩子从孤儿院转移到他们的案例中一开始就应该选的。


如果这是您的问题:creating a record in subform does not enforce a record in the main form. 在选择父案例记录之前,您可以禁用或隐藏子表单吗?在什么情况下,您会在分配给case 0 的子表单中获得新行? Case 0 存在吗?如果是这样,那就是在充当你的孤儿院。

【讨论】:

以上是关于处理多个表的工作流的主要内容,如果未能解决你的问题,请参考以下文章

用C语言写CSV文件,如何写出多个工作表?

excel多个表格合并成一个工作表的方法

将多个 html 表转换为具有多个工作表的 Excel 工作簿

跨多个工作表的 VBA 宏

工作簿和工作表的区别

MS Access VBA:创建具有多个工作表的 Excel 工作簿