使用C#动态读取COBOL重新定义

时间:2016-03-07 14:54:32

标签: c# cobol mainframe ebcdic

我正在制作一个C#程序,它能够动态读取用COBOL编写的IBM HOST Copybook并从中生成一个SQL表。生成表后,我可以将文件上传到我的程序中,它将读取,从IMB-37转换并将文件插入到该sql表中。到目前为止,我几乎可以处理任何事情,尽管我遇到了REDEFINES的一些问题。

例如:

           10   SOME-FIELD        PIC 9(3)      COMP-3.     SCRRB205
4117       10   SOME-OTHER-FIELD REDEFINES                  3041-17
4117              SOME-FIELD      PIC X(2).                 3041-17

我理解在这种情况下,重新定义取代了它上面的字段,虽然我不明白的是编译器如何知道它是否应该使用重新定义。我假设在这种情况下它将是因为第一个是第二个是一个字符的数字,尽管在下面的例子中它们都使用了字符。

 05  STREET-ADDRESS.
       10  ADDRESS-LINE-1               PIC X(20).
       10  ADDRESS-LINE-2               PIC X(20).
   05  PO-BOX REDEFINES STREET-ADDRESS  PIC X(40). 

我试过忽略重新定义,因为它总是占用相同的空间,但是在原始字段被打包并且重新定义的字段不是的情况下,我需要知道何时解压缩字段。

任何有关这方面的帮助都会让人惊叹!

2 个答案:

答案 0 :(得分:5)

我可以帮助你,就像2年前我完成了你现在正在做的事情。

我必须设计一个MySQL Datawarehouse,包括ETL系统,完全基于Linux上运行的 RM COBOL ERP应用程序的文件。 该应用程序有600多个文件,目前还不清楚它们中有多少最终会进入数据库。大多数重要文件都被编入索引,在COMP字段上使其变得更难,而且一个显而易见的要求是文件及其索引键之间的所有关系都可以在数据库上重现。所以我可能需要每个文件的每个字段。

给出文件数量,手动和逐个处理所有文件是不可能的。

所以我的想法是编写一个在输入中使用COBOL副本的VB.NET应用程序:

  1. 生成COBOL程序,通过读取原始索引文件并将记录写入顺序文本文件,将数据转换为可利用的数据。
  2. 生成VBA模块,其中包含将这些数据文件从MS Access导入MySQL所需的所有代码(包括CREATE TABLE和Indexes)
  3. 在项目开始时,我遇到了与你现在完全相同的问题,特别是那些该死的REDEFINES。我发现列出和编码所有字帖可能性的任务,如果不是不可能的话,至少是危险的。 所以我调查了另一种方式,发现了这个:

    CB2XML

    COBOL copybook to XML converter SourceForge

    这为我节省了数周的字帖解析和口译工作。 它可以解析COBOL副本,将它们更改为一个XML文件,完美地描述所有具有许多有用属性的PICTURE,例如 length type 。它完全支持COBOLV 86标准。

    示例:

    000001 FD  FACTURE.                                                     
    000006 01  REC-FACTURE.                                                 
    000011     03  FS1                  PIC X.                              
    000016     03  FS2.                                                     
    000021         05  FS2A            PIC 9.                               
                   05  RFS2B           PIC X(8).
    000026         05  FS2B REDEFINES RFS2B  PIC 9(8).
    000031     03  FS3.                                                     
    000036         05  FS3A            PIC 9.                               
    000041         05  FS3B            PIC X(10).                            
    000046     03  FS4.                                                     
    000051         05  FS4A            PIC 99.                              
    000056         05  FS4B            PIC 99.                              
    000061         05  FS4C            PIC 99.                              
    000066     03  FS5                 PIC X(5).                              
    000071     03  FS6                 PIC X(20).                           
    000076     03  FS7                 PIC 9.                               
    000081     03  FS8                 PIC S9(9)V99    COMP-3.              
    000086     03  FS9                 PIC S9(9)V99    COMP-3.              
    000091     03  FS10                PIC 9.                               
    000096     03  FS11                PIC S9(9)V99    COMP-3.              
    000101     03  FS12                PIC S9(9)V99    COMP-3.              
    000106     03  FS13                PIC S9(9)V99    COMP-3.              
    000111     03  FS14-15 OCCURS 10.                                       
    000116         05  FS14            PIC 9.                               
    000121         05  FS15            PIC S9(9)V99    COMP-3.              
    000126         05  FS16            PIC S9(9)V99    COMP-3.              
    000131     03  FS17 OCCURS 10       PIC S9(9)V99    COMP-3.              
    000136     03 FS18                 PIC 9(6).                            
    000141     03  FS19                PIC 9.                               
    000241     03  FILLER              PIC X.    
    

    变成这样:

    <copybook filename="FD8.COP.CLEAN">
        <item display-length="428" level="01" name="REC-FACTURE" position="1" storage-length="428">
            <item display-length="1" level="03" name="FS1" picture="X" position="1" storage-length="1"/>
            <item display-length="9" level="03" name="FS2" position="2" storage-length="9">
                <item display-length="1" level="05" name="FS2A" numeric="true" picture="9" position="2" storage-length="1"/>
                <item display-length="8" level="05" name="RFS2B" picture="X(8)" position="3" redefined="true" storage-length="8"/>
                <item display-length="8" level="05" name="FS2B" numeric="true" picture="9(8)" position="3" redefines="RFS2B" storage-length="8"/>
            </item>
            <item display-length="11" level="03" name="FS3" position="11" storage-length="11">
                <item display-length="1" level="05" name="FS3A" numeric="true" picture="9" position="11" storage-length="1"/>
                <item display-length="10" level="05" name="FS3B" picture="X(10)" position="12" storage-length="10"/>
            </item>
            <item display-length="6" level="03" name="FS4" position="22" storage-length="6">
                <item display-length="2" level="05" name="FS4A" numeric="true" picture="99" position="22" storage-length="2"/>
                <item display-length="2" level="05" name="FS4B" numeric="true" picture="99" position="24" storage-length="2"/>
                <item display-length="2" level="05" name="FS4C" numeric="true" picture="99" position="26" storage-length="2"/>
            </item>
            <item display-length="5" level="03" name="FS5" picture="X(5)" position="28" storage-length="5"/>
            <item display-length="20" level="03" name="FS6" picture="X(20)" position="33" storage-length="20"/>
            <item display-length="1" level="03" name="FS7" numeric="true" picture="9" position="53" storage-length="1"/>
            <item display-length="11" level="03" name="FS8" numeric="true" picture="S9(9)V99" position="54" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            <item display-length="11" level="03" name="FS9" numeric="true" picture="S9(9)V99" position="60" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            <item display-length="1" level="03" name="FS10" numeric="true" picture="9" position="66" storage-length="1"/>
            <item display-length="11" level="03" name="FS11" numeric="true" picture="S9(9)V99" position="67" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            <item display-length="11" level="03" name="FS12" numeric="true" picture="S9(9)V99" position="73" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            <item display-length="11" level="03" name="FS13" numeric="true" picture="S9(9)V99" position="79" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            <item display-length="13" level="03" name="FS14-15" occurs="10" position="85" storage-length="13">
                <item display-length="1" level="05" name="FS14" numeric="true" picture="9" position="85" storage-length="1"/>
                <item display-length="11" level="05" name="FS15" numeric="true" picture="S9(9)V99" position="86" scale="2" signed="true" storage-length="6" usage="computational-3"/>
                <item display-length="11" level="05" name="FS16" numeric="true" picture="S9(9)V99" position="92" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            </item>
            <item display-length="11" level="03" name="FS17" numeric="true" occurs="10" picture="S9(9)V99" position="215" scale="2" signed="true" storage-length="6" usage="computational-3"/>
            <item display-length="6" level="03" name="FS18" numeric="true" picture="9(6)" position="275" storage-length="6"/>
            <item display-length="1" level="03" name="FS19" numeric="true" picture="9" position="281" storage-length="1"/>
    

    所有XML属性的列表

          For Each Attribute As Xml.XmlAttribute In itemNode.Attributes
    
                Select Case Attribute.Name
    
                    Case "name" ' FIeld name
    
                    Case "level" ' PICTURE level
    
                    Case "numeric"  ' True if numeric data type
    
                    Case "picture" ' COmplete PICTURE string
    
                    Case "storage-length" ' Variable storage lenght
    
                    Case "usage" ' If COMP field, give the original COMP type ("computational-x")
    
                    Case "signed" true if PIC S...
    
                    Case "scale" ' Give number of digits afeter decimal point
    
                    Case "redefined" ' true if the field is redifined afterwards
    
                    Case "redefines" ' If REDEFINES : give the name of the redefined field
    
                    Case "occurs" ' give the number of occurences if it's an ARRAY
    
                    Case "position" ' Give the line position in the original copybook
    
                    Case "display-length" ' Give the display size
    
                    Case "filename" ' Give the FD name
    

    借助这种XML结构,我实现了所有目标。

    生成的COBOL程序将索引文件(仅可用RM cobol运行时读取)转换为平面文件,处理包含的每个字段,ARRAYS和REDEFINES。

    • 对于REDEFINES:我为&#34; primary&#34;创建了一个字段。 PICTURE,它的REDEFINES更改及其类型与COBOL PICTURE相匹配
    • 对于ARRAY,我为每个元素创建一个字段,还有一个包含整个数组的大字段&#34; line&#34;
    • 对于COMPUTATIONAL字段,我只是将原始COMP移动到完全相同的DISPLAY PICTURE

    并非所有字段在数据库中都有用,但至少一切都是可用的

    使用上面的文件,SEQUENTIAL文本文件副本成为:

    自动生成COBOL

      FILE SECTION. 
    
      * ----------------------------------------------------------- 
      * INPUT FILE                                                
           COPY "FD8.COP" . 
    
      * -----------------------------------------------------------
      * OUTPUT FILE
       FD FACTURE-DWH.
       01 REC-FACTURE-DWH.      
           03 FS1-DWH           PIC X.
           03 FS2-DWH           PIC X(9).
           03 FS2A-DWH           PIC 9.
           03 RFS2B-DWH           PIC X(8).
           03 FS2B-DWH           PIC 9(8).
           03 FS3-DWH           PIC X(11).
           03 FS3A-DWH           PIC 9.
           03 FS3B-DWH           PIC X(10).
           03 FS4-DWH           PIC X(6).
           03 FS4A-DWH           PIC 99.
           03 FS4B-DWH           PIC 99.
           03 FS4C-DWH           PIC 99.
           03 FS5-DWH           PIC X(5).
           03 FS6-DWH           PIC X(20).
           03 FS7-DWH           PIC 9.
           03 FS8-DWH           PIC -9(9)V99.
           03 FS9-DWH           PIC -9(9)V99.
           03 FS10-DWH           PIC 9.
           03 FS11-DWH           PIC -9(9)V99.
           03 FS12-DWH           PIC -9(9)V99.
           03 FS13-DWH           PIC -9(9)V99.
           03 FS14-15-1-DWH           PIC X(13).
           03 FS14-15-2-DWH           PIC X(13).
           03 FS14-15-3-DWH           PIC X(13).
           03 FS14-15-4-DWH           PIC X(13).
           03 FS14-15-5-DWH           PIC X(13).
           03 FS14-15-6-DWH           PIC X(13).
           03 FS14-15-7-DWH           PIC X(13).
           03 FS14-15-8-DWH           PIC X(13).
           03 FS14-15-9-DWH           PIC X(13).
           03 FS14-15-10-DWH           PIC X(13).
           03 FS14-1-DWH           PIC 9.
           03 FS14-2-DWH           PIC 9.
           03 FS14-3-DWH           PIC 9.
           03 FS14-4-DWH           PIC 9.
           03 FS14-5-DWH           PIC 9.
           03 FS14-6-DWH           PIC 9.
           03 FS14-7-DWH           PIC 9.
           03 FS14-8-DWH           PIC 9.
           03 FS14-9-DWH           PIC 9.
           03 FS14-10-DWH           PIC 9.
           03 FS15-1-DWH           PIC -9(9)V99.
           03 FS15-2-DWH           PIC -9(9)V99.
           03 FS15-3-DWH           PIC -9(9)V99.
           03 FS15-4-DWH           PIC -9(9)V99.
           03 FS15-5-DWH           PIC -9(9)V99.
           03 FS15-6-DWH           PIC -9(9)V99.
           03 FS15-7-DWH           PIC -9(9)V99.
           03 FS15-8-DWH           PIC -9(9)V99.
           03 FS15-9-DWH           PIC -9(9)V99.
           03 FS15-10-DWH           PIC -9(9)V99.
           03 FS16-1-DWH           PIC -9(9)V99.
           03 FS16-2-DWH           PIC -9(9)V99.
           03 FS16-3-DWH           PIC -9(9)V99.
           03 FS16-4-DWH           PIC -9(9)V99.
           03 FS16-5-DWH           PIC -9(9)V99.
           03 FS16-6-DWH           PIC -9(9)V99.
           03 FS16-7-DWH           PIC -9(9)V99.
           03 FS16-8-DWH           PIC -9(9)V99.
           03 FS16-9-DWH           PIC -9(9)V99.
           03 FS16-10-DWH           PIC -9(9)V99.
           03 FS17-1-DWH           PIC -9(9)V99.
           03 FS17-2-DWH           PIC -9(9)V99.
           03 FS17-3-DWH           PIC -9(9)V99.
           03 FS17-4-DWH           PIC -9(9)V99.
           03 FS17-5-DWH           PIC -9(9)V99.
           03 FS17-6-DWH           PIC -9(9)V99.
           03 FS17-7-DWH           PIC -9(9)V99.
           03 FS17-8-DWH           PIC -9(9)V99.
           03 FS17-9-DWH           PIC -9(9)V99.
           03 FS17-10-DWH           PIC -9(9)V99.
           03 FS18-DWH           PIC 9(6).
           03 FS19-DWH           PIC 9.
    

    移动说明

      * ============================================================   
       PROG.                                                             
           MOVE FS1  TO FS1-DWH
           MOVE FS2  TO FS2-DWH
           MOVE FS2A  TO FS2A-DWH
           MOVE RFS2B  TO RFS2B-DWH
           MOVE FS2B  TO FS2B-DWH
           MOVE FS3  TO FS3-DWH
           MOVE FS3A  TO FS3A-DWH
           MOVE FS3B  TO FS3B-DWH
           MOVE FS4  TO FS4-DWH
           MOVE FS4A  TO FS4A-DWH
           MOVE FS4B  TO FS4B-DWH
           MOVE FS4C  TO FS4C-DWH
           MOVE FS5  TO FS5-DWH
           MOVE FS6  TO FS6-DWH
           MOVE FS7  TO FS7-DWH
           MOVE FS8  TO FS8-DWH
           MOVE FS9  TO FS9-DWH
           MOVE FS10  TO FS10-DWH
           MOVE FS11  TO FS11-DWH
           MOVE FS12  TO FS12-DWH
           MOVE FS13  TO FS13-DWH
           MOVE FS14-15(1)  TO FS14-15-1-DWH
           MOVE FS14-15(2)  TO FS14-15-2-DWH
           MOVE FS14-15(3)  TO FS14-15-3-DWH
           MOVE FS14-15(4)  TO FS14-15-4-DWH
           MOVE FS14-15(5)  TO FS14-15-5-DWH
           MOVE FS14-15(6)  TO FS14-15-6-DWH
           MOVE FS14-15(7)  TO FS14-15-7-DWH
           MOVE FS14-15(8)  TO FS14-15-8-DWH
           MOVE FS14-15(9)  TO FS14-15-9-DWH
           MOVE FS14-15(10)  TO FS14-15-10-DWH
           MOVE FS14(1)  TO FS14-1-DWH
           MOVE FS14(2)  TO FS14-2-DWH
           MOVE FS14(3)  TO FS14-3-DWH
           MOVE FS14(4)  TO FS14-4-DWH
           MOVE FS14(5)  TO FS14-5-DWH
           MOVE FS14(6)  TO FS14-6-DWH
           MOVE FS14(7)  TO FS14-7-DWH
           MOVE FS14(8)  TO FS14-8-DWH
           MOVE FS14(9)  TO FS14-9-DWH
           MOVE FS14(10)  TO FS14-10-DWH
           MOVE FS15(1)  TO FS15-1-DWH
           MOVE FS15(2)  TO FS15-2-DWH
           MOVE FS15(3)  TO FS15-3-DWH
           MOVE FS15(4)  TO FS15-4-DWH
           MOVE FS15(5)  TO FS15-5-DWH
           MOVE FS15(6)  TO FS15-6-DWH
           MOVE FS15(7)  TO FS15-7-DWH
           MOVE FS15(8)  TO FS15-8-DWH
           MOVE FS15(9)  TO FS15-9-DWH
           MOVE FS15(10)  TO FS15-10-DWH
           MOVE FS16(1)  TO FS16-1-DWH
           MOVE FS16(2)  TO FS16-2-DWH
           MOVE FS16(3)  TO FS16-3-DWH
           MOVE FS16(4)  TO FS16-4-DWH
           MOVE FS16(5)  TO FS16-5-DWH
           MOVE FS16(6)  TO FS16-6-DWH
           MOVE FS16(7)  TO FS16-7-DWH
           MOVE FS16(8)  TO FS16-8-DWH
           MOVE FS16(9)  TO FS16-9-DWH
           MOVE FS16(10)  TO FS16-10-DWH
           MOVE FS17(1)  TO FS17-1-DWH
           MOVE FS17(2)  TO FS17-2-DWH
           MOVE FS17(3)  TO FS17-3-DWH
           MOVE FS17(4)  TO FS17-4-DWH
           MOVE FS17(5)  TO FS17-5-DWH
           MOVE FS17(6)  TO FS17-6-DWH
           MOVE FS17(7)  TO FS17-7-DWH
           MOVE FS17(8)  TO FS17-8-DWH
           MOVE FS17(9)  TO FS17-9-DWH
           MOVE FS17(10)  TO FS17-10-DWH
           MOVE FS18  TO FS18-DWH
           MOVE FS19  TO FS19-DWH
    

    编写平面文件后,可以通过VBBA应用程序生成的VBA代码将它们处理为MySQL。

    自动生成VBA

    键入def声明以处理文本文件导入

    请注意每个字段旁边的评论中的原始图片

    '-------------------------------------------------------------
    ' REC_FC8 Record
    '-------------------------------------------------------------
    Private Type REC_FC8 
       FS1 as string*1  '  03 FS1  PIC X  
       FS2 as string*9  '  03 FS2  PIC   
       FS2A as string*1  '  05 FS2A  PIC 9  
       RFS2B as string*8  '  05 RFS2B  PIC X(8)  
       FS2B as string*8  '  05 FS2B  PIC 9(8)  
       FS3 as string*11  '  03 FS3  PIC   
       FS3A as string*1  '  05 FS3A  PIC 9  
       FS3B as string*10  '  05 FS3B  PIC X(10)  
       FS4 as string*6  '  03 FS4  PIC   
       FS4A as string*2  '  05 FS4A  PIC 99  
       FS4B as string*2  '  05 FS4B  PIC 99  
       FS4C as string*2  '  05 FS4C  PIC 99  
       FS5 as string*5  '  03 FS5  PIC X(5)  
       FS6 as string*20  '  03 FS6  PIC X(20)  
       FS7 as string*1  '  03 FS7  PIC 9  
       FS8 as string*12  '  03 FS8  PIC S9(9)V99 computational-3 
       FS9 as string*12  '  03 FS9  PIC S9(9)V99 computational-3 
       FS10 as string*1  '  03 FS10  PIC 9  
       FS11 as string*12  '  03 FS11  PIC S9(9)V99 computational-3 
       FS12 as string*12  '  03 FS12  PIC S9(9)V99 computational-3 
       FS13 as string*12  '  03 FS13  PIC S9(9)V99 computational-3 
       FS14_15_1 as string*13  '  03 FS14-15  PIC   
       FS14_15_2 as string*13  '  03 FS14-15  PIC   
       FS14_15_3 as string*13  '  03 FS14-15  PIC   
       FS14_15_4 as string*13  '  03 FS14-15  PIC   
       FS14_15_5 as string*13  '  03 FS14-15  PIC   
       FS14_15_6 as string*13  '  03 FS14-15  PIC   
       FS14_15_7 as string*13  '  03 FS14-15  PIC   
       FS14_15_8 as string*13  '  03 FS14-15  PIC   
       FS14_15_9 as string*13  '  03 FS14-15  PIC   
       FS14_15_10 as string*13  '  03 FS14-15  PIC   
       FS14_1 as string*1  '  05 FS14  PIC 9  
       FS14_2 as string*1  '  05 FS14  PIC 9  
       FS14_3 as string*1  '  05 FS14  PIC 9  
       FS14_4 as string*1  '  05 FS14  PIC 9  
       FS14_5 as string*1  '  05 FS14  PIC 9  
       FS14_6 as string*1  '  05 FS14  PIC 9  
       FS14_7 as string*1  '  05 FS14  PIC 9  
       FS14_8 as string*1  '  05 FS14  PIC 9  
       FS14_9 as string*1  '  05 FS14  PIC 9  
       FS14_10 as string*1  '  05 FS14  PIC 9  
       FS15_1 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_2 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_3 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_4 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_5 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_6 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_7 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
       FS15_8 as string*12  '  05 FS15  PIC S9(9)V99 computational-3 
    ...
       FS17_8 as string*12  '  03 FS17  PIC S9(9)V99 computational-3 
       FS17_9 as string*12  '  03 FS17  PIC S9(9)V99 computational-3 
       FS17_10 as string*12  '  03 FS17  PIC S9(9)V99 computational-3 
       FS18 as string*6  '  03 FS18  PIC 9(6)  
       FS19 as string*1  '  03 FS19  PIC 9      
            FC8LF As String * 2 ' LF 11
    End Type
    

    创建表格程序

    每个字段都成为一个对象(来自我创建的自定义类),下面使用的方法SQLtypeFull返回每个字段的MySQL数据类型

    '========================================================================
    Private Function Create_Table_MySQL() As Boolean
        On Error GoTo Erreur
    
        Dim Rs As Recordset
        Dim SQL As String
    
        SQL = "CREATE TABLE IF NOT EXISTS `TBL_DAT_FACTURE` ( `ID` INT(11) NOT NULL auto_increment, `RECID` INT(11)"
               SQL = SQL &  ", `FS1` " & FS1.SQLtypeFull
               SQL = SQL &  ", `FS2` " & FS2.SQLtypeFull
               SQL = SQL &  ", `FS2A` " & FS2A.SQLtypeFull
               SQL = SQL &  ", `RFS2B` " & RFS2B.SQLtypeFull
               SQL = SQL &  ", `FS2B` " & FS2B.SQLtypeFull
               SQL = SQL &  ", `FS3` " & FS3.SQLtypeFull
               SQL = SQL &  ", `FS3A` " & FS3A.SQLtypeFull
               SQL = SQL &  ", `FS3B` " & FS3B.SQLtypeFull
               SQL = SQL &  ", `FS4` " & FS4.SQLtypeFull
               SQL = SQL &  ", `FS4A` " & FS4A.SQLtypeFull
               SQL = SQL &  ", `FS4B` " & FS4B.SQLtypeFull
               SQL = SQL &  ", `FS4C` " & FS4C.SQLtypeFull
               SQL = SQL &  ", `FS5` " & FS5.SQLtypeFull
               SQL = SQL &  ", `FS6` " & FS6.SQLtypeFull
               SQL = SQL &  ", `FS7` " & FS7.SQLtypeFull
               SQL = SQL &  ", `FS8` " & FS8.SQLtypeFull
               SQL = SQL &  ", `FS9` " & FS9.SQLtypeFull
               SQL = SQL &  ", `FS10` " & FS10.SQLtypeFull
               SQL = SQL &  ", `FS11` " & FS11.SQLtypeFull
               SQL = SQL &  ", `FS12` " & FS12.SQLtypeFull
               SQL = SQL &  ", `FS13` " & FS13.SQLtypeFull
               SQL = SQL &  ", `FS14_15_1` " & FS14_15_1.SQLtypeFull
               SQL = SQL &  ", `FS14_15_2` " & FS14_15_2.SQLtypeFull
               SQL = SQL &  ", `FS14_15_3` " & FS14_15_3.SQLtypeFull
               SQL = SQL &  ", `FS14_15_4` " & FS14_15_4.SQLtypeFull
               SQL = SQL &  ", `FS14_15_5` " & FS14_15_5.SQLtypeFull
               SQL = SQL &  ", `FS14_15_6` " & FS14_15_6.SQLtypeFull
               SQL = SQL &  ", `FS14_15_7` " & FS14_15_7.SQLtypeFull
               SQL = SQL &  ", `FS14_15_8` " & FS14_15_8.SQLtypeFull
               SQL = SQL &  ", `FS14_15_9` " & FS14_15_9.SQLtypeFull
               SQL = SQL &  ", `FS14_15_10` " & FS14_15_10.SQLtypeFull
               SQL = SQL &  ", `FS14_1` " & FS14_1.SQLtypeFull
               SQL = SQL &  ", `FS14_2` " & FS14_2.SQLtypeFull
               SQL = SQL &  ", `FS14_3` " & FS14_3.SQLtypeFull
               SQL = SQL &  ", `FS14_4` " & FS14_4.SQLtypeFull
               SQL = SQL &  ", `FS14_5` " & FS14_5.SQLtypeFull
               SQL = SQL &  ", `FS14_6` " & FS14_6.SQLtypeFull
               SQL = SQL &  ", `FS14_7` " & FS14_7.SQLtypeFull
               SQL = SQL &  ", `FS14_8` " & FS14_8.SQLtypeFull
               SQL = SQL &  ", `FS14_9` " & FS14_9.SQLtypeFull
               SQL = SQL &  ", `FS14_10` " & FS14_10.SQLtypeFull
               SQL = SQL &  ", `FS15_1` " & FS15_1.SQLtypeFull
               SQL = SQL &  ", `FS15_2` " & FS15_2.SQLtypeFull
               SQL = SQL &  ", `FS15_3` " & FS15_3.SQLtypeFull
               SQL = SQL &  ", `FS15_4` " & FS15_4.SQLtypeFull
               SQL = SQL &  ", `FS15_5` " & FS15_5.SQLtypeFull
    ...
               SQL = SQL &  ", `FS17_9` " & FS17_9.SQLtypeFull
               SQL = SQL &  ", `FS17_10` " & FS17_10.SQLtypeFull
               SQL = SQL &  ", `FS18` " & FS18.SQLtypeFull
               SQL = SQL &  ", `FS19` " & FS19.SQLtypeFull
    
    
        SQL = SQL & ", PRIMARY KEY (`ID`)"
        SQL = SQL & ") ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE utf8_bin;"
        MySQLcon.Execute (SQL)      
    
        Create_Table_MySQL = True
    
    Exit_Sub:
        Exit Function
    
    Erreur:
        Create_Table_MySQL = False
        Resume Exit_Sub
    
    End Function
    

    最终SQL语句

    CREATE TABLE IF NOT EXISTS `FACTURE` 
    ( `ID` INT(11) NOT NULL auto_increment, `RECID` INT(11), `FS1` CHAR(1), `FS2` CHAR(9), `FS2A` TINYINT(1) UNSIGNED, `RFS2B` CHAR(8), `FS2B` INT(8) UNSIGNED, `FS3` CHAR(11), `FS3A` TINYINT(1) UNSIGNED, `FS3B` CHAR(10), `FS4` CHAR(6), `FS4A` TINYINT(2) UNSIGNED, `FS4B` TINYINT(2) UNSIGNED, `FS4C` TINYINT(2) UNSIGNED, `FS5` CHAR(5), `FS6` CHAR(20), `FS7` TINYINT(1) UNSIGNED, `FS8` DECIMAL(11,2), `FS9` DECIMAL(11,2), `FS10` TINYINT(1) UNSIGNED, `FS11` DECIMAL(11,2), `FS12` DECIMAL(11,2), `FS13` DECIMAL(11,2), `FS14_15_1` CHAR(13), `FS14_15_2` CHAR(13), `FS14_15_3` CHAR(13), `FS14_15_4` CHAR(13), `FS14_15_5` CHAR(13), `FS14_15_6` CHAR(13), `FS14_15_7` CHAR(13), `FS14_15_8` CHAR(13), `FS14_15_9` CHAR(13), `FS14_15_10` CHAR(13), `FS14_1` TINYINT(1) UNSIGNED, `FS14_2` TINYINT(1) UNSIGNED, `FS14_3` TINYINT(1) UNSIGNED, `FS14_4` TINYINT(1) UNSIGNED, `FS14_5` TINYINT(1) UNSIGNED, `FS14_6` TINYINT(1) UNSIGNED, `FS14_7` TINYINT(1) UNSIGNED, `FS14_8` TINYINT(1) UNSIGNED, `FS14_9` TINYIN
    T(1) UNSIGNED, `FS14_10` TINYINT(1) UNSIGNED, `FS15_1` DECIMAL(11,2), `FS15_2` DECIMAL(11,2), `FS15_3` DECIMAL(11,2), `FS15_4` DECIMAL(11,2), `FS15_5` DECIMAL(11,2), `FS15_6` DECIMAL(11,2), `FS15_7` DECIMAL(11,2), `FS15_8` 
    ...
    DECIMAL(11,2), `FS17_10` DECIMAL(11,2), `FS18` DATE, `FS19` TINYINT(1) UNSIGNED, 
     PRIMARY KEY (`ID`)) ENGINE=MyISAM  
     DEFAULT CHARSET=utf8 COLLATE utf8_bin;
    

    我在生成的VBA模块中有更多功能,生成的xml的详细程度和准确性对所有这些都有很大帮助:

    • 我创建了一个管理字段所有方面的类,特别是在原始PICTURE和VBA类型(日期,长期,双打,货币等等)之后处理VBA / MySQL的转换,并且&#39 ;如果你想强迫另一种类型,请使用钩子。
    • 它完全涉及元数据创建(也在MySQL中)
    • 它处理导入数据时的错误,记录文件和字段级别的所有内容

    我可能已经展示了足够的想法,所以我会停在那里。

    最重要的是:在数十万条记录中,我的计算没有一位数损失。当我在数据库中使用SQL对所有行进行SUM()时,我的数字与原始COBOL应用程序返回的数字完全相同

    如果你想知道为什么我使用Access / VBA而不是.NET进行输入:这是一个不可协商的要求-_-

    最后一点:我与 CB2XML 无关联,这不是它的广告。它只是一个伟大而有用的软件,值得爱和关注。

答案 1 :(得分:4)

REDEFINES会让您的任务变得更加困难。它不是&#34;编译器&#34;知道要使用哪个特定字段,直观地说,现有COBOL系统中的代码知道要使用哪个字段。会有一些指示,在另一个字段中有一些值,这将指示在哪个特定时间使用哪个字段。

以你的第二个例子为例,因为第一个例子没有背景:

05  ADDRESS-PO-BOX-FLAG                  PIC X.

在使用数据之前将询问该字段。直接(你可以在那里找到很多可怕的代码)或88级条件名称:

    88  ADDRESS-IS-A-PO-BOX              VALUE "Y". (an example only)

IF ADDRESS-IS-A-PO-BOX
    some code relating to PO Boxes
ELSE
    some code relating to other types of addresses
END-IF

您的第一个例子将以类似的方式处理。

这是一种旧式的#34;使用REDEFINES,在记录中使用相同的存储位置以实现相互排斥的情况。节省存储,这是昂贵的。您正在使用的系统要么是旧的&#34;,要么它的设计被错误的&#34;体验&#34;感染。

您有两个广泛的选择:复制所有条件选择的数据(这样您就可以保持两组业务逻辑);获取文件更改,以便每个字段占用自己的存储空间。

COMP-3(或PACKED-DECIMAL)或COMP / COMP-4 / COMP-5 / BINARY数据类型的存在也使您感到复杂。然后,您需要在字段级别对实际的EBCDIC数据执行EBCDIC到ASCII,并执行转换或简单获取&#34;计算&#34;所需的任何操作。数据

另请注意,任何带符号的DISPLAY数字字段(带有以S开头但没有显式&#34;计算&#34;用法的PICture的数字字段)显然会包含&#34;字符&#34;最后一个字节中的数据,因为符号被保持为&#34; overpunch&#34;最后一个字节。

请注意,二进制数据类型将为Big Endian。

如果您收到的文件没有REDEFINES,没有&#34;计算&#34;那么对您来说将会非常简单。字段,没有嵌入的符号(或隐含的小数位)。您的所有数据都是字符,您可以在记录级别(或文件级别,文件传输机制)使用EBCDIC到ASCII。

如果你看这里标记为COMP-3的问题,你会发现对此的进一步讨论,如果你决定了荒谬的路线(你的程序理解原生的大型机COBOL数据项而不是简单的&#34; text&#34;)是唯一可行的方法,然后在讨论中有许多内容可供您使用或应用。

如果您的公司受到监管&#34;在外部,然后在编码一行之前确保您的合规性,审计和会计部门对您的设计感到满意。哎呦。迟到了。我们希望它是制造业。