Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение данных из таблицы, сохранение данных из таблицы 
:(
    Опции темы
brusel
Дата 4.3.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Помогите исправить ошибку в коде сохранения данных  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.


PM MAIL   Вверх
Rodman
Дата 4.3.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



Код

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;

хотя без ошибки трудно понять как ее решить!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
brusel
Дата 4.3.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



так не пашет.
Сделал так

Код

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);

выдает ошибку
PM MAIL   Вверх
Rodman
Дата 5.3.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



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

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

а тебе обязалово бинарик?:
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Deniz
Дата 5.3.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Непонятно, зачем объявлять 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;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
brusel
Дата 5.3.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Сделал по последнему совету. Помогло.  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;


PM MAIL   Вверх
Deniz
Дата 5.3.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(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;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
brusel
Дата 7.3.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



В строке
Код

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


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

[Ошибка] Unit1.pas(219): Not enough actual parameters
PM MAIL   Вверх
Rodman
Дата 7.3.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



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

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

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

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Deniz
Дата 7.3.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
brusel
Дата 7.3.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Спасибо работает  smile 
Еще вопрос
Как вывести сообшение в котором указывалось сколько записей обновилось и сколько добавилось новых.
PM MAIL   Вверх
Rodman
Дата 7.3.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



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

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

можно просто вывести кол-во записей на добавление!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Deniz
Дата 11.3.2008, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Добавь 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;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1064 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.