Альтернативный ввод адреса

База знаний

Модераторы: m0p3e, edward_K, Модераторы

Ответить
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Альтернативный ввод адреса

Сообщение edward_K »

Можете использовать как пример работы с quickchoice или рекурсивного вызова функций
Прообраз - программа 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



Ответить