• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Обновление Записей

  • Автор темы hasp84
  • Дата начала
H

hasp84

Здравствуйте !

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

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ExtCtrls, StdCtrls, ComCtrls;

type
TFrmGlav = class(TForm)	  //Основная форма
con1: TADOConnection;		//подключение к базе SQL
qryQuery: TADOQuery;		 //Обновляемые таблицы
ds1: TDataSource;
lbl1: TLabel;						//Количество просмотренных таблиц
btnRun: TButton;
qryQuery1: TADOQuery;		//для поиска обновляемых строк
ds2: TDataSource;
Label1: TLabel;					 //подсчитаное количество обновленных записей
Label2: TLabel;					 //подсчитаное количество просмотренных записей
procedure btnRunClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmGlav: TFrmGlav;
KeyInform : integer;	 //Количество обновленных строк
KeyView: integer;		 //Количество просмотренных строк
implementation

{$R *.dfm}

procedure N27Click(s:string);

procedure expandet(str1:String);
var d,i:integer;

begin
FrmGlav.qryQuery1.Active:=false;
FrmGlav.qryQuery1.SQL.Clear;
FrmGlav.qryQuery1.SQL.Add('Select Familia, Imia, Otchestvo');
FrmGlav.qryQuery1.SQL.Add('FROM temp_table');
FrmGlav.qryQuery1.Active:=True;

FrmGlav.qryQuery.Active:=false;
FrmGlav.qryQuery.SQL.Clear;
FrmGlav.qryQuery.SQL.Add('Select Familia, Imia, Otchestvo, inform');
FrmGlav.qryQuery.SQL.Add('FROM '+str1);
FrmGlav.qryQuery.Active:=True;

for i:=0 to FrmGlav.ds1.DataSet.RecordCount-1 do
begin
for d:=0 to FrmGlav.ds2.DataSet.RecordCount-1 do
Begin
KeyView:=KeyView+1;	 //подсчитываем количество проходов
if (FrmGlav.ds1.DataSet.Fields.FieldByName('Familia').AsString = FrmGlav.ds2.DataSet.Fields.FieldByName('Familia').AsString)
and (FrmGlav.ds1.DataSet.Fields.FieldByName('Imia').AsString = FrmGlav.ds2.DataSet.Fields.FieldByName('Imia').AsString)
and (FrmGlav.ds1.DataSet.Fields.FieldByName('Otchestvo').AsString = FrmGlav.ds2.DataSet.Fields.FieldByName('Otchestvo').AsString)
Then
Begin
FrmGlav.ds1.DataSet.Edit;
FrmGlav.ds1.DataSet.Fields.FieldByName('inform').AsString:='1 необходимо получить бланк';
FrmGlav.ds1.DataSet.Post;
KeyInform:= KeyInform + 1; //подсчитываем количество обновлений
FrmGlav.ds2.DataSet.Next;
End
Else FrmGlav.ds2.DataSet.Next;
end;
FrmGlav.ds1.DataSet.Next;
end;
end;

var
a:integer;
begin
KeyInform:=0; KeyView:=0;
for a:=1 to 10 do
begin
FrmGlav.lbl1.Caption:='обновление таблиц из темп '+IntToStr(a)+' из 10';
case a of
1:expandet('tbl1');	 2:expandet('tbl2');
3:expandet('tbl3');	 4:expandet('tbl4');
5:expandet('tbl5'); 6:expandet('tbl6');
7:expandet('tbl7');	 8:expandet('tbl8');
9:expandet('tbl9'); 10:expandet('tbl10');
end;
end;
FrmGlav.Label1.Caption:= IntToStr(KeyInform)+' обновлено записей';
FrmGlav.Label2.Caption:= IntToStr(KeyView)+' просмотрено записей';
end;

procedure TFrmGlav.btnRunClick(Sender: TObject);
begin
btnRun.Enabled:=False;
N27Click('');
end;

end.
 

Вложения

  • 1.JPG
    1.JPG
    12,4 КБ · Просмотры: 497
M

-master-

Зачем эта куча кода? Это все можно сделать быстро 1 запросом.
 
H

hasp84

-master- сказал(а):
если это можно сделать все одним запросом подскажи пожалуйста как сделать.
вот что у меня получилось для обработки одной таблицы, как обработать все таблицы сразу в одном запросе???

Код:
update tbl1
set inform = '1 необходимо получить бланк'
FROM tbl1
INNER JOIN temp_table ON tbl1.Familia= temp_table.Familia AND tbl1.Imia= temp_table.Imia AND tbl1.Otchestvo = temp_table.Otchestvo
 
S

sinkopa

-master- сказал(а):
Зачем эта куча кода? Это все можно сделать быстро 1 запросом.
если это можно сделать все одним запросом подскажи пожалуйста как сделать.
Ну... все 10 таблиц сразу вряд ли конечно... :lol:
но при обновлении одной таблицы датасеты точно Вам не требуются.
Вы не указали к какой СУБД коннектися ваш ADO, но в общем случае Ваш код может выглядеть примерно так
Код:
// результат - количество обновленных записей
function expandet(const updTable:string): Integer;
var
SQL: string;
begin
SQL := 'UPDATE u '+
' SET inform = "1 необходимо получить бланк" '+
'FROM '+ updTable +' u '+
' INNER JOIN temp_table t '+
'	ON u.Familia  = t.Familia '+
'	AND u.Imia	 = t.Imia '+
'	AND u.Otchestvo = t.Otchestvo ';

FrmGlav.qryQuery1.Close;
FrmGlav.qryQuery1.SQL.Text := SQL;
try
FrmGlav.qryQuery1.ExecSQL;
Result := FrmGlav.qryQuery1.RowsAffected;
except
Result := 0;
end;
end;

procedure TFrmGlav.btnRunClick(Sender: TObject);
const
tbl: array[1..10] of string = ('tbl1','tbl2','tbl3','tbl4','tbl5',
'tbl6','tbl7','tbl8','tbl9','tbl10'
);
var
i,KeyInform, KeyView: Integer;
begin
KeyInform := 0;
KeyView := 10; // все же 10 будем смотреть... правда ведь? :-)

for i := 1 to 10 do begin
FrmGlav.lbl1.Caption := Format('обновление таблиц из темп %d из 10',[i]); // ? нахрена ? :-)
Inc(KeyInform, expandet(tbl[i]));
end;

FrmGlav.Label1.Caption:= Format(' %d обновлено записей',[KeyInform]);
FrmGlav.Label2.Caption:= Format(' %d просмотрено записей',[KeyView]);

end;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!