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

Вставка и выбор

Добавлено: 02 июл 2008, 15:34
s2176
Добрый день!
Пишу интерфейс по загрузке данных из xls-файла в Галактику,
создаю лицевые счета.
Проблема такая.
Читаю запись из xls-файла, достаю из нее должность, если в Catalogs уже есть такая, то достаю nrec, а если такой нет, то записываю в Catalogs новую должность. Одни и те же должности в файле могут повторяться. Естественно, если новую должность уже один раз внесли в базу, второй раз этого делать не надо. А у меня почему-то все новые пишутся столько раз, сколько встречаются.
Напрашивается, что после вставки записи надо обновить логическую таблицу из Catalogs, но как это сделать?
Текст:

interface lsch 'tour_lsch' escclose;
var nrec_pers, nrec_dolgn, nrec_podr, nrec_lsch, _nrec: comp;

create view
as select ls.*, cd.*
from lschet ls, catalogs cd
;
create view cat
as select *
from catalogs
where ((0==lpr and 23h==mainlink)) //должности
;
create view pers
select persons.*
from persons
where((persons.nrec==lschet.tperson)) and not(isvalidall(tnlschet))
;
create view dd
as select catalogs.nrec
where(('ДОЛЖН'==catalogs.code(noindex)))
;
function getdate(rr, kk: longint; fr: string): date;
{ var sss: string;
xlGetCellValue(rr,kk,sss);
getdate:=strtodate(sss,fr);
}

HandleEvent
cmInit :
{ var xls_pers, dolgn, dolgn_tmp: string;
var state: boolean;
var _row, idFileB, tabn, tabn_tmp: LongInt;
var dnazn, dnazn_tmp, app_date, dis_date: date;
var oklad, oklad_tmp: double;
var sovm: word;

xls_pers:=GetFileName('*.xls','Сотрудники, оклады: выбор XLS ресурса');
StartNewVisual (vtNumericVisual,vfBreak+vfConfirm+vfTimer,''#3'Ждите....',1);
SetVisualTitle('формирование лицевых счетов');
state := xlCreateExcelWithTemplate(xls_pers, true);
_row:=2;

delete all from lschet;
if dd.getfirst catalogs = tsOk _nrec:=dd.catalogs.nrec;

logStrToFile('load_pers.log','*****Проверьте наличие сотрудников в базе: '+
datetostr(cur_date(),'DD/MM/YYYY')+' '+timetostr(cur_time(),'HH:MM:SS'));
if (state = false) { Message ('Ошибка открытия XlS-файла '+xls_pers,CancelButton); Exit; }

xlGetCellValue(_row,2,tabn_tmp);
xlGetCellValue(_row,7,dolgn_tmp); xlGetCellValue(_row,8,oklad_tmp);

if getfirst persons where ((tabn_tmp==persons.tabnmb(noindex))) = tsOk
{ nrec_pers:=persons.nrec; nrec_podr:=persons.galdep;
app_date:=persons.appdate; dis_date:=persons.disdate; sovm:=word(persons.csovm);
}
dolgn:=dolgn_tmp; tabn:=tabn_tmp; oklad:=oklad_tmp;
while(tabn<>0)
do { if tabn<>tabn_tmp
{ clearbuffer(#ls);
nrec_lsch:=getnextnrec(#ls,0)
set ls.nrec:=nrec_lsch;
set ls.tabn:=tabn_tmp;
set ls.datpos:=app_date;
set ls.datuv:=dis_date;
set ls.tperson:=nrec_pers;
set ls.cex:=nrec_podr;
set ls.sovm:=sovm;
set ls.sisopl:=30;
set ls.tarif:=oklad_tmp;
set ls.cappoint:=nrec_dolgn;
set ls.cschetd:='20';
set ls.TBLD[1]:=104;
set ls.CKAUD[1]:=10000000002C9h; //аналитика 001-зарплата
set ls.rejim:=11; //5-дневка
insert current ls;
tabn_tmp:=tabn; dolgn_tmp:=dolgn;
nrec_podr:=0; nrec_pers:=0; app_date:=date(0,0,0); dis_date:=date(0,0,0); sovm:=0;
if getfirst persons where ((tabn_tmp==persons.tabnmb(noindex))) = tsOk
{ nrec_pers:=persons.nrec; nrec_podr:=persons.galdep;
app_date:=persons.appdate; dis_date:=persons.disdate; sovm:=word(persons.csovm);
}
if iNextVisual('Загрузка лицевых счетов ...'+''#13'Обработано: ')=false break;
}
oklad_tmp:=oklad;
_row:=_row+1;
xlGetCellValue(_row,2,tabn);
xlGetCellValue(_row,7,dolgn); xlGetCellValue(_row,8,oklad);
if dolgn<>dolgn_tmp or tabn<>tabn_tmp
{ nrec_dolgn:=0;
cat._loop catalogs
{ if upcase(trim(cat.catalogs.name))=upcase(trim(dolgn_tmp))
then nrec_dolgn:=cat.catalogs.nrec;
}
if nrec_dolgn=0
{ clearbuffer(#cd);
nrec_dolgn:=getnextnrec(#cd,0)
set cd.nrec:=nrec_dolgn;
set cd.cparent:=_nrec;
set cd.groupcode:=2;
set cd.mainlink:=_nrec;
set cd.name:=dolgn_tmp;
insert current cd;
}
dolgn_tmp:=dolgn;
}
}
clearbuffer(#ls);
nrec_lsch:=getnextnrec(#ls,0)
set ls.nrec:=nrec_lsch;
set ls.tabn:=tabn_tmp;
set ls.datpos:=app_date;
set ls.datuv:=dis_date;
set ls.tperson:=nrec_pers;
set ls.cex:=nrec_podr;
set ls.sovm:=sovm;
set ls.sisopl:=30;
set ls.tarif:=oklad_tmp;
set ls.cappoint:=nrec_dolgn;
set ls.cschetd:='20';
set ls.TBLD[1]:=104;
set ls.CKAUD[1]:=10000000002C9h; //аналитика 001-зарплата
set ls.rejim:=11; //5-дневка
insert current ls;
! создание лицевых счетов, для которых нет записей в таблице истории
pers._loop persons
{ nrec_lsch:=getnextnrec(#ls,0)
set ls.nrec:=nrec_lsch;
set ls.tabn:=pers.persons.tabnmb;
set ls.datpos:=pers.persons.appdate;
set ls.datuv:=pers.persons.disdate;
set ls.tperson:=pers.persons.nrec;
set ls.tarif:=0;
set ls.cex:=pers.persons.galdep;
set ls.sovm:=pers.persons.csovm;
set ls.cschetd:='20';
set ls.TBLD[1]:=104;
set ls.CKAUD[1]:=10000000002C9h; //аналитика 001-зарплата
insert current ls;
if iNextVisual('Загрузка лицевых счетов ...'+''#13'Обработано: ')=false break;
}

StopVisual('',0);
xlKillExcel;
closeinterface(cmOk);
};
end;
end.

Добавлено: 02 июл 2008, 16:49
edward_K
1. set cd.nrec:=nrec_dolgn; - лишнне. он сам сгенериться елси пустой.
2. а кто вам запрещает во вьюхе cat вставку сделать?
3. cat.rereadrecords(cat.tncatalogs)

Добавлено: 03 июл 2008, 09:29
s2176
А компилятор ругается, что нет такой функции(((
cat.rereadrecords(cat.tncatalogs)
Может, дело в версии, у нас еще 712.

Добавлено: 03 июл 2008, 09:48
s2176
в доке нашла rereadrecord, но и на нее ругается(
Попыталась сделать вставку во вьюхе так:

if dolgn<>dolgn_tmp or tabn<>tabn_tmp
{ nrec_dolgn:=0; //cat.rereadrecord(cat.tncatalogs)
cat._loop catalogs
{ if upcase(trim(cat.catalogs.name))=upcase(trim(dolgn_tmp))
then nrec_dolgn:=cat.catalogs.nrec;
}
if nrec_dolgn=0
{ cat.insert catalogs
set cparent:=_nrec, groupcode:=2, mainlink:=_nrec, name:=dolgn_tmp;
}
dolgn_tmp:=dolgn;
}

все равно вставляет дубли.

Добавлено: 03 июл 2008, 09:52
edward_K
значит попробуйте
rereadrecord(cat.tncatalogs)
но надежней вставку сделать сразу во вьюху cat
а в главной вьюхе
rereadrecord(tncatalogs) уж точно скомпилиться.

Добавлено: 03 июл 2008, 10:11
s2176
Сейчас так:

if dolgn<>dolgn_tmp or tabn<>tabn_tmp
{ nrec_dolgn:=0; rereadrecord(cat.tncatalogs)
cat._loop catalogs
{ if upcase(trim(cat.catalogs.name))=upcase(trim(dolgn_tmp))
then nrec_dolgn:=cat.catalogs.nrec;
}
if nrec_dolgn=0
{ cat.insert catalogs
set cparent:=_nrec, groupcode:=2, mainlink:=_nrec, name:=dolgn_tmp;
}
dolgn_tmp:=dolgn;
}

И все равно дублируются :sad:

Добавлено: 03 июл 2008, 10:30
edward_K
1. cat.insert catalogs
set catalogs.cparent:=_nrec, catalogs.groupcode:=2,
catalogs.mainlink:=_nrec, catalogs.name:=dolgn_tmp;
2. _nrec - совпадает с тем что во вьюхе?
3. в _loop добавте
logstrtofile('!test.txt',catalogs.nrec+'/'+catalogs.name+'/'+dolg_tmp+'/'+dolgn+'/'+nrec_dolgn)
4. dolgn_tmp c dolgn не перепутаны местами?

Добавлено: 03 июл 2008, 10:42
s2176
Спасибо!!! в 1001 раз Вы мне помогаете!

а ведь точно, надо не
catalogs.mainlink:=_nrec, а catalogs.mainlink:=23h,
во вьюхе то стоит такое условие.
Все получилось :cool: