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

Тема в разделе "Delphi - Базы данных", создана пользователем hasp84, 21 янв 2015.

  1. hasp84

    hasp84 New Member

    Регистрация:
    21 янв 2015
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте !

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

    Код (Delphi):
    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
      Размер файла:
      15 КБ
      Просмотров:
      28
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Зачем эта куча кода? Это все можно сделать быстро 1 запросом.
     
  3. hasp84

    hasp84 New Member

    Регистрация:
    21 янв 2015
    Сообщения:
    2
    Симпатии:
    0
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну... все 10 таблиц сразу вряд ли конечно... :lol:
    но при обновлении одной таблицы датасеты точно Вам не требуются.
    Вы не указали к какой СУБД коннектися ваш ADO, но в общем случае Ваш код может выглядеть примерно так
    Код (Delphi):
    // результат - количество обновленных записей
    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;
     
Загрузка...

Поделиться этой страницей