УРОК 202. Окно ввода средствами QINPUT
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3, 4, 5  Next  :| |:
-> Программирование в БЭСТ-4

#16:  Author: nordkLocation: Горбунов Константин PostPosted: 02 Nov 2007 21:13
    —
Ааа пропустил
Тогда по первой таблице создайте индекс UPPER(CODE)
А по второй таблице UPPER(CODE+TYPE)
Сами справочники в общем виде создавать умеете ?
Если да то сделайте справочник по первой и второй таблице через
MAKEREFER() и тогда уже приводим окончательный текст программы-заготовки

#17:  Author: vlaLocation: Гаклин Владимир Ильич PostPosted: 02 Nov 2007 21:46
    —
ОК, продолжаем. Расширенный вариант заготовки:
Code:

//корректировка доп.информации о партнере
//к уроку 202 (QINPUT)
function main()
Local p_vid,p_typ,p_post
Local aRef
Local aSet,aSetKey
altd()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
NETUSE("PART_T","part_t.dbf",,.F.) //справочник типов партнеров
NETUSE("PART_V","part_v.dbf",,.F.) //справочник видов партнеров
PART__T->(OrdSetFocus(01))         //индекс UPPER(CODE)
PART__V->(OrdSetFocus(01))         //индекс UPPER(CODE+TYPE)
  p_typ:=val(token(partner->adress2,,1))  //подтянули текущее значение типа
  p_vid:=val(token(partner->adress2,,2))  //подтянули текущее значение вида
  p_post:=alltrim(token(partner->adress2,,3)) //подтянули текущее значение емэйла
  //определим справочник типов
  part_t->( MAKEREFER("s_t","Тип партнера",2,{" Код  ","  Тип      "},;
  {3,5,16}, "n/w,w+/n",{"CODE"},{"xVar[1]"},,;
  {{||str(FIELD->CODE,6,0)},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))
  //определим справочник видов
  part_v->( MAKEREFER("s_v","Вид партнера",2,{" Код  ","Населенный пункт "},;
  {3,5,16}, "n/w,w+/n",{"TYPE"},{"xVar[1]"},,;
  {{||str(FIELD->TYPE,6,0)},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))
  //

  //
    if NoOrYes("Изменять информацию о партнере",2,{" Да "," Нет "})=1
      partner->(RECLOCK())
        partner->adress2:=str(p_typ,6,0)+';'+str(p_vid,6,0)+';'+ltrim(p_post)
      partner->(F_DBUNLOCK())
    endif
part_t->( DBCLOSEAREA() )
part_v->( DBCLOSEAREA() )
RestSetKey(aSetKey)
RestSet(aSet)
return nil

#18:  Author: nordkLocation: Горбунов Константин PostPosted: 03 Nov 2007 14:50
    —
Пропустил
В структурах баз давайте CODE сделаем C 6 0
И type тоже сделаем C 6 0
Я ведь даже индексы написал что эти поля символьные

#19:  Author: nordkLocation: Горбунов Константин PostPosted: 03 Nov 2007 14:55
    —
Теперь переделаем справочники

было
//определим справочник типов
Code:
  part_t->( MAKEREFER("s_t","Тип партнера",2,{" Код  ","  Тип      "},;
  {3,5,16}, "n/w,w+/n",{"CODE"},{"xVar[1]"},,;
  {{||str(FIELD->CODE,6,0)},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))

Поскольку мы делаем через QINPUT то массив будет aIn[]
И еще необходимо добавить строку поиска с тем чтобы
не обращаться к справочнику при корректировке, если
значение какое-то уже было выставлено и менять не обязательно
Поэтому стало

Code:
  part_t->( MAKEREFER("s_t","Тип партнера",2,{" Код  ","  Тип      "},;
  {3,5,16}, "n/w,w+/n",{"CODE"},{"aIn[1]"},'UPPER(aIn[1])',;
  {{||str(FIELD->CODE,6,0)},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))

#20:  Author: nordkLocation: Горбунов Константин PostPosted: 03 Nov 2007 15:04
    —
Теперь второй справочник
было
Code:
part_v->( MAKEREFER("s_v","Вид партнера",2,{" Код  ","Населенный пункт "},;
  {3,5,16}, "n/w,w+/n",{"TYPE"},{"xVar[1]"},,;
  {{||str(FIELD->TYPE,6,0)},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))

Теже изменения что и в предыдущем плюс увязка с предыдущим
по индексу
Code:
part_v->( MAKEREFER("s_v","Вид партнера",2,{" Код  ","Населенный пункт "},;
  {3,5,16}, "n/w,w+/n",{"TYPE"},{"aIn[2]"},'UPPER(aIn[1]+aIn[2])',;
  {{||str(FIELD->TYPE,6,0)},{||FIELD->NAME}};
  ,,,,,,;
  {||part_v->( SETSCOPE('UPPER(CODE)',UPPER(aIn[1])) )},;
  {||part_v->( SETSCOPE() )},;
   ,,,,,,,,,'cFind$UPPER(NAME)'))

#21:  Author: nordkLocation: Горбунов Константин PostPosted: 03 Nov 2007 15:07
    —
Теперь добавляем в таблицу partner поля P_CODE C 6 0 и P_TYPE C 6 0
Для централизованной поддержки не забываем информацию о них
в базу fields в соответствие с описанием в help
Исправляем в заготовке с учетом смена типа переменных и изменения
справочников. Выкладываем что получилось и если непонятно
задаем вопросы

#22:  Author: Дениска PostPosted: 03 Nov 2007 17:37
    —
nordk wrote:
Теперь добавляем в таблицу partner поля P_CODE C 6 0 и P_TYPE C 6 0


QINPUT сам пишет в базу? Получится сделать запись информации не в добавленные поля P_CODE и P_TYPE, а в поле adress2 (я не нашел где в БЭСТ-е это поле задействовано), как это хочет Владимир? Вот код, который он написан выше:
Code:

      partner->(RECLOCK())
        partner->adress2:=str(p_typ,6,0)+';'+str(p_vid,6,0)+';'+ltrim(p_post)
      partner->(F_DBUNLOCK())

#23:  Author: vlaLocation: Гаклин Владимир Ильич PostPosted: 06 Nov 2007 11:22
    —
Пользовательские справочники part_t и part_v изменил, индексы к ним создал.
Изменения в определения справочника типов и видов внес.
Пришлось уточнить соответственно str(FIELD->CODE,6,0) на FIELD->CODE.
Что получилось - непонятно, ибо созданные справочники нигде не используются.

#24:  Author: nordkLocation: Горбунов Константин PostPosted: 06 Nov 2007 11:23
    —
Дениска wrote:
nordk wrote:
Теперь добавляем в таблицу partner поля P_CODE C 6 0 и P_TYPE C 6 0


QINPUT сам пишет в базу? Получится сделать запись информации не в добавленные поля P_CODE и P_TYPE, а в поле adress2 (я не нашел где в БЭСТ-е это поле задействовано), как это хочет Владимир? Вот код, который он написан выше:
Code:

      partner->(RECLOCK())
        partner->adress2:=str(p_typ,6,0)+';'+str(p_vid,6,0)+';'+ltrim(p_post)
      partner->(F_DBUNLOCK())


QINPUT пишет как в базу так и в переменные.
Собственно InitList для ввода использует QINPUT
Да это можно сделать, только мы в примере сделаем в поля а в адрес
это уже для самостоятельного развлечения...

#25:  Author: nordkLocation: Горбунов Константин PostPosted: 06 Nov 2007 11:24
    —
vla wrote:
Пользовательские справочники part_t и part_v изменил, индексы к ним создал.
Изменения в определения справочника типов и видов внес.
Пришлось уточнить соответственно str(FIELD->CODE,6,0) на FIELD->CODE.
Что получилось - непонятно, ибо созданные справочники нигде не используются.


Пожалуйста опубликуйте что получилось.
Я посмотрю на весь текст и мы сразу сделаем вво

#26:  Author: vlaLocation: Гаклин Владимир Ильич PostPosted: 06 Nov 2007 11:34
    —
Попробовал заменить aIn[x] на xVar[x] и проверить через Dialog():
Code:
function main()
Local p_vid,p_typ,p_post
Local aRef
Local aSet,aSetKey
altd()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
NETUSE("PART_T","part_t.dbf",,.F.) //справочник типов партнеров
PART_T->(OrdSetFocus("PART_T"))
part_t->(dbgotop())
  p_typ:=token(partner->adress2,,1)  //подтянули текущее значение типа
  //определим справочник типов
  part_t->( MAKEREFER("s_t","Тип партнера",2,{" Код  ","  Тип      "},;
  {3,5,16}, "n/w,w+/n",{"CODE"},{"xVar[1]"},'UPPER(xVar[1])',;
  {{||FIELD->CODE},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))
  //а дальше временное, для проверки работы справочников
  aRef:="s_t"
  p_typ:=Dialog('Вид партнера:', 'XXXXXX',p_typ,,,,,aRef)
  if lastkey()<>27
    if NoOrYes("Изменять информацию о партнере",2,{" Да "," Нет "})=1
      partner->(RECLOCK())
        partner->adress2:=p_typ+';'
      partner->(F_DBUNLOCK())
    endif
  endif
part_t->( DBCLOSEAREA() )
RestSetKey(aSetKey)
RestSet(aSet)
return nil

- работает, вот только текущее значение в справочнике не находится, т.к. CODE хранится выровненным вправо, а в Dialog() показывается выровненным влев

#27:  Author: vlaLocation: Гаклин Владимир Ильич PostPosted: 06 Nov 2007 11:39
    —
Текущее состояние:
Code:

//корректировка доп.информации о партнере
//к уроку 202 (QINPUT)
function main()
Local p_vid,p_typ,p_post
Local aRef
Local aSet,aSetKey
altd()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
NETUSE("PART_T","part_t.dbf",,.F.) //справочник типов партнеров
NETUSE("PART_V","part_v.dbf",,.F.) //справочник видов партнеров
PART_T->(OrdSetFocus("PART_T"))
PART_V->(OrdSetFocus("PART_V"))
  p_typ:=token(partner->adress2,,1)  //подтянули текущее значение типа
  p_vid:=token(partner->adress2,,2)  //подтянули текущее значение вида
  p_post:=alltrim(token(partner->adress2,,3)) //подтянули текущее значение емэйла
  //определим справочник типов
  part_t->( MAKEREFER("s_t","Тип партнера",2,{" Код  ","  Тип      "},;
  {3,5,16}, "n/w,w+/n",{"CODE"},{"aIn[1]"},'UPPER(aIn[1])',;
  {{||FIELD->CODE},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))
  //определим справочник видов
  part_v->( MAKEREFER("s_v","Вид партнера",2,{" Код  ","Населенный пункт "},;
   {3,5,16}, "n/w,w+/n",{"TYPE"},{"aIn[2]"},'UPPER(aIn[1]+aIn[2])',;
   {{||FIELD->TYPE},{||FIELD->NAME}};
   ,,,,,,;
   {||part_v->( SETSCOPE('UPPER(CODE)',UPPER(aIn[1])) )},;
   {||part_v->( SETSCOPE() )},;
    ,,,,,,,,,'cFind$UPPER(NAME)'))
   //

   //
    if NoOrYes("Изменять информацию о партнере",2,{" Да "," Нет "})=1
      partner->(RECLOCK())
        partner->adress2:=p_typ+';'+p_vid+';'+ltrim(p_post)
      partner->(F_DBUNLOCK())
    endif
part_t->( DBCLOSEAREA() )
part_v->( DBCLOSEAREA() )
RestSetKey(aSetKey)
RestSet(aSet)
return nil

#28:  Author: nordkLocation: Горбунов Константин PostPosted: 06 Nov 2007 13:12
    —
Владимир мы с Вами делаем пример от простого к сложному.
А значит мы делаем на своих полях в справочнике партнеров.
Добейтесь сначала результатов в этом а уж потом притягивайте
составные текстовые поля в качестве самостоятельной программы - ок ?

#29:  Author: vlaLocation: Гаклин Владимир Ильич PostPosted: 06 Nov 2007 13:59
    —
nordk wrote:
Владимир мы с Вами делаем пример от простого к сложному.

Написал в личк

#30:  Author: vlaLocation: Гаклин Владимир Ильич PostPosted: 06 Nov 2007 16:29
    —
С учетом замечаний Константина текущий вариант выглядит так:
Code:
function main()
Local p_vid,p_typ,p_post
Local aRef
Local aSet,aSetKey
altd()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
NETUSE("PART_T","part_t.dbf",,.F.) //справочник типов партнеров
NETUSE("PART_V","part_v.dbf",,.F.) //справочник видов партнеров
PART_T->(OrdSetFocus("PART_T"))
PART_V->(OrdSetFocus("PART_V"))
  p_typ:=partner->p_typ   //подтянули текущее значение типа
  p_vid:=partner->p_vid   //подтянули текущее значение вида
  p_post:=partner->p_post //подтянули текущее значение емэйла
  //определим справочник типов
  part_t->( MAKEREFER("s_t","Тип партнера",2,{" Код  ","  Тип      "},;
  {3,5,16}, "n/w,w+/n",{"CODE"},{"aIn[1]"},'UPPER(aIn[1])',;
  {{||FIELD->CODE},{||FIELD->NAME}};
  ,,,,,,,,,,,,,,,,,'cFind$UPPER(NAME)'))
  //определим справочник видов
  part_v->( MAKEREFER("s_v","Вид партнера",2,{" Код  ","Населенный пункт "},;
   {3,5,16}, "n/w,w+/n",{"TYPE"},{"aIn[2]"},'UPPER(aIn[1]+aIn[2])',;
   {{||FIELD->TYPE},{||FIELD->NAME}};
   ,,,,,,;
   {||part_v->( SETSCOPE('UPPER(CODE)',UPPER(aIn[1])) )},;
   {||part_v->( SETSCOPE() )},;
    ,,,,,,,,,'cFind$UPPER(NAME)'))
   //

   //
    if NoOrYes("Изменять информацию о партнере",2,{" Да "," Нет "})=1
      partner->(RECLOCK())
        partner->p_typ:=p_typ
        partner->p_vid:=p_vid
        partner->p_post:=p_post
      partner->(F_DBUNLOCK())
    endif
part_t->( DBCLOSEAREA() )
part_v->( DBCLOSEAREA() )
RestSetKey(aSetKey)
RestSet(aSet)
return nil


Соответственно, в таблицу partner предварительно добавил 3 текстовых поля (согласно правилам, до поля CRC):
P_TYP Char len=6
P_VID Char len=6
P_POST Char len=30



-> Программирование в БЭСТ-4


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3, 4, 5  Next  :| |:
Page 2 of 5

Powered by phpBB © 2001, 2005 phpBB Group