ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
Авторизация

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

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


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Отображение в initlist только записей, удовлетворяющих определенному условию

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Отображение в initlist только записей, удовлетворяющих определенному условию
 
Здравствуйте!
Надо чтобы Initlist отображал на экране не все записи из файла , а лишь те которые удовлетворяют некоторому условию. По описанию больше всего подходит aBlockCols ( других подходящих параметровя не нашел) :
Файл содержит три поля.Вот я задаю
aBlockCols:={{{||FIELD->code},0},{{||FIELD->period},7},{{||FIELD->date},16}}
Надо чтобы отображались на экране записи ,например, FIELD->code=="000002".

Как это записать?
 
DBSETFILTER()
SETSCOPE()
Предварительно отфильтровать таблицу надо
 
Цитата
nordk пишет:
DBSETFILTER()
SETSCOPE()
Предварительно отфильтровать таблицу надо
Да я понимаю ,что dbsetfilter () .
А где ( в каком параметре) его записать?
 
Писать его надо перед вызовом initlist. Или навешивать установку фильтра на setkey(), если его надо устанавливать/отменять оперативно, в процессе работы.
С уважением, Новиков Алексей.
 
Здравствуйте!
Поставил перед Inilist DBSETFILTER()

Код
U_sheta->(ordsetfocus("TAG_CODE"))

U_sheta->(DBSETFILTER({|| field->CODE=_codePartn},"field->CODE=_codePartn") )

U_sheta->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,,aPic,aWhen,,;
,bDel,,,,;
,,,,,;
,,,,,;
,bPostGet,,,,))

U_sheta->(DbClearFilter())

Теперь отображает записи с учетом фильтра.
Но после попытки удаления записи вываливается ошибка "Переменная не существует".
Если закомментировать строку
Код
U_sheta->(DBSETFILTER({|| field->CODE=_codePartn},"field->CODE=_codePartn") )
то при удаление записи ошибка не выскакивает.
Полный текст :

Код
#include "inkey.ch"
Function Main()
LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc
LOCAL bDel,_aHeads,aPic,nLeft,nUniMode,nTag,bPreGet,bPostGet,bPost,bScrPost,bScrInit
LOCAL _codePartn:="000001",_namePartn:=" "
//LOCAL _codePartn:=partner->code,_namePartn:=partner->SHORTNAME
aSet:=SAVESET()
aSetKey:=SAVESETKEY()            
NETUSE("U_sheta",LOADPATH()+"real\u_scheta.dbf",,.F.)
DISPBOX(2,0,23,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ),"W+/B")
SAYSCREEN(_codePartn+' '+_namePartn+"- ДАТА ПОЛУЧЕНИЯ СЧЕТ ФАКТУРЫ  ",2,5)

cColHead:={"  КОД  ПЕРИОД   ДАТА  "}
cCurProc:={||"2"}

aBlockCols:={{{||FIELD->code},0},{{||FIELD->period},7},{{||FIELD->date},16}}

aWhen:={{||aIn[1]:=_codePartn,.f.},,}


bDel:={||.T.} // удаление будет запрещено и наоборот соответственно разрешено
nLeft:=1
nUniMode:=2
nTag :='01'
_aHeads:={{"Код партнера.......................:","CODE",},;
          {"Период ............................:","PERIOD"},;
          {"Дата получения покупателем счета...:","DATE"}}
aPic:={,"9999.99",} // шаблон ввода данных

bPostGet:={{||myfunction(),.t.}}
bPost:={||myfunction()}

U_sheta->(ordsetfocus("TAG_CODE"))
U_sheta->(DBSETFILTER({|| field->CODE=_codePartn},"field->CODE=_codePartn") )



U_sheta->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,,aPic,aWhen,,;
,bDel,,,,;
,,,,,;
,,,,,;
,bPostGet,,,,))

U_sheta->(DbClearFilter())
U_sheta->( DBCLOSEAREA() )
RESTSETKEY(aSetKey)
RESTSET(aSet)
RETURN NIL
FUNCTION myfunction()
altd()
  SAYANDWAIT("OK")
RETURN 
 
Плагин запускается в справочнике партнеров.
Индекс
Код
U_sheta->(ordsetfocus("TAG_CODE"))
прописан в bases_05.dbf как upper(CODE+PERIOD)

Что-то еще надо прописать?
 
У Вас переменная _codePartn объявлена как local
В исходной функции она видна, поэтому фильтр устанавливается
А в функции initlist ваша локальная переменная уже недоступна и выражение фильтра рассчитано быть не может.
Выхода два - либо создать выражение фильтра как блок из строки с готовым значением _codePartn
Либо объявить _codePartn как private
С уважением, Новиков Алексей.
 
Цитата
Алексей Новиков пишет:
У Вас переменная _codePartn объявлена как local
Да объявил как Private и проблема ушла. ( Вы когда-то мне на подобную проблему отвечали,но я не подумал и опять на те же грабли наступил.Извините). Спасибо.
Еще непонятно : 11 параметр nUniMode по какому ключу (индексу) определяет уникальность.
Т.е в каком параметре надо задать ключ (индекс) по которому nUniMode будет определяеть уникальность?
 
28 - nTag - номер тега, по которому проверяется уникальность индекса
С уважением, Новиков Алексей.
 
Цитата
Алексей Новиков пишет:
28 - nTag - номер тега, по которому проверяется уникальность индекса
Спасибо!
 
Здравствуйте!
Прописал 14 -м параметром

Код
aSortSeek:={;
{"- по коду/периоду",{"Код   ","Период"}, {'CODE','PERIOD'},'UPPER(aIn[1]+aIn[2])',,,,'TAG_CODE'};
} 
Если в MAKEREFER() задавать такой параметр ,то в подвале окна появлялась подсказка
по горячим клавишам F3 , F7 и сортировка и поиск работали.
В этом же плагине в подвале окна никаких подсказок не появилось ,но поиск по F7 заработал, а
вот сортировка не появилась ( нажатие на F3 вообще ни к каким последствиям не приводит).

В материалах форума для задания "горячих клавиш" нашел такой код для 30-го параметра:aHotKey:={;
Код
{;
{'Ctrl+F5 - Статус',K_CTRL_F5,{||myfunction()},1},;
{'Ctrl+F7 - Таблица расстояний',K_CTRL_F7,{||myfunction()},1};
},;
{},;
{};
}
Но отображение подсказок при этом идет только при нажатии клавиши CTRL.
А что нужно сделать чтобы,например,в подвале экрана отражались : F3- сортировка
F7-поиск?
Единственное ,что пришло в голову - это вывести в подвал экрана эти подсказки с помощью SAYSCREEN().
К тому же в этом примере к клавишам привязываются только свои функции.
 
F3 и F7 назначаются автоматически в initlist()
Возможно, что из-за того что у Вас всего один вариант сортировки/поиска. initlist() не выводит диалог выбора варианта.
А если тэг, указанные в aSortSekk совпадает с тэгом, установленным перед вызовом Initlist(), то ничего не происходит и Вам кажется что сортировка не работает.

aHotKey содержит три подмассива, для Ctrl, Alt и Shift соответственно (за порядок следования не ручаюсь). В примере заполнен только первый подмассив. для Ctrl
Вам следует разнести свои горячие клавиши по подмассивам в зависимости от используемого модификатора.
С уважением, Новиков Алексей.
Страницы: 1
Читают тему (гостей: 18)