Announcement

Collapse
No announcement yet.

Unabhängiges RecordSet erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unabhängiges RecordSet erzeugen

    Hallo,

    Ich habe folgendes Problem:

    Um eine weitere Bearbeitung in Crystal Reports 10 (Datenherkunft COM) zu ermöglichen, möchte ich ein RecordSet mit den Daten aus unserer COM Geschäftslogik füllen, um Sie dann in einem ReportTemplate einbinden zu können.

    Dazu habe ich ein Automatisierungsobject erstellt, dass ein Recordset in einer entsprechenden Funktion zurückgibt.

    Fülle ich dieses RecordSet mithilfe einer ADOQuery, funktioniert alles wunderbar.

    Bei mir scheitert es nun an der Befüllung eines leeren RecordSet's, das völlig unabhängig von irgendeiner Datenbank arbeiten soll.

    Das heißt, ich möchte selbst das RecordSet mit Leben, sprich Felder und Daten, füllen.

    Wer kann mir weiterhelfen ?

    Gruß, Tom

  • #2
    Hallo,

    >..ich möchte selbst das RecordSet mit Leben, sprich Felder und Daten, füllen.

    das folgende Beispiel zeigt, wie zur Laufzeit eine Recordset-Instanz mit eigener Datenstruktur erzeugt und mit Daten gefüllt wird. Der "Umweg" über TADODataSet macht nur dann Sinn, wenn die Controls einer Benutzeroberfläche (TDBGrid etc.) die Daten anzeigen sollen. In einer COM-Umgebung wird nur mit dem nativen Recordset-Objekt hantiert, denn dort stören die Macken von TADODataSet nur.
    <pre>
    <font color="#003399"><i>{ ************************************************** **************
    Autor : Andreas Kosch
    Compiler : Delphi 6.0 Enterprise
    Betriebssystem : Windows 2000 SP2
    Erstellt am : 06.08.2001
    Beschreibung : Testprogramm für das Einfügen von
    50000 Datensätzen in eine RecordSet-
    instanz, deren Struktur im eigenen Programm
    definiert wurde.
    ************************************************** ************** }</i></font>
    <br>
    <b>unit</b> ADOPerfTestFrm;
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, ToolWin, Grids, DBGrids, DB, ExtCtrls,
    DBCtrls, StdCtrls, ADODB;
    <br>
    <b>type</b>
    TFormMain = <b>class</b>(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    StatusBar1: TStatusBar;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    DBNavigator1: TDBNavigator;
    ToolButton2: TToolButton;
    ProgressBar1: TProgressBar;
    ToolButton3: TToolButton;
    ADODataSet1: TADODataSet;
    <b>procedure</b> FormCreate(Sender: TObject);
    <b>procedure</b> ToolButton1Click(Sender: TObject);
    <b>private</b>
    <font color="#003399"><i>{ Private declarations }</i></font>
    <b>public</b>
    <font color="#003399"><i>{ Public declarations }</i></font>
    <b>end</b>;
    <br>
    <b>var</b>
    FormMain: TFormMain;
    <br>
    <b>implementation</b>
    <br>
    <font color="#003399"><i>{$R *.dfm}</i></font>
    <br>
    <b>uses</b> ADOInt, ActiveX, ComObj;
    <br>
    <b>procedure</b> TFormMain.FormCreate(Sender: TObject);
    <b>var</b>
    aRS : _Recordset;
    <b>begin</b>
    aRS := CoRecordset.Create;
    <b>with</b> aRS <b>do</b>
    <b>begin</b>
    CursorLocation := adUseClient;
    Fields.Append(<font color="#9933CC">'INT'</font>, adInteger, 4, adFldUnspecified);
    Fields.Append(<font color="#9933CC">'VARCHAR'</font>, adVarChar, 75, adFldUnspecified);
    Open(EmptyParam, EmptyParam, adOpenUnspecified,
    adLockUnspecified, 0);
    <b>end</b>;
    <b>with</b> ADODataSet1 <b>do</b>
    <b>begin</b>
    RecordSet := aRS;
    Active := True;
    <b>end</b>;
    <b>end</b>;
    <br>
    <b>procedure</b> TFormMain.ToolButton1Click(Sender: TObject);
    <b>resourcestring</b>
    cFmt = <font color="#9933CC">'%d Datensätze in %d Ticks hinzugefügt (Speichern: %d Ticks)'</font>;
    cFV1 = <font color="#9933CC">'Ein kurzer Dummy-Eintrag für die VARCHAR-Spalte.'</font>;
    cFV2 = <font color="#9933CC">'Ein etwas längerer Dummy-Eintrag für die VARCHAR-Spalte.'</font>;
    <b>var</b>
    i, iStart, iStop, iStop2 : Integer;
    <b>begin</b>
    ADODataSet1.DisableControls;
    Statusbar1.SimpleText := <font color="#9933CC">'Daten werden eingefügt...'</font>;
    Application.ProcessMessages;
    iStart := GetTickCount;
    <b>try</b>
    <b>with</b> ADODataSet1 <b>do</b>
    <b>for</b> i := 0 <b>to</b> 50000 <b>do</b>
    <b>begin</b>
    Append;
    Fields[0].Value := i;
    <b>if</b> (i <b>mod</b> 5) = 0 <b>then</b>
    Fields[1].Value := cFV1
    <b>else</b>
    Fields[1].Value := cFV2;
    Post;
    <b>if</b> (i <b>mod</b> 500) = 0 <b>then</b>
    <b>begin</b>
    ProgressBar1.StepIt;
    Application.ProcessMessages;
    <b>end</b>;
    <b>end</b>;
    <b>finally</b>
    ProgressBar1.Position := 0;
    ADODataSet1.EnableControls;
    <b>end</b>;
    iStop := GetTickCount;
    ADODataSet1.SaveToFile(<font color="#9933CC">'ADOPerfTest.dat'</font>, pfADTG);
    iStop2 := GetTickCount;
    Statusbar1.SimpleText := Format(cFmt,
    [ADODataSet1.RecordCount, iStop - iStart, iStop2 - iStop]);
    <b>end</b>;
    <br>
    <b>end</b>.
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,

      Vielen Dank für die rasche Antwort, die ich leider erst jetzt gesehen habe.

      Ich werde es gleich mal ausprobieren.

      Gruß, To

      Comment

      Working...
      X