Страница 1 из 1

Зацикливание! Помогите!!!

Добавлено: 17 янв 2013, 15:47
agrail
Проблема в том, что при выборке определенных водителей происходит зацикливание - нес-ко раз проходит цикл по одному и тому же водителю. Как избежать этого??? Эти водители хранятся во врем таблице = temprcons. Саму временную таблицу проверял - дупликатов водителей нет. Собственно выборка:

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

_loop katsopr where ((201==katsopr.vidsopr(noIndex) and dBegin<<=katsopr.dsopr(noIndex) and dEnd>>=katsopr.dsopr(noIndex) and 0<<katsopr.summa(noindex)))
  {  if getfirst podr_tbl where ((katsopr.cPodrFrom == podr_tbl.CREC(noindex))) = tsOk
 {   if getfirst TTNDOC where ((1109 == TTNDOC.wtable(noIndex) and katsopr.nrec == TTNDOC.cdoc(noIndex)))=tsOK
    {   if getfirst temprcons where ((ttndoc.cdriver==temprcons.NREC(noIndex)))=tsok  do
          {   kolnakl:=kolnakl+1; message(temprcons.nrec);
              xl := xlCreateExcelWithTemplate('c:\dover_driver\doc_pak\tr_nakl.xlt',true);
              xlSETACTIVESHEETbyname('стр.1');
              xlSetCellstringValue(day(dBegin) + '.' + month(dBegin) + '.' + year(dBegin)+'-'+day(dend) + '.' + month(dend) + '.' + year(dend),9,61,9,61);
              xlSetCellstringValue(temprcons.mcname,12,2,12,2);

           _loop kndriver where((temprcons.mcname==kndriver.name(noindex)))
          { if getfirst katorg where ((ExAttrFun.sGetAttr(1457, kndriver.nRec,'Организация')==katorg.name(noindex)))=tsok
            {xlSetCellstringValue(katorg.name+' ИНН '+katorg.unn+' '+katorg.addr,12,2,12,2);
            xlSetCellstringValue('Согласно договору '+katorg.code,35,2,35,2);
            xlSetCellstringValue('Согласно договору '+katorg.code,57,2,57,2);
            xlSetCellstringValue('Согласно договору '+katorg.code,59,2,59,2);
            xlSetCellstringValue('Согласно договору '+katorg.code,61,2,61,2);
            xlSetCellstringValue('Согласно договору '+katorg.code,63,2,63,2);  }
          }
   //АДРЕС, ОТ КОТОРОГО НАЧИНАЕТСЯ РАЗВОЗКА
   _loop katpodr where ((podr_str == katpodr.NAME(noIndex)))
   { if getfirst filial where((katpodr.nrec==filial.cpodr(noIndex)))=tsok
          { if getfirst katorg where ((filial.corg==katorg.nrec(noIndex)))=tsok
            { xlSetCellstringValue('ОАО "Золотые луга", '+katorg.addr,14,2,14,2);
              xlSetCellstringValue(katorg.addr,39,2,39,2);
            }
          }
   }

   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',12,56,12,56);     // грузополучатель
   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',14,56,14,56);     // грузополучатель
   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',17,2,17,2);       // наименование груза
   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',19,2,19,2);       // наименование груза
   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',21,2,21,2);       // наименование груза
   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',26,2,26,2);       // сопроводительные документы на груз
   xlSetCellstringValue('Приложение '+'(погрузочный лист для '+temprcons.mcname+')',39,56,39,56);     // сдача груза
   xlSetCellstringValue('РЕФ',31,2,31,2);                                                       // указания грузоотправителя
   xlSetCellstringValue(day(dBegin) + '.' + month(dBegin) + '.' + year(dBegin)+'-'+day(dend) + '.' + month(dend) + '.' + year(dend),66,2,66,2);
   //ПЕРЕХОДИМ НА СТРАНИЦУ №2
  xlSETACTIVESHEETbyname('стр.2');
  _loop kndriver where((temprcons.mcname==kndriver.name(noindex)))
          { if getfirst katorg where ((ExAttrFun.sGetAttr(1457, kndriver.nRec,'Организация')==katorg.name(noindex)))=tsok
            {xlSetCellstringValue(katorg.name+' ИНН '+katorg.unn+' '+katorg.addr,5,2,5,2);
             xlSetCellstringValue(katorg.name,41,56,41,56);
            }
          }
   xlSetCellstringValue(day(dBegin) + '.' + month(dBegin) + '.' + year(dBegin)+'-'+day(dend) + '.' + month(dend) + '.' + year(dend),41,31,41,31);
   xlSetCellstringValue(day(dBegin) + '.' + month(dBegin) + '.' + year(dBegin)+'-'+day(dend) + '.' + month(dend) + '.' + year(dend),41,85,41,85);
   xlKillExcel;
   }
    // Выборка по водителям!!!
   while getnext temprcons where ((ttndoc.cdriver==temprcons.NREC(noIndex)))
    		}  //ttndoc
      }  //katpodr
    }

Re: Зацикливание! Помогите!!!

Добавлено: 17 янв 2013, 16:30
LaaLaa
Где и почему происходит зацикливание, тоже можно понять анализируя SIL-протоколы
Инструкции и протокольные модули можно взять здесь ftp://ftp.galaktika.ru/pub/support/temp ... Protocols/

Re: Зацикливание! Помогите!!!

Добавлено: 17 янв 2013, 16:57
agrail
Зацикливание происходит в том месте где вызывается шаблон ексель. { if getfirst temprcons where ((ttndoc.cdriver==temprcons.NREC(noIndex)))=tsok do { kolnakl:=kolnakl+1; message(temprcons.nrec); xl := xlCreateExcelWithTemplate('c:\dover_driver\doc_pak\tr_nakl.xlt',true); может в выборке кода ошибка, только я не вижу. может где то синтаксис не тот, подскажите. по поводу sil-протоколов поищу, сроки просто горят!!!

Re: Зацикливание! Помогите!!!

Добавлено: 18 янв 2013, 00:04
edward_K
очень сложно предположить что в накладных за месяц одни водитель. Наверное в этом дело
logstrtofiile вам в помощь. Ну или отладка.

Re: Зацикливание! Помогите!!!

Добавлено: 18 янв 2013, 10:28
agrail
мне нужно просто вывести в эксель каждого водителя из цикла, а они у меня дублируются, получается много эксель-файлов на каждого водителя, как убрать дупликаты!!!?????????

Re: Зацикливание! Помогите!!!

Добавлено: 18 янв 2013, 11:39
Den
ну если у Вас в цикле по temprcons вызывается xlCreateExcelWithTemplate и Вы говорите "получается много эксель-файлов на каждого водителя" то наверное в temprcons лежит один и тот же водитель несколько раз ?

Re: Зацикливание! Помогите!!!

Добавлено: 18 янв 2013, 11:59
agrail
есть форма - на ней 2 поля. 1 поле методом pick выбираем подразделения и 2 поле выбираем водителей - и 1 и 2 поле выбираем несколько подразделений и водителей. потом в этом цикле у меня находятся накладная на данного водителя с привязанным подразделением. как перейти на след водителя?
н-р: водители(иванов, петров, сидоров) и подразделения(склад1, склад2, склад3) - находим накладные и выводим на каждого водителя 1 ексель файл.
иванов например привязан к склад 1 и т.д....скорее всего циклится на подразделении в цикле.

Re: Зацикливание! Помогите!!!

Добавлено: 18 янв 2013, 12:48
agrail
вопрос на засыпку: цикл такого формата: _loop table1 where....{ _loop table2 where....{...break;} ... } - будет искать по внутр циклу - т.е. с первого знач table2 по последний, если успех то break а затем внешний цикл переходит на второе значение???

Re: Зацикливание! Помогите!!!

Добавлено: 18 янв 2013, 13:01
Den
ну у Вас примерно правильно сделано все. Просто неясно вот что Вы пишите :
"а они у меня дублируются, получается много эксель-файлов на каждого водителя, как убрать дупликаты!"
а потом в последнем месседж
"находим накладные и выводим на каждого водителя 1 ексель файл. "

Дак нужен все же на каждый разрез подразделение/водила отдельный файл или нет ?


и потом ответьте на вопрос что Вы тогда в цикле пытаетесь обойти по temprcons ? То как у Вас сейчас реализовано (внутри цикла temprcons делается xlCreateExcelWithTemplate ) будет приводить к тому, что на каждую накладную будет выводиться столько раз xlsфайл, сколько есть водителей в temprcons.

Re: Зацикливание! Помогите!!!

Добавлено: 22 янв 2013, 09:37
agrail
Разобрался) впереди поставил 2 цикла один по подразделению второй по водителям, теперь когда внутр цикл по водителю -если найден break - переходим на след подразделение. Всем большое спасибо!

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

_loop podr_tbl
   {_loop dr_tbl
  { if getfirst katsopr where ((201==katsopr.vidsopr(noIndex) and dBegin<<=katsopr.dsopr(noIndex) and dEnd>>=katsopr.dsopr(noIndex) and 0<<katsopr.summa(noindex) and podr_tbl.CREC==katsopr.cPodrFrom(noindex)))=tsok do
{  //message('нашли в накладных!!!'+katsopr.nrec);

      if getfirst TTNDOC where ((1109 == TTNDOC.wtable(noIndex) and katsopr.nrec == TTNDOC.cdoc(noIndex) and dr_tbl.crec==ttndoc.cdriver(noindex)))=tsok
    {    //message('нашли в TTNDOC!!!'+ttndoc.cdoc);

            if getfirst katorg where ((ExAttrFun.sGetAttr(1457, dr_tbl.crec,'Организация')==katorg.name(noIndex)))=tsok
             { //message('нашли по водителю!!!');
              kolnakl:=kolnakl+1;............................