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

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

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

Ответить
agrail
Посетитель
Сообщения: 39
Зарегистрирован: 06 ноя 2012, 10:04

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

Сообщение 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
    }
LaaLaa

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

Сообщение LaaLaa »

Где и почему происходит зацикливание, тоже можно понять анализируя SIL-протоколы
Инструкции и протокольные модули можно взять здесь ftp://ftp.galaktika.ru/pub/support/temp ... Protocols/
agrail
Посетитель
Сообщения: 39
Зарегистрирован: 06 ноя 2012, 10:04

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

Сообщение 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-протоколов поищу, сроки просто горят!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

очень сложно предположить что в накладных за месяц одни водитель. Наверное в этом дело
logstrtofiile вам в помощь. Ну или отладка.
agrail
Посетитель
Сообщения: 39
Зарегистрирован: 06 ноя 2012, 10:04

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

Сообщение agrail »

мне нужно просто вывести в эксель каждого водителя из цикла, а они у меня дублируются, получается много эксель-файлов на каждого водителя, как убрать дупликаты!!!?????????
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

ну если у Вас в цикле по temprcons вызывается xlCreateExcelWithTemplate и Вы говорите "получается много эксель-файлов на каждого водителя" то наверное в temprcons лежит один и тот же водитель несколько раз ?
agrail
Посетитель
Сообщения: 39
Зарегистрирован: 06 ноя 2012, 10:04

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

Сообщение agrail »

есть форма - на ней 2 поля. 1 поле методом pick выбираем подразделения и 2 поле выбираем водителей - и 1 и 2 поле выбираем несколько подразделений и водителей. потом в этом цикле у меня находятся накладная на данного водителя с привязанным подразделением. как перейти на след водителя?
н-р: водители(иванов, петров, сидоров) и подразделения(склад1, склад2, склад3) - находим накладные и выводим на каждого водителя 1 ексель файл.
иванов например привязан к склад 1 и т.д....скорее всего циклится на подразделении в цикле.
agrail
Посетитель
Сообщения: 39
Зарегистрирован: 06 ноя 2012, 10:04

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

Сообщение agrail »

вопрос на засыпку: цикл такого формата: _loop table1 where....{ _loop table2 where....{...break;} ... } - будет искать по внутр циклу - т.е. с первого знач table2 по последний, если успех то break а затем внешний цикл переходит на второе значение???
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

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

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


и потом ответьте на вопрос что Вы тогда в цикле пытаетесь обойти по temprcons ? То как у Вас сейчас реализовано (внутри цикла temprcons делается xlCreateExcelWithTemplate ) будет приводить к тому, что на каждую накладную будет выводиться столько раз xlsфайл, сколько есть водителей в temprcons.
agrail
Посетитель
Сообщения: 39
Зарегистрирован: 06 ноя 2012, 10:04

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

Сообщение 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;............................
Ответить