上面过程中需要的一个类型未发送,现发送:
Type CommonData
Create_time As String * 8
Create_type As String * 1
create_year1 As String * 4
create_year2 As String * 4
reader As String * 3
Depart_code As String * 1
Alter_rec As String * 1
yz_code As String * 3
yw_code As String * 1
char_set As String * 4
char_set_app As String * 4
tmwz_code As String * 2
End Type
我将写的VB的代码贴出来你看一下能不能有所感悟,当时我做的时候是一边使用DEBUG分析,一边编写VB程序才试出来的,不过具体的MARC数据也有所区别,我仅是拆分和重建简单的MARC数据。
Public Sub DBToMarc(Filename As String, Rs As Recordset, GDM As String, CRLF As Boolean)
Dim i As Long
Dim tmpstr As String
Dim F1 As Long
Dim RecCtl As String '形如nam0
Dim n As Integer
Dim C_1D As String * 1
Dim CrLf_char As String * 2
Dim comdata As CommonData
Dim Head As Control_head
Dim DIR_Block(11, 3) As String '1为标识,2列为宽度,3列位置
Dim CTl_Block(11) As String '定义11个目次区
Dim Total_len As Long
Dim Cur_len As Long
Dim Last_Pos As Long
Dim Stop_char As String * 1
Dim Begin_char As String * 1
C_1D = Chr(29)
CrLf_char = Chr(13) & Chr(10)
Begin_char = Chr(31)
Stop_char = Chr(30)
F1 = FreeFile
If Len(Dir(Filename)) > 0 Then
i = MsgBox("文件已经存在,要删除吗?", vbOKCancel + vbInformation, "通知")
If i = 1 Then
Kill Filename
Else
MsgBox "由于你不想删除文件,本次转换失败!", vbInformation, "通知"
Exit Sub
End If
End If
Open Filename For Binary Access Write As F1
'依次扫描记录集,对于记录集中每个成份进行编码
For i = 1 To 11
Select Case i
Case 1
DIR_Block(i, 1) = "001"
Case 2
DIR_Block(i, 1) = "010"
Case 3
DIR_Block(i, 1) = "100"
Case 4
DIR_Block(i, 1) = "101"
Case 5
DIR_Block(i, 1) = "200"
Case 6
DIR_Block(i, 1) = "210"
Case 7
DIR_Block(i, 1) = "215"
Case 8
DIR_Block(i, 1) = "690"
Case 9
DIR_Block(i, 1) = "801"
Case 10
DIR_Block(i, 1) = "905"
Case 11
DIR_Block(i, 1) = "970"
End Select
Next i
Do While Not Rs.EOF
For i = 1 To 11
Select Case i
Case 2, 3, 6, 7, 8, 10, 11
CTl_Block(i) = " "
Case 4
CTl_Block(i) = "0 "
Case 5
CTl_Block(i) = "1 "
Case 9
CTl_Block(i) = " 1"
End Select
Next i
CTl_Block(1) = ""
Call Init(comdata, Head)
For i = 0 To Rs.Fields.Count - 1
Select Case UCase(Trim(Rs.Fields(i).Name))
'相应的字段写入相应的区域
Case "JLKZB", "记录控制号"
If Not IsNull(Rs(i)) Then
CTl_Block(1) = Format(Trim(Rs(i)), "0000000000")
End If
Case "ISBN", "ISBN号"
If Not IsNull(Rs(i)) Then CTl_Block(2) = CTl_Block(2) + Chr(31) & "a" & Trim(Rs(i))
Case "ZZ", "装帧"
If Not IsNull(Rs(i)) Then CTl_Block(2) = CTl_Block(2) + Chr(31) & "b" & Trim(Rs(i))
Case "DJ", "单价", "定价", "价格"
If Not IsNull(Rs(i)) Then CTl_Block(2) = CTl_Block(2) + Chr(31) & "d" & Trim(Rs(i))
Case "cbrq", "出版日期"
If Not IsNull(Rs(i)) Then
If IsDate(Rs(i)) Then
comdata.Create_time = Format(Trim(Rs(i)), "yyyymmdd")
Else
comdata.Create_time = Mid(Trim(Rs(i)) + Space(8), 1, 8)
End If
End If
Case "NF", "YEAR", "年份"
If Not IsNull(Rs(i)) Then
comdata.create_year1 = Format(Rs(i), "0000")
End If
Case "YZ", "CBZYZ", "语种"
If Not IsNull(Rs(i)) Then
CTl_Block(4) = CTl_Block(4) & Chr(31) & "a" & Trim(Rs(i))
End If
Case "ZTM", "主题名", "正题名"
If Not IsNull(Rs(i)) Then
CTl_Block(5) = CTl_Block(5) & Chr(31) & "a" & Trim(Rs(i))
End If
Case "ZRZ01", "ZRZ", "责任者", "第一责任者"
If Not IsNull(Rs(i)) Then
CTl_Block(5) = CTl_Block(5) & Chr(31) & "f" & Trim(Rs(i))
End If
Case "BTM", "BNTM", "并列题名"
If Not IsNull(Rs(i)) Then
CTl_Block(5) = CTl_Block(5) & Chr(31) & "d" & Trim(Rs(i))
End If
Case "ZRZ02", "QTZRZ", "其他责任者", "第二责任者", "其它责任者"
If Not IsNull(Rs(i)) Then
CTl_Block(5) = CTl_Block(5) & Chr(31) & "g" & Trim(Rs(i))
End If
Case "FCH", "分册号", "分册辑号", "分辑号"
If Not IsNull(Rs(i)) Then
CTl_Block(5) = CTl_Block(5) & Chr(31) & "h" & Trim(Rs(i))
End If
Case "JCH", "卷册号"
If Not IsNull(Rs(i)) Then
CTl_Block(5) = CTl_Block(5) & Chr(31) & "v" & Trim(Rs(i))
End If
Case "CBD", "出版地", "出版发行地"
If Not IsNull(Rs(i)) Then
CTl_Block(6) = CTl_Block(6) & Chr(31) & "a" & Trim(Rs(i))
End If
Case "CBZ", "出版者", "出版发行者"
If Not IsNull(Rs(i)) Then
CTl_Block(6) = CTl_Block(6) & Chr(31) & "c" & Trim(Rs(i))
End If
Case "CBRQ", "出版日期", "出版发行日期"
If Not IsNull(Rs(i)) Then
CTl_Block(6) = CTl_Block(6) & Chr(31) & "d" & Trim(Rs(i))
End If
Case "YS", "页数"
If Not IsNull(Rs(i)) Then
CTl_Block(7) = CTl_Block(7) & Chr(31) & "a" & Trim(Rs(i))
End If
Case "KB", "开本"
If Not IsNull(Rs(i)) Then
CTl_Block(7) = CTl_Block(7) & Chr(31) & "d" & Trim(Rs(i))
End If
Case "FLH", "分类号"
If Not IsNull(Rs(i)) Then
CTl_Block(8) = CTl_Block(8) & Chr(31) & "a" & Trim(Rs(i))
End If
Case "BC", "版次"
If Not IsNull(Rs(i)) Then
CTl_Block(8) = CTl_Block(8) & Chr(31) & "v" & Trim(Rs(i))
End If
' Case "GJ", "国家"
' If Not IsNull(rs(i)) Then
' CTl_Block(9) = CTl_Block(9) & Chr(31) & "a" & Trim(rs(i))
' End If
'
End Select
Next i
CTl_Block(9) = CTl_Block(9) & Chr(31) & "a" & "CN"
CTl_Block(10) = CTl_Block(10) & Chr(31) & "a" & Trim(GDM)
CTl_Block(11) = CTl_Block(11) & Chr(31) & "a" & "科技"
tmpstr = Trim(CTl_Block(3))
CTl_Block(3) = Chr(32) & Chr(32) & Chr(31) & "a" & comdata.Create_time & comdata.Create_type
CTl_Block(3) = CTl_Block(3) & comdata.create_year1 & comdata.create_year2
CTl_Block(3) = CTl_Block(3) & comdata.Depart_code & comdata.Alter_rec
CTl_Block(3) = CTl_Block(3) & comdata.yz_code & comdata.yw_code & comdata.char_set
CTl_Block(3) = CTl_Block(3) & comdata.char_set_app & comdata.tmwz_code
CTl_Block(3) = CTl_Block(3) & tmpstr
For i = 1 To 11
CTl_Block(i) = CTl_Block(i) & Chr(30) '加入休止符
Next i
'写入文件:据数组中的信息收集写入文件
Total_len = 0
For i = 1 To 11
Cur_len = TestStrLen(CTl_Block(i))
Total_len = Total_len + Cur_len
DIR_Block(i, 2) = Format(Cur_len, "0000")
Next i
Last_Pos = 0
For i = 1 To 11
'置于位置数组
DIR_Block(i, 3) = Format(Last_Pos, "00000")
Last_Pos = Val(DIR_Block(i, 2)) + Val(DIR_Block(i, 3))
Next i
'设定前24字节中的数据
Head.Dir_len = Format(24 + 1 + 11 * 12, "00000")
Head.Head = Format(Total_len + 1 + Val(Head.Dir_len), "00000")
' Head.Head = Format(Total_len + Val(Head.Dir_len), "00000")
Put F1, , Head
For i = 1 To 11
For k = 1 To 3
Put F1, , DIR_Block(i, k)
Next k
Next i
Put F1, , Stop_char '结束符
For i = 1 To 11
Put F1, , CTl_Block(i)
Next i
Put F1, , C_1D
If CRLF Then Put F1, , CrLf_char
Rs.MoveNext
Loop
Rs.Close
Close F1
MsgBox "数据已经转换完毕!", vbInformation, "通知"
End Sub