Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Установка свойств при программном создании полей.
 
 автор: Дядя Федор   (03.02.2012 в 10:05)   личное сообщение
 
 

Поля прекрасно добавляются программно.
Но вот описание добавить не удается.

'Пример от С.Гаврилова. Установка  св-ва поля.

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" нельзя добавить программно?

  Ответить  
 
 автор: Анатолий (Киев)   (03.02.2012 в 11:39)   личное сообщение
 
 

Вообще-то св-во "Description" в Аксе предусмотрено для самой таблицы, а не для поля. Может поэтому?

ЗЫ. Конструкция CurrentDb.TableDefs("TblPrice").Fields("Name") хорошо работает для чтения свойств, но в большинстве случаев не работает на изменение. Правильно так:
Set db = CurrentDb
db.TableDefs("TblPrice").Fields("Name")...

  Ответить  
 
 автор: Дядя Федор   (03.02.2012 в 12:51)   личное сообщение
 
 

"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 - некое исключение. Однако приведенный выше код взят из хелпа. Но не работает.
Ну да ладно.

  Ответить  
 
 автор: Анатолий (Киев)   (06.02.2012 в 16:36)   личное сообщение
 
 


"Description" есть и у полей. Оно прекрасно читается... если заполнено при создании в конструкторе.


"Description" есть у полей запроса и в конструкторе запроса это св-во можно заполнить.
Но я в упор не вижу его в св-вах полей в конструкторе таблицы в своем А2003. Может у вас версия свежее и там есть?
А любое другое текстовое (и не только) св-во с левым названием вам удалось добавить объекту Fields таблицы?

  Ответить  
 
 автор: Дядя Федор   (06.02.2012 в 16:52)   личное сообщение
 
 

>А любое другое текстовое (и не только) св-во с левым названием вам удалось добавить объекту 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) - ошибка.
Как-то так.

  Ответить  
 
 автор: lukas   (06.02.2012 в 17:18)   личное сообщение
 
 

Создавать и Аппендить "левые" пропертя требуется.
:)

  Ответить  
 
 автор: Анатолий (Киев)   (06.02.2012 в 17:23)   личное сообщение
 
 


А Дискрипшин - это то, что мы пишем в конструкторе в столбце "Oписание".


А слона то я и не заметил...
Но у меня получилось...
А всего-то в функции SetAccessProperty надо исправить
Dim prp As Property
на
Dim prp As DAO.Property
Без этого у меня ругалось на "Несоответствие типов"

  Ответить  
 
 автор: Дядя Федор   (07.02.2012 в 07:51)   личное сообщение
 
 

Значит у вас исп-ся библ. и дао и адо. В противном случае (если только дао) дао - по умолчанию.

  Ответить  
 
 автор: Анатолий (Киев)   (07.02.2012 в 11:44)   личное сообщение
 
 

Но с DAO.Property у вас получилось?
Дело в том, что коллекция Properties есть не только у объектов DAO или ADODB, но еще и у форм, отчетов, их элементов и т.д. И у них свои Property. А ссылка на библиотеку Access выше, чем на DAO и ADO, поэтому без указания родителя вы объявляете неизвестно что.
У меня в БД таких проперти - 4 (Access, ADODB, DAO, VBIDE).

  Ответить  
 
 автор: Дядя Федор   (07.02.2012 в 11:49)   личное сообщение
 
 


DAO.Property


Конечно попробовал. Но не получилось.

  Ответить  
 
 автор: Дядя Федор   (10.02.2012 в 10:24)   личное сообщение
 
 

Добил.
Работает.

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

  Ответить  
 
 автор: Анатолий (Киев)   (10.02.2012 в 15:53)   личное сообщение
 
 

Т.е. раньше был dbText, а в свежих версиях стал dbMemo, и в єтом біла засада? У вас какой Акс?
Не знаю, какой в этом смысл, но несовместимость кода - на лице.

  Ответить  
 
 автор: Дядя Федор   (10.02.2012 в 16:15)   личное сообщение
 
 

1.("TblPrice").Fields("Name")->("TblPrice").Fields(j)
2.txt->memo

3.2003

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList