Альтернативный ввод адреса
Добавлено: 05 авг 2010, 18:37
Можете использовать как пример работы с quickchoice или рекурсивного вызова функций
Прообраз - программа 2НДФЛ. Давно лежит без движения - мож кому пригодится.
У главного фейса 2 режима работы - поиск и ввод
Для запуска в режиме поиска внизу АРД.
Для ввода при нажатии F3 в поле "населенный пункт" стандартного окна ввода адресов будет вопрос - запустить стандартный выбор или нет. При выборе "нет" попадете в это окно. Не рекомендуется искать населенный пункт не зная района - будет долго.
Можно пробовать искать по индексу. Для страны быстрый поиск не сделан намерено - чтоб иметь возможность стандартного выбора
Надо как нибудь переделать заполнение временной таблицы для выбора на пакетную вставку.
Прообраз - программа 2НДФЛ. Давно лежит без движения - мож кому пригодится.
У главного фейса 2 режима работы - поиск и ввод
Для запуска в режиме поиска внизу АРД.
Для ввода при нажатии F3 в поле "населенный пункт" стандартного окна ввода адресов будет вопрос - запустить стандартный выбор или нет. При выборе "нет" попадете в это окно. Не рекомендуется искать населенный пункт не зная района - будет долго.
Можно пробовать искать по индексу. Для страны быстрый поиск не сделан намерено - чтоб иметь возможность стандартного выбора
Надо как нибудь переделать заполнение временной таблицы для выбора на пакетную вставку.
Код: Выделить всё
AddressGet.Vip
#ifdef ComponentVersion
#component "z_staff"
#end
#DEFINE _NOBETA_
#IFDEF _BETA_
#ENDIF
vipinterface TerrCatalog licensed(free) parameters
(iEntryPoint: integer;
NRecTerr: comp;
parmode: comp);
#include AdrFunc.vih // Функции работы с адресами
#ifdef ComponentVersion
#component "z_staff"
#endif
//=============================================
vipinterface AddressGet_My licensed(free) parameters(Title:string;wcaddres : comp; wtype:word;cpers:comp;wcsterr_out:comp );
vipinterface AddressGetIndex licensed(free) parameters(wcsterr:comp;windex:string );
vipinterface get_sterrquick licensed(free) parameters(wcsterr : comp ;wcsterr1 : comp ;wlevel_filtr:word ; wtp:word;wspostind:string[10]);
//============================================
//==== ГЛАВНЫЙ ==========================
//============================================
Interface AddressGet_My 'Ввод Адреса' EscClose ;
var iAdrFunc : AddressFunc; // Переменная типа интерфейс AddressFunc
create view vAddressGet_My
var
index_new,index_old :string[10] ;
country_new :string ;
oblast_new,oblast_old:string ;
raion_new,raion_old:string ;
town_new,town_old:string ;
nasp_new,nasp_old :string ;
street_new,street_old:string ;
house_new,house_old:string ;
korpus_new,korpus_old:string ;
flat_new,flat_old:string ;
wcsterr,wcsterr1 :comp ; // для поиска
wcsterr_out :comp ; // выходной
wcaddres:comp ; // NRec адреса
wkl_update_adress :boolean ;
title :string ; //заголовок
wtype:word ; // тип Адреса
cpers:comp ;
w_comm2,w_comm1 :string ; // комментарии
Main_Root :comp;
as select sterr.nrec
from sterr
//,sterr sterr1,sterr sterr2,sterr sterr3
,addressn
where ((
wcaddres == addressn.nrec
and wcsterr1==sterr.nrec
))
;
parameters Title, // Заголовок
wcaddres, // NRec адреса
wType, // Тип адреса
cPers, // Ссылка на персону
wcsterr_out // выходной параметр
;
var dm_csterr : array [0..10] of comp ;
//=============================================
Procedure SaveParam ;
{ SaveMyDsk(wcsterr_out,'AddressGetMy_wcsterr_out')
}
//=============================================
Procedure ReadParam ;
{ if not ReadMyDsk(wcsterr_out,'AddressGetMy_wcsterr_out',false) wcsterr_out:=0 ;
}
//=============================================
panel pnmain ;
screen scrmain ;
table addressn ;
FIELDS
country_new ('Выбор стандартным образом!',,sci13ESc) :protect, pickbutton ;
w_comm1 : skip ;
w_comm2 : skip ;
index_new(,,sci13ESc) :{ Font = { Color = if (index_new<>index_old, ColorMark, 0 )}}, noprotect, pickbutton ;
index_old : skip ;
oblast_new(,,sci13ESc):{ Font = { Color = if ( oblast_old<>oblast_new, ColorMark, 0 )}}, protect, pickbutton, QuickChoice;
oblast_old: skip ;
// dm_csterr[1] : protect,skip ;
raion_new(,,sci13ESc) :{ Font = { Color = if ( raion_old<>raion_new, ColorMark, 0 )}}, protect, pickbutton, QuickChoice ;
raion_old: skip ;
// dm_csterr[2] : protect,skip ;
town_new(,,sci13ESc) : { Font = { Color = if ( town_old<>town_new, ColorMark, 0 )}}, protect, pickbutton, QuickChoice ;
town_old : skip ;
// dm_csterr[3] : protect,skip ;
nasp_new(,,sci13ESc) : { Font = { Color = if ( nasp_old<>nasp_new, ColorMark, 0 )}}, protect, pickbutton, QuickChoice ;
nasp_old : skip ;
// dm_csterr[4] : protect,skip ;
street_new(,,sci13ESc) :{ Font = { Color = if (street_new<>street_old, ColorMark, 0 )}}, protect, pickbutton, QuickChoice;
street_old: skip ;
// dm_csterr[5] : protect,skip ;
house_new :{ Font = { Color = if (house_new<>house_old, ColorMark, 0 )}}, noprotect ;
house_old : skip ;
korpus_new:{ Font = { Color = if (korpus_new<>korpus_old, ColorMark, 0 )}}, noprotect ;
korpus_old: skip ;
flat_new :{ Font = { Color = if (flat_new<>flat_old, ColorMark, 0 )}}, noprotect ;
flat_old:skip ;
Buttons
cmOk, default;
cmCancel;
cmIndexView ;
//.@@@@@@@@@@@@@@@@@@@
<<
Страна .@@@@@@@@@@@@@@@@@@@@
.@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
Индекс .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
Область .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
Район .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
Город .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
Нас.пункт .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
улица .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
дом .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
корпус .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
кв-ра .@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@
<.Установить.> <.~О~тмена.> <.Посмотреть индексы.>
>>
end;
end;
//======================================
function GetRuSSia: comp ;
{ if GetFirst sTerr where
(( '643' == sTerr.sGNI_CODE and Main_Root == sterr.cparent(noindex) )) = tsOk
{
GetRuSSia := sTerr.Nrec; // корневой
}
}
//======================================
Procedure GetSterrName(wtp:word ) ;
{ if getfirst sterr where ((dm_csterr[wtp] == sterr.nrec ))=0
{ case wtp of
1: oblast_new:=sterr.SNAME ;
2: raion_new:=sterr.SNAME ;
3: town_new:=sterr.SNAME ;
4: nasp_new:=sterr.SNAME ;
5: street_new:=sterr.SNAME ;
end ;
}
}
//=============================================
// почистить Адрес
//=============================================
Procedure ClearAddr(wtp :word ) ;
var ii:integer ;
{
for(ii:=wtp ;ii<=5; ii:=ii+1)
{ dm_csterr[ii]:=0 ;
case ii of
1:{ oblast_new:='' }
2:{ raion_new:=''}
3:{ town_new:='' }
4:{ nasp_new:=''}
5:{ street_new:=''}
end ;
} //for(ii:=wtp ;ii<=5; ii:=ii+1)
}
//=============================================
// заполнить адрес
//=============================================
Procedure MyGetTown(wnrec :comp ) ;
var windex :string ;
{ ClearAddr(1)
windex:=''
do {
wcsterr1:=wnrec ;
if getfirst sterr=0 // where (( wnrec == sterr.nrec ))=0
{ if windex='' and sterr.SPOSTIND<>''
windex:=sterr.SPOSTIND
if sterr.cparent=0 then break ;
if sTerr.SysCode=-10 then break ;
case sTerr.wType of
1:{ dm_csterr[0]:=sterr.nrec ; country_new:=sterr.sname ; }
2:{ dm_csterr[1]:=sterr.nrec ; oblast_new:=sterr.sname ; }
3:{ dm_csterr[2]:=sterr.nrec ; raion_new:=sterr.sname ; }
4:{ dm_csterr[3]:=sterr.nrec ; town_new:=sterr.sname ; }
5:{ dm_csterr[4]:=sterr.nrec ; nasp_new:=sterr.sname ;}
7:{ dm_csterr[5]:=sterr.nrec ; street_new:=sterr.sname ;}
else
{ if STERR.WTERR=2 then
{ dm_csterr[1]:=sterr.nrec ; oblast_new:=sterr.sname ;
}
else
if (length(sTerr.sGNI_CODE) = 15) or (length(sTerr.sGNI_CODE) = 17)
{ dm_csterr[5]:=sterr.nrec ; street_new:=sterr.sname ;
}
}
end ;
wnrec:=sterr.cparent ;
wcsterr1:=wnrec ;
} else break ;
} while true ;
if windex<>'' and index_new=''
then index_new:=windex
rescanpanel(#addressn) ;
} //Procedure MyGetTown(wnrec :comp ) ;
//=============================================
Function get_sterr(wtp :word) :boolean ;
var wlevelfiltr,ii :word ;
{ wlevelfiltr:=0 ;
if wtp=0 then exit ;
get_sterr:=false ;
// message('1 '+string(wtp))
{ for(ii:=0 ;ii<wtp; ii:=ii+1)
{ // message('2 '+string(ii))
if dm_csterr[ii]>0
{ wlevelfiltr:=ii ;
wcsterr:=dm_csterr[ii] ;
// break ;
}
}
}
// message('2')
if wlevelfiltr=0 and dm_csterr[0]=0
{ dm_csterr[0]:=GetRuSSia ;
country_new:=sterr.sname ;
wcsterr:=dm_csterr[0] ;
}
// message('3')
QuickChoiceName:='qcAddr_sName'
// message('4')
wcsterr1:=dm_csterr[wtp] ;
if wtp=10
{ wcsterr1:=longint(index_new)
}
else index_new:='' ;
if RunInterface(get_sterrquick,wcsterr,wcsterr1,wlevelfiltr,wtp,index_new)=cmDefault {}
if wtp<>10 // не индекс
{
if dm_csterr[wtp]<>wcsterr1 and wcsterr1>0
{ dm_csterr[wtp]:=wcsterr1 ;
GetSterrName(wtp) ;
// message(oblast_new) ;
MyGetTown(wcsterr1) ;
}//if dm_csterr[wtp]<>wcsterr1
}
else
{ if wcsterr1>0
{ MyGetTown(wcsterr1) ;
}
}
rescanpanel(#addressn )
get_sterr:=true ;
}
//=============================================
function CreateFullStreet : string;
{ // Создает строку адреса из улицы, дома, корпуса, квартиры
var MyBuild : string;
var MyHouse : string;
var MyFlat : string;
MyBuild := if (trim(AddressN.sBlock) > '',if (AddressN.wDopField1 = 0, ', кор.', ', стр.'),'');
MyHouse := if (trim(AddressN.sHouse) > '',', дом ','');
MyFlat := if (trim(AddressN.sFlat) > '',', кв.','');
CreateFullStreet := trim(trim(AddressN.sAddress2) + MyHouse + trim(AddressN.sHouse) +
MyBuild + trim(AddressN.sBlock) + MyFlat + trim(AddressN.sFlat));
}
//=============================================
Procedure GetTerrCatalog ;
var ctmp :comp ;
ii:integer ;
{ //message('start')
ctmp:=0 ;
for(ii:=5;ii>=0;ii:=ii-1)
{ if dm_csterr[ii]>0
{ ctmp:=dm_csterr[ii] ;
// message(string(ii));
break ;
}
}
// message('Выбор стандартным образом !') ;
rereadrecord ;
rescanpanel(#addressn) ;
if runinterface(TerrCatalog , -10, ctmp, 0)=cmDefault
{ MyGetTown(ctmp) ;
} // if runinterface( TerrCatalog , -10, ctmp, 0)\=cmDefault
rescanpanel(#addressn) ;
}
//=============================================
HandleEvent
cmIndexView:
{ var w :string ;
w:=index_new ;
if dm_csterr[5]=0
{ message('Задайте улицу!!')
}
else
if runinterface(AddressGetIndex,dm_csterr[5],w)=cmDefault
{ index_new :=w ;
}
rescanpanel(#addressn) ;
} //cmIndexView:
cmPick :
{ rescanpanel(#addressn )
// message('1')
// rereadrecord ;
case CurField of
#Country_new :
{ GetTerrCatalog ;
} //Country_new :
#index_new :
{ get_sterr(10) ;
}
#oblast_new: get_sterr(1) ;
#raion_new : get_sterr(2) ;
#town_new : get_sterr(3) ;
#nasp_new : get_sterr(4) ;
#street_new: get_sterr(5) ;
end ; //case CurField of
} //cmPick :
cmOpenSearch :
{ rescanpanel(#addressn )
case CurField of
#oblast_new: get_sterr(1) ;
#raion_new : get_sterr(2) ;
#town_new : get_sterr(3) ;
#nasp_new : get_sterr(4) ;
#street_new: get_sterr(5) ;
end ;
stop ;
} //cmOpenSearch :
cmDelOnProtect :
{ case CurField of
#oblast_new:{ ClearAddr(1) }
#raion_new: { ClearAddr(2) }
#town_new: { ClearAddr(3) }
#nasp_new: { ClearAddr(4) }
#street_new:{ ClearAddr(5) }
end ;
rescanpanel(#addressn )
} //cmDelOnProtect :
cmPositionChanged :
{ //message('1') ;
// logstrtofile('!sterr.txt','cmPositionChanged=!!! ' )
}
cmCheckField:
{
/* case curfield of
#oblast_new: oblast_old:=oblast_new ;
#raion_new: raion_old:=raion_new ;
#town_new: town_old:=town_new ;
#nasp_new: nasp_old:=nasp_new ;
#street_new: nasp_old:=street_new ;
end ;
*/
}
cmInit:
{
#IFDEF _BETA_
Message('БЭТА ВЕРСИЯ')
#ENDIF
var ii:word ;
for (ii:=0;ii<=5;ii:=ii+1)
{ dm_csterr[ii]:=0 ;
}
oblast_new:='' ;
raion_new :='' ;
town_new :='' ;
nasp_new :='' ;
if (GetFirst sTerr where ((-10 == sTerr.SysCode)) = tsOk)
{ Main_Root := sTerr.NREC; // корневой
}
wkl_update_adress:=false ;
if getfirst addressn=0
{ wkl_update_adress:=true ;
w_comm1:='Новые значения'
w_comm2:='Старые значения' ;
// message('1 '+addressn.SADDRESS2+'/'+string(addressn.nrec)) ;
index_new :=addressn.SPOSTIND ;
index_old :=addressn.SPOSTIND ;
MyGetTown(addressn.csterr)
dm_csterr[5]:=addressn.cstreet ;
street_new:=addressn.SADDRESS2
street_old:=addressn.SADDRESS2
house_new :=addressn.SHOUSE
house_old :=addressn.SHOUSE
korpus_new:=addressn.SBLOCK
korpus_old:=addressn.SBLOCK
flat_new :=addressn.SFLAT
flat_old :=addressn.SFLAT
cfsSetProp('i_SCRMAIN_oblast_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_index_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_oblast_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_town_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_raion_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_nasp_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_street_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_house_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_house_new', cfpVisible, true);
cfsSetProp('i_SCRMAIN_flat_new', cfpVisible, true);
cfsSetProp('i_SCRMAIN_flat_old', cfpVisible, true);
cfsSetProp('i_SCRMAIN_korpus_new', cfpVisible, true);
cfsSetProp('i_SCRMAIN_korpus_old', cfpVisible, true);
cfsSetProp('T_SCRMAIN_дом', cfpVisible, true);
cfsSetProp('T_SCRMAIN_корпус', cfpVisible, true);
cfsSetProp('T_SCRMAIN_кв-ра', cfpVisible, true);
}
else //режим поиска Адреса
{ if wcsterr_out=0 ReadParam ;
MyGetTown(wcsterr_out)
w_comm1:='Введите первые буквы' ; w_comm2:='' ;
cfsSetProp('i_SCRMAIN_oblast_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_index_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_oblast_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_town_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_raion_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_nasp_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_street_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_house_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_house_new', cfpVisible, false);
cfsSetProp('i_SCRMAIN_flat_new', cfpVisible, false);
cfsSetProp('i_SCRMAIN_flat_old', cfpVisible, false);
cfsSetProp('i_SCRMAIN_korpus_new', cfpVisible, false);
cfsSetProp('i_SCRMAIN_korpus_old', cfpVisible, false);
cfsSetProp('T_SCRMAIN_дом', cfpVisible, false);
cfsSetProp('T_SCRMAIN_корпус', cfpVisible, false);
cfsSetProp('T_SCRMAIN_кв-ра', cfpVisible, false);
}
settitle(title) ;
oblast_old:=oblast_new ;
raion_old :=raion_new ;
town_old :=town_new ;
nasp_old :=nasp_new ;
if dm_csterr[0]=0
{ dm_csterr[0]:=GetRuSSia ;
country_new:=sterr.sname ;
}
rescanpanel(#addressn)
} //cmInit:
cmOk :
{ wcsterr_out:=0 ;
rescanpanel(#addressn )
#IFDEF _BETA_
Message('БЭТА ВЕРСИЯ')
#ENDIF
if wkl_update_adress
{ if message('Обновить Адрес?',YesNo)=cmYes
{ var ii :word ;
for(ii:=4;ii>=0;ii:=ii-1)
{ if dm_csterr[ii]>0
{ wcsterr_out:=dm_csterr[ii] ;
break ;
}
}
SaveParam ;
if wcsterr_out>0
{ addressn.SHOUSE:=house_new ;
addressn.SBLOCK:=korpus_new ;
addressn.SFLAT:=flat_new ;
addressn.SPOSTIND:=index_new ;
addressn.csterr:=wcsterr_out ;
addressn.cstreet:=dm_csterr[5] ;
AddressN.sAddress2 :=street_new ;
AddressN.sAddress1 := CreateFullStreet();
update current addressn ;
index_new := iAdrFunc.GetPostZipGni(AddressN.NRec);
if index_new<>'' and index_new<>AddressN.SPOSTIND
{ update current AddressN set AddressN.SPOSTIND:=index_new ;
}
closeinterface(cmDefault)
}
else
closeinterface(cmDone)
}
else
closeinterface(cmDone)
} //if wkl_update_adress
else // режим поиска Адреса
{ var ii :word ;
for(ii:=5;ii>=0;ii:=ii-1)
{ if dm_csterr[ii]>0
{ wcsterr_out:=dm_csterr[ii] ;
break ;
}
}
SaveParam ;
closeinterface(cmDefault)
}
} //cmOk :
end ;
end.
//=================================================================
// быстрый выбор
//=================================================================
interface get_sterrquick cacheable,doaccept,escclose ;
var iAdrFunc : AddressFunc; // Переменная типа интерфейс AddressFunc
table struct tmp_sterr
( nrec :comp
,csterr :comp
,sname :string[100]
,longname:string
,SGNI_CODE:string[20]
,SPOSTIND:string[10]
,pa :word
)
with index
( tmp_sterr02=sname
,tmp_sterr03=nrec
) ;
var
wcsterr,wcsterr1,wcsterr_main : comp ;wlevel_filtr:word ; wtp:word ;
create view ttt
var www :comp ;
dt1 :date ;
chet:longint ;
wtp1:word ;
wkluch :boolean ;
windex :string ; // для поиска по индексу
wSGNI_CODE :string ;
wspostind :string[10] ;
as select * from tmp_sterr
//where ((www == tmp_sterr.csterr ))
;
create view vvv
as select sterr.nrec from sterr
// ,tmp_sterr
,sterr sterr1
where (( wcsterr_main == sterr.cparent
and sterr.nrec == sterr1.cparent
)) ;
;
parameters wcsterr ,wcsterr1 , wlevel_filtr , wtp , wspostind;
//=============================================
quickChoice qcAddr_sName
{
// acceptField = ttt.tmp_sterr.sName;
acceptField =ttt.tmp_sterr.nrec ;
viewField = ttt.tmp_sterr.sName;
viewField = ttt.tmp_sterr.SGNI_CODE;
viewField = ttt.tmp_sterr.longname;
viewField = ttt.tmp_sterr.SPOSTIND;
searchField = ttt.tmp_sterr.sName;
onOpen :
{ //Message ('Поехали!');
if fileexist('!sterr.txt') deletefile('!sterr.txt')
//Message (quickChoiceString);
ProcessCommand (cmValue1);
}
onClose : {
//Message ('Приехали...');
set wcsterr1:=ttt.tmp_sterr.nrec ;
set wspostind:=ttt.tmp_sterr.spostind ;
PutCommand(cmDefault)
}
};
//=============================================
Procedure Fill_TmpByIndex(const wnrec :comp; wwindex:string) ;
var whouse : comp ;
wstr:string ;
{
ttt.windex:=string(wwindex) ;
// logstrtofile('!sterr.txt','Fill_TmpByIndex '+ttt.windex) ;
if length(ttt.windex)<>6 then
{ message('индекс 6 знаков!!!') ;
exit ;
}
if vvv.getfirst sterr where (( wnrec == sterr.nrec ))<>0
{ message('Не задан ни один из элементов АТД')
exit ;
}
if vvv.sterr.wtype<2 and vvv.STERR.WTERR<>2
{ message('поиск индексов производится только для области и ниже!!') ;
exit;
}
ttt.wsgni_code:=vvv.sterr.sgni_code ;
if vvv.sterr.wtype=2 or vvv.STERR.WTERR=2
{ ttt.wsgni_code:=substr(ttt.wsgni_code,1,4) ;
}
// logstrtofile('!sterr.txt','Fill_TmpByIndex '+ttt.wsgni_code) ;
// 78000000000057400
ttt.insert visual into tmp_sterr
( nrec ,sname, csterr,SGNI_CODE, SPOSTIND )
select
sterr.nrec,sterr.sname,sterr.cparent
,sterr.SGNI_CODE,sterr.SPOSTIND
from sterr where ((
ttt.wSGNI_CODE <<= STERR.SGNI_CODE
and ttt.wSGNI_CODE+chr(255) >>= STERR.SGNI_CODE
and ttt.windex == STERR.SPOSTIND(noindex) )) ;
// logstrtofile('!sterr.txt','Вставили '+string(recordsintable(#tmp_sterr))+' записей' ) ;
//sterr Справочник номеров домов объектов АТД")
if vvv.getfirst sterr where (( 2202 == syscode ))=0
{ whouse :=vvv.sterr.nrec
}
//78000000000141000 -17 знаков
chet:=0 ;
// logstrtofile('!sterr.txt','Fill_TmpByIndex 2') ;
ttt._loop fullcache tmp_sterr
{ inc(chet)
if chet mod 10=0
{ if not nextvisual then exit ;
}
// logstrtofile('!sterr.txt',tmp_sterr.sname) ;
if tmp_sterr.csterr=whouse
{ wstr:=substr(ttt.tmp_sterr.sgni_code,1,17) ;
if vvv.getfirst fastfirstrow sterr where (( wstr == sterr.sgni_code ))=0
{ ttt.tmp_sterr.nrec :=vvv.sterr.nrec
ttt.tmp_sterr.sname:=vvv.sterr.sname+'='+ttt.tmp_sterr.sname ;
ttt.tmp_sterr.csterr:=vvv.sterr.cparent ;
ttt.update current tmp_sterr ;
}
else
{ wstr:=substr(ttt.tmp_sterr.sgni_code,1,15) ;
if vvv.getfirst fastfirstrow sterr where (( wstr == sterr.sgni_code ))=0
{ ttt.tmp_sterr.nrec :=vvv.sterr.nrec
ttt.tmp_sterr.sname:=vvv.sterr.sname+'='+ttt.tmp_sterr.sname ;
ttt.tmp_sterr.csterr:=vvv.sterr.cparent ;
ttt.update current tmp_sterr ;
}
else
ttt.delete current tmp_sterr ;
}
} ;
ttt.update current tmp_sterr set
tmp_sterr.longname:=iAdrFunc.GetFullTerrName(ttt.tmp_sterr.csterr) ;
}
// logstrtofile('!sterr.txt','Fill_TmpByIndex 2') ;
} //Fill_TmpByIndex
//====================================
Function Fill_tmp(const wnrec :comp ;const curlevel :word ;const wlongname :string ) :boolean ;
var w,w1 :comp ;
wlev :word ;
wnm:string ;
{ set wcsterr_main:=wnrec ;
Fill_tmp:=false ;
wlev:=curlevel +1 ;
if wlev>10 then exit ;
if wnrec=0 then exit ;
w1:=wnrec ;
inc(chet) ;
if chet div 10 =0
{ if not nextvisual then exit ;
}
// logstrtofile('!sterr.txt','Fill_tmp '+string(wnrec) )
if (vvv.getfirst fastfirstrow sterr
where (( wcsterr_main == sterr.cparent ))
ordered by index STERR03)=0
do {
inc(chet)
if chet div 10 =0
{ if not nextvisual then exit ;
}
if vvv.sterr.wtype=wtp1 or (wtp1=2 and vvv.STERR.WTERR=2)
// для улиц персонально
or (wtp1=7 and ((length(vvv.sTerr.sGNI_CODE) = 15) or (length(vvv.sTerr.sGNI_CODE) = 17)))
{
ttt.tmp_sterr.nrec := vvv.sterr.nrec ;
ttt.tmp_sterr.sname := vvv.sterr.sname ;
ttt.tmp_sterr.csterr := wcsterr ;
ttt.tmp_sterr.SGNI_CODE:=vvv.STERR.SGNI_CODE ;
ttt.tmp_sterr.longname :=wlongname ;
ttt.tmp_sterr.SPOSTIND :=vvv.STERR.SPOSTIND ;
ttt.insert current tmp_sterr ;
/*
ttt.insert into tmp_sterr set
tmp_sterr.nrec := vvv.sterr.nrec
,tmp_sterr.sname := vvv.sterr.sname
,tmp_sterr.csterr := wcsterr
,tmp_sterr.SGNI_CODE:=vvv.STERR.SGNI_CODE
,tmp_sterr.longname :=wlongname
,tmp_sterr.SPOSTIND :=vvv.STERR.SPOSTIND
;
*/
// logstrtofile('!sterr.txt','tmp= '+string(ttt.tmp_sterr.sname) )
}
// PushPos(vvv.tnsterr) ;
if vvv.sterr.wtype<wtp1
{ if vvv.getfirst fastfirstrow sterr1 where ((sterr.nrec == sterr1.cparent ))=0
{ w:=vvv.sterr.nrec ;
wnm:=wlongname+','+vvv.sterr.sname
if not Fill_tmp(w, wlev,wnm) then exit ;
set wcsterr_main:=w1 ;
if vvv.getfirst fastfirstrow sterr where (( w == sterr.nrec ))=0 {};
set wcsterr_main:=w1 ;
} //if vvv.getfirst fastfirstrow sterr1=0
} //if vvv.sterr.wtype<wtp1
} while (vvv.getnext sterr
where (( wcsterr_main == sterr.cparent ))
ordered by index STERR03)=0 ;
Fill_tmp:=true ;
} //Fill_tmp:=true ;
//================================
BROWSE BR
table tmp_sterr;
fields
tmp_sterr.sname 'наименование' : [30],protect ;
tmp_sterr.SGNI_CODE 'КОД ИМНС' : [15],protect ;
tmp_sterr.longname 'Длинное наименование' : [60],protect ;
tmp_sterr.SPOSTIND 'Индекс' : [6],protect ;
end;
//================================
handleEvent
cmDefault :
{ set wcsterr1:=ttt.tmp_sterr.nrec ;
set wspostind:=ttt.tmp_sterr.spostind ;
}
cmValue1:
{ ttt.www:=wcsterr ;
#IFDEF _BETA_
Message('БЭТА ВЕРСИЯ')
#ENDIF
if fileexist('!sterr.txt') deletefile('!sterr.txt')
delete all tmp_sterr ;
wkluch:=true ;
chet:=0 ;
if wtp=5 and wlevel_filtr<2
{ if vvv.getfirst fastfirstrow sterr where ((wcsterr == sterr.nrec ))=0
{ if upcase(vvv.sterr.sname)<>'САНКТ-ПЕТЕРБУРГ Г' and upcase(vvv.sterr.sname)<>'МОСКВА Г'
{ if message('Задан поиск улицы по области или по стране! Очень долго! Надо?',YesNo)
<>cmYes
{ wkluch:=false ;
abort ;
}
}
}
else
{ wkluch:=false ;
message('Не нашли входящую запись!') ;
}
}
if wtp=10 // индекс
{
if message('Задан режим поиска по индексу! Очень долго! Надо?',YesNo)=cmYes
{
StartNewVisual(vtNumericVisual, vfTimer + vfBreak + vfConfirm,
'Подготовка индексов для быстрого выбора', 1);
Fill_TmpByIndex(wcsterr,string(wcsterr1) ) ;
StopVisual('',0)
}
else { stop; abort ;}
wkluch:=false ;
}
if wkluch //ttt.getfirst tmp_sterr<>0
{ //delete all tmp_sterr ;
wtp1:=wtp+1 ;
if wtp=5 then wtp1:=7 ;
StartNewVisual(vtNumericVisual, vfTimer + vfBreak + vfConfirm,
'Подготовка для быстрого выбора', 999999);
Fill_tmp(wcsterr,0,'') ;
StopVisual('',0)
if ttt.getfirst tmp_sterr where (( wcsterr1 == tmp_sterr.nrec ))=0
{ quickChoiceString:=ttt.tmp_sterr.sname ;
}
else
{ if ttt.getfirst tmp_sterr<>0
{ message('Нет данных!')
abort ;
}
}
}
wcsterr1:=0 ;
// quickChoiceString:='' ;
} //cmValue1:
cmPositionChanged :
{
// logstrtofile('!sterr.txt','cmPositionChanged= '+string(ttt.tmp_sterr.sname) )
Notify(cmPositionChanged, tmp_sterr.nrec ) //
}
cmInit :
{
}
end;
end.
//===================================
//======= AddressGetIndex ===========
//===================================
//198264
//7800000000000
//78000000000186000
interface AddressGetIndex DoAccept,EscClose ;
create view vAddressGetIndex
var wcsterr:comp;windex:string ;
as select sterr.sname
from sterr, sterr sterr1
where ((
wcsterr == sterr1.nrec
and sterr1.SGNI_CODE <<= STERR.SGNI_CODE
and sterr1.SGNI_CODE+chr(255) >>= STERR.SGNI_CODE
)) ;
parameters wcsterr,windex;
browse brmain ;
table sterr ;
fields
sterr.sname 'Наименование' :[30],protect ;
sterr.SGNI_CODE 'КОД ГНИ' :[20],protect ;
sterr.SPOSTIND 'Индекс' :[10],protect ;
end; //browse brmain ;
HandleEvent
cmInit:
{ if getfirst sterr1<>0
{ closeinterface(cmDone) ;
abort ; exit ;
}
SetTitle('Выбор индекса для '+sterr1.sname) ;
}
cmDefault:
{ windex:=sterr.spostind ;
}
end; //HandleEvent
end. //interface AddressGetIndex DoAccept,EscClose ;
//==============================
//====== alter =================
//==============================
#component "Z_STAFF"
alter interface ADDRESSWINN
( '')
;
overload
end;
panel panAddressN;
table AddressN;
HandleEvent
cmPick:
{
case CurField of
#TerrName :
{ if not bogettune('UP.POST.ADDRESS_NEW')// message('Запустить стандртныей выбор?',YesNo)=cmYes
inherited :: HandleEvent (cmPick);
else
{ //updatetable;
#DEFINE Addressn_EDIT
#IFDEF Addressn_EDIT
if isnew or AddressN.nrec=0
{ //Putcommand(cmInsertRecord) ;
AddressN.cPerson := cPers;
AddressN.ObjType := wType;
if (insert current AddressN = tsOk)
{ set EntryPoint := AddressN.NRec;
// message('Вставили запись!!')
}
SetNew(false) ;
}
makevalid(#Addressn)
rescanpanel(#Addressn) ;
set Addressn.SPOSTIND:=Addressn.SPOSTIND ;
updatetable;
RunInterface(AddressGet_My,title,Addressn.nrec,wtype,cpers,NRecTerr) ;
rereadrecord(#Addressn) ;
set TerrName := iAdrFunc.GetFullTerrName(Addressn.csterr);
updatetable;
rescanpanel(#Addressn) ;
#ELSE
if (AddressN.cStreet <> 0)
NRecTerr := AddressN.cStreet;
else
NRecTerr := sTerr.NRec;
if RunInterface(AddressGet_My,title,0,0,0,NRecTerr)=cmDefault
{ if (GetFirst sTerr where ((NRecTerr == sTerr.NRec)) = tsOk)
{
if (length(sTerr.sGNI_CODE) = 15 or length(sTerr.sGNI_CODE) = 17 or sTerr.wType = 7) // выбрана улица
{
NRecTerr := sTerr.cParent;
AddressN.cSterr := sTerr.cParent;
set AddressN.sAddress2 := sTerr.sName;
set AddressN.cStreet := sTerr.NRec; // ссылка на улицу
}
else
{
set AddressN.cSterr := NRecTerr;
set AddressN.cStreet := 0; // ссылка на улицу
}
} //if (GetFirst sTerr where ((NRecTerr == sTerr.NRec)) = tsOk)
set TerrName := iAdrFunc.GetFullTerrName(NRecTerr);
updatetable;
newZip := iAdrFunc.GetPostZipGni(AddressN.NRec);
if (newZip <> '')
{
set AddressN.sPostINd := newZip;
updatetable;
newZip := iAdrFunc.GetPostZipGni(AddressN.NRec);
set AddressN.sPostINd := newZip;
}//if (newZip <> '')
}//if RunInterface(AddressGet_My,title,0,0,0,wwterr)=cmDefault
#ENDIF
} //else
} //#TerrName :
else
{ inherited :: HandleEvent (cmPick);
}
end;
}
end ; //HandleEvent
end;//panel panAddressN;
end. //ADDRESSWINN
//=============================================
.AutoForm frmAdressFind
.Group 'Утилиты'
.nameinlist 'АТД поиск Адреса'
.table blank
.begin
RunInterfaceNoModal(AddressGet_My,'Поиск Адреса по АТД',0,0,0,0)
frmAdressFind.fexit ;
end.
.endform