Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: So 04.07.10 21:08 
Hallihallo,


1. Frage:

muss ich bei der Benutzung der Komponenten:

1. TADOQuery
2. TADOConnection

irgendwelche Treiber für Windowssystem mitliefern (wie die BDA z.B.)?



Folgende Fragen betrifft ADO -> Excel:

Ich erstelle mittels ADO eine Exceltabelle und möchte nun leere Zeilen hinzufügen, um verschiedene Daten voneinander visuell zu trennen. Wie ist das möglich?
Wie kann ich die Sheets mit Sonderzeichen belegen (23.07.2010 z.B.)?

Hier ist mein Code zum erzeugen eines Sheets:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
                  ADOQuery1.SQL.Text := 'CREATE TABLE ''' + IntToStr(y) + ''' (Name VarChar(255))';
                  ADOQuery1.ExecSQL;
                  ADOQuery1.SQL.Text := 'INSERT INTO ''' + IntToStr(y) + ''' (Name) VALUES (''' + ADO_Dummy_String + ''')';
                  ADOQuery1.ExecSQL;
                  inc(y, 1);

//y ist der Name des erstellten Sheets (in Excel die Reiter unten)
// ADO_Dummy_String enthält z.B. hier: "Mittwoch, 23.07.2010 Raum 1"



Nun noch ein ganz komisches Problem (neue Frage):

Wenn ich, wie oben eine Tabelle = Sheet erstellt habe, wie kann ich dann in diesem gleichen Sheet eine weitere Tabelle erstellen, die mit Werten gefüllt werden?
Sozusagen ist die erste Tabelle eine Überschrift, der folgende Rest die Daten.

Mittels ADOQuery1.SQL.ADD habe ich das Problem leider nicht lösen können, mir fehlt das Wissen um SQL Statements.



Für Hilfe wäre ich sehr dankbar :)

Viele Grüße
~Mathias
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mo 05.07.10 10:42 
Hallo,

ich schätze du stößt hier an die Grenzen von ADO. Diese Technik ist ja eigentlich dazu da klassische Relationale Datenbanken anzubinden, Excel ist keine. Wenn du also Excel per ADO anbindest, dann kann dass nur soweit funktionieren wie es auch mit anderen Datenbanken möglich wäre. In deinem Fall heißt das ein Sheet = eine Tabelle. Das mit den leeren Zeilen könnte gerade noch mit einem ADOQuery1.SQL.Text := 'INSERT INTO ''' + IntToStr(y) + ''' (Name) VALUES ('''''')'; klappen, aber auch da bin ich mir nicht sicher ob das mehr als einmal pro Sheet geht.

Wenn du mehr willst als es bei einer "normalen" Datenbank möglich ist, insbesondere was die visuelle Aufarbeitung der Daten angeht, wirst du nicht umhinkommen dir eine andere Zugriffstechnik zu suchen. Das gängigste ist wohl die Fernsteuerung per OLE, ich denke wenn du hier im Forum suchst wirst du viel dazu finden, es setzt aber ein installiertes Excel voraus. Ansonsten gibt es sicher auch noch einige Komponenten die dir da einige Möglichkeiten bieten.

critter

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 05.07.10 12:05 
Danke, Excel installiert zu haben, kann und/oder möchte ich nicht vorraussetzen. Ich selbst nutze auch kein Microsoft Officce zum erstellen, nur die Viewer.

Die Lösung zum leeren Eintrag hatte ich auch schon so in etwa probiert, ich guck nochmal nach :)

Aber generell noch einmal eine Frage:

Bei ADO kann man ja SQL nutzen, wenn ich nun eine Tabelle erstelle, die ich später erstelle, ist es per .Add möglich eine weitere Tabelle im gleichen Blatt zu erzeugen - wie würde der SQL Befehl dazu lauten?

Danke + Gruß
~Mathias

Edit:

Anmerkung, jetzt geht es auch mit den "Leezeilen" im Sheet.
Zitat:

ADOQuery1.SQL.Text := 'INSERT INTO ' + IntToStr(y) + ' ('+CellSaveName_ADO[0]+') VALUES ('''')';
ADOQuery1.ExecSQL;


CellSaveName_ADO ist ein Array.
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mo 05.07.10 15:20 
Hallo,

meiner Ansicht nach ist es nicht möglich eine Zweite Tabelle auf das gleiche Blatt zu machen. Da der ADO-Treiber per jede Seite als eigenständige Tabelle ansieht. Wenn du also später eine neue Tabelle anlegst (mit CREATE TABLE) erhältst du immer auch ein neues Sheet.

critter

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 05.07.10 21:33 
Huhu Critter,

ich habe das Problem gelöst :)

Manchmal sieht man (ich) den Wald echt nicht vor lauter Bäumen ^^.

Da ich ja eine Art Überschrift im Sheet haben wollte, dachte ich immer falsch und habe versucht ein extra Feld in einer extra Tabelle zu erzeugen.
Dabei ist es viel einfacher, das erste Feld der Werte-Tabelle für ie Überschrift zu mißbrauchen :D

Danke für Deine Hilfe.

Hier mal ein Auszug meiner Erarbeitung:


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
            AC.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + SaveDialog.FileName + ';Extended Properties= "Excel 8.0;HDR=Yes";Persist Security Info=False;Persist Security Info=False';
            AC.Connected := True;

            ADO_Dummy_String := '';
            for z := 0 to High(CellSaveName_ADO) do
              if not (z in [1]) then
                ADO_Dummy_String := ADO_Dummy_String + CellSaveName_ADO[z]
                  + ' VarChar(99), ';
            Delete(ADO_Dummy_String, Length(ADO_Dummy_String) - 13);
            ADOQuery1.SQL.Text := 'CREATE TABLE ' + IntToStr(y) + ' (' +
              ADO_Dummy_String + ')';
            ADOQuery1.ExecSQL;
            ADOQuery1.SQL.Text := 'INSERT INTO ' + IntToStr(y) + ' (' +
              CellSaveName_ADO[0] + ') VALUES ('''')';
            ADOQuery1.ExecSQL;


            for x := 0 to GridVariables_Pos do
            begin

              Panel_ExportGrid_Caption.Caption :=
                Format('Daten speichern.. %d/%d', [x, GridVariables_Pos]);
              ProgressBar4.StepBy(-1);

              Application.ProcessMessages;

              { Neues Zimmer oder Tag }
              if Length(GridVariables[x].NewDay_Caption) > 0 then
                if GridVariables[x].NewDay_Caption <> ' : ENDE : ' then
                begin
                  for z := 0 to 2 do
                  begin
                    ADOQuery1.SQL.Text := 'INSERT INTO ' + IntToStr(y) + ' (' +
                      CellSaveName_ADO[0] + ') VALUES ('''')';
                    ADOQuery1.ExecSQL;
                  end;

                  ADO_Dummy_String :=
                    GridVariables[x].NewDay_Caption + #32 +
                    GridVariables[x].NewDay_Date + #32 +
                    IntToStr(GridVariables[x].NewDay_Grid_Name);
                  ADOQuery1.SQL.Text := 'INSERT INTO ' + IntToStr(y) + ' (' +
                    CellSaveName_ADO[0] + ') VALUES (''' + ADO_Dummy_String + ''')';
                  ADOQuery1.ExecSQL;

                  ADOQuery1.SQL.Text := 'INSERT INTO ' + IntToStr(y) + ' (' +
                    CellSaveName_ADO[0] + ') VALUES ('''')';
                  ADOQuery1.ExecSQL;

                end;
              { Neues Zimmer oder Tag }

              ADO_Dummy_String := 'INSERT INTO ' + IntToStr(y);
              ADO_Dummy_String := ADO_Dummy_String + ' (';
              for z := 0 to High(CellSaveName_ADO) do
                if not (z in [1]) then
                  ADO_Dummy_String := ADO_Dummy_String + CellSaveName_ADO[z] +
                    ',';
              Delete(ADO_Dummy_String, Length(ADO_Dummy_String), 1);
              ADO_Dummy_String := ADO_Dummy_String + ') VALUES (';
              ADO_Dummy_String := ADO_Dummy_String +
                '''' + GridVariables[x].GridCell_Uhrzeit + ''',' +

[..]


CellSaveName_ADO ist ein Array für Tabellenfelder
GridVariables ist ein typirisiertes Array

Meine Fragen sind jetzt beantwortet und gelöst :)

Viele Grüße
~Mathias