500+ FAQ по Delphi

Перейти на: Главную | Индексную | Предыдущую | Следующую страницу
Ультразвуковой прибор измерения толщины слоев.

Почему DB2 ругается на Create Trigger?

Я тут писал по поводу того, что у меня не pаботали тpиггеpы. Все дело оказалось в пpавиле написания команды "create trigger". Если все остальные команды коppектно воспpинимаются на любом pегистpе, то эта - только набpанная одними большими буквами.

Как создать новый запрос и скопировать туда точно такие же описания полей?

Копируешь FieldDefs.
Проходишь циклом по FieldDefs.Items[ i ].CreateField( Owner );

Как создать вычисляемые поля во время исполнения программы (Calculated fields at RunTime)?

Смотрите книгу "Developing Custom Delphi Components" от Рэя Конопки.

Здесь немного исправленный пример из этой книги -

function TMyClass.CreateCalcField( const AFieldName: string; AFieldClass: TFieldClass; ASize: Word ): TField;
begin
Result := FDataSet.FindField( AFieldName ); // Field may already exists!
if Result<>nil then Exit;
if AFieldClass = nil then
begin
DBErrorFmt( SUnknownFieldType, [AFieldName] );
end;
Result := FieldClass.Create( Owner );
with Result do
try
FieldName := AFieldName;
if ( Result is TStringField ) or ( Result is TBCDField ) or ( Result is TBlobField ) or ( Result is TBytesField ) or ( Result is TVarBytesField ) then
begin
Size := ASize;
end;
Calculated := True;
DataSet := FDataset;
Name := FDataSet.Name + AFieldName;
except
Free; // We must release allocated memory on error!
raise;
end;
end;

Alex Konshin
(2:5030/217.217)

Как заставить BDE сохранять в БД поле времени с сотыми долями секунды?

Если руками, то в BDE Administrator (BDE Configuration Utility).

Если при инсталляции твоей программы, то -
В пункте Make Registry Changes InstallShield'а создай ключ

HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\SYSTEM\FORMATS\TIME\MILSECONDS=TRUE

Alexey Yashin
(2:5020/62.31)

Как решать некоторые вопросы при подключении к Oracle?

DD> 1. Все поля (TField), опpеделенные в фоpмах, имеющие типы TDateField,
DD> TSmallIntField - пpи откpытии таблицы pугаются: Field "..." is not of
DD> expected type. Посмотpел - пpи пеpеопpеделении их под Oracle'ом они
Чтобы "увидеть" integer-поля нужно в настройке Alias'а Oracle в BDE установить Enable Integers -> True (и напрочь будет потерян Locate по этим якобы int/smallint полям). С датами, возможно, тоже надо разбираться через настройки Win & Oracle. У меня в Win дата формата "дд.мм.гггг", в Oracle NLS_LANG -> AMERICAN_AMERICA.CL8MSWIN1251 и с датами все гут.

DD> 2. Используя в SQL
DD> стpоки типа 'SELECT XX FROM YY WHERE XX="QQQ"' мы поступали
DD> непpавильно,
DD> т.к. двойные кавычки в Oracle обpабатывабтся не так, как в Btrieve.
Oracle в данном случае не причем. Это глюк BDE. Лечилось просто - вместо обрамления двойными кавычками строкового значения, нужно обрамлять его с помощью #39, примерно так

MySQLString := 'SELECT XX FROM YY WHERE XX='+#39+'QQQ'+#39;

Belsky Roman
(2:450/94.75)

-------------

SS> У кого-нибудь есть опыт по настройке BDE ? Откликнитесь плиз! При
SS> попытке соединиться с базой вылезает ошибка: Vendor failed init!
SS> Delphi запускаю под 95. Hа всякий случай пути к \BDE и ORAWIN\BIN я
SS> проставил! orant71.dll (родной или переименнованый ora72win.dll)
SS> закидывал куда угодно, но.... все равно вылетает ошибка BDE Error
SS> 15879 Vendor failed init :-(
Клиент у тебя NT, как я понял?

ora7x.dll - 32bit клиент для win95
orant7x.dll - 32bit клиент для NT
ora7xwin.dll - 16bit клиент для win
т.е. ora7xwin в Delphi3 вообще ставить бесполезно (16bit для 32bit appl). ora*71.dll у меня изначально к ORACLE 7.2 не коннектился - они там как-то резко сменили OCI. Правда потом ora72win.dll с Personal Oracle 7.3 работал, но все равно лучше, наверное, чтобы номер версии dll был не ниже версии сервера.

А вообще я 32bit дельфях в Vendor Init давно прописываю OCIW32.dll - он всегда для последней версии сервера с которым ты работаешь.

Это IMHO. Hо у меня Delphi3 и Delphi1 коннектятся как с Oracle 7.1 на Unix'е, так и с Personal Oracle 7.3

Alex Mironov
(2:5020/238.46)

Как в Oracle создать sequence с некоторого номера?

create sequence minvalue 10;

Как пересчитать все вычисляемые поля (Calculated fields) без переоткрытия TDataSet?

Resync( [rmExact, rmCenter] );

Как научить VCL делать Refresh для запросов правильно?

Старо как мир, и нет ничего военного:

procedure RefreshQuery( Query: TQuery; F: boolean );
var
B: TBookMark;
begin
with Query do
if Query.Active then
begin
B := GetBookMark;
try
Close;
Unprepare; {Если не поставить этого, то если используется select
SP, то иногда последующая операция вешает сервер.
Кто скажет почему?!}
Active:=True;
if F then
begin
try
GotoBookMark(B)
except
on EDatabaseError do First;
end
end
else First;
finally
FreeBookmark(B);
end;
end;
end;

Eugene Zhilkin
(2:461/88)

-------------

Уфф! Кажется, лyчше yже не сделать. :)

dbtables можно опционально пpопатчить (см. в конце), чтобы иметь такой вот pyлезный Detail query.

Update for dbtables.pas
New interface function DoRefreshQuery can Refresh TQuery component in master-detail scheme and alone.
TQuery.RefreshParams should be updated

function GetFieldNamesStr( DataSet: TDataSet ): String;
var
I: Integer;
begin
Result := '';
with DataSet do
for I := 0 to FieldCount - 1 do
begin
Result := Result + Fields[ I ].FieldName + ';';
end;
end;

procedure DoRefreshQuery( Query: TQuery; KeyFields: String; BookMarkSearch: Boolean);
var
Fields: TList;
KeyValues: Variant;
KeyNames: String;
Bmk: TBookmark;
I: Integer;
BookmarkFound: Boolean;
CanLocate: Boolean;
begin
Fields := TList.Create;
if KeyFields = '' then KeyFields := GetFieldNamesStr( Query );
try
Query.GetFieldList( Fields, KeyFields );
for I := Fields.Count - 1 downto 0 do
with TField( Fields[I] ) do
if Calculated or Lookup then Fields.Delete( I );
CanLocate := Fields.Count > 0;
if CanLocate then
begin
if Fields.Count = 1 then
KeyValues := TField(Fields[0]).Value
else
begin
KeyValues := VarArrayCreate( [0, Fields.Count - 1], varVariant );
KeyValues[0] := TField( Fields[0] ).Value;
end;
KeyNames := TField( Fields[0] ).FieldName;
for I := 1 to Fields.Count - 1 do
begin
KeyNames := KeyNames + ';' + TField( Fields[I] ).FieldName;
KeyValues[ I ] := TField( Fields[I] ).Value;
end;
end;
finally
Fields.Free;
end;
with Query do
begin
Bmk := nil;
DisableControls;
try
BookmarkFound := False;
if BookMarkSearch then
Bmk := GetBookmark;
Close;
Open;
if Assigned( Bmk ) then
try
GotoBookMark( Bmk );
BookmarkFound := True;
except
end;
if not BookmarkFound and CanLocate then
Locate( KeyNames, KeyValues, [] );
finally
EnableControls;
Screen.Cursor := crDefault;
FreeBookmark( Bmk );
end;
end;
end;

procedure TQuery.RefreshParams;
var
DataSet: TDataSet;
begin
DisableControls;
try
if FDataLink.DataSource <> nil then
begin
DataSet := FDataLink.DataSource.DataSet;
if DataSet <> nil then
if DataSet.Active and ( DataSet.State <> dsSetKey ) then
DoRefreshQuery( Self, GetFieldNamesStr( Self ), False );
end;
finally
EnableControls;
end;
end;

Vladimir Gaitanoff
vg@divo.ru
(2:5017/5.69)

Как настроить MS SQL Server 6.5 на корректную работу с числами и BDE при выполнении UPDATE?

Дело в том, что SQL Links на NT-ишном клиенте шлет на сеpвеp дату как 1-янв-97, что сеpвеp не пpиемлет. Совеpшенно случайно я нашел системный скpипт, котоpый подключает pусский и болгаpский языки.

выполни sp_configure и убедись, что у тебя default sortorder id==106 (rus case insens) или 105 (rus case sens). Если нет - пеpеставь сеpвеp.
найди в каталоге c:\mssql\install скpипт instlang.sql и запусти его.
либо pуками каждому пpоставь каждому логину, pаботающему с NT, язык pусский, либо поставь его как default language сеpвеpу. В этом случае 95-м клиентам пpидется pуками пpописать в логине язык us_english, иначе они пеpестанут pаботать.
Для установки russian как default надо выполнить скpипт:

exec sp_configure 'default language', 2
go
reconfigure
go

Vadim Shcolin
vadim@vsh.spb.su
(2:5030/87.91)

Как настроить Personal Oracle с русским языком на корректную работу с числами и BDE?

прописать в \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE параметр:
NLS_NUMERIC_CHARACTERS = '.,'

или
после соединения с ORACLE выполнить
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'

Aleksei Alekseenko
(2:5030/548.2)

Можно ли вызвать хранимую процедуру через TQuery, если она не возвращает курсора?

В случае MS SQL нужно написать:

Query1.Sql := 'declare @res' + #13#10 + 'exec MyFunc :Param1, :Param2, @res OUTPUT';
Query1.Open;
Result := Query1.FieldByName( 'Column1' ).Value;
Query1.Close;

Konstantin Suslov
(2:5020/300.16)

Как записать в BLOB-поле большой текст (>255 байт) из Delphi?

Можно так -
var
S: TBlobStream;
B: pointer;
c: integer;
...
Table1.Edit;
S := TBlobStream.Create( Table1BlobField as TBlobField, bmWrite ); {кажется, так}
C := S.Write(B, C);
Table1.Post;
S.Destroy;

или так -

var
S: TMemoryStream;
B: pointer;
C: integer;
...
S := TMemoryStream.Create;
...
Table1.Edit;
S.Clear;
S.SetSize(C);
C := S.Write(B,C);
( Table1BlobField as TBlobField ).LoadFromStream( S );
S.Clear;
Table1.Post;
...
S.Destroy;

Alexey Kats
(2:463/201.9)

Каким образом можно узнать где физически располагается локальная база данных, если известно имя Alias-а?

1. По таблице (фактически по Database) получить физическое местонахождение.

Примечание: Database можно создать явно, если нет, Дельфи сама его создаст, доступ к ней по Table(Query).Database

uses
DbiProcs;

function GetDirByDatabase( Database: TDatabase ): string;
var
pszDir: PChar;
begin
pszDir := StrAlloc( 255 );
try
DbiGetDirectory( Database.Handle, True, pszDir );
Result := StrPas( pszDir );
finally
StrDispose( pszDir );
end;
end;

2. По алиасу.

function GetPhNameByAlias( sAlias: string ): string;
var
Database: TDatabase;
pszDir: PChar;
begin
Database := TDatabase.Create( nil ); {allocate memory}
pszDir := StrAlloc( 255 );
try
Database.AliasName := sAlias;
Database.DatabaseName := 'TEMP'; {requires a name -- is ignored}
Database.Connected := True; {connect without opening any table}
DbiGetDirectory( Database.Handle, True, pszDir ); {get the dir.}
Database.Connected := False; {disconnect}
Result := StrPas( pszDir ); {convert to a string}
finally
Database.Free; {free memory}
StrDispose( pszDir );
end;
end;

Pavel Kulchenko
(2:465/66)

Подскажите, как упаковать базу (dBase, Paradox) во время исполнения программы (runtime)?

Для dBase:

uses
DbiProcs;

with Table do
begin
OldState := Active;
Close;
Exclusive := True;
Open;

DbiPackTable( DBHandle, Handle, nil, nil, True );
{^ здесь можно добавить check()}

Close;
Exclusive := False;
Active := OldState;
{ при желании можно сохранить закладку }
end;


Pavel Kulchenko

(2:465/66)

--------------------------------------------------------------------------------

Пpимеp для Paradox:

Uses BDE; // for D3, для D2 не помню (что-то типа DbiProcs и еще что-то)

// для пpимеpа
tLog : TTable; // таблица, юзающая d:\db\log.db

var
TblDesc: CRTblDesc;
rslt: DBIResult;
Dir: String; //имеется в виду huge string т.е. {$H+}
hDb: hDbiDb;

begin
tLog.Active := False; //деактивиpуем TTable

SetLength( Dir, dbiMaxNameLen + 1 );
DbiGetDirectory( tLog.DBHandle, False, PChar( Dir ) );
SetLength( Dir, StrLen( PChar( Dir ) ) );

DbiOpenDatabase( nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb );

DbiSetDirectory( hDb, PChar( Dir ) );

FillChar( TblDesc, sizeof( CRTblDesc ), 0 );
StrPCopy( TblDesc.szTblName, 'd:\db\log.db' );
// здесь должно быть полное имя файла
//котоpое можно: а) ввести pуками;
//б) вытащить из пpопеpтей таблицы;
//в) вытащить из алиаса;
//г) см. FAQ
StrCopy( TblDesc.szTblType, szParadox );
//BTW тут может и szDBase стоять

TblDesc.bPack := TRUE;

DbiDoRestructure( hDb, 1, @TblDesc, nil, nil, nil, False );
DbiCloseDatabase(hDb);

end;

// можно еще чеки ввести, но облом :-)

Robert Gluvchinskiy
(2:463/102.108)


Материалы находятся на сайте http://cracklab.narod.ru/faq/


Создатель этого HTML файла не претендует на авторство вопросов/ответов представленных в нём, не отвечает за их содержание и достоверность, а также за последствия использования программных кодов , полученных из этого HTML файла. Также не принимаются претензии относительно не размещённой информации об авторе каждого конкретного FAQ'а. Любые другие вопросы присылайте на bad_guy@cracklab.ru (обращаться к Bad_guy'ю).
Hosted by uCoz