Дублирует последнюю запись таблицы

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

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

Ответить
solka
Сообщения: 9
Зарегистрирован: 30 янв 2008, 14:14

Дублирует последнюю запись таблицы

Сообщение solka »

Помогите пожалуйста разобраться с кодом. На основе формы прототипа создаю свою, которая формирует файл .xls. Временные таблицы заполняются правильно. А вот во время выгрузки в Excel, он берет последнюю запись таблицы и дублирует столько раз, сколько записей в таблице вообще. Где, что упущено, почему не выводит корректно?

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

.LinkForm 'RTTEKOST_01_' Prototype is 'rtTekOst'
.Group 'Отчеты в НДЕ'
.NameInList 'Текущие остатки МЦ 2 отчета в Excel'
.var
 Subj, Supp, Prog, org : string;  
 SelMC  : comp;
 LastPr : double;
 xlRes, xlRes2 : Boolean;
.endvar

.create view vwMain as select * 
          from mtmyTekOst, 
               mtmyTemMC where (( mtmyTekOst.NrecMC == mtmyTemMc.NrecMC )) 
; 
.{
.{
.{
.{
.begin
 ClearBuffer(vwMain.tnmtmyTekOst);
	vwMain.mtmyTekOst.NrecMC   := MCNREC;  
	vwMain.mtmyTekOst.NrecPodr := PodrNrec;
	vwMain.mtmyTekOst.NamePodr := PodrName;
	vwMain.mtmyTekOst.NrecMOL  := MOLNrec;
	vwMain.mtmyTekOst.NameMOL  := MOLName;
	vwMain.mtmyTekOst.OstSum   := sumOstatok;   
	vwMain.mtmyTekOst.OstKol   := kolOstatok;    
	vwMain.mtmyTekOst.RezSum   := sumRezerv;  
	vwMain.mtmyTekOst.RezKol   := kolRezerv;
 vwMain.insert current vwMain.mtmyTekOst;        
 
if vwMain.getfirst mtmyTemMC where (( MCNREC == mtmyTemMC.NrecMC )) <> tsOk 
 {
   ClearBuffer(vwMain.tnmtmyTemMC);
        vwMain.mtmyTemMC.NrecMC   := MCNREC;  
  	vwMain.mtmyTemMC.NameMC   := MCName;
  	vwMain.mtmyTemMC.KodMC    := BarKod;
  	vwMain.mtmyTemMC.AvgPr    := averPrice; 

  	vwMain.mtmyTemMC.LastPr   := lastpr;  
  	vwMain.mtmyTemMC.PrgMC    := prog;
  	vwMain.mtmyTemMC.Suppl    := supp; 
  	vwMain.mtmyTemMC.Subjct   := subj;
 vwMain.insert current vwMain.mtmyTemMC; 
 } 
end.
end.  
.}
.}
.}
.}
.begin
var
NR,NC : integer;

 	 xlRes:=True;
	 xlRes:=xlCreateExcelWithTemplate((translatepath('%StartPath%Asu\XlTempl\')+'temTekOst.xlt'),True);
         xlRes:=xlIsExcelValid;
         xlRes:=xlDisplayAlerts(False);
         xlRes:=xlSetActiveSheetByName('Podr');

         xlRes:=xlSetCellStringValue(string(CommonFormHeader),1,1,1,1);
         xlRes:=xlSetCellStringValue(string(NDESim),6,6,6,6);
         NR:=8; NC:=1;

         vwMain._loop mtmyTemMC 
         {
          xlRes:=xlSetCellStringValue(string(mtmyTemMC.NameMC),NR,NC,NR,NC);
          xlRes:=xlSetCellStringValue(string(mtmyTemMC.KodMC),NR,NC+1,NR,NC+1);

          inc(NR);  


         vwMain._loop mtmyTekOst ordered by index i02
         {
	  xlSetCellStringValue(string(mtmyTekOst.NamePodr),NR,NC,NR,NC);
          xlSetCellStringValue(string(mtmyTekOst.NameMOL),NR,NC+1,NR,NC+1);

          inc(NR);
         }
         } 
         xlRes:=xlKillExcel;	
end.
.endform
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

у вас во вью ограничение на таблицу (вы же её наполняете)
сделайте синоним вашей таблицы и в эксель выводите уже циклом по синониму без ограничений - тогда получится.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение m0p3e »

Дублирует потому как:
xlSetCellStringValue(string(mtmyTekOst.NamePodr),NR,NC,NR,NC);
xlSetCellStringValue(string(mtmyTekOst.NameMOL),NR,NC+1,NR,NC+1);
А должно быть:
xlSetCellStringValue(string(vwMain.mtmyTekOst.NamePodr),NR,NC,NR,NC);
xlSetCellStringValue(string(vwMain.mtmyTekOst.NameMOL),NR,NC+1,NR,NC+1);

К именованным талицам обращаться надо по полному имени.
solka
Сообщения: 9
Зарегистрирован: 30 янв 2008, 14:14

Сообщение solka »

m0p3e, спасибо
именно таким образом все стало выводится корректно
Ответить