Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > сохранение данных из таблицы


Автор: brusel 4.3.2008, 14:49
Помогите исправить ошибку в коде сохранения данных  smile 

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;

type
  TMember = record
    Counter: string[11]; //1
    C_Code : string[3];  //2
    N_Code : string[2];  //3
    DataSkl: string[10]; //4
    ProtNum: string[6];  //5
    FamN: string[20];    //6
    D_Code: string[2];   //7
    Pos_Node: string[2]; //8
    ST_Code: string[5];  //9
    Pov_Code: string[1]; //10
    DataV: string[10];   //11
    FamS: string[20];    //12
    NameS: string[14];   //13
    SonameS: string[19]; //14
    DataBD: string[10];  //15
    ObjName: string[22]; //16
    NamePoS: string[22]; //17
    Pos_Code: string[1]; //18
    PRO_Code: string[2]; //19
    NameRoz: string[20]; //20
    Nap_Code: string[1]; //21
    RI_Code: string[2];  //22
    DataRi: string[10];  //23
    PostN: string[3];    //24
    SumR: string[3];     //25
    SumK: string[2];     //26
    UData: string[10];    //27
    UNData: string[10];   //28
    UUData: string[10];   //29
    SKN_Code: string[1]; //30
    SKP_Code: string[1]; //31
    SS_Code: string[1];  //32
    NPR_Code: string[1]; //33
    PZ_Code: string[1];  //34
    SVS_Code: string[1]; //35
    KZap: string[20];    //36
    KZData: string[10];   //37
    PError: string[1];   //38
    SF: string[1];       //39

  end;
type
  TForm1 = class(TForm)
    ReadButton: TButton;
    SaveButton: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Table: TTable;
    procedure SaveButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;
  r: array of TMember;

implementation

{$R *.dfm}


procedure TForm1.SaveButtonClick(Sender: TObject);
var
F : file of TMember;
i, count: integer;
begin
AssignFile(F,'20.kap');
Rewrite(F);
table.First;
 while not table.Eof do
     begin
     r[i].counter:=table.FieldByName('Counter').AsString;
     r[i].C_Code:=table.FieldByName('C_Code').AsString;
     r[i].N_Code:=table.FieldByName('N_Code').AsString;
     end;
  Write (F, r[i]);
CloseFile(F);
end;


end.


Автор: Rodman 4.3.2008, 15:57
Код

var
  Form1: TForm1;
  r: array[1..100] of TMember;
implementation
{$R *.dfm}
procedure TForm1.SaveButtonClick(Sender: TObject);
var
F : file of TMember;
i, count: integer;
begin
AssignFile(F,'20.kap');
Rewrite(F);
table.First;
 while not table.Eof do
     begin
     r[i].counter:=table.FieldByName('Counter').AsString;
     r[i].C_Code:=table.FieldByName('C_Code').AsString;
     r[i].N_Code:=table.FieldByName('N_Code').AsString;
     table.next;
     end;
  Write (F, r[i]);
CloseFile(F);
end;

хотя без ошибки трудно понять как ее решить!

Автор: brusel 4.3.2008, 19:57
так не пашет.
Сделал так

Код

procedure TForm1.SaveButtonClick(Sender: TObject);
var
F : file of TMember;
i : integer;
begin
AssignFile(F,'20.kap');
Rewrite(F);
table.First;
for i:= 1 to table.RecordCount do
     begin
     SetLength(r,Length(r) + 1);
     r[i].counter:=table.FieldByName('Counter').AsString;
     r[i].C_Code:=table.FieldByName('C_Code').AsString;
     r[i].N_Code:=table.FieldByName('N_Code').AsString;
     r[i].DataSkl:=table.FieldByName('DataSkl').AsString;
     r[i].ProtNum:=table.FieldByName('ProtNum').AsString;
     r[i].FamN:=table.FieldByName('FamN').AsString;
     r[i].D_Code:=table.FieldByName('D_Code').AsString;
     r[i].Pos_Node:=table.FieldByName('Pos_Node').AsString;
     r[i].ST_Code:=table.FieldByName('ST_Code').AsString;
     r[i].Pov_Code:=table.FieldByName('Pov_Code').AsString;
     r[i].DataV:=table.FieldByName('DataV').AsString;
     r[i].FamS:=table.FieldByName('FamS').AsString;
     r[i].NameS:=table.FieldByName('NameS').AsString;
     r[i].SonameS:=table.FieldByName('SonameS').AsString;
     r[i].DataBD:=table.FieldByName('DataBD').AsString;
     r[i].ObjName:=table.FieldByName('ObjName').AsString;
     r[i].NamePoS:=table.FieldByName('NamePoS').AsString;
     r[i].Pos_Code:=table.FieldByName('Pos_Code').AsString;
     r[i].PRO_Code:=table.FieldByName('PRO_Code').AsString;
     r[i].NameRoz:=table.FieldByName('NameRoz').AsString;
     r[i].Nap_Code:=table.FieldByName('Nap_Code').AsString;
     r[i].RI_Code:=table.FieldByName('RI_Code').AsString;
     r[i].DataRi:=table.FieldByName('DataRi').AsString;
     r[i].PostN:=table.FieldByName('PostN').AsString;
     r[i].SumR:=table.FieldByName('SumR').AsString;
     r[i].SumK:=table.FieldByName('SumK').AsString;
     r[i].UData:=table.FieldByName('UData').AsString;
     r[i].UNData:=table.FieldByName('UNData').AsString;
     r[i].UUData:=table.FieldByName('UUData').AsString;
     r[i].SKN_Code:=table.FieldByName('SKN_Code').AsString;
     r[i].SKP_Code:=table.FieldByName('SKP_Code').AsString;
     r[i].SS_Code:=table.FieldByName('SS_Code').AsString;
     r[i].NPR_Code:=table.FieldByName('NPR_Code').AsString;
     r[i].PZ_Code:=table.FieldByName('PZ_Code').AsString;
     r[i].SVS_Code:=table.FieldByName('SVS_Code').AsString;
     r[i].KZap:=table.FieldByName('KZap').AsString;
     r[i].KZData:=table.FieldByName('KZData').AsString;
     r[i].PError:=table.FieldByName('PError').AsString;
     r[i].SF:=table.FieldByName('SF').AsString;
  end;
  Write (F, r[i]);
SetLength(r, 0);
CloseFile(F);
end;


Но в втором цыкле  в строке
Код

SetLength(r,Length(r) + 1);

выдает ошибку

Автор: Rodman 5.3.2008, 09:51
Цитата(brusel @  4.3.2008,  18:57 Найти цитируемый пост)
выдает ошибку 

она не лечится без диагноза!

а тебе обязалово бинарик?:

Автор: Deniz 5.3.2008, 11:55
Непонятно, зачем объявлять i, count : integer?
Можно вот так попробовать:
Код

procedure TForm1.SaveButtonClick(Sender: TObject);
var
F : file of TMember;
obj : TMember;
begin
AssignFile(F,'20.kap');
Rewrite(F);
table.First;
while not table.Eof do
  begin
    obj.counter:=table.FieldByName('Counter').AsString;
    obj.C_Code:=table.FieldByName('C_Code').AsString;
    obj.N_Code:=table.FieldByName('N_Code').AsString;
    Write (F, obj);
    table.next;
  end;
CloseFile(F);
end;

Автор: brusel 5.3.2008, 14:51
Сделал по последнему совету. Помогло.  smile Супер.  smile  Еще вопрос. smile 
Как сделать чтобы новые данные заносились в базу, а старые только обновлялись

Пример работы со StringGrid.
Нужно вносить данные в таблицу Table ключевое поле Counter;


Код

procedure TForm1.ReadButtonClick(Sender: TObject);
var
  f: File of TMember;
  r: array of TMember;
  i, count: integer;
begin
  AssignFile(f, '20.kap');
  Reset(f);
  try
    count:=FileSize(f);
    if count<>0 then
      begin
      SetLength(r, count); 
      i:=0;
      while not Eof(f) do
        begin
        Read(f, r[i]);
        // work with record
        StringGrid1.Cells[1,i]:=r[i].Counter;
        StringGrid1.Cells[2,i]:=r[i].C_Code;
        StringGrid1.Cells[3,i]:=r[i].N_Code;
        StringGrid1.Cells[4,i]:=r[i].DataSkl;
            i:=i+1;
        end;
      end;
  finally
    CloseFile(f);
  end;
end;


Автор: Deniz 5.3.2008, 15:40
Цитата(brusel @  5.3.2008,  17:51 Найти цитируемый пост)
Как сделать чтобы новые данные заносились в базу, а старые только обновлялись
не совсем понятно, что имеется ввиду.
Вероятно вот это:
Код

for i:=1 to count do
begin
  if Table.locate('Counter', r[i].Counter) then Table.Edit else Table.Append;
  Table.FieldByName('Counter').AsString:=r[i].counter;
  Table.FieldByName('C_Code').AsString:=r[i].C_Code;
  Table.FieldByName('N_Code').AsString:=r[i].N_Code;
  ...
  Table.Post;
end;

Автор: brusel 7.3.2008, 09:42
В строке
Код

if Table.locate('Counter', r[i].Counter) then Table.Edit else Table.Append;


выдает ошибку

[Ошибка] Unit1.pas(219): Not enough actual parameters

Автор: Rodman 7.3.2008, 09:49
Table.Locate(Имя_Поля, Что искать, Опции поиска) 
для последнего параметра поставь одну из опций (а можно и с двумя попробовать) - [loCaseInsensitive, loPartialKey]
ЗЫ: квадратные скобочки тоже должны быть!

вот типа так должно смотреться!
Код

if Table.locate('Counter', r[i].Counter, [loCaseInsensitive]) then Table.Edit else Table.Append;

Автор: Deniz 7.3.2008, 10:45
Цитата(brusel @  7.3.2008,  12:42 Найти цитируемый пост)
выдает ошибку
это меня отвлекли, забыл дописать параметры поиска.

Автор: brusel 7.3.2008, 14:23
Спасибо работает  smile 
Еще вопрос
Как вывести сообшение в котором указывалось сколько записей обновилось и сколько добавилось новых.

Автор: Rodman 7.3.2008, 15:04
Цитата(brusel @  7.3.2008,  13:23 Найти цитируемый пост)
записей обновилось

разве ты что то обновляешь???
Цитата(brusel @  7.3.2008,  13:23 Найти цитируемый пост)
сколько добавилось новых. 

можно просто вывести кол-во записей на добавление!

Автор: Deniz 11.3.2008, 07:02
Добавь 2 счетчика:
Код

CntUpdate:=0;
CntInsert:=0;
...
if Table.locate('Counter', r[i].Counter, [loCaseInsensitive]) 
  then begin inc(CntUpdate); Table.Edit; end
  else begin inc(CntInsert); Table.Append; end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)