TNewThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
Procedure SyncDelete;
Procedure SyncAddLog;
Procedure SyncClose;
Function FindTransaction(NoTrans:Integer):Boolean;
public
FileName:string;
NoKKM, NoRep, NoTrans:longInt;
Percent:integer;
tqFind, tqAppend:TADOQuery;
Msg:String;
cmd:byte;
end;
Function TNewThread.FindTransaction(NoTrans:Integer):Boolean;
begin
tqFind.Close;
tqFind.Parameters.ParamByName('NoTrans').Value:= NoTrans;
tqFind.ExecSQL;
tqFind.Open;
Result := not tqFind.IsEmpty;
end;
procedure TNewThread.SyncDelete;
begin
ListThread.Remove(Self);
end;
procedure TNewThread.SyncAddLog;
begin
Form1.AddLog(Msg, cmd);
end;
procedure TNewThread.Execute;
Var TypeTrans, NoCheck, User, MaxPos, zNoKKM:Longint;
zCount, Price, Summa: Single;
Date, Time, Code, Section:String;
s,s1:String;
f:TextFile;
begin
// Запрос для поиска транзакций
tqFind.SQL.Clear;
With tqFind.SQL do
begin
Add('SELECT Транзакции.Касса, Транзакции.НомерТранзакции ');
Add('FROM Транзакции ');
Add('WHERE (((Транзакции.Касса)= :Kassa) AND ((Транзакции.НомерТранзакции)= :NoTrans));');
end;
tqFind.Parameters.ParamByName('Kassa').DataType := ftInteger;
tqFind.Parameters.ParamByName('NoTrans').DataType:= ftInteger;
tqFind.Parameters.ParamByName('Kassa').Value := NoKKM;
// Запрос на добавление записей
With tqAppend.SQL do
begin
Clear;
Add('INSERT INTO Транзакции ');
Add('(Касса,НомерТранзакции,Дата,Время,ТипТранзакции,НомерЧека,КодКассира,Код,Секция,Цена,Количество,Сумма)');
Add('VALUES (:Kassa, :NoTrans, :Data, :Time, :TypeTrans, :NoCheck, :KodUser, :Code, :Section, :Price, :Count, :Summa)');
end;
With tqAppend.Parameters do
begin
ParamByName('Kassa').DataType := ftInteger;
ParamByName('Kassa').Value := NoKKM;
ParamByName('NoTrans').DataType := ftInteger;
ParamByName('Data').DataType := ftDateTime;
ParamByName('Time').DataType := ftDateTime;
ParamByName('TypeTrans').DataType:=ftInteger;
ParamByName('KodUser').DataType := ftInteger;
ParamByName('NoCheck').DataType := ftInteger;
ParamByName('Code').DataType := ftString;
ParamByName('Section').DataType := ftString;
ParamByName('Price').DataType := ftCurrency;
ParamByName('Count').DataType := ftFloat;
ParamByName('Summa').DataType := ftCurrency;
end;
cmd :=0;
// Откроем файл для чтения
AssignFile(f, FileName);
try
Reset(f);
except
Msg := 'Ошибка открытия файла '+FileName;
Synchronize(SyncAddLog);
Synchronize(SyncDelete); // удаляем из списка поток
exit;
end;
MaxPos :=FileSize(f);
While not Eof(f) do
begin
try
Readln(f,s);
Percent := Round(100*FilePos(f)/MaxPos);
If s = '#' then
begin
// Следующийотчет в одном файле
Readln(f,s);
Readln(f,s);
Readln(f,s);
end;
except
Msg := 'Ошибка обработки файла '+FileName;
Synchronize(SyncAddLog);
Synchronize(SyncDelete); // удаляем из списка поток
CloseFile(f);
exit;
end;
try
NoTrans := StrToInt(FromString(s)); // НомерТранзакции = Число(СтрПолучитьСтроку( Стр, 1 ) );
Date := Trim(FromString(s)); // ДатаТранзакции = Дата( СтрПолучитьСтроку( Стр, 2 ) );
Time := Trim(FromString(s)); // ВремяТранзакции = СтрПолучитьСтроку( Стр, 3 );
TypeTrans:= StrToInt(FromString(s)); // ТипТранзакции = Число( СтрПолучитьСтроку( Стр, 4 ) );
except
Msg := 'Ошибка обработки файла '+FileName;
Synchronize(SyncAddLog);
Synchronize(SyncDelete); // удаляем из списка поток
CloseFile(f);
exit;
end;
If TypeTrans in [24,50,51,65,66,150,60,62,63,90,91,40,58] then Continue; // пропускаем открытие ящика и др.
IsEmpty := true;
Synchronize(FindTransaction);
If IsEmpty then Continue;
Try
zNoKKM := StrToInt(FromString(s)); // НомерККМ = Число( СтрПолучитьСтроку( Стр, 5 ) );
NoCheck := StrToInt(FromString(s)); // НомерЧека = Число( СтрПолучитьСтроку( Стр, 6 ) );
User := StrToInt(FromString(s)); // Кассир = СтрПолучитьСтроку( Стр, 7 );
Code := Trim(FromString(s)); // Код = СтрПолучитьСтроку( Стр, 8 );
Section := Trim(FromString(s)); // Секция = СтрПолучитьСтроку( Стр, 9 );
Price := StrToFloat(FromString(s));// Цена = Число( СтрЗаменить( СтрПолучитьСтроку( Стр, 10 ), ",", "." ) );
s1 := FromString(s); // Количество = Число( СтрЗаменить( СтрПолучитьСтроку( Стр, 11 ), ",", "." ) );
//zCount := 0;
//Val(s1, zCount, i);
zCount := StrToFloat(s1, fs);
Summa := StrToFloat(FromString(s));// Сумма = Число( СтрЗаменить( СтрПолучитьСтроку( Стр, 12 ), ",", "." ) );
except
Msg := 'Ошибка обработки файла '+FileName;
Synchronize(SyncAddLog);
Synchronize(SyncDelete); // удаляем из списка поток
CloseFile(f);
exit;
end;
try
With tqAppend.Parameters do
begin
ParamByName('NoTrans').Value := NoTrans;
ParamByName('Data').Value := StrToDate(Date);
ParamByName('Time').Value := StrToDateTime(Date+' '+Time);
ParamByName('TypeTrans').Value:=TypeTrans;
ParamByName('NoCheck').Value := NoCheck;
ParamByName('KodUser').Value := User;
ParamByName('Code').Value := Code;
ParamByName('Section').Value := Section;
ParamByName('Price').Value := FloatToCurr(Price);
ParamByName('Count').Value := Count;
ParamByName('Summa').Value := FloatToCurr(Summa);
end;
tqAppend.ExecSQL; // Вот тут и происходит зависание на 2-1 итерации
except
Msg := 'Ошибка обработки файла '+FileName;
Synchronize(SyncAddLog);
Synchronize(SyncDelete); // удаляем из списка поток
CloseFile(f);
exit;
end;
end;
Msg := 'Файл '+FileName+' загружен';
Synchronize(SyncAddLog);
Synchronize(SyncDelete); // удаляем из списка поток
CloseFile(f);
try
DeleteFile(FileName);
Except
end;
end;