Прямой доступ к DBF файлам
Материал из GedeminWiki
Прямой доступ к DBF файлам без использования внешних библиотек и дополнительных драйверов осуществляется с помощью класса TDBF (наследник TDataSet). Для упрощения работы с которым создан VBScript класс TvbDBF:
Class TvbDBF Private DBFFieldDefs Public DBF Public Sub OpenTable(Path, NameTable) DBF.Close DBF.FilePath = Path DBF.TableName = NameTable DBF.Open End Sub Private Sub AddField(FieldName, FieldType, Size, Precision, Required) Dim F Set F = DBFFieldDefs.AddFieldDefs F.FieldName = FieldName F.NativeFieldType = FieldType F.Size = Size F.Precision = Precision F.Required = Required End Sub Public Sub CreateTable(Path, NameTable, TableLevel, LangID, Fields, AutoOpen) Dim i DBF.Close DBF.FilePath = Path DBF.TableName = NameTable DBF.TableLevel = TableLevel If LangID > 0 Then DBF.LanguageID = LangID End If For i = LBound(Fields, 1) To UBound(Fields, 1) Call AddField(Fields(i)(0), Fields(i)(1), Fields(i)(2), Fields(i)(3), Fields(i)(4)) Next DBF.CreateTableEx(DBFFieldDefs) If AutoOpen Then DBF.Open End Sub Private Sub Class_Initialize Set DBF = Designer.CreateObject(NULL, "TDBF", "") Set DBFFieldDefs = Designer.CreateObject(DBF, "TDBFFieldDefs", "") End Sub Private Sub Class_Terminate Designer.DestroyObject(DBF) Designer.DestroyObject(DBFFieldDefs) End Sub End Class
Пример создания таблицы и заполнения ее данными из SQL запроса (сам запрос в примере не приведен):
... Dim vbDbf Set vbdbf = New TvbDBF Call vbDbf.CreateTable(TmpDir, TableName & ".dbf", 4, 101, _ Array(Array("cashid", "C", 6, 0, False), _ Array("zid", "C", 6, 0, False), _ Array("checkid", "C", 6, 0, False), _ Array("id", "C", 6, 0, False), _ Array("date", "D", 8, 0, False), _ Array("articul", "C", 4, 0, False), _ Array("quantity", "N", 16, 6, False), _ Array("pricerub", "N", 16, 2, False), _ Array("totalrub", "N", 16, 2, False), _ Array("casher", "C", 4, 0, False), _ Array("operation", "N", 6, 0, False), _ Array("card", "C", 10, 0, False), _ Array("tn", "C", 6, 0, False), _ Array("time", "C", 4, 0, False)), True) Dim dbf Set dbf = vbDbf.dbf While Not m_IBSQL.Eof dbf.Append dbf.FieldByName("cashid").AsString = m_IBSQL.FieldByName("USR$CASHNUMBER").AsString dbf.FieldByName("zid").AsString = m_IBSQL.FieldByName("USR$SHIFTNUMBER").AsString dbf.FieldByName("checkid").AsString = m_IBSQL.FieldByName("OrderNumber").AsString dbf.FieldByName("id").AsString = "1" dbf.FieldByName("date").AsDateTime = m_IBSQL.FieldByName("USR$LOGICDATE").AsDateTime dbf.FieldByName("articul").AsString = "" dbf.FieldByName("quantity").AsCurrency = 0 dbf.FieldByName("pricerub").AsCurrency = 0 dbf.FieldByName("totalrub").AsCurrency = 0 dbf.FieldByName("casher").AsString = "" dbf.FieldByName("operation").AsInteger = 5 dbf.FieldByName("card").AsString = "" dbf.FieldByName("tn").AsString = m_IBSQL.FieldByName("StaffTabNum").AsString dbf.FieldByName("time").AsString = ConvertTime(m_IBSQL.FieldByName("TM").AsDateTime) dbf.Post m_IBSQL.Next Wend dbf.Close ...
Пример чтения DBF файла:
Dim vbDbf, dbf, Path, NameTable Path = "Путь к папке с файлами базы данных" NameTable = "Имя файла (таблицы)" Set vbDbf = New TvbDBF Call vbDbf.OpenTable(Path, NameTable) Set dbf = vbDbf.dbf While Not dbf.eof MsgBox dbf.FieldByName("имя_поля_для_отображения").AsString dbf.next WEnd dbf.Close