背景故事:
我有一个将医生人口统计数据加载到我们系统中的流程。此数据可以在更新之间的任何时间和任何间隔进入。数据就是我们所说的"逐个排除",意味着源文件优先,并且数据库中不在源文件中的任何医生记录都标记为" Termed&# 34;或无效。
问题:
我需要能够将来自源数据的数据输出到平面文件目的地,作为每日报告给配套的COBOL系统。在处理之前将源数据加载到ETL.PhysicianLoad表中,并且在每次新的处理事务之前擦除ETL表,因此保留一整天的时间。没有输出文件的记录现在不可能。
示例:ProcessOutput_10152013.txt
理想情况下,输出文件应该是整个日子的全面内容。处理。意思是我想要不断追加那些日子。文件直到那天结束,然后通过电子邮件发送通知,说明该文件已准备好提取。然后,应该将在一天之后进入的任何数据放入新创建的文件中。
输出应该如下(没有标题)
BatchID | LastName | FirstName | MiddleInitial | Date
0001 | Smith | John | A | 10/15/13
0001 | Smith | Sue | R | 10/15/13
0001 | Zeller | Frank | L | 10/15/13
0002 | Peters | Paula | D | 10/15/13
0002 | Rivers | Patrick | E | 10/15/13
0002 | Waters | Oliver | G | 10/15/13
我在想什么:
我正在考虑使用一个CurrentDate变量来保存当前日期,将它与一个名为FileName的基于表达式的变量进行比较,该变量将当前的mmddyyyy连接到" ProcessOutput_.txt"。我的想法是我应该能够在目标文件夹中找到具有该名称的文件,如果它存在,我应该能够写入它。否则我将不得不创建一个新文件。然后,我可以通过表达式将我的平面文件目标设置为FileName变量。
任何人都可以看到更好的方法,或者我可能没有看到此解决方案可能出现的任何问题吗?
答案 0 :(得分:2)
我的思维过程是在正确的地方,但有缺陷。
以下是我解决问题的方法。
在尝试使用原始问题中的逻辑构建我的控制/数据流之后,我发现自己正在努力工作。
这让我再次思考,我怎样才能以最简单的方式做到这一点
首先,我是否定义了正确的变量?号。
那我错过了什么?
现在该怎么办?
将VB脚本任务添加到控制流,设置FileExists标志。
'Check to see if ProspectivePhysician_<currentdate>.txt exists.
Dts.Variables("User::FileExists").Value = File.Exists(Dts.Variables("User::FileName").Value.ToString)
现在我们已经定义了目标文件,从源表创建数据流对象。检查条件拆分中的FileExists变量。将数据流分成两个分支。创建两个名为“现有”和“新建”的平面文件目的地,暂时将它们设置到同一个平面文件位置。
如果您此时尝试运行程序包,您将收到来自两个目标之一的验证错误,因为第一个目标是拥有该文件的所有权,并且不允许第二个目标验证该文件。
如何解决此问题...使用表达式来回交换实际的FileName值。
对于现有平面文件连接字符串值,请使用以下表达式:
@ [User :: FileExists] ==是吗? @ [User :: FileName]:@ [User :: PlaceholderFile]
对于New Flat File Connection String值,请使用以下表达式:
@ [User :: FileExists] ==是吗? @ [User :: PlaceholderFile]:@ [User :: FileName]
最后,右键单击数据流中的每个平面文件目标对象,并在新平面文件目标上将Overwrite属性设置为True,在现有目标上设置为False。这将确保在现有文件上使用Append操作。