BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Обращение к полю БД через переменную

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Обращение к полю БД через переменную
 
Здравствуйте!
Как в плагине правильно обратиться к полю, если имя поля содержится в переменной?
Вот кусок плагина:
Private i,_text,aFieldNames,aTypes
Private aSet,aSetKey,Path_1
dbPush()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
Path_1:=GlobalTmpPath+'spr_6.DBF'
NETUSE('_SPRAV',Path_1)
dbPush('_SPRAV','','',{})
//определяем структуру файла
aFieldNames:=_SPRAV->(Array(Fcount()))
aTypes:=_SPRAV->(Array(Fcount()))
_SPRAV->(AFIELDS(aFieldNames,aTypes,,))
_SPRAV->(dbgotop())
//цикл по всем полям файла
i:=1
do while i<=len(aTypes)
altd()
if aTypes[i]='C'
_SPRAV->(dbgotop())
do while _SPRAV->(RECNO())<_SPRAV->(LASTREC())+1
_text:='_SPRAV->'+aFieldNames[i]
_SPRAV->(dbskip())
enddo
endif
i:=i+1
enddo
dbpop()
_SPRAV->( DbCloseArea())
RestSetKey(aSetKey)
RestSet(aSet)
dbpop()
В данном случае выражение '_SPRAV->'+aFieldNames[i] воспринмается программой как строка,а надо как обращение к полю файла.
Заранее спасибо.
Изменено: gabov - 07.01.2013 09:11:25
 
_SPRAV->(fieldget(fieldpos([символьная строка, в которой содержится имя поля])))

Описание обеих функций есть в хелпе по программированию
 
Здравствуйте!
Теперь встала задача
Всем числовым полям присвоить значение по умолчанию 0 (имя поля содержится в переменной).
Private i,_text,aFieldNames,aTypes
Private aSet,aSetKey,Path_1
dbPush()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
Path_1:=GlobalTmpPath+'spr_6.DBF'
NETUSE('_SPRAV',Path_1)
dbPush('_SPRAV','','',{})
//определяем структуру файла
aFieldNames:=_SPRAV->(Array(Fcount()))
aTypes:=_SPRAV->(Array(Fcount()))
_SPRAV->(AFIELDS(aFieldNames,aTypes,,))
_SPRAV->(dbgotop())
//цикл по всем полям файла
i:=1
do while i<=len(aTypes)
altd()
if aTypes[i]='N'
_SPRAV->(dbgotop())
do while _SPRAV->(RECNO())<_SPRAV->(LASTREC())+1
_SPRAV->(reclock())
_SPRAV->(fieldput(fieldpos(aFieldNames[i])),0)
_SPRAV->(F_DBUNLOCK())
_SPRAV->(dbskip())
enddo
endif
i:=i+1
enddo
dbpop()
_SPRAV->( DbCloseArea())
RestSetKey(aSetKey)
RestSet(aSet)
dbpop()

После запуска этого плагина Бэст вываливается и выходит "виндовское окно" ,что программа будет закрыта.
Проблема,видимо в строке _SPRAV->(fieldput(fieldpos(aFieldNames[i])),0)
Что надо переписать в программе,чтоб решить проблему?
Заранее спасибо
 
Цитата
gabov пишет:
Здравствуйте!
Теперь встала задача
Всем числовым полям присвоить значение по умолчанию 0 (имя поля содержится в переменной).
Private i,_text,aFieldNames,aTypes
Private aSet,aSetKey,Path_1
dbPush()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
Path_1:=GlobalTmpPath+'spr_6.DBF'
NETUSE('_SPRAV',Path_1)
dbPush('_SPRAV','','',{})
//определяем структуру файла
aFieldNames:=_SPRAV->(Array(Fcount()))
aTypes:=_SPRAV->(Array(Fcount()))
_SPRAV->(AFIELDS(aFieldNames,aTypes,,))
_SPRAV->(dbgotop())
//цикл по всем полям файла
i:=1
do while i<=len(aTypes)
altd()
if aTypes='N'
_SPRAV->(dbgotop())
do while _SPRAV->(RECNO())<_SPRAV->(LASTREC())+1
_SPRAV->(reclock())
_SPRAV->(fieldput(fieldpos(aFieldNames)),0)
_SPRAV->(F_DBUNLOCK())
_SPRAV->(dbskip())
enddo
endif
i:=i+1
enddo
dbpop()
_SPRAV->( DbCloseArea())
RestSetKey(aSetKey)
RestSet(aSet)
dbpop()

После запуска этого плагина Бэст вываливается и выходит "виндовское окно" ,что программа будет закрыта.
Проблема,видимо в строке _SPRAV->(fieldput(fieldpos(aFieldNames)),0)
Что надо переписать в программе,чтоб решить проблему?
Заранее спасибо
Программирование состоит элементарно из этапов: описывается структурная схема (постановка задачи), затем функциональная схема, затем алгоритм (математика и логическая схема процедуры) и позже программирование на языке. При условии, что на стадии постановки задачи решены Вопросы с базой данных т. е. информационным обеспечением. Этот ликбез надо усвоить или вообще не браться за создание даже таких маленьких плагинов. Кроме того надо научиться вести отладку, тестирование отдельно, прежде чем подсоединяться к БЭСТ. Толка не будет от того, что кто-то Вам поможет и найдёт ошибку в цикле или условно, или без условном переходе, или порядке обнуления, или своевременного присвоения значений переменным. Удачи.
 
1. Пропущен индекс
if aTypes='N'

2. Неэффективная организация. Сначала надо собрать наименования всех числовых полей в отдельный массив, затем для каждой записи базы менять значения всех полей из массива. Будет гораздо быстрее, чем для каждого поля лочить и разлочивать запись.

3. _SPRAV->(RECNO())<_SPRAV->(LASTREC())+1
Оригинально, но "!_sprav->(eof())" понятней

4. _SPRAV->(fieldput(fieldpos(aFieldNames)),0)
Пропущен индекс.
Изменено: Алексей Новиков - 01.10.2013 15:28:04
С уважением, Новиков Алексей.
 
Алексей ,большое спасибо за замечания!
Цитата
Алексей Новиков пишет:
1. Пропущен индекс
if aTypes='N'

В исходном плагине ,который компилировал и проходил с отладчиков ,выражение
if aTypes[i]='N' было написано верно,
[i] - выпал при копировании текста плагина в этот пост.

Цитата
Алексей Новиков пишет:

2. Неэффективная организация. Сначала надо собрать наименования всех числовых полей в отдельный массив, затем для каждой записи базы менять значения всех полей из массива. Будет гораздо быстрее, чем для каждого поля лочить и разлочивать запись.
С этим согласен .Первоначально я предполагал ,что вариант,который предложили Вы оптимальный.
Просто не стал переписывать плагин ( точнее не предал этому значение)
Цитата
Алексей Новиков пишет:

3. _SPRAV->(RECNO())<_SPRAV->(LASTREC())+1
Оригинально, но "!_sprav->(eof())" понятней
К сожалению много раз ->(eof()) подводила в тех случаях когда в условию отбора (фильтра, скоба)
попадает одна запись в БД,т,е например:
_grup:="00001"
_nnum:=''
dbPush('_SPRAV','_SPRAV->GRUP==_grup','',{})
_SPRAV->(dbgotop())
do while _SPRAV->(!Eof())
_nnum:=_SPRAV->NNUM
_SPRAV->(dbskip())
enddo
dbpop()
Если "попала" одна запись ,то _nnum - будет пусто.
Уже много раз на это спотыкался.

_SPRAV->(RECNO())<_SPRAV->(LASTREC())+1 - никогда не подводила.
Изменено: gabov - 01.10.2013 20:51:51
 
Цитата
Алексей Новиков пишет:

4. _SPRAV->(fieldput(fieldpos(aFieldNames )),0)
Пропущен индекс.
С отладчиком "бегал"."Вываливание" из программы как раз и происходит на этой строке.
И компиляция проходит без проблем.
Как-то по другому надо это записывать?
Изменено: gabov - 01.10.2013 20:46:56
 
Цитата

Синтаксис

FieldPos( <cFieldName> ) --> nFieldPosition

Параметры

<cFieldName>

<cFieldName> - символьная строка, в которой содержится имя поля.

И компилятор разумеется считает что в Вашем случае
Цитата
gabov пишет:
4. _SPRAV->(fieldput(fieldpos(aFieldNames )),0)
aFieldNames это символьная переменная с именем поля
Но Вы то делаете
Цитата
Валерий Кораблин пишет:
AFIELDS(aFieldNames,aTypes,,)
то есть это у Вас массив, а где указание на элемент массива [i] ?

вот это Вам Алексей и сказал :)
 
И блокировку записи надо делать до всех ваших циклов с полями
 
Я ему советовал, только вот это:

"Программирование состоит элементарно из этапов: описывается структурная схема (постановка задачи), затем функциональная схема, затем алгоритм (математика и логическая схема процедуры - со всеми вычислениями, включая организацию массивов, циклов и т.д.)) и позже программирование на языке. При условии, что на стадии постановки задачи решены Вопросы с базой данных т. е. информационным обеспечением. Этот ликбез надо усвоить или вообще не браться за создание даже таких маленьких плагинов. Кроме того, надо научиться вести отладку, тестирование отдельно, прежде чем подсоединяться к БЭСТ. Толку не будет от того, что кто-то Вам поможет и найдёт ошибку в цикле или условном, или без условном переходе, или порядке обнуления, или своевременного присвоения значений переменным. Удачи."
Я помогаю, только когда уверен, что собеседник имеет профессиональное образование, а не выпускник педвуза или кулинарного колледжа. И тот и другой очень нужен в своей профессии.
 
Цитата
nordk пишет:

И компилятор разумеется считает что в Вашем случае
Цитата
gabov пишет:
4. _SPRAV->(fieldput(fieldpos(aFieldNames )),0)
aFieldNames это символьная переменная с именем поля
а где указание на элемент массива ?


Посмотрите, пожалуйста, как у меня записано:
_SPRAV->(fieldput(fieldpos(aFieldNames[i])),0)

,т.е.индекс [i] присутствует .
Алексей Новиков писал о том ,что нет индекса в выражении : if aTypes[i]='N'
Почему-то в процессе копирования текста в пост он иногда исчезает.
Или вы что-то другое имели ввиду?
 
Цитата
Алексей Новиков пишет:
4. _SPRAV->(fieldput(fieldpos(aFieldNames )),0)
Пропущен индекс.
 
Если индексы стоят и не работает - поподробнее инфо об ошибке тогда
 
Добрый вечер.
Разобрался. По невнимательности не там поставил закрывающую скобку
надо было написать _SPRAV->(fieldput(fieldpos(aFieldNames[i]),0))

Смутило только что сам Бэст при этом вываливался с ошибкой,в противном бы случае никого
не беспокоил.
Всем спасибо
 
БЭСТ ошибки включая переваривает через себя. И разумеется выдает экран с ошибкой.
Поэтому когда Вы видите такой экран думать что именно сам БЭСТ по ошибке слетел не совсем корректно.
БЭСТ прекратил работу по ошибке - это факт. а вот чья ошибка - это уже не всегда по вине БЭСТа
Страницы: 1
Читают тему (гостей: 1)