тормозит вставка контрагентов

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

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

Ответить
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

тормозит вставка контрагентов

Сообщение Darikon »

Задача была такая: есть дбф с контрагентами, нужно проверить наличие, и если нет то добавить, а если есть проапдейтить. Галактика 8.1.
Сделал на випе но тормозит СТРАШНО, что можно придумать?

Код: Выделить всё

Create View vwkatOrg
var Vkod : String
As Select *
From katOrg
where
 katOrg.Code=Vkod
;
Create View vwkatOrgProv
var sINN : String
    sKPP : String
    sName: String
As Select *
From katOrg
where ((
  sINN /== katOrg.UNN        and
  sKPP /== katOrg.KodPlatNDS (noindex) and
  sName/== katOrg.Name
      ))
;
Create View vwPodrInfo
var cKatOrg : comp
As Select *
From PodrInfo
where
 PodrInfo.cPodr=cKatOrg
 and PodrInfo.OKVED=0
;
Create View vwPodrInfoPost
var cKatOrg : comp
As Select *
From PodrInfo
where
 PodrInfo.cPodr=cKatOrg
;
Create View vwkatCity
var City : String
As Select *
From katCity
where
 katCity.Name=City
;
Create View vwkatState
var State : String
As Select *
From katState
where
 katState.Name=State
;
Create View vwkatB
var sMFO1 : String
As Select *
From katB
where
 katB.MFO1=sMFO1
;
Create View vwkatBank
var cKatOrg : String
As Select *
From katBank
where
 katBank.cOrg=cKatOrg
;

Create View vwAddressn
var cAddr:comp
As Select *
From Addressn
where Addressn.nrec=cAddr
;
create view vwmytempKO
as select mytempKO.*
;
Create View vwAttrVal
var AttrNam_Name   : String
    AttrNam_wTable : word
    AttrVal_cRec   : comp
As Select Attrnam.name, attrval.vstring
from Attrnam, Attrval
where ((
      AttrNam_wTable==attrnam.wtable and
      AttrNam.nrec==Attrval.cAttrNam
      ))
and AttrNam.Name=AttrNam_Name
and AttrVal.cRec =AttrVal_cRec
;
Create View vwAttrNam
var AttrNam_Name  : String
    AttrNam_wTable: word
As Select *
from Attrnam
where ((
      AttrNam_wTable==attrnam.wtable
      ))
and AttrNam.Name=AttrNam_Name
;
create view vwDep
var sKod    : string
    TypePodr: word
as select katpodr.*
from katpodr
where
   ((
   TypePodr == katpodr.sklad
   ))
and katpodr.kod=sKod
;

Код: Выделить всё

Procedure OutTemp;
begin
  StartNewVisual (vtRotateVisual,vfConfirm, 'Вставка записей', 0);
  MyCount:= 0;
  if vwmytempKO.GetFirst=tsOk then
    do
      {
      MyCount:=MyCount+1;
      iNextVisual(MyCount);
      Flag:=0;

      If vwmytempKO.mytempKO.Name = ''
        {
        LogList_01.write('Warning Не задано наименование контрагента, код ',0);
        LogList_01.write(vwmytempKO.mytempKO.Kod,0);
        continue;
        }

      vwKatOrg.VKod:=vwmytempKO.mytempKO.Kod;
      if not(vwKatOrg.GetFirst=tsOk) then //если организации нет
        {
        vwKatOrg.KatOrg.nrec:=comp(0);
        vwKatOrg.KatOrg.Code:= vwmytempKO.mytempKO.Kod;
        Flag:=1;
        }
      MyPos:=Pos('/',vwmytempKO.mytempKO.INN);
      if MyPos=0 then MyPos:=Pos('\',vwmytempKO.mytempKO.INN);
      if MyPos=0 then 
        {
        vwKatOrg.KatOrg.UNN:=vwmytempKO.mytempKO.INN;
        }
      else
        {
        vwKatOrg.KatOrg.UNN:= SubStr(vwmytempKO.mytempKO.INN,1,MyPos-1);
        vwKatOrg.KatOrg.KodPlatNDS := SubStr(vwmytempKO.mytempKO.INN,MyPos+1,length(vwmytempKO.mytempKO.INN));
        };
      vwKatOrg.KatOrg.Name       := vwmytempKO.mytempKO.Name     ;

      vwKatorgProv.sINN:=vwKatOrg.KatOrg.UNN;
      vwKatorgProv.sKPP:=vwKatOrg.KatOrg.KodPlatNDS;
      vwKatorgProv.sName:=vwKatOrg.KatOrg.Name;
      If vwKatorgProv.GetFirst = tsOk then
        {
        LogList_01.write('Error Контрагент с ИНН:'+vwKatorgProv.UNN+' КПП:'+vwKatorgProv.sKPP+' и названием:'+vwKatorgProv.sName,0);
        LogList_01.write('уже существует с кодом:'+vwKatorgProv.KatOrg.Code+', код внедряемой записи:'+vwmytempKO.mytempKO.Kod+'. запись добавлена с фразой (дубль) перед названием',0);
        vwKatOrg.KatOrg.Name := '(дубль)'+vwmytempKO.mytempKO.Name     ;
        }

       if length(trim(vwmytempKO.mytempKO.Name2))>0 then vwKatOrg.KatOrg.Name :=vwKatOrg.KatOrg.Name+' '+trim(vwmytempKO.mytempKO.Name2);
       if length(trim(vwmytempKO.mytempKO.Name3))>0 then vwKatOrg.KatOrg.Name :=vwKatOrg.KatOrg.Name+' '+trim(vwmytempKO.mytempKO.Name3);
      vwKatOrg.KatOrg.Addr       := vwmytempKO.mytempKO.IndexUr+', '+vwmytempKO.mytempKO.respUr+', '+vwmytempKO.mytempKO.RayonUr+', '+trim(vwmytempKO.mytempKO.GorodUr)+', '+trim(vwmytempKO.mytempKO.UlicaUr);
      vwKatOrg.KatOrg.IndexK     := vwmytempKO.mytempKO.IndexUr  ;

      vwKatCity.City := vwmytempKO.mytempKO.GorodUr;
      if vwKatCity.GetFirst<>tsOk then
        {
        vwKatCity.KatCity.Name := vwmytempKO.mytempKO.GorodUr;
        vwKatCity.insert current KatCity;
        }
      vwKatState.State := vwmytempKO.mytempKO.StranaN;
      if vwKatState.GetFirst<>tsOk then
        {
        vwKatState.KatState.Name := vwmytempKO.mytempKO.StranaN;
        vwKatState.KatState.Kod  := vwmytempKO.mytempKO.StranaK;
        vwKatState.insert current KatState;
        }
       
      vwKatOrg.KatOrg.cCity       := vwKatCity.KatCity.nrec   ;
      vwKatOrg.KatOrg.cState      := vwKatState.KatState.nrec ;
      vwKatOrg.KatOrg.Tel         := vwmytempKO.mytempKO.Tel  ;
      vwKatOrg.KatOrg.OKPO        := vwmytempKO.mytempKO.OKPO ; // Код по ОКПО
      vwKatOrg.KatOrg.OKONH       := vwmytempKO.mytempKO.OKONH; // Код по ОКНХ

      if Flag=1 then
        {
        vwKatOrg.insert current KatOrg;
        }
      else
        {
        vwKatOrg.update current KatOrg;
        }

      vwKatOrg.VKod:=vwmytempKO.mytempKO.Kod;
      if vwKatOrg.GetFirst=tsOk then //ищем данную орг, ее нрек
        {            
        //БИК
        vwKatB.sMFO1:=vwmytempKO.mytempKO.BIK;
        if vwKatB.GetFirst=tsOk then
          {
          vwKatBank.cKatOrg:=vwKatOrg.KatOrg.nrec;
          if vwKatBank.GetFirst=tsOk then
            {
            vwKatBank.KatBank.Name     := vwKatB.KatB.Name  ; // Наименование
            vwKatBank.KatBank.Remark   := vwKatB.KatB.Remark; // Комментарий
            vwKatBank.KatBank.Addr     := vwKatB.KatB.Addr  ; // Адрес
            vwKatBank.KatBank.MFO1     := vwKatB.KatB.MFO1  ; // Код МФО
            vwKatBank.KatBank.MFO2     := vwKatB.KatB.MFO2  ; // Код РКЦ
            vwKatBank.KatBank.Schet2   := vwKatB.KatB.KorSchet; // Счет
            vwKatBank.update current KatBank;
            }
          else
            {
            vwKatBank.KatBank.nrec     := comp(0);
            vwKatBank.KatBank.Name     := vwKatB.KatB.Name  ; // Наименование
            vwKatBank.KatBank.Remark   := vwKatB.KatB.Remark; // Комментарий
            vwKatBank.KatBank.Addr     := vwKatB.KatB.Addr  ; // Адрес
            vwKatBank.KatBank.MFO1     := vwKatB.KatB.MFO1;   // Код МФО
            vwKatBank.KatBank.MFO2     := vwKatB.KatB.MFO2;   // Код РКЦ
            vwKatBank.KatBank.Schet2   := vwKatB.KatB.KorSchet; // Счет
            vwKatBank.insert current KatBank;
            }
          }
        else
          {
!          vwKatB.KatB.nrec:=0;
!          vwKatB.KatB.MFO1:=vwmytempKO.mytempKO.BIK;
!          vwKatB.insert current KatB;
          LogList_01.write('warning Не найдена позиция');
          LogList_01.write('Проверить банк с БИК '+vwmytempKO.mytempKO.BIK);
          }

        //Адреса
        vwPodrInfoPost.cKatOrg:=vwKatOrg.KatOrg.nrec;
        if vwPodrInfoPost.GetFirst<>tsOK then
          {
          //Юр адрес
          vwAddressn.addressn.saddress1:=vwmytempKO.mytempKO.IndexUr+', '+vwmytempKO.mytempKO.respUr+', '+vwmytempKO.mytempKO.RayonUr+', '+trim(vwmytempKO.mytempKO.GorodUr)+', '+trim(vwmytempKO.mytempKO.UlicaUr);
          vwAddressn.addressn.spostind :=trim(vwmytempKO.mytempKO.IndexUr);
          vwaddressn.addressn.nrec     :=0;
          vwAddressn.insert current addressn;
          vwPodrInfoPost.PodrInfo.nrec     := 0;
          vwPodrInfoPost.PodrInfo.insnomer := string(vwAddressn.addressn.nrec);
          vwPodrInfoPost.PodrInfo.cpodr    := vwKatOrg.KatOrg.nrec;
 
          //Почт адрес
          if trim(vwmytempKO.mytempKO.GorodPo)<>'' and trim(vwmytempKO.mytempKO.UlicaPo)<>'' then
            {
            vwaddressn.addressn.nrec     :=0;
            vwAddressn.addressn.saddress1:=trim(vwmytempKO.mytempKO.GorodPo)+', '+trim(vwmytempKO.mytempKO.UlicaPo);
            vwAddressn.insert current addressn;
            vwPodrInfoPost.PodrInfo.okved    := string(vwAddressn.addressn.nrec);
            }
          vwPodrInfoPost.insert current PodrInfo;
          }
        else
          {
          //Юр адрес
          vwAddressn.cAddr:=comp(vwPodrInfoPost.PodrInfo.insnomer);
          if vwAddressn.GetFirst=tsOK then
            {
            vwAddressn.addressn.saddress1:=vwmytempKO.mytempKO.IndexUr+', '+vwmytempKO.mytempKO.respUr+', '+vwmytempKO.mytempKO.RayonUr+', '+trim(vwmytempKO.mytempKO.GorodUr)+', '+trim(vwmytempKO.mytempKO.UlicaUr);
            vwAddressn.addressn.spostind :=trim(vwmytempKO.mytempKO.IndexUr);
            vwAddressn.update current addressn;
            }
          else
            {
            vwAddressn.addressn.saddress1:=vwmytempKO.mytempKO.IndexUr+', '+vwmytempKO.mytempKO.respUr+', '+vwmytempKO.mytempKO.RayonUr+', '+trim(vwmytempKO.mytempKO.GorodUr)+', '+trim(vwmytempKO.mytempKO.UlicaUr);
            vwAddressn.addressn.spostind :=trim(vwmytempKO.mytempKO.IndexUr);
            vwAddressn.addressn.nrec     :=0;
            vwAddressn.insert current addressn;
            vwPodrInfoPost.PodrInfo.insnomer := string(vwAddressn.addressn.nrec);
            vwPodrInfoPost.update current PodrInfo;
            }
          //Почт адрес
          vwAddressn.cAddr:=comp(vwPodrInfoPost.PodrInfo.okved);
          if vwAddressn.GetFirst=tsOK then
            {
            if trim(vwmytempKO.mytempKO.GorodPo)<>'' and trim(vwmytempKO.mytempKO.UlicaPo)<>'' then
              {
              vwAddressn.addressn.saddress1:=trim(vwmytempKO.mytempKO.GorodPo)+', '+trim(vwmytempKO.mytempKO.UlicaPo);
              vwAddressn.update current addressn;
              }
            else 
              {
              vwAddressn.delete current addressn;
              }
            }
          else
            {
            if trim(vwmytempKO.mytempKO.GorodPo)<>'' and trim(vwmytempKO.mytempKO.UlicaPo)<>'' then
              {
              vwaddressn.addressn.nrec       :=0;
              vwAddressn.addressn.saddress1:=trim(vwmytempKO.mytempKO.GorodPo)+', '+trim(vwmytempKO.mytempKO.UlicaPo);
              vwAddressn.insert current addressn;
              vwPodrInfoPost.PodrInfo.okved := string(vwAddressn.addressn.nrec);
              vwPodrInfoPost.update current PodrInfo;
              }
            }
          }

        //внеш аттр 'Табельный номер'
        if length(trim(vwmytempKO.mytempKO.SotrTabNo))>0 then
          {
          vwAttrVal.AttrNam_Name  :='Табельный номер';
          vwAttrVal.AttrNam_wTable:=word('1418');
          vwAttrVal.AttrVal_cRec  :=vwKatOrg.KatOrg.nRec;
          if vwAttrVal.GetFirst=tsOk then
            {
            vwAttrVal.AttrVal.vString  := vwmytempKO.mytempKO.SotrTabNo   ;
            vwAttrVal.update current AttrVal;
            }
          else
            {
            vwAttrVal.AttrVal.nrec     :=comp(0);
            vwAttrVal.AttrVal.vString  :=vwmytempKO.mytempKO.SotrTabNo;
            vwAttrVal.AttrVal.cRec     :=vwKatOrg.KatOrg.nRec         ;
            vwAttrVal.AttrVal.wTable   :=word('1418')                 ;
            vwAttrNam.AttrNam_Name     :=vwAttrVal.AttrNam_Name       ;
            vwAttrNam.AttrNam_wTable   :=vwAttrVal.AttrNam_wTable     ;
            if vwAttrNam.GetFirst=tsOk then
              vwAttrVal.Attrval.cAttrNam := vwAttrNam.AttrNam.nRec   ;
            vwAttrVal.insert current AttrVal;
            };
          };

        }; //if vwKatOrg.GetFirst=tsOk then //ищем данную орг, ее нрек
      } while (vwmytempKO.GetNext=tsOk);

   StopVisual('Работа завершена',1);

end;
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

я думаю, конечно, жесткая подцепка еще мешает, но, без нее как? пустые записи мне не нужны...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

1.все условия нужно перенести в (( )) - это уже даст вам раз 10 судя по коду.
2.определите узкие места - вы ж все равно протокол ведете - добавте туда вывод текущего времени с милисекундами.
3. жесткую подцепку можно убрать и заменить например
vwKatorgProv.GetFirst=0
на
vwKatorgProv.GetFirst fastfirstrow katorg=0
будет слегка шустрее.
и лучше писать
set vwAttrVal.AttrNam_Name:= ....
4. зачем так много вьюх в свете 3 тоже не понятно. Вместо одно запроса вы серверу отправляете несколько. Выделять логичней когда есть таблица в которой много записей не подчиненных главной таблице(или их несколько).
5. можно подкэшировать справочники во временные таблы.
6. select * тоже плохо, лучше nrec один вывести, компилятор сам дополнит запрос полями используемыми в коде.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Сообщение Darikon »

1 согласен, знал, не обратил внимания
3 чем отличается set vwAttrVal.AttrNam_Name:= .... и vwAttrVal.AttrNam_Name:= ....
4 делаю...
5 уже было
6 согласен, знал, не обратил внимания

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

Сообщение edward_K »

set приводит к принудительному перечитыванию вьюхи. В противном случае результат может отличаться от желаемого ( впрочем getfirst тоже вроде как сие делает , но вот isvalid точно лажу даст).
Ответить