Прямой доступ к DBF файлам
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
| (не показаны 2 промежуточные версии 1 участника) | |||
| Строка 1: | Строка 1: | ||
| − | Прямой доступ к DBF файлам без использования внешних библиотек и дополнительных драйверов осуществляется с помощью класса '''TDBF''' (наследник '''TDataSet'''). Для упрощения работы с которым создан VBScript класс '''TvbDBF''': | + | Прямой доступ к DBF файлам без использования внешних библиотек и дополнительных драйверов осуществляется с помощью класса '''[http://tdbf.sourceforge.net/index.php TDBF]''' (наследник '''TDataSet'''). Для упрощения работы с которым создан VBScript класс '''TvbDBF''': |
<syntaxhighlight lang="vbnet"> | <syntaxhighlight lang="vbnet"> | ||
Class TvbDBF | Class TvbDBF | ||
| − | + | Private DBFFieldDefs | |
| + | Public DBF | ||
| − | + | Public Sub OpenTable(Path, NameTable) | |
| − | + | ||
| − | + | ||
DBF.Close | DBF.Close | ||
DBF.FilePath = Path | DBF.FilePath = Path | ||
DBF.TableName = NameTable | DBF.TableName = NameTable | ||
DBF.Open | DBF.Open | ||
| − | + | End Sub | |
| − | + | Private Sub AddField(FieldName, FieldType, Size, Precision, Required) | |
| − | + | Dim F | |
| − | + | Set F = DBFFieldDefs.AddFieldDefs | |
F.FieldName = FieldName | F.FieldName = FieldName | ||
F.NativeFieldType = FieldType | F.NativeFieldType = FieldType | ||
F.Size = Size | F.Size = Size | ||
F.Precision = Precision | F.Precision = Precision | ||
| − | F.Required = Required | + | F.Required = Required |
| − | + | End Sub | |
| − | + | ||
| − | + | Public Sub CreateTable(Path, NameTable, TableLevel, LangID, Fields, AutoOpen) | |
| − | + | Dim i | |
| + | |||
DBF.Close | DBF.Close | ||
DBF.FilePath = Path | DBF.FilePath = Path | ||
DBF.TableName = NameTable | DBF.TableName = NameTable | ||
DBF.TableLevel = TableLevel | DBF.TableLevel = TableLevel | ||
| − | + | If LangID > 0 Then | |
DBF.LanguageID = LangID | 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) | DBF.CreateTableEx(DBFFieldDefs) | ||
| − | + | ||
| − | + | If AutoOpen Then DBF.Open | |
| + | End Sub | ||
Private Sub Class_Initialize | Private Sub Class_Initialize | ||
| − | + | Set DBF = Designer.CreateObject(NULL, "TDBF", "") | |
| − | + | Set DBFFieldDefs = Designer.CreateObject(DBF, "TDBFFieldDefs", "") | |
| − | + | ||
| − | + | ||
End Sub | End Sub | ||
Private Sub Class_Terminate | Private Sub Class_Terminate | ||
| − | + | Designer.DestroyObject(DBF) | |
| − | + | Designer.DestroyObject(DBFFieldDefs) | |
| − | + | ||
End Sub | End Sub | ||
End Class | End Class | ||
| Строка 63: | Строка 60: | ||
<syntaxhighlight lang="vbnet"> | <syntaxhighlight lang="vbnet"> | ||
... | ... | ||
| + | |||
Dim vbDbf | Dim vbDbf | ||
Set vbdbf = New TvbDBF | Set vbdbf = New TvbDBF | ||
| Строка 101: | Строка 99: | ||
dbf.FieldByName("time").AsString = ConvertTime(m_IBSQL.FieldByName("TM").AsDateTime) | dbf.FieldByName("time").AsString = ConvertTime(m_IBSQL.FieldByName("TM").AsDateTime) | ||
dbf.Post | dbf.Post | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
m_IBSQL.Next | m_IBSQL.Next | ||
| Строка 133: | Строка 112: | ||
<syntaxhighlight lang="vbnet"> | <syntaxhighlight lang="vbnet"> | ||
Dim vbDbf, dbf, Path, NameTable | Dim vbDbf, dbf, Path, NameTable | ||
| − | Path = | + | Path = "Путь к папке с файлами базы данных" |
| − | NameTable = | + | NameTable = "Имя файла (таблицы)" |
Set vbDbf = New TvbDBF | Set vbDbf = New TvbDBF | ||
| − | + | Call vbDbf.OpenTable(Path, NameTable) | |
Set dbf = vbDbf.dbf | Set dbf = vbDbf.dbf | ||
| − | + | While Not dbf.eof | |
MsgBox dbf.FieldByName("имя_поля_для_отображения").AsString | MsgBox dbf.FieldByName("имя_поля_для_отображения").AsString | ||
dbf.next | dbf.next | ||
| − | + | WEnd | |
dbf.Close | dbf.Close | ||
Текущая версия на 12:29, 3 мая 2016
Прямой доступ к 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