【问题标题】:fixed width text file from two tables来自两个表的固定宽度文本文件
【发布时间】:2014-05-23 03:08:40
【问题描述】:

我需要指出正确的方向。我需要从 Access 创建一个固定宽度的文件。数据将来自 2 个表(雇主和雇员)。文本文件必须显示雇主记录,然后下一条记录将包含雇员数据。然后将生成的文件布局用于上传到单独的系统。

例如:

雇主表

RecordID - 2 char - always 01
EmployerNumber - 6 char
EmployerName - 25 char
ReportID (pk) - Not included on text file, only used to relate employer with employee

员工表

RecordID - 2 char - always 02
EmployeeNumber - 4 char
EmployeeName - 25 char
ReportID (fk) - Not included on text file, only used to relate employee with employer

生成的文本文件:

01012345PENGUINS
028686CROSBY
027777MALKIN
026666LEMIEUX
01012345ACME INC
021122BUGS BUNNY
021133DAFFY DUCK
029872ROAD RUNNER

【问题讨论】:

    标签: ms-access vba ms-access-2010


    【解决方案1】:

    假设 [ReportID] 是整数,因此 [Employer] 的示例数据如下所示...

    ReportID  EmployerNumber  EmployerName  RecordID
    --------  --------------  ------------  --------
           1  012345          PENGUINS      01      
           2  012345          ACME INC      01      
    

    ... 而这对于 [Employee] ...

    ReportID  EmployeeNumber  EmployeeName  RecordID
    --------  --------------  ------------  --------
           1  8686            CROSBY        02      
           1  7777            MALKIN        02      
           1  6666            LEMIEUX       02      
           2  1122            BUGS BUNNY    02      
           2  1133            DAFFY DUCK    02      
           2  9872            ROAD RUNNER   02      
    

    查询

        SELECT 
            RecordID & EmployerNumber & EmployerName AS RowData,
            CDbl(ReportID) AS RowSort
        FROM Employer
    UNION ALL
        SELECT 
            RecordID & EmployeeNumber & EmployeeName AS RowData,
            CDbl(ReportID) + Val(EmployeeNumber) / 10000 AS RowSort
        FROM Employee
    

    返回

    RowData            RowSort
    -----------------  -------
    01012345PENGUINS         1
    01012345ACME INC         2
    028686CROSBY        1.8686
    027777MALKIN        1.7777
    026666LEMIEUX       1.6666
    021122BUGS BUNNY    2.1122
    021133DAFFY DUCK    2.1133
    029872ROAD RUNNER   2.9872
    

    所以查询

    SELECT RowData
    FROM
        (
                SELECT 
                    RecordID & EmployerNumber & EmployerName AS RowData,
                    CDbl(ReportID) AS RowSort
                FROM Employer
            UNION ALL
                SELECT 
                    RecordID & EmployeeNumber & EmployeeName AS RowData,
                    CDbl(ReportID) + Val(EmployeeNumber) / 10000 AS RowSort
                FROM Employee
        )
    ORDER BY RowSort
    

    返回

    RowData          
    -----------------
    01012345PENGUINS 
    026666LEMIEUX    
    027777MALKIN     
    028686CROSBY     
    01012345ACME INC 
    021122BUGS BUNNY 
    021133DAFFY DUCK 
    029872ROAD RUNNER
    

    只需将最后一个查询保存在 Access 中,然后将其导出为文本。

    【讨论】:

    • 意识到它必须是对字段数量的 SQL 限制。当我消除雇主领域时。有用。但需要所有 111 个字段才能完成文本文件。使用不同的数据库程序会更好吗?
    • @exceldude2001 如果您只运行包含所有 111 个字段的 SELECT ... FROM Employer 子查询,是否有效?如果是这样,那么另一种选择可能是使用一些 VBA 代码和临时表而不是 UNION 查询。
    • 我发现每个 SELECT 语句的访问限制是 100 个字段。作为一种解决方法,我考虑拆分雇主表(临时表?),然后以某种方式连接两个 select 语句?
    【解决方案2】:

    你的问题对于初学者来说有点复杂,但它有两个部分:

    1. 您需要加入 2 个表。您应该在 Google 上搜索“SQL 内部连接”以获取一些示例。
    2. 您需要以您想要的格式导出数据。您可以使用Left() 函数来做到这一点。

    假设您的表名为 Employee 和 Employer,请考虑以下 SQL 语句:

    Select
    ER.RecordID & 
    left(ER.EmployerNumber & "      ",6) & 
    left(ER.EmployerName & "                         ",25) & 
    EE.RecordID & 
    Left(EE.EmployeeNumber & "    ",4) & 
    Left(EE.EmployeeName & "                         ",25) as SingleCol
    From Employee EE
    Join Employer ER on EE.ReportID=ER.ReportID
    

    此查询连接 2 个表(请参阅底部的 Join)并首先显示 Employer 表中的 3 个字段,然后显示 Employee 表中的 3 个字段。带有所有空格的 Left() 语句用空格填充字段。此查询将准确返回 1 个长文本字段。

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多