|
|
|
| Поля прекрасно добавляются программно.
Но вот описание добавить не удается.
'Пример от С.Гаврилова. Установка св-ва поля.
SetAccessProperty CurrentDb.TableDefs("TblPrice").Fields("Name"), "Description", dbText, "*"
Function SetAccessProperty(obj As Object, strName As String, _
intType As Integer, varSetting As Variant) As Boolean
Dim prp As Property
Const conPropNotFound As Integer = 3270
On Error GoTo ErrorSetAccessProperty
' Explicitly refer to Properties collection.
obj.Properties(strName) = varSetting
obj.Properties.Refresh
SetAccessProperty = True
ExitSetAccessProperty:
Exit Function
ErrorSetAccessProperty:
If Err = conPropNotFound Then
' Create property, denote type, and set initial value.
Set prp = obj.CreateProperty(strName, intType, varSetting)
' Append Property object to Properties collection.
obj.Properties.Append prp
obj.Properties.Refresh
SetAccessProperty = True
Resume ExitSetAccessProperty
Else
MsgBox Err & ": " & vbCrLf & Err.Description
SetAccessProperty = False
Resume ExitSetAccessProperty
End If
End Function
|
Обработка ошибки 3270 - это описание ("Description")
Однако попытка добавить именно это свойство вызывает ошибку на строке
Set prp = obj.CreateProperty(strName, intType, varSetting)
"Объект не поддерживает это св-во или метод"
что св-во "Description" нельзя добавить программно? | |
|
| |
|
|
|
| Вообще-то св-во "Description" в Аксе предусмотрено для самой таблицы, а не для поля. Может поэтому?
ЗЫ. Конструкция CurrentDb.TableDefs("TblPrice").Fields("Name") хорошо работает для чтения свойств, но в большинстве случаев не работает на изменение. Правильно так:
Set db = CurrentDb
db.TableDefs("TblPrice").Fields("Name")... | |
|
| |
|
|
|
| "Description" есть и у полей. Оно прекрасно читается... если заполнено при создании в конструкторе.
А если там пусто - то ошибка. Свойства нет.
Set rst = CurrentDb.OpenRecordset("SELECT * FROM TBLPRICE")
With rst
For j = 0 To rst.Fields.Count - 1
Debug.Print .Fields(j).Properties("NAME")
On Error Resume Next
Debug.Print .Fields(j).Properties("Description"), .Fields(j).Properties("Type")
Next
End With
****
Set db = CurrentDb
db.TableDefs("TblPrice").Fields("Name")... - не помогло.
****
Description - некое исключение. Однако приведенный выше код взят из хелпа. Но не работает.
Ну да ладно. | |
|
| |
|
|
|
|
"Description" есть и у полей. Оно прекрасно читается... если заполнено при создании в конструкторе.
|
"Description" есть у полей запроса и в конструкторе запроса это св-во можно заполнить.
Но я в упор не вижу его в св-вах полей в конструкторе таблицы в своем А2003. Может у вас версия свежее и там есть?
А любое другое текстовое (и не только) св-во с левым названием вам удалось добавить объекту Fields таблицы? | |
|
| |
|
|
|
| >А любое другое текстовое (и не только) св-во с левым названием вам удалось добавить объекту Fields таблицы?
Не пробовал.
А Дискрипшин - это то, что мы пишем в конструкторе в столбце "Oписание".
(Скорее всего в англ.версии это будет столбец "Description" (!?)
Вот, например, текст программы:
Public Sub fieldstblproperties()
Dim s$
Dim fld As Field
Dim j%
Dim prp As Property
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM TBLPRICE")
With rst
For j = 0 To rst.Fields.Count - 1
Debug.Print .Fields(j).Properties("NAME")
On Error Resume Next
Debug.Print "" & Nz(.Fields(j).Properties("Description"), ""), .Fields(j).Properties("Type")
Next
End With
Set rst = Nothing
End Sub
|
Вот результат:
IdPrice
Ключ 4
VisPrice
Признак отображения позиции 1
Cena
Внутрезаводская цена без НДС (руб) 7
IdPricePref
Префикс - Ключ 4
NaimPrice
Полное наименование 10
MemoPrice
Примечание 10
Mass
BlnSkidka
Признак применени скидки 1
CenaPrice
Цена по прайсу (руб) 7
.......
Там где было ОПИСАНИЕ, например, у поля Cena - "Внутрезаводская цена без НДС (руб)"
там выводится.
Там где нет ОПИСАНИЯ (у поля Mass) - ошибка.
Как-то так. | |
|
| |
|
|
|
| Создавать и Аппендить "левые" пропертя требуется.
:) | |
|
| |
|
|
|
|
А Дискрипшин - это то, что мы пишем в конструкторе в столбце "Oписание".
|
А слона то я и не заметил...
Но у меня получилось...
А всего-то в функции SetAccessProperty надо исправить
Dim prp As Property
на
Dim prp As DAO.Property
Без этого у меня ругалось на "Несоответствие типов" | |
|
| |
|
|
|
| Значит у вас исп-ся библ. и дао и адо. В противном случае (если только дао) дао - по умолчанию. | |
|
| |
|
|
|
| Но с DAO.Property у вас получилось?
Дело в том, что коллекция Properties есть не только у объектов DAO или ADODB, но еще и у форм, отчетов, их элементов и т.д. И у них свои Property. А ссылка на библиотеку Access выше, чем на DAO и ADO, поэтому без указания родителя вы объявляете неизвестно что.
У меня в БД таких проперти - 4 (Access, ADODB, DAO, VBIDE). | |
|
| |
|
|
|
|
Конечно попробовал. Но не получилось. | |
|
| |
|
|
|
| Добил.
Работает.
Public Sub tstfieldstblproperties()
Dim s$
Dim fld As Field
Dim j%
Dim prp As dao.Property
Dim rst As dao.Recordset
Dim db As Database
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM TBLPRICE")
With rst
For j = 0 To rst.Fields.Count - 1
'Выводим имя поля
Debug.Print .Fields(j).Properties("NAME")
On Error GoTo 1 'Если нет описания - создаем
'Выводим ОПИСАНИЕ (Description) поля
Debug.Print "" & Nz(.Fields(j).Properties("Description"), ""), .Fields(j).Properties("Type")
GoTo 2
1:
' можно запросить msgbox-ом, но для простоты:
SetAccessProperty db.TableDefs("TblPrice").Fields(j), "Description", dbMemo, "тут пишем описание"
2:
Next
End With
Set rst = Nothing
End Sub
|
| |
|
| |
|
|
|
| Т.е. раньше был dbText, а в свежих версиях стал dbMemo, и в єтом біла засада? У вас какой Акс?
Не знаю, какой в этом смысл, но несовместимость кода - на лице. | |
|
| |
|
|
|
| 1.("TblPrice").Fields("Name")->("TblPrice").Fields(j)
2.txt->memo
3.2003 | |
|
| |