Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с большим числом [D5, IB6.x]


Страницы:   1 2

Andrey V. ©   (2004-02-08 10:29:00) 

Возникла необходимость хранить в базе большое число
(~13 знаков).
В базе создал NUMERIC (15,0), а с интерфейсом запнулся.
Стандартные vclы не подходят.
TSpin подошел бы, но он не может работать с числом больше integer.
TCurrencyEdit (от RX) кажет всякие "E" , что нежелательно.
Пришлось сотановиться на TEdit.
Теперь не могу пинуть его содержимое в базу , ругается ... numeric overflow ...

Ну не хранить же его в текстовом виде ?? (хотя ...)


Vlad   (2004-02-09 10:31:00) [21]


> Anatoly Podgoretsky © (09.02.04 10:09) [8]


> Стандартные vclы не подходят.
> Пришлось сотановиться на TEdit.


Дейсвительно, грусная история... ;-)


Anatoly Podgoretsky   (2004-02-09 10:09:00) [22]

Vlad © (09.02.04 10:00) [7]

Читай
Andrey V. © (08.02.04 10:29)
Стандартные vclы не подходят.


Vlad   (2004-02-09 10:00:00) [23]


> Andrey V. © (08.02.04 10:29)


а TDBEdit чем не устраивает ?


Deniz   (2004-02-09 09:52:00) [24]

Ну зачем же так, приговор.
Понятие IB6.x уже достаточно размыто, поэтому надо указывать конкретную версию сервера.
Вот например в FB1.5 есть такой тип данных BIGINT, так вот 18(восемнадцать) 9 туда "залазят" без проблем!


KA_   (2004-02-08 16:48:00) [25]

TKisBankMngr - это TDataModule, который содержит все запросы и пр. средства для работы с БД.


KA_   (2004-02-08 16:45:00) [26]

>Andrey V. © (08.02.04 10:29)
>Ну не хранить же его в текстовом виде ??

А почему нет?
Вот тебе пример модуля - справочника банков:

unit uKisBanks;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uKisClasses, DB, ImgList, ActnList, IBCustomDataSet, IBDatabase,
DBTables, uKisUtils;

type
EInvalidBIK = EAbort;
EInvalidKAccount = EAbort;
EInvalidTown = EAbort;
EInvalidBankGroup = EAbort;
EInvalidName = EAbort;

TKisBank = class(TKisEntity)
private
FBIK: Integer;
FName: String;
FKAccount: String;
FTown: String;
FBankGroup: SmallInt;
procedure CheckBIK(ABIK: Integer);
procedure CheckKAccount(const AKAccount: String);
procedure CheckName(const AName: String);
procedure CheckEditor(Editor: TForm);
procedure SetBIK(const Value: Integer);
procedure SetName(const Value: String);
function BIKString: String;
procedure SetKAccount(const Value: String);
procedure SetTown(const Value: String);
procedure SetBankGroup(const Value: SmallInt);
protected
function GetText: String; override;
public
constructor Create(Mngr: TKisEntityMngr); override;
function Edit: Boolean; override;
property Name: String read FName write SetName;
property BIK: Integer read FBIK write SetBIK;
property KAccount: String read FKAccount write SetKAccount;
property Town: String read FTown write SetTown;
property BankGroup: SmallInt read FBankGroup write SetBankGroup;
end;

TKisBankMngr = class(TKisEntityMngr)
dsSelect: TIBDataSet;
Transaction: TIBTransaction;
dsSelectID: TIntegerField;
dsSelectNAME: TIBStringField;
dsSelectBIK: TIBStringField;
dsSelectK_ACCOUNT: TIBStringField;
dsSelectTOWN: TIBStringField;
dsSelectBANK_GROUP: TSmallintField;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
protected
procedure CreateView; override;
procedure Activate; override;
procedure Deactivate; override;
public
procedure LoadData; override;
function CurrentEntity: TKisEntity; override;
end;

implementation

{$R *.dfm}

uses
uKisBankEditor, DM;

const
S_INVALID_BIK = "Неверное значение БИК!";
S_INVALID_KACCOUNT = "Неверное значение корр/счета!";
S_INVALID_NAME = "Неверное наименование банка!";
S_EDITOR_NOT_ASSIGNED = "Не найден редактор свойств банка!";

type
TNumberChar = set of Char;

const
NumberChars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];

function CharIsNumber(C: Char): Boolean;
begin
Result := C in NumberChars;
end;

function StrIsNumber(const S: String): Boolean;
var
I: Integer;
begin
Result := True;
for I := 1 to Length(S) do
if not CharIsNumber(S[I]) then
begin
Result := False;
Exit;
end;
end;
{ TKisBank }

function TKisBank.BIKString: String;
begin
Result := Format("%9.9d", [FBIK]);
end;

procedure TKisBank.CheckBIK(ABIK: Integer);
begin
//raise EInvalidBIK.Create(S_INVALID_BIK);
end;

procedure TKisBank.CheckEditor(Editor: TForm);
begin
if Assigned(Editor) then
with Editor as TKisBankEditor do
begin

end
else
raise EAbort.Create(S_EDITOR_NOT_ASSIGNED);
end;

procedure TKisBank.CheckKAccount(const AKAccount: String);
begin
if not StrIsNumber(AKAccount) {or ((Length(AKAccount) <> 18) or
(Length(AKAccount) <> 20))} then
raise EInvalidKAccount.Create(S_INVALID_KACCOUNT);
end;

procedure TKisBank.CheckName(const AName: String);
begin
if Trim(AName) = EmptyStr then
raise EInvalidName.Create(S_INVALID_NAME);
end;

constructor TKisBank.Create(Mngr: TKisEntityMngr);
begin
inherited;
FBankGroup := 0;
end;

function TKisBank.Edit: Boolean;
var
I: Integer;
L: TStringList;
begin
inherited;
with TKisBankEditor.Create(Application) do
begin
edName.Text := Self.FName;
edTown.Text := Self.FTown;
edBIK.Text := IntToStr(FBIK);
edKAccount.Text := FKAccount;
cbStates.Items.Add("неопределен");
L := DModule.GetStatesList;
cbStates.Items.AddStrings(L);
L.Free;
I := cbStates.Items.IndexOfObject(Pointer(Self.FBankGroup));
if I < 0 then I := 0;
cbStates.ItemIndex := I;
Result := ShowModal = mrOK;
if Result then
try
Self.BIK := StrToInt(edBIK.Text);
Self.Name := edName.Text;
Self.Town := edTown.Text;
Self.KAccount := edKAccount.Text;
Self.BankGroup := Integer(cbStates.Items.Objects[cbStates.ItemIndex]);
except
end;
Release;
end;
end;

function TKisBank.GetText: String;
begin
Result := Self.Name + " " + Self.Town + " " + Self.BIKString;
end;

procedure TKisBank.SetBankGroup(const Value: SmallInt);
begin
if FBankGroup <> Value then
begin
FBankGroup := Value;
Modified := True;
end;
end;

procedure TKisBank.SetBIK(const Value: Integer);
begin
CheckBIK(Value);
if FBIK <> Value then
begin
FBIK := Value;
Modified := True;
end;
end;

procedure TKisBank.SetKAccount(const Value: String);
begin
CheckKAccount(Value);
if FKAccount <> Value then
begin
FKAccount := Value;
Modified := True;
end;
end;

procedure TKisBank.SetName(const Value: String);
begin
CheckName(Value);
if FName <> Value then
begin
FName := Value;
Modified := True;
end;
end;

procedure TKisBank.SetTown(const Value: String);
begin
if FTown <> Value then
begin
FTown := Value;
Modified := True;
end;
end;

{ TKisBankMngr }

procedure TKisBankMngr.Activate;
begin
inherited;
if not Transaction.Active then
Transaction.StartTransaction;
LoadData;
end;

procedure TKisBankMngr.CreateView;
begin
inherited;
FView.Caption := "Банки";
end;

procedure TKisBankMngr.Deactivate;
begin
inherited;
if Transaction.Active then
Transaction.Commit;
end;

procedure TKisBankMngr.LoadData;
begin
inherited;
dsSelect.Open;
dsSelect.FetchAll;
end;

procedure TKisBankMngr.DataModuleCreate(Sender: TObject);
begin
inherited;
Transaction.DefaultDatabase := DModule.Database;
dsSelect.Transaction := Transaction;
end;

function TKisBankMngr.CurrentEntity: TKisEntity;
begin
if dsSelect.Active then
begin
Result := TKisBank.Create(Self);
with Result as TKisBank do
begin
ID := dsSelect.FieldByName("ID").AsInteger;
Name := dsSelect.FieldByName("NAME").AsString;
BIK := dsSelect.FieldByName("BIK").AsInteger;
KAccount := dsSelect.FieldByName("K_ACCOUNT").AsString;
Town := dsSelect.FieldByName("TOWN").AsString;
BankGroup := dsSelect.FieldByName("BANK_GROUP").AsInteger;
end;
end
else
Result := nil;
end;

end.


Поле K_ACCOUNT содержит коррсчет банка - 20 символов, все цифры.
При его установке проверка на правильность. С показом вообще проблем нет.


Anatoly Podgoretsky   (2004-02-08 14:45:00) [27]

Что все же, ну рассказал ты грустную историю, а что дальше. Конечно лучше ее было в Потрепаться опубликовать, там такие истории любят.


Andrey V.   (2004-02-08 14:35:00) [28]

От человека такого уровня , это воспринимается как приговор :-)
И все же ?


Anatoly Podgoretsky   (2004-02-08 12:29:00) [29]

Грустная история.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо