Announcement

Collapse
No announcement yet.

TDBChart/TeeChart - Access - ADO

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

  • TDBChart/TeeChart - Access - ADO

    Hallo, <p>

    ich verwende eine Access-Datenbank und wollte nun eine Mitarbeiter-Auswertung mit teeChart (TDBChart) realisieren.<br>
    Das TADODataSet beinhaltet folgenden SQL-Statement : <br>
    select Nachname, Sum(Stunden)<br>
    from Mitarbeiter<br>
    group by Nachname<br>
    <br>
    Dabei sollen die Stunden auf der Y-Achse und die Namen auf der X-Achse erscheinen<br>
    Feldtyp Stunden = Gleitkomma <br>
    Feldtyp Nachname = Text (50)
    <br>
    Leider werden auf der x-Achse nur irgendwelche Indexzahlen von 0 bis N angezeigt und nicht die Namen.<br>
    Auch habe ich keine Möglichkeit gesehen, (wie beim Demo, (leider nur auf DBASE und nicht mit ADO)) <br>
    dass ich bei der Datenauswahl das Datenbankfeld "Nachnamen" beim Merkmal "Bezeichnung, x-Achse, y-Achse" <br>
    nicht selektieren konnte (die Stunden werden angezeigt - nur keine Text-Felder) <br>
    <br>
    Als weiteres, wenn ich TDecisionCube verwende, bekomme ich eine Fehlermeldung die den WideString nicht verarbeiten kann.<br>
    <br>
    Auf was muss ich bei den beiden Sachen achten ? <br>
    Gibt es ein anderes Tool, um Kreuztabellen und mehrdimensionale Größen darzustellen ? <br>
    <br>
    Gruss und Dank<br>
    Dietmar

  • #2
    Hallo,

    sowohl die Probleme mit TDecisionCube als auch mit TDBChart haben eine gemeinsame Ursache - Daten von Typ <b>TWideStringField</b>. Das folgende Beispiel demonstriert, wie man trotzdem eine Beschriftung von Textfeldern erhält:
    <pre>
    object Form1: TForm1
    Left = 192
    Top = 107
    Width = 696
    Height = 480
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object DBChart1: TDBChart
    Left = 32
    Top = 176
    Width = 400
    Height = 250
    BackWall.Brush.Color = clWhite
    BackWall.Brush.Style = bsClear
    Title.Text.Strings = (
    'Datenbankauswertung')
    LeftAxis.Title.Caption = 'Länder je Kontinent'
    Legend.LegendStyle = lsSeries
    TabOrder = 0
    object Series1: TBarSeries
    Marks.ArrowLength = 20
    Marks.Style = smsLegend
    Marks.Visible = True
    DataSource = ADODataSet1
    SeriesColor = clRed
    XLabelsSource = 'ContinentString'
    XValues.DateTime = False
    XValues.Name = 'X'
    XValues.Multiplier = 1
    XValues.Order = loAscending
    YValues.DateTime = False
    YValues.Name = 'Balken'
    YValues.Multiplier = 1
    YValues.Order = loNone
    YValues.ValueSource = 'Expr1001'
    end
    end
    object DBGrid1: TDBGrid
    Left = 152
    Top = 24
    Width = 425
    Height = 65
    DataSource = DataSource1
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
    'Source=C:\Database\Access2000\dbdemos.mdb;Mode=Sh are Deny None;E' +
    'xtended Properties="";Locale Identifier=1033;Jet OLEDB:System da' +
    'tabase="";Jet OLEDB:Registry Path="";Jet OLEDBatabase Password' +
    '="";Jet OLEDB:Engine Type=4;Jet OLEDBatabase Locking Mode=0;Je' +
    't OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transact' +
    'ions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create Syste' +
    'm Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDBon'#39 +
    't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica' +
    ' Repair=False;Jet OLEDB:SFP=False'
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 24
    Top = 16
    end
    object ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    OnCalcFields = ADODataSet1CalcFields
    CommandText = 'SELECT Continent, Count(*) '#13#10'FROM COUNTRY'#13#10'GROUP BY Continent'
    Parameters = <>
    Left = 56
    Top = 16
    object ADODataSet1Continent: TWideStringField
    FieldName = 'Continent'
    Size = 24
    end
    object ADODataSet1Expr1001: TIntegerField
    FieldName = 'Expr1001'
    end
    object ADODataSet1ContinentString: TStringField
    FieldKind = fkCalculated
    FieldName = 'ContinentString'
    Calculated = True
    end
    end
    object DataSource1: TDataSource
    DataSet = ADODataSet1
    Left = 88
    Top = 16
    end
    end
    </pre>
    Es wird dazu ein neues berechnetes Feld vom Typ <b>TStringField</b> angelegt, so dass dieses im DBChart als Beschriftungsfeld ausgewählt werden kann. Zur Laufzeit werden die Daten vom WideString-Feld in dieses berechnete Feld kopiert:
    <pre>
    procedure TForm1.ADODataSet1CalcFields(DataSet: TDataSet);
    begin
    ADODataSet1ContinentString.Value := ADODataSet1Continent.AsString;
    end;
    </pre&gt

    Comment


    • #3
      Teil 2: Im Fall der Decision Cube kann man - je nach Datenbank - die Typkonvertierung auch direkt in der SELECT-Abfrage machen. Das folgende Beispiel für eine SQL Server 7-Datenbank demonstriert diesen Weg:
      <pre>
      object ADOConnection1: TADOConnection
      Connected = True
      ConnectionString =
      'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
      'al Catalog=Northwind;Data Source=(local);Use Procedure for Prepa' +
      're=1;Auto Translate=True;Packet Size=4096;Workstation ID=G7-800'
      KeepConnection = False
      LoginPrompt = False
      Provider = 'SQLOLEDB.1'
      Left = 8
      Top = 8
      end
      object ADODataSet1: TADODataSet
      Active = True
      Connection = ADOConnection1
      CursorType = ctStatic
      CommandText =
      'SELECT Orders.OrderDate, '#13#10' CONVERT(varchar, Employees.LastNa' +
      'me) AS EmployeeName,'#13#10' SUM(CONVERT(money, '#13#10' [Order Detail' +
      's].UnitPrice * [Order Details].Quantity * (1 - [Order Details].D' +
      'iscount)'#13#10' / 100) * 100) AS Payment'#13#10'FROM [Order Details] IN' +
      'NER JOIN'#13#10' Orders ON '#13#10' [Order Details].OrderID = Orders.O' +
      'rderID INNER JOIN'#13#10' Customers ON '#13#10' Orders.CustomerID = Cu' +
      'stomers.CustomerID INNER JOIN'#13#10' Shippers ON '#13#10' Orders.Ship' +
      'Via = Shippers.ShipperID INNER JOIN'#13#10' Employees ON '#13#10' Orde' +
      'rs.EmployeeID = Employees.EmployeeID'#13#10'GROUP BY Orders.OrderDate,' +
      'Employees.LastName'
      Parameters = <>
      Left = 40
      Top = 8
      end
      </pre&gt

      Comment


      • #4
        Hallo
        Ich habe ein ähnliches Problem mit dem Decision Cube.
        Ich möchte Sortenumsätze der Kunden (RE für RechnungsEmpfänger) darstellen.
        Delphi 7 Enterprise
        MSAcces 2000
        Adoconnenctions
        Kann man einen Cube überhaupt in der Konstellation verwenden? Ohne Textfelder klappt es ganz gut.
        Eigentlich sollte es so wie oben zu lösen sein, aber leider sieht man nur den ersten Datensatz sobald ich ein Widestringfield mit abfrage. Wie ist das zu erklären / beheben ?

        <PRE>
        <i>
        type
        TForm1 = class(TForm)
        DecisionSource1: TDecisionSource;
        DecisionGrid1: TDecisionGrid;
        DecisionPivot1: TDecisionPivot;
        DecisionCube1: TDecisionCube;
        ADOConnection1: TADOConnection;
        DSCube: TADODataSet;
        DSCubeSortenbez: TWideStringField;
        DSCubeBeizbez: TWideStringField;
        DSCubeMATCHCODE: TWideStringField;
        DSCubeUMSATZ: TFloatField;
        DSCubeSorte: TStringField;
        DSCubeBeize: TStringField;
        DSCubeRE: TStringField;
        procedure DSCubeCalcFields(DataSet: TDataSet);
        private
        { Private declarations }
        public
        { Public declarations }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.dfm}

        procedure TForm1.DSCubeCalcFields(DataSet: TDataSet);
        begin
        //
        DSCubeSorte.Value := DSCubeSortenBez.AsString;
        DSCubeBeize.Value := DSCubebeizBez.AsString;
        DSCUBERe.Value := DSCubeMatchCode.AsString;
        end;

        end.
        </i>
        </Pre&gt

        Comment

        Working...
        X