Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 10 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Существует ли средство для вывода определения структуры таблицы?

Я создал таблицу и хочу получить её структуру, чтобы сделать изменённый оператор создания таблицы.

Для этого существует утилита DB2LOOK. Она находится в SQLLIB\MISC.

Пример использования:

CONNECT TO SAMPLE USER xxx USING yyy
DB2LOOK -d SAMPLE -u xxx -e -t employee

Вывод может быть перенаправлен в файл.

Полный синтаксис выдаётся по команде:

DB2LOOK ?

Vadim Rumyantsev
(2:5030/48.400)



Поясните, чем в Oracle являются понятия Instance, Database etc.?

Перевод документации:

Что такое ORACLE Database?
Это данные которые будут обрабатываться как единое целое. Database состоит из файлов операционной системы. Физически существуют database files и redo log files. Логически database files содержат словари, таблицы пользователей и redo log файлы. Дополнительно database требует одну или более копий control file.
Что такое ORACLE Instance?
ORACLE Instance обеспечивает программные механизмы доступа и управления database. Instance может быть запущен независимо от любой database (без монтирования или открытия любой database). Один instance может открыть только одну database. В то время как одна database может быть открыта несколькими Instance.

Instance состоит из:
SGA (System Global Area), которая обеспечивает коммуникацию между процессами;
до пяти (в последних версиях больше) бэкграундовых процессов.
От себя добавлю - database включает в себя tablespace, tablespace включает в себя segments (в одном файле данных может быть один или несколько сегментов, сегменты не могут быть разделены на несколько файлов). segments включают в себя extents.

Alex Kravets
(2:5020/904.12)



Почему при создании таблицы Paradox с первичным нечувствительным к регистру индексом вываливается ошибка?

В Парадоксе первичный индекс всегда CaseSensitive.



Как засунуть в качестве паpаметpа хpанимой пpоцедуpы стpоку длиной более 255 символов?

"Засунуть" длинную строку можно было и раньше, если написать редактируемый запрос, и воспользоваться операциями Insert/Edit.

Однако это не относится к хранимым процедурам.

В Delphi 3.0 появился новый тип параметра (TBlobField вроде) и соответственно его поддержка в BDE.

Если просто взять BDE 4.01 и выше, то работать все-равно не будет - нужна соотв. версия VCL (из Delphi 3.0 или выше).

Dmitry Kuzmenko

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

Т.е. - переходите на Delphi 3.02 или выше, или используйте альтернативные способы - типа представлений, обновляемых с помощью триггеров.



Как работать из Delphi напрямую с MS ADO (Microsoft Active Data Objects)?

Итак, хочу поделиться некоторыми достижениями... так на всякий случай. Если у вас вдруг потребуется сделать в своей программке доступ к базе данных, а BDE использовать будет неохота (или невозможно) - то есть довольно приятный вариант: использовать ActiveX Data Objects. Однако с их использованием есть некоторые проблемы, и одна из них это как передавать Optional параметры, которые вроде как можно не указывать. Однако, если вы работаете с ADO по-человечески, а не через тормозной IDispatch.Invoke то это превращается в головную боль. Вот как от нее избавляться:

var
OptionalParam: OleVariant;
VarData: PVarData;
begin
OptionalParam := DISP_E_PARAMNOTFOUND;
VarData := @OptionalParam;
VarData^.VType := varError;

после этого переменную OptionalParam можно передавать вместо неиспользуемого аргумента.

Далее, самый приятный способ получения Result sets:

Там есть масса вариантов, но как выяснилось оптимальным является следующий вариант, который позволяет получить любой желаемый вид курсора (как клиентский, так и серверный)

var
MyConn: _Connection;
MyComm: _Command;
MyRecSet: _Recordset;
prm1: _Parameter;
begin
MyConn := CoConnection.Create;
MyConn.ConnectionString := 'DSN=pubs;uid=sa;pwd=;';
MyConn.Open( '', '', '', -1 );
MyCommand := CoCommand.Create;
MyCommand.ActiveConnection := MyConn;
MyCommand.CommandText := 'SELECT * FROM blahblah WHERE BlahID=?'
Prm1 := MyCommand.CreateParameter( 'Id', adInteger.adParamInput, -1, <value> );
MyCommand.AppendParameter( Prm1 );
MyRecSet := CoRecordSet.Create;
MyRecSet.Open( MyCommand, OptionalParam, adOpenDynamic, adLockReadOnly, adCmdText );

... теперь можно фетчить записи. Работает шустро и классно. Меня радует. Особенно радуют серверные курсоры.

Проверялось на Delphi 3.02 + ADO 1.5 + MS SQL 6.5 sp4. Пашет как зверь.

Из вкусностей ADO - их легко можно использовать во всяких многопоточных приложениях, где BDE порой сбоит, если, конечно, ODBC драйвер грамотно сделан...

Ну и еще можно использовать для доступа к данным всяких там "нестандартных" баз типа MS Index Server или MS Active Directory Services.

Alexey Kopernick
(2:5020/221)

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

В Delphi (как минимум в 4 версии) существует "константа" EmptyParam, которую можно подставлять в качестве пустого параметра.



После снесения через родной uninstall Interbase Server 5.0 для Windows и желания поставить 5.1.1 вылетает ошибка: IBCheck. Что делать?

Решение найдено. Прочитай сам и передай товарищу:

Надо запустить regedit, и открыть ключ

HKEY_LOCAL_MACHINE\Environment

Там есть строка PATH. Так вот иногда она почему-то становится не строкой, а еще чем-то. Ее надо убить, и пересоздать как строку, прописав туда прежнее содержимое (в виде строки).

Dmitry Kuzmenko



Как узнать текущие дату и время в Interbase?

Дата + время - DATE.

Только дата - TODAY.

Только время - DATE-TODAY.

Сяржук Казачэнка



Ошибка BDE при ApplyUpdates.

Использyй ноpмальнyю тpансляцию ошибок в Application.OnException.

Вpоде это.

procedure DBExceptionTranslate(E: EDBEngineError);

function OriginalMessage: String;
var
I: Integer;
DBErr: TDBError;
S: String;
begin
Result := '';
for I := 0 to E.ErrorCount - 1 do
begin
DBErr := E.Errors[I];
case DBErr.NativeError of
-836: { Intebase exception }
begin
S := DBErr.Message;
Result := #13#10 + Copy(S, Pos(#10, S) + 1, Length(S));
Exit;
end;
end;
S := Trim(DBErr.Message);
if S <> '' then Result := Result + #13#10 + S;
end;
end;

begin
case E.Errors[0].ErrorCode of
$2204:
E.Message := LoadStr(SKeyDeleted);
$271E,$2734:
E.Message := LoadStr(SInvalidUserName);
$2815:
E.Message := LoadStr(SDeadlock);
$2601:
E.Message := LoadStr(SKeyViol);
$2604:
E.Message := LoadStr(SFKViolation) + OriginalMessage;
else
begin
E.Message := Format(LoadStr(SErrorCodeFmt), [E.Errors[0].ErrorCode]) +
OriginalMessage;
end;
end;
end;

Vladimir Gaitanoff
(2:5017/5.69)



Как открыть индексированную таблицу dBase, если отсутствует файл индекса?

Для dBase-таблицы встроенными средствами ты не перестроишь индекс, если его нет. Для этой цели мне пришлось написать процедуру для физического удаления признака индексации в самом dbf-файле и после её применения добавлять индексы заново.

Для этого в заголовок файла dbf по смещению 28(dec) записываешь 0.

По другому никак не выходит(я долго бился)- вот для Paradox таблиц все Ok.

Олег
oleg@avia.cmw.ru

-----------

С помощью BDE Callbacks. Пpимеp для Delphi 2.0, на пеpвом не пpовеpял:

=== Callback.pas ===
unit Callback;

interface

uses BDE, Classes, Forms, DB, DBTables;

type
TForm1 = class(TForm)
Table1: TTable;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
CBack: TBDECallback; // опpеделение BDE CallBack
CBBuf: CBInputDesc; // пpосто буфеp
function CBFunc(CBInfo: Pointer): CBRType; // Callback-функция
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Session.Open; // В это вpемя сессия ещё не откpыта
CBack := TBDECallback.Create( Session {Hапpимеp}, nil, cbINPUTREQ, @CBRegBuf,
SizeOf(CBBuf), CBFunc, False); // Опpеделили Callback
Table1.Open;
//^^^^^^^^^^^ - здесь возможна ошибка с индексом, etc.
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
CBack.Free; // Освобождаем CallBack
end;

function TForm1.CBFunc(CBInfo: Pointer): CBRType;
begin
with PCBInputDesc(CBInfo)^ do
case eCbInputId of
cbiMDXMissing {, cbiDBTMissing - можно ещё и очищать BLOB-поля}:
begin
iSelection := 3; // Hомеp ваpианта ответа (1-й - откpыть только
// для чтения, 2-й - не откpывать, 3-й - отсоединить индекс).
// Возможный источник непpиятностей: а вдpуг в последующих веpсиях
// BDE номеpа будут дpугими?
Result := cbrCHKINPUT; // Обpабатывать введённый ответ
end;
end;
end;

end.
=== Callback.pas ===

PS: конечно, это лишь пpимеp, делающий минимум необходимого. В pамках данного письма невозможно дать какое-то описание BDE Callbacks. Инфоpмацию я взял из BDE32.HLP, BDE.INT и DB.PAS. В VCL.HLP совсем ничего нет по этому поводу.

Вообще, pуки бы отоpвал тем, кто писал спpавку по Дельфям: я неделю мучался с сабжем, пока случайно не набpёл на Callbacks.

Denis Zaytsev
(2:5011/49.6)



Как указать FreeIBComponents использовать раскладку Win1251?

Добавить в строки коннекта FIBDatabase строку -

lc_ctype=WIN1251

Hапример так:

DataModule1.FIBatabase.DBParams.Add( 'lc_ctype=WIN1251' );

p.s. Разумеется, до вызова FIBDatabase.Connected := True;

Dmitry Kuzmenko, Epsylon Technologies.

TechSupport Manager. Delphi, InterBase and PowerDesigner support.



Как скомпилиpовать UDF для Interbase под Linux RH 4.0?

Пример -

#!/bin/sh
gcc -c -O -fpic udflib.c
ld -o libudf.so -shared udflib.o
cp libudf.so /usr/interbase/lib/
ldconfig -v >>/dev/null

Yura Tsaplay



Как гарантированно сделать backup/restore БД InterBase?

Att.bat:

at 01:00 /INTERACTIVE "e:\IB_DATA\BR.BAT"
BR.bat:

del e:\IB_DATA\b.txt
del e:\IB_DATA\r.txt
del e:\ib_data\AR_IB.PRV
del e:\IB_DATA\AR_IB.GBK
d:\ib_42\bin\gfix -shut -force 1 e:\ib_data\AR_IB.GDB -user "SYSDBA" -password "oooo"
net stop "InterBase Server"
copy e:\ib_data\AR_IB.GDB e:\ib_data\AR_IB.PRV
net start "InterBase Server"
d:\ib_42\bin\gbak e:\ib_data\AR_IB.GDB e:\ib_data\AR_IB.GBK -user "SYSDBA" -password "oooo" -B -L -Y "e:\IB_DATA\b.txt"
d:\ib_42\bin\gbak e:\ib_data\AR_IB.GBK e:\ib_data\AR_IB.GDB -user "SYSDBA" -password "oooo" -P 4096 -V -R -Y "e:\IB_DATA\r.txt"

Sergey Klochkovski
2:5080/60.3



Как удобнее работать с динамически формируемыми запросами?

В процессе работы с БД иногда необходимо выполнить какие-то мелкие запросы.

Держать для этого где-то временную Query меня лично ломает, посему ловите творение (под Delphi) -

модуль для создания временных TQuery и работы с ними.

примеры использования:

var S:string;
...
S := FastLookUp( format( 'select A.F1 from A,B where A.F4=B.F4 and B.F9=%d', [1] ) );

with GiveMeResultSet( 'select*from A where F1="777"' ) do
try
....
finally
Free; {не забудьте!}
end;

.....
if NOT ExecuteSQL( 'delete from A' ) then ShowMessage( 'Something Wrong' );
.....

Сам модуль идёт ниже -

{
Temporary Queries Creatin' and handlin'

(c) 1997-98 by Volok Alexander (D1/D2)

creation date: 30.10.1997
last update : 17.06.1998
}
unit TmpQuery;

interface

uses
DBTables;

const
InternalDBname = 'MAIN'; {Изменять по вкусу - TDataBase.DataBaseName}

type
TSQLScript = {$IFDEF WIN32} string {$ELSE} PChar {$ENDIF};

{Создаст куери с текстом запроса, но не откроет его}
function CreateTempQuery(SQLscript: TSQLscript): TQuery;

{Создаст куери и откроет запрос - не забудьте прибить}
function GiveMeResultSET(SQLscript: TSQLscript): TQuery;

{Проверит непустоту выборки, заданной ...}
function CheckExistence(SQLscript: TSQLscript): boolean;

{Вытащит аж одно значение(лукап) из выборки, заданной ...}
function FastLookUP(SQLscript: TSQLscript): string;

{Выполнит запрос и сообщит результат}
function ExecuteSQL(SQLscript: TSQLscript): boolean;

implementation

uses
Forms;

function CreateTempQuery(SQLscript: TSQLscript): TQuery;
begin
Result:= TQuery.Create(Application);
with Result do
begin
DatabaseName := InternalDBname;
{$IFDEF WIN32}
SQL.Text := SQLscript;
{$ELSE}
SQL.SetText(SQLscript);
{$ENDIF}
end;
end;

function ExecuteSQL(SQLscript: TSQLscript): boolean;
begin
with CreateTempQuery(SQLscript) do
begin
try
ExecSQL;
Result := True;
except
Result := False;
end;
Free;
end;
end;

function CheckExistence(SQLscript: TSQLscript): boolean;
begin
with GiveMeResultSET(SQLscript) do
begin
Result := NOT EOF;
Free;
end;
end;

function GiveMeResultSET(SQLscript: TSQLscript): TQuery;
begin
Result := CreateTempQuery(SQLscript);
with Result do
try
Open;
except
Free;
Result:= NIL;
end;
end;

function FastLookUP(SQLscript: TSQLscript): string;
begin
with GiveMeResultSET(SQLscript) do
begin
try
Result:= Fields[0].AsString;
except
Result:= '';
end;
Free;
end;
end;

end.

Alexander Volok
2:464/130.14

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

Что-то удобное есть в rxLib, как мне помнится.



Как заставить DBGrid сортировать данные по щелчку на заголовке столбца?

Кyсочек кода, чтобы повесить на clickable столбец RxGrid, показывающий RxQuery с опpеделенным макpосом %Order.

Работать не бyдет (без модyлей), но в качестве идеи может быть полезен.

unit vgRXutil;

interface

uses
SysUtils, Classes, DB, DBTables, rxLookup, RxQuery;

{ TrxDBLookup }
procedure RefreshRXLookup(Lookup: TrxLookupControl);
procedure RefreshRXLookupLookupSource(Lookup: TrxLookupControl);

function RxLookupValueInteger(Lookup: TrxLookupControl): Integer;

{ TRxQuery }

{ Applicatable to SQL's without SELECT * syntax }

{ Inserts FieldName into first position in '%Order' macro and refreshes query }
procedure HandleOrderMacro(Query: TRxQuery; Field: TField);

{ Sets '%Order' macro, if defined, and refreshes query }
procedure InsertOrderBy(Query: TRxQuery; NewOrder: String);

{ Converts list of order fields if defined and refreshes query }
procedure UpdateOrderFields(Query: TQuery; OrderFields: TStrings);

implementation
uses
vgUtils, vgDBUtl, vgBDEUtl;

{ TrxDBLookup refresh }

type
TRXLookupControlHack = class(TrxLookupControl)
property DataSource;
property LookupSource;
property Value;
property EmptyValue;
end;

procedure RefreshRXLookup(Lookup: TrxLookupControl);
var
SaveField: String;
begin
with TRXLookupControlHack(Lookup) do
begin
SaveField := DataField;
DataField := '';
DataField := SaveField;
end;
end;

procedure RefreshRXLookupLookupSource(Lookup: TrxLookupControl);
var
SaveField: String;
begin
with TRXLookupControlHack(Lookup) do
begin
SaveField := LookupDisplay;
LookupDisplay := '';
LookupDisplay := SaveField;
end;
end;

function RxLookupValueInteger(Lookup: TrxLookupControl): Integer;
begin
with TRXLookupControlHack(Lookup) do
try
if Value <> EmptyValue then
Result := StrToInt(Value) else
Result := 0;
except
Result := 0;
end;
end;

procedure InsertOrderBy(Query: TRxQuery; NewOrder: String);
var
Param: TParam;
OldActive: Boolean;
OldOrder: String;
Bmk: TPKBookMark;
begin
Param := FindParam(Query.Macros, 'Order');
if not Assigned(Param) then Exit;

OldOrder := Param.AsString;

if OldOrder <> NewOrder then
begin
OldActive := Query.Active;
if OldActive then Bmk := GetPKBookmark(Query, '');
try
Query.Close;
Param.AsString := NewOrder;
try
Query.Prepare;
except
Param.AsString := OldOrder;
end;
Query.Active := OldActive;
if OldActive then SetToPKBookMark(Query, Bmk);
finally
if OldActive then FreePKBookmark(Bmk);
end;
end;
end;

procedure UpdateOrderFields(Query: TQuery; OrderFields: TStrings);
var
NewOrderFields: TStrings;

procedure AddOrderField(S: String);
begin
if NewOrderFields.IndexOf(S) < 0 then
NewOrderFields.Add(S);
end;

var
I, J: Integer;
Field: TField;
FieldDef: TFieldDef;
S: String;
begin
NewOrderFields := TStringList.Create;
with Query do
try
for I := 0 to OrderFields.Count - 1 do
begin
S := OrderFields[I];
Field := FindField(S);
if Assigned(Field) and (Field.FieldNo > 0) then
AddOrderField(IntToStr(Field.FieldNo))
else
try
J := StrToInt(S);
if J < FieldDefs.Count then
AddOrderField(IntToStr(J));
except
end;
end;
OrderFields.Assign(NewOrderFields);
finally
NewOrderFields.Free;
end;
end;

procedure HandleOrderMacro(Query: TRxQuery; Field: TField);
var
Param: TParam;
Tmp, OldOrder, NewOrder: String;
I: Integer;
C: Char;
TmpField: TField;
OrderFields: TStrings;
begin
Param := FindParam(Query.Macros, 'Order');
if not Assigned(Param) or Field.Calculated or Field.Lookup then Exit;
OldOrder := Param.AsString;
I := 0;
Tmp := '';
OrderFields := TStringList.Create;
try
OrderFields.Add(Field.FieldName);
while I < Length(OldOrder) do
begin
Inc(I);
C := OldOrder[I];
if C in FieldNameChars then
Tmp := Tmp + C;

if (not (C in FieldNameChars) or (I = Length(OldOrder))) and (Tmp <> '') then
begin
TmpField := Field.DataSet.FindField(Tmp);
if OrderFields.IndexOf(Tmp) < 0 then
OrderFields.Add(Tmp);
Tmp := '';
end;
end;

UpdateOrderFields(Query, OrderFields);
NewOrder := OrderFields[0];
for I := 1 to OrderFields.Count - 1 do
NewOrder := NewOrder + ', ' + OrderFields[1];
finally
OrderFields.Free;
end;
InsertOrderBy(Query, NewOrder);
end;

end.

Vladimir Gaitanoff
(2:5017/5.69)



После analyze_schema приличное количество запросов начинают тормозить. Как лечить?

Это у всех так или у воркгрупп 7.3.2 под HТ только?
Пока полечил удалением статистики. Хинтить не предлагайте, запросы генерит crystal report, а он очень трепетно относится к редактированию sql-предложения в некоторых местах...

А ты метод оптимизатора по дефолту переключи в RULE.

Это можно сделать разными способами :

1. ALTER SESSION SET OPTIMIZER_GOAL = ... (это только для данной сессии)

2. При старте инстанса поправить параметр OPTIMIZER_MODE (это для всех сессий)

Anatoly Kuznetsov
2:5015/75.1



Исключения в PL/SQL процедуре (Oracle7 WG Server). Почему не получается?

SB> Пишу следующий блок:
BEGIN
INSERT INTO CUSTOM.CAMAIN20
SELECT * FROM CUSTOM.CAMAIN20TEMP
WHERE CC_07_01=curCC_07_01 AND CC_07_02=curCC_07_02 AND CC_07_03=curCC_07_03;
EXCEPTION
WHEN others THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('ВВОД ДУБЛЯ В CUSTOM.CAMAIN20');
NULL;
END;
END;
SB> Думал, что при нарушении первичного ключа в таблице CUSTOM.CAMAIN20
SB> обработчик EXCEPTION WHEN others THEN ... ; пропустит строку и программа
SB> пойдет выполняться дальше.Программа же вылетает с сообщением :
Так - это сделать не получится. Hо можно сделать по другому.

Объявить выборку SELECT * FROM CUSTOM.CAMAIN20TEMP WHERE CC_07_01=curCC_07_01 AND CC_07_02=curCC_07_02 AND CC_07_03=curCC_07_03 курсором, а потом примерно так:

loop
fetch_cursor;
выход когда фетчить больше нечего;
begin
INSERT INTO CUSTOM.CAMAIN20 чего нафетчили;
EXCEPTION
WHEN others THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('ВВОД ДУБЛЯ В CUSTOM.CAMAIN20');
END
end
end loop;

Dmitry Voronenkov
2:5005/56



Я так и не смог заставить выводить текст из базы данных.

Эта функция используется действительно только для отладки.Для того, чтобы результаты ее работы были видны из SQL Plus, необходимо в нем выдать команду:

set serveroutput on size 10000;



Почему не всегда верно обновляются IndexDefs по Update?

Ошибка в VCL.

А помогает добавление fUpdated:=false; в теле процедуры TIndexDefs.Update.

Или убиением владельца через Free, и пересозданием.

Edward Shigapov
2:5051/22.8



Как заставить работать BDE с русским текстом в кодировке?

Здесь будет описана методика превращения набора символов BDE 5.01, скажем, dBase 868, в набор символов ISO 8859-5.

Методика такая:

Открываем charset.cvb любым hex editor-ом;
Ищем строку "868";
Находится строка "BTCVD4868" - именно то, что надо;
Прокручиваемся вниз. Сначала будет много $FF, потом пойдет весь набор символов разделенный нолями: 00 00 01 00 02 00 03 00 и т. д.;
Это таблица перекодировки ANSI -> OEM для 868 кодовой страницы;
После 7E 00 7F 00 пропускаем 96 байт (2 байта на символ, буквы в ISO начинаются с $B0, $B0 - $80 = $30, $30 * 2 = $60, $60 = 96);
Запоминаем это смещение (у меня оно $ED72h);
Ищем строку "866". Находим "BTCVD2866";
Прокручиваемся вниз, пропускаем $FF, находим набор символов, как в п.4;
Находим последовательность 7E 00 7F 00;
Отмечаем дальнейшую последовательность от 10 04 11 04 12 04 до 3D 04 3E 04 3F 04;
Копируем ее на смещение из п.7;
Повторяем п.4;
Прокручиваемся дальше, за таблицу ANSI -> OEM, там опять будет много $FF, после них будет обратная таблица перекодировки OEM -> ANSI, такая же, как и в п.4;
Ищем последовательность 7E 00 7F 00, пропускаем после нее $150 байт (установлено методом научного тыка), начиная с этого смещения (у меня $F486) заносим байты B0 00 B1 00 B2 00 .... ED 00 EE 00 EF 00;
Все. Далее указываем dBase BUL 868 для langdriver-а BDE-шного алиаса.
При открытии таблицы с этого алиаса она будет перекодироваться OEM (то есть ISO) <-> ANSI.

Konstantin Popenko
2:5040/31.13



Нужна функция на SQL, возвращающая представление числа прописью.

PRAGMA RESTRICT_REFERENCES (number2word,WNDS, WNPS, RNDS, RNPS);

/**********************************************/
/* функция сумма прописью в рублях и копейках */
/**********************************************/
FUNCTION number2word (source IN NUMBER) RETURN varchar2 is
result VARCHAR2(300);
BEGIN
-- k - копейки
result := ltrim(to_char( source,
'9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')) || 'k';
-- t - тысячи; m - милионы; M - миллиарды;
result := replace( result, ',,,,,,', 'eM');
result := replace( result, ',,,,,', 'em');
result := replace( result, ',,,,', 'et');
-- e - единицы; d - десятки; c - сотни;
result := replace( result, ',,,', 'e');
result := replace( result, ',,', 'd');
result := replace( result, ',', 'c');
--
result := replace( result, '0c0d0et', '');
result := replace( result, '0c0d0em', '');
result := replace( result, '0c0d0eM', '');
--
result := replace( result, '0c', '');
result := replace( result, '1c', 'сто ');
result := replace( result, '2c', 'двести ');
result := replace( result, '3c', 'триста ');
result := replace( result, '4c', 'четыреста ');
result := replace( result, '5c', 'пятьсот ');
result := replace( result, '6c', 'шестьсот ');
result := replace( result, '7c', 'семьсот ');
result := replace( result, '8c', 'восемьсот ');
result := replace( result, '9c', 'девятьсот ');
--
result := replace( result, '1d0e', 'десять ');
result := replace( result, '1d1e', 'одиннадцать ');
result := replace( result, '1d2e', 'двенадцать ');
result := replace( result, '1d3e', 'тринадцать ');
result := replace( result, '1d4e', 'четырнадцать ');
result := replace( result, '1d5e', 'пятнадцать ');
result := replace( result, '1d6e', 'шестнадцать ');
result := replace( result, '1d7e', 'семьнадцать ');
result := replace( result, '1d8e', 'восемнадцать ');
result := replace( result, '1d9e', 'девятнадцать ');
--
result := replace( result, '0d', '');
result := replace( result, '2d', 'двадцать ');
result := replace( result, '3d', 'тридцать ');
result := replace( result, '4d', 'сорок ');
result := replace( result, '5d', 'пятьдесят ');
result := replace( result, '6d', 'шестьдесят ');
result := replace( result, '7d', 'семьдесят ');
result := replace( result, '8d', 'восемьдесят ');
result := replace( result, '9d', 'девяносто ');
--
result := replace( result, '0e', '');
result := replace( result, '5e', 'пять ');
result := replace( result, '6e', 'шесть ');
result := replace( result, '7e', 'семь ');
result := replace( result, '8e', 'восемь ');
result := replace( result, '9e', 'девять ');
--
result := replace( result, '1e.', 'один рубль ');
result := replace( result, '2e.', 'два рубля ');
result := replace( result, '3e.', 'три рубля ');
result := replace( result, '4e.', 'четыре рубля ');
result := replace( result, '1et', 'одна тысяча ');
result := replace( result, '2et', 'две тысячи ');
result := replace( result, '3et', 'три тысячи ');
result := replace( result, '4et', 'четыре тысячи ');
result := replace( result, '1em', 'один миллион ');
result := replace( result, '2em', 'два миллиона ');
result := replace( result, '3em', 'три миллиона ');
result := replace( result, '4em', 'четыре миллиона ');
result := replace( result, '1eM', 'один милиард ');
result := replace( result, '2eM', 'два милиарда ');
result := replace( result, '3eM', 'три милиарда ');
result := replace( result, '4eM', 'четыре милиарда ');
--
result := replace( result, '11k', '11 копеек');
result := replace( result, '12k', '12 копеек');
result := replace( result, '13k', '13 копеек');
result := replace( result, '14k', '14 копеек');
result := replace( result, '1k', '1 копейка');
result := replace( result, '2k', '2 копейки');
result := replace( result, '3k', '3 копейки');
result := replace( result, '4k', '4 копейки');
--

if not (substr(result,1,1)='.') then
result := replace( result, '.', ' рублeй ');
else
result := replace( result, '.', 'ноль рублeй ');
end if;
result := replace( result, 't', 'тысяч ');
result := replace( result, 'm', 'миллионов ');
result := replace( result, 'M', 'милиардов ');
result := replace( result, 'k', ' копeeк');
--
RETURN(result);
END number2word;



Как грузить DBF-файлы с помощью SQL*Loader?

Можно использовать ctl-файл такого вида:

LOAD DATA
infile "COUNT_VD.DBF" " DB3 16 "
append
into table AIS_AUDIT.T21AU_GAL
TRAILING NULLCOLS
(
M_REG "19",
REGION POSITION(2:6) INTEGER EXTERNAL,
ENT_TYPE POSITION(7:7) INTEGER EXTERNAL,
KD POSITION(8:12) CHAR,
N_PLAT POSITION(13:16) INTEGER EXTERNAL
)
При загрузке файлов с кодировкой DOS(866) LOAD DATA лучше заменить на LOAD DATA characterset ru8pc866.

Размерности полей соответствуют размерностям в .DBF-файле.

Hо ctl-файл такого вида понимают только loader'ы под виндами. Если попробуешь использовать этот ctl-файл для Unix (проверено для Dynix), получишь на выходе ругань.

В Oracle 8.0.5 и более поздних редакциях такая конструкция больше не работает.

Решение для Oracle 8.0.5: ставить клиента от Oracle 7.3.4, ставить оракловские утилиты от Oracle 7.3.4. Клиент Oracle 7.3.4 с сервером Oracle 8.0.5 работает. Sqlldr73 - тоже.

На сайте http://oraclub.trecom.tomsk.su Вы найдёте также утилиту db3load, которая готовит CTL-болванки и скрипты для оракловской таблицы.

Владимир Белов (Vladimir Belov)



Как создать окно произвольной формы? Как перетаскивать окно за любое место?

Воспользоваться компонентой mlRegionForm из набора MediaLib, sohoRegionForm из набора SohoLib.



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

Воспользоваться компонентами RxTrayIcon из набора RxLib,
StTrayIcon из набора SysTools
LMDTrayIcon из набора LMDTools
или другими, в которых есть слово Tray.
(Я встречал порядка десятка в различных наборах или отдельно).



Как запустить внешнюю программу?

Воспользоваться компонентами xProcExec из набора xTools-Nails,
LMDStarter из набора LMDTools,
ExecuteProcess.



Как узнать, что программа уже запущена?

Воспользоваться функцией AlreadyRunning из набора sohoLib,
компонентом XJustOne.



Как просмотреть версию (и другие параметры) исполняемого файла?

Воспользоваться компонентами StVersionInfo из набора SysTools.
LMDStVersionInfo из набора LMDTools.
Воспользоваться классом TVersionInfo из набора RxLib.



Чем залить фон формы?

Воспользоваться компонентой sohoBackground из набора SohoLib.



Как вычислить CRC?

Воспользоваться компонентой xCRCCalc из набора xTools-Nails.



Как создать бегущую вверх строку (самоскролирующее Memo)?

Воспользоваться компонентой xCredit из набора xTools-Nails,
Titler из набора vgLib,
SecretPanel из набора RxLib,



Как зашифровать файл?

Воспользоваться компонентой xCrypt из набора xTools-Nails,
компонентой CopyCrypt,
набором Delphi Encryption Compedium,
библиотекой AMNSoft Crypt Library.



Как скопировать файл?

Воспользоваться компонентой xFileCopy из набора xTools-Nails.
Позволяет копировать определенный размер.
А чтобы процесс был визуальным, как в Windows?
Воспользоваться компонентой StFileOperation из набора SysTools.



Как в приложении отлавливать нажатия на какую-то кнопку?

Воспользоваться компонентой xSecurityKey из набора xTools-Nails.



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

Воспользоваться компонентой xNumberConvert из набора xTools-Nails.
Единственный хороший компонент из этого набора. Позволяет переводить
числа из любой системы, в том числе можно задать свою собственную.



Как задать параметры печати?

Воспользоваться компонентой xPrintOut из набора xTools-Nails.



Как работать с регистром?

Воспользоваться компонентой xRegistry из набора xTools-Nails.



Как запомнить параметры формы(Размер,Положение,Цвет)?

Воспользоваться компонентой xRemember из набора xTools-Nails,
компонентой FormStorage из набора rxLib,
компонентой sohoFormStorage из набора sohoLib,



Как написать число прописью?

Воспользоваться компонентой MoneyString из набора vgLib,
функцией Real2Name из набора sohoLib,



Как отредактировать меню в run-time?

Воспользоваться компонентой sohoMenuCaptionEditor из набора sohoLib.



Как вычислить какой день недели был в данный день?

Воспользоваться компонентой xDateCalc из набора xTools-Nails.



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

Воспользоваться компонентой xTimeCalc из набора xTools-Nails
или функцией DateDiff из набора RxLib.
Может вычислить сколько месяцев, дней, часов, минут, секунд
прошло между определенными участками времени.



Как отсортировать строки в TStrings?

Воспользоваться компонентой xStrList из набора xTools-Nails.
С возможностью сортировки, реакции на дубликаты.



Как написать свой ScreenSaver?

Воспользоваться компонентой xScreenSaver из набора xTools-Nails.
Воспользоваться компонентой mmScreenSaver из набора Multimedia Tools.
Воспользоваться компонентой LMDScreenSaver из набора LMDTools.



Как написать ComboBox для изменения временных зон как в Windows 9х?

Воспользоваться компонентой xTimeZone из набора xTools-Nails.



Как проиграть звуковой файл?

Wave - компоненты
MediaPlayer - со странички System,
mlWavePlayer из набора MediaLib,
hgWavePlayer из набора HighGear,
LMDWaveComp из набора LMD Tools,
sohoSound из набора sohoLib,
Mpeg - компоненты
AudioPlayer из набора MediaLib,



Как сделать, чтобы можно было переходить между компонентами по кнопочке

Enter, а не Tab?
Воспользоваться компонентой sohoEnterTab из набора SohoLib.



Как изменять размеры визуальных компонент в run-time?

Воспользоваться компонентой sohoFormEditor из набора SohoLib.



Хочу красивый Label.

Хотеть не вредно, воспользуйтесь компонентами
sohoLabel из набора SohoLib,
rxLabel из набора RxLib,
и чтобы можно было поворачивать под разными углами
воспользуйтесь компонентой sohoVertLabel из набора SohoLib,



Как сравнить две строки?

Воспользоваться функцией WildStringCompare из набора sohoLib.



Как сделать красивую панель?

Воспользоваться компонентами mlMediaPanel из набора MediaLib,
hgPanel из набора HighGear,
LMDPanel из набора LMDTools,
sohoPanel из набора SohoLib,
sohoScrollPanel из набора SohoLib,



Как изменить цвет, фон кнопки, а также цвет надписи ?

Воспользоваться компонентами mlMediaButton,mlBitmapButton,
mlBlurButton,mlSphereButton,mlGrashGuardButton
mlRegionSpeedButton из набора MediaLib,
hgBitBtn из набора HighGear,
sohoTextButton, sohoTransButton,
sohoBitBtn из набора SohoLib,



<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS