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

insert по условию

Добавлено: 08 окт 2012, 11:13
VarankDA
Подскажите криворукому!
Необходимо добавить записи в таблицу sys_mbf из стороннего файла при выполнении определенного условия;

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

 if fl_j=0
             begin
               _cex[j_eof]:=t1.lschet.cex;
               j_eof:=j_eof+1;
               _mnrec:=_mnrec+1;
               insert
                 sys_mbf
               set
                 mnrec:=_mnrec,
                 nmnem:='В счет ЗП от '+string(_dDate)+' Имп',
                 cex:=_cex[j_eof-1],
                 choice := 1,
                 koff:=1,
                 kassir:=65535,
                 datan := _dDate,
                 datok := _dDate;
             end;  
Условие выполняется 31 раз, в таблицу добавляется 3 раза
Если условие отключить оператор insert работает корректно.

Re: insert по условию

Добавлено: 08 окт 2012, 11:46
Darikon
Возможно, набор данных не удовлетворяет какому либо индексу в данной таблице.
И, пожалуй, явно следует указать

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

nrec:=0;

Re: insert по условию

Добавлено: 08 окт 2012, 12:28
VarankDA
Попробовал - картинка та же

Re: insert по условию

Добавлено: 08 окт 2012, 12:32
Darikon
предлагаю выложить код не только тела цикла, но и самого цикла,
иначе не видна картинка.

Re: insert по условию

Добавлено: 08 окт 2012, 12:42
Masygreen
может вы _mnrec переопределяете выше ? и он пересекается с уже вставленным.. объявите это поле как индекс уникальный и пускай он сам там увеличивается

Re: insert по условию

Добавлено: 08 окт 2012, 12:46
VarankDA

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

.form 'Imp_540'
.ard
.nameinlist 'Загрузить сведения по ЗП'
.var
   file,n,c: longint;
   i,i_eof : integer; // позиция список
   j,j_eof : integer; // позиция цех
   s: string;
   _prop,_Tabn,_fio: array [1..5000] of string;
   _LS: array [1..5000] of comp;
   _Sum: array [1..5000] of double;
   _f : array [1..5] of integer;
   _s : array [1..5] of string;
   _cex : array [1..100] of comp;
   fl_j : byte;
   _dDate :date;
   _mnrec :word;
.endvar
.create view T1
  var
    _NrecLS :comp;
as
select
  lschet.cex,
  lschet.tabn
from
  lschet
where
  ((_NrecLS == lschet.nrec))
;
!.create view t2 as select * from sys_mbf;
.begin
  i:=1;
  _mnrec:=9999;
  _dDate:=date(30,06,2012);
  file:= CreateFileHandle('xxx');
  File_OpenFile('D:\Temp\ZP\limit.txt', stOpenRead, file);
  While not File_EOF(file) do begin
    file_readln(s, file);
!********Пропуск
    _f[1]:=pos(';',s);
    _Prop[i]:=subStr(s,1,_f[1]-1);
!********Табельный номер
    _s[2]:=subStr(s,length(_Prop[i])+2,length(s)-length(_Prop[i]));
    _f[2]:=pos(';',_s[2]);
    _tabn[i]:=subStr(_s[2],1,_f[2]-1);
!********ФИО
    _s[3]:=subStr(_s[2],length(_tabn[i])+2,length(_s[2])-length(_Tabn[i]));
    _f[3]:=pos(';',_s[3]);
    _fio[i]:=subStr(_s[3],1,_f[3]-1);
!********Лицевой счет
    _s[4]:=subStr(_s[3],length(_fio[i])+2,length(_s[3])-length(_fio[i]));
    _f[4]:=pos(';',_s[4]);
    _LS[i]:=comp(subStr(_s[4],1,_f[4]-1));
!********Сумма
    _s[5]:=subStr(_s[4],length(_LS[i])+2,length(_s[4])-length(_LS[i]));
    _f[5]:=pos(';',_s[5]);
    _Sum[i]:=Double(subStr(_s[5],1,_f[5]-1));
    i_eof:=i;
    i:=i+1;
  end;
  i:=1;
  DeleteFileHandle(file);
  j_eof:=1;
end.
.fields
!  _Ls[i] t1._nrecls T1.lschet.cex fl_j
  j_eof-1
.endfields
.begin
  while i<=i_eof
    T1._loop
      {
         begin
           T1._nrecls:=comp(_ls[i]);
           fl_j:=0;
           for (j:=1;j<=j_eof;j:=j+1)
             if _cex[j]=t1.lschet.cex then fl_j:=1;
           if fl_j=0
             begin
               _cex[j_eof]:=t1.lschet.cex;
               j_eof:=j_eof+1;
               _mnrec:=_mnrec+1;
               insert
                 sys_mbf
               set
                 mnrec:=_mnrec,
                 nmnem:='В счет ЗП от '+string(_dDate)+' Имп',
                 cex:=_cex[j_eof-1],
                 choice := 1,
                 koff:=1,
                 kassir:=65535,
                 datan := _dDate,
                 datok := _dDate;
             end;
           i:=i+1;
         end;
      }
end.
                                         ^
.endForm

Re: insert по условию

Добавлено: 08 окт 2012, 13:33
Darikon
а как вы определяете что вставилось три записи?
по сырцам вроде все верно... если не пропустил чего..

Re: insert по условию

Добавлено: 08 окт 2012, 13:56
VarankDA
смотрю состояние счетчика j_eof с отключенным инсертом

Re: insert по условию

Добавлено: 08 окт 2012, 14:21
Den
логическая таблица.insert table
set
логическая таблица.table.fileds1:=
....
логическая таблица.table.filedsn:=;

Re: insert по условию

Добавлено: 08 окт 2012, 14:54
edward_K
Mnrec там уникальное поле

Re: insert по условию

Добавлено: 08 окт 2012, 15:18
Darikon
Соглашусь с Den, это будет правильнее (однозначно определено)

Re: insert по условию

Добавлено: 08 окт 2012, 16:21
VarankDA
mnrec сам не формируется значение по умолчанию - 0,
Эт еще один вопросик - из какой настройки он берет последний номер для mnrec?
синтаксис переписал, но чет неправильно:

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

T2.insert table
               set
                 sys_mbf.mnrec:=_mnrec,
                 sys_mbf.nmnem:='В счет ЗП от '+string(_dDate)+' Имп',
                 sys_mbf.cex:=_cex[j_eof-1],
                 sys_mbf.choice := 1,
                 sys_mbf.koff:=1,
                 sys_mbf.kassir:=65535,
                 sys_mbf.datan := _dDate,
                 sys_mbf.datok := _dDate;
не указан узел для модификации "sys_mbf.datok := _dDate;" и рантайм 216

Re: insert по условию

Добавлено: 08 окт 2012, 16:32
Den
А так ?...
T2.insert sys_mbf
set
sys_mbf.mnrec:=_mnrec,
sys_mbf.nmnem:='В счет ЗП от '+string(_dDate)+' Имп',
sys_mbf.cex:=_cex[j_eof-1],
sys_mbf.choice := 1,
sys_mbf.koff:=1,
sys_mbf.kassir:=65535,
sys_mbf.datan := _dDate,
sys_mbf.datok := _dDate;

Re: insert по условию

Добавлено: 08 окт 2012, 16:42
VarankDA
УРА!!! Спасибо - все получилось!