Библиотека Интернет Индустрии I2R.ru |
|||
|
Delphi, С++ Builder и базы данных: вопросы и ответыВ статье "Создание серверов приложений с помощью Delphi 3" вы написали, что подключались к Personal Oracle с помощью BDE. Я очень прошу вас рассказать, как вы это сделали. Для меня пока это остается загадкой. Доступ к Personаl Oracle (как и к любой другой версии этой СУБД) осуществляется
следующим образом. Недавно я перешел на использование Oracle, и все мои попытки использовать компонент TStoredProc кончаются неудачей. Почему? Причины неработоспособности компонента TStoredProc могут быть следующими. Во-первых,
при использовании ODBC-доступа может оказаться, что применяемый вами ODBC-драйвер
не поддерживает хранимые процедуры (как известно, не все ODBC-драйверы их поддерживают).
Есть ли возможность в Delphi как-то корректно прервать выполнение SQL запроса к серверу Oracle с помощью BDE? Например, при использованиис SQL Plus после отправки на выполнение SQL-запроса на экране появляется окно с кнопкой Cancel, благодаря чему мы имеем возможность в любой момент прервать выполнение этого запроса. Можно ли что-то подобное сделать в Delphi? Насколько мне известно, для этой цели лучше всего использовать функции Oracle
Call Interface (низкоуровневый API Oracle). В комплекте поставки Oracle есть
соответствующие примеры для C, и переписать их на Pascal несложно. Что необходимо предпринять, чтобы сгенерировать из ERwin таблицы для локальной базы данных Paradox 5.0? На компьютере установлены Delphi 4.0 и MetaBase. Для этого требуется установить ODBC-драйвер для этой версии Paradox той же разрядности, что и ERwin. Затем нужно описать соответствующий ODBC-источник, и он будет доступен в ERwin. Не могли бы Вы мне подсказать, как заблокировать функцию вставки записи непосредственно в компоненте TDBGrid с сохранением всех остальных возможностей редактирования таблицы. Наиболее разумным представляется создать обработчик события BeforeInsert компонента TTable, TQuery или TClientDataSet, данные из которых отображаются в TDBGrid. Сам компонент TDBGrid не имеет подходящего события для обработки, так как это компонент, предназначенный только для создания пользовательского интерфейса, а в данном случае следует, по существу, запретить добавление записей в таблицу. У меня в комплект Borland C++ Builder не входит Visual Query Builder. Могу ли я связать две таблицы без него? Безусловно, можно связать две таблицы и без VQB. Самый простой способ - запустить
Database Form Wizard и связать две таблицы, используя TQuery. Те два запроса,
которые при этом получатся (один из них - параметризованный), можно использовать
как образец. Я установил Borland C++ Builder 3.0 Client/Server Suite и InterBase Server 5.1.1. (автоматически с ним установился InterBase 5.x Driver by Visigenic). Но у меня не работают хранимые процедуры. То есть процедура правильно откомпилирована, и вызов ее из C++ Builder осуществляется с помощью выполнения оператора StoredProc1->ExecProc(); При этом возникает следующая ошибка : "Capability not supported. General SQL error. [Visigenic][ODBC InterBase 4.x Driver] Driver not capable". ODBC-драйвер может не поддерживать хранимые процедуры. В этом случае стоит
попытаться использовать драйвер SQL Link (он должен быть в C++ Builder 3.0 Client/Server
Suite). Для этого нужно создать для вашей базы данных псевдоним типа INTRBASE.
В этом случае хранимые процедуры должны работать. При удалении записей из таблицы dBase с помощью компонента TTable они просто приобретают признак удаления, и я никак не могу добиться их физического удаления. Как быть? Ваша проблема решается просто - для физического удаления записей нужно использовать функцию DbiPackTable (ее описание есть в справочном файле BDE). При добавлении новых записей с помощью TTable.AppendRecord в индексированную таблицу FoxPro через какое-то время (то есть при добавлении сразу большого количества записей) возникает ошибка: "Access to table disabled because of previous error. Read failure. File" <имя_файла.cdx>.. Возможно, причина заключается в том, что операции чтения-записи в файл, содержащий
таблицу FoxPro, особенно при использовании кэширования, предоставляемого операционной
системой, конфликтуют с содержимым индексного файла (это часто происходит при
многопользовательской работе). Дело в том, что ранние версии dBase, FoxPro,
Clipper работали с неподдерживаемыми индексами, то есть индексные файлы не обновлялись
одновременно с таблицей, и для их синхронизации требовалось выполнять специальные
операции. Но соответствующие средства разработки, применяемые в то время, обычно
не поддерживали никаких аналогов транзакций - записи обычно вставлялись по одной.
Позволяет ли QuickReport выгружать данные в формате Microsoft Excel? Quick Report не позволяет выгружать данные в формате Microsoft Excel. Но последние
его версии позволяют сохранять отчеты в формате CSV (Comma Separated Value)
и HTML, и оба эти формата можно прочесть с помощью Excel. Как можно создать свою форму просмотра отчетов QuickReport в С++Builder? Для создания собственных окон просмотра отчета можно использовать компонент TQRPreview. Для этой цели следует создать форму (назовем ее PreviewForm), поместить на нее компонент TQRPreview, сослаться на нее в форме, содержащей отчет, и в форме, из которой вызывается просмотр отчета. Код для показа отчета выгладит примерно так: void __fastcall TForm1::Button1Click(TObject *Sender) { PreviewForm->Show(); QuickReport1->Preview(); } Далее создадим обработчик события OnPreview компонента TQuickRep: void __fastcall TQuickReport1::QuickReport1Preview(TObject *Sender) { PreviewForm->QRPreview1->QRPrinter = QuickReport1->QRPrinter; } После этого данный отчет будет появляться не в стандартном окне просмотра, а в форме PreviewForm. Возможно ли использование компонентов Decision Support System при генерации отчетов в QuickReport и, если можно , то каким образом? Если QuickReport не подходит для этих целей, то какие другие варианты Вы можете посоветовать? Самый простой способ - использовать компоненты TQRLabel, текст в которых динамически меняется во время печати (то есть способ, которым можно напечатать все, что угодно, написав при этом немного кода). В принципе можно двумерное сечение куба записать во временную таблицу или в компонент TClientDataSet, написав соответствующий цикл, и сделать отчет на ее основе. Использование DecisionQuery в качестве источника данных для отчета также вполне возможно. Другие возможные варианты - это использование автоматизации Word или Excel, либо вычисление сумм внутри отчета. Можно также использовать другие генераторы отчетов - например, с помощью Crystal Reports можно создавать отчеты, содержащие кросс-таблицы. Как корректно подключить Crystal Reports к Delphi ? В составе Crystal Reports Professional имеется VCL-компонент для Delphi, элемент управления ActiveX, модуль CRPE32.PAS, котором объявлены все функции и структуры Print Engine API, и описание опубликованных методов Crystal Reports как сервера автоматизации. Соответственно есть следующие возможности подключения Crystal Reports к Delphi: 1. Использование функций Report Engine API из библиотеки CRPE32 DLL. В этом случае следует добавить в проект модуль CRPE32.PAS и сослаться на этот модуль в предложении uses. Ниже приведен пример соответствующего кода: procedure TForm1.Button1Click(Sender: TObject); VAR RepNam:PChar; begin if OpenDialog1.Execute then begin If PEOpenEngine then begin RepNam := StrAlloc(80); StrPCopy(RepNam, OpenDialog1.Filename); JN := PEOpenPrintJob(RepNam); if JN = 0 then ShowMessage('Ошибка открытия отчета'); StrDispose(RepNam); end else ShowMessage('Ошибка открытия отчета'); end; end; procedure TForm1.Button2Click(Sender: TObject); begin PEClosePrintJob(JN); PECloseEngine; Close; end; procedure TForm1.Button3Click(Sender: TObject); begin PEOutputToWindow(jn,'Пример использования Crystal Reports Print Engine',30,30,600,400,0,0) ; if PEStartPrintJob(JN, True) = False then ShowMessage('Ошибка вывода отчета'); end; end. Следует помнить, что строковые параметры, передаваемые в функции Print Engine API, представляют собой тип данных PChar, а не стандартные строки, используемые в Pascal, поэтому для передачи таких параметров, как, например, имя отчета, следует осуществить преобразование типов с помощью функции StrPCopy. Для успешной компиляции подобных приложений файл CRPE32.PAS должен находиться в том же каталоге, что и разрабатываемое приложение, либо в каталоге Delphi\Lib. 2. Использование VCL-компонента и комплекта поставки (для этого следует установить его в палитру компонентов Delphi). Естественно, этот компонент инкапсулирует те же самые функции Print Engine API. Существуют также аналогичные компоненты третьих фирм (например, компонент от SupraSoft Ltd., http://www.suprasoft.com). 3. Использование элемента управления Crystal Reports ActiveX. Этот элемент управления может быть установлен в палитру компонентов Delphi. Он обладает набором свойств и методов, более или менее сходным с соответствующим VCL-компонентом из комплекта поставки Crystal Reports Professional. 5. Использование Crystal Reports как сервера автоматизации. В справочной системе Crystal Reports имеется подробное описание иерархии вложенных объектов и их методов (и внушительный набор примеров для Visual Basic, аналоги которых несложно создать и на Pascal). Ниже приведен пример соответствующего кода: procedure TForm1.Button1Click(Sender: TObject); var r,rep: Variant; begin rep:=CreateOleObject('Crystal.CRPE.Application'); r:=rep.OpenReport('d:\Report2.rpt'); r.RecordSelectionFormula := ' = '+Edit1.Text; r.Preview; r:=Unassigned; rep:=Unassigned; end; 6. Можно также сделать отчет в виде исполняемого файла и вызвать его из приложения. Но в этом случае в отчет не удастся передать параметры. Наталия Елманова |
|
2000-2008 г. Все авторские права соблюдены. |
|