Autor Beitrag
Ydobon
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 42



BeitragVerfasst: Fr 11.04.08 16:13 
Das Erstellen einer DB geht auch per ADOX. Wenn man die gesamte Typenbibliothek nicht zu importieren braucht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
uses ...ComObj;
var cat: OLEVariant;
begin
  cat:=CreateOleObject('ADOX.Catalog');
  cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb');
  cat:=unassigned;
end;

Die DB kann man dann mit einer ADOConnection verbinden und durch SQL beliebig füllen.
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Fr 11.04.08 17:09 
Sehr gut, das hatte ich nach langem suchen auch mal rausgefunden.
In Delphi7 hatte ich die ADOX TypeLibrary eingebunden und dann den ADOXCatalog Befehl benutzt.
Das einbinden der TypeLib ist aber nicht ganz einfach und ab den höheren Versionen ging das dann gar nicht mehr.

Braucht man für diese Variante keine Typelib mehr ?

Ansonsten wollte ich nicht gleich mit Kanonen auf Spatzen schießen, aber wenn Du schon mal damit anfängst, dann biete ich hier mal eine vollständige Variante des ganzen.
Da habe ich dann auch irgendwann mal im Forum gefunden. wozu so ein Forum nicht alles gut ist :).

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:
uses {..,}Variants, ComObj{,..}; 
//.. 
const 
   dbVersion10   = 1; 
   dbVersion11   = 8; 
   dbVersion20   = 16; 
   dbVersion30   = 32; 
   dbVersion40   = 64; 

function CreateDB(const FileName: String; const Version: Integer; DelIfExists: Boolean = False): String; 
var 
   DBEngine, 
   Workspace, 
   Database  : OleVariant; 
   s         : String; 
const 
   dbLangGeneral = ';LANGID=0x0409;'; 
begin 
   Result  := ''; 
   if FileExists(FileName) And DelIfExists then 
      DeleteFile(FileName); 
   s       := dbLangGeneral + 'CP=' + IntToStr(GetACP()) + ';COUNTRY=0'; 
   DBEngine:= CreateOleObject('DAO.DBEngine.36'); 
   try 
      try 
         Workspace := DBEngine.Workspaces[0]; 
         Database  := Workspace.CreateDatabase(FileName, s, Version); 
         Database.Close; 
         Workspace.Close; 
      except 
         On E: Exception do 
            Result := E.Message; 
      end; 
   finally 
      Database  := NULL; 
      Workspace := NULL; 
      DBEngine  := NULL; 
   end; 
end; 

procedure TForm1.BtnDBNeu.Click(Sender: TObject); 
begin 
   CreateDB('test.mdb', dbVersion20); 
end;


Damit wäre erst mal die Datenbank angelegt.
Als nächste muss die Tabelle in der DB angelegt werden.

Das erfahren wir dann in der nächten Sendung :)
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Fr 11.04.08 17:52 
Hier dann wie man die Tabellen anlegt.
Habe das nur so im Editor zusammengestellt, gebe keine Garantie für die Funktion.
Soll ja auch nur zeigen wie man es macht.
Con1 ist die ADOConnection und QKonten und QWaehrung sind Querys die mit der ADOConnection verbunden sind.

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:
procedure CreateTable;
const
  cCreateKonten = 'CREATE TABLE Konten('
    + 'KontoNr char(5) PRIMARY KEY,'
    + 'Beschriftung char(50),'
    + 'KontenTyp char(1),'
    + 'SH char(1),'
    + 'Land char(30),'
    + 'USTID char(20))';

  cCreateWaehrung = 'CREATE TABLE Waehrung('
    + 'Nr AutoInc PRIMARY KEY,'
    + 'Beschreibung char(30),'
    + 'Eurokurs double,'
    + 'EuroSt double,'
    + 'EuLand char(2),'
    + 'BasisWBetrag double,'
    + 'BasisWKennung integer)';

begin
  Con1.Active:=True; // Datenbank aktivieren
  
  QKonten.SQL.Text:=cCreateKonten; // Tabelle Konten erzeugen
  QKonten.ExecSQL; // Da keine Daten zurückgegeben werden ExecSQL ausführen

  QWaehrung.SQL.Text:=cCreateWaehrung; // Tabelle Waehrung erzeugen
  QWaehrung.ExecSQL; // Da keine Daten zurückgegeben werden ExecSQL ausführen
    
  QKonten.SQL.Text := 'Select * From Konten'; // Daten in Konten Selektieren
  QKonten.open; // Hier werden Daten zurückgegeben, daher open ausführen
  QWaehrung.SQL.Text := 'Select * From Waehrung'; // Daten in Waehrung Selektieren
  QWaehrung.open; // Hier werden Daten zurückgegeben, daher open ausführen 
End;
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Fr 11.04.08 18:09 
hi jop hab access 2007 und auch schonmal nen bissl damit in der schule gearbeitet, könnte auch mein kleines addressbuch ändern bloß nun hab ich die frage ob ich in der access datenbank auch bilder speichern kann?
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Fr 11.04.08 19:34 
Wenn Du Access 2007 hast, dann mustt Du nach dem anlegen der DB die DB als Access2000 Format speichern, das 2007er Format geht nicht mit den ADO Komponenten.

Man kann auch Bilder in der Datenbank speichern, das ist aber kompliziert, einfacher ist es die Bilder in einem separaten Pfad abzulegen und in der Datenbank nur den Pfad und Dateinamen abzulegen.

Glaub aber nicht, dass das Bild von alleine angezeigt wird wie in den DBEdit Komponenten, ein bisschen muss man dafür schon tun.
Setze eine Image Komponente aufs Formular und lade bei jedem Datensatzwechsel das Bild in die Image rein.
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Fr 11.04.08 22:25 
klingt ja kompliziert^^ naja werd mich das we mal damit beschäftigen erstmal den aufbau mit den ado komponenten etc
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Sa 12.04.08 00:54 
user profile iconYdobon hat folgendes geschrieben:
Access ist doch eigentlich nicht unbedingt notwendig, die Jet Engine sollte doch ab 2000 bei Windows auch so dabei sein?

Jein. Bei den Embedded-Versionen von XP (und vermutlich auch Vista) kann man konfigurieren ob man auch die Jet-Engine haben will. Ist diese nicht konfiguriert kann sie nicht einzeln (per MDAC-Installer) nachinstalliert werden. Man braucht dann eine richtige Access-Installation.
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Sa 12.04.08 13:50 
ok SmileySN kannste mir mal alle komponenten sagen die ich jetzt für die umsetzung mit access brauche?

hab zurzeit diese scon aufn formular:
adotable, adoconnection, adoquery, datasource

für das eintragen von daten:
dbnavigator, mehrere db edit felder, ein dbimage

für das anzeigen der daten:
dbgrid

z den ganzen komponenten kommen noch zusätzliche dige hinzu wie buttons und menü etc. aber denke die spielen erstmal keine rolle
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Sa 12.04.08 15:01 
OK, dann hast Du ja schon alles.
Die Table brauchen wir erst mal nicht.
Jetzt erst mal am besten mit dem assistenten im Objektinspector in der ADOConnection den ConnectionString aufbauen.
Doppelklick auf Connectionstring dann Button Aufbauen drücken dann "Microsoft Jet 4.0 OLE DB Provider" auswählen.
Weiter Button drücken.
Datenbank (mdb)auswählen mit ...
Verbindung Testen. Es sollte OK erscheinen.

Die Query auswählen und im Objectinspector unter Connection die ADOConnection auswählen.
SQL im Objectinspector auswählen mit doppelklick und folgendes eingeben: Select * from Tabellenname
(Hier den Tabellennamen der Tabelle in der Datenbank eingeben)

Datasourcekomponente auswählen.
Bei Dataset die Query auswählen.

Im DBGrid,DBEdit,Navigator jeweils die Datasource auswählen.

Beim DBEdit muss man noch das Datenfeld angeben das dort angezeigt werden soll.

Dann zum testen mal die connection auf active setzen, dann die query und dann die Datasource.

Jetzt sollten schon mal Daten im Grid und den Editfeldern erscheinen.
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Sa 12.04.08 15:05 
Wenn man seine Daten sortiert haben möchte, dann im Programm folgendes eingeben.
ausblenden Delphi-Quelltext
1:
2:
Query.SQL.Text:='Select * from Tabellenname order by feldname';
Query.open;


danach sind die Daten nach Feldname sortiert.
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Sa 12.04.08 15:19 
Diesen Thread auch mal durchlesen für den nächsten Schritt: www.delphi-forum.de/viewtopic.php?t=82483
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: So 13.04.08 13:54 
k hab das jetzt soweit also die daten von einer tabelle in der datnebank werden in der grid angezeigt
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: So 13.04.08 14:30 
Gut, und mit dem Navigator kannst Du Dich in der Tabelle auch bewegen, hinzufügen und löschen.
Was soll jetzt noch funktionieren ?
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: So 13.04.08 16:22 
jup geht, na bilder muss ich da jetzt noch irgendwie mit rein achen oder so wie du das gesagt hattest mit dem pfad der bilder aber hab kein plan wie ich das machen soll
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: So 13.04.08 20:43 
Das mit dem Bild ist doch gar nicht schwer, man muss sich nur von dem Gedanken lösen, das es von alleine geht.
Mit irgendwas musst Du doch Deinen Datensatzzeiger bewegen um auf den nächsten Datensatz zu kommen.
Wenn Du noch mit dem Navigator arbeitest, dann solltest Du dor mal in die ereignisse gehen und dir die mal ansehen, da gibt es betimmt eines, das ausgelöst wird, wenn Du den Datensatz bewegst.
Da machst Du einen doppelklick drauf und kommst in eine neue Prozedur, darin kannst Du dann den Namen des Bildes aus der Datenbank lesen (der solte beim neuanlegen des Datensatzes mit OpenFileDialog abgelegt worden sein) und Das auf dem Formular sitzende Image damit füllen.
Image.Picture.Loadfromfile(Dateiname aus Datenbankfeld);
Jedesmal wenn Du eine Datensatzbewegung machst wird dieser Befehl ausgeführt und das Bild wird geladen und angezeigt.
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mo 14.04.08 10:45 
ok ich werds mal mit dem ereignis beforeaction probieren
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mo 14.04.08 12:15 
Ich habe mir den DBNavigator mal angesehen, der ist zum Programmieren kaum zu gebrauchen, soweit ich das sehe.
Die einzelnen Funktionen haben kein eigenes Ereignis.
Ich benutze immer nur Buttons für die Funktionen, das ist ganz einfach.
Button auf Formular Caption umbenennen in "Weiter" und einen doppelklick drauf, dann "Query.next;" reinschreiben.
Query sollte der Name Deiner Querys sein.
Dasselbe mit Button "Zurück" "Query.Prior;"
Dann gibt es noch .Last und .First.
Für "Neu" kann man query.append benutzen.
Für "Speichern" Query.Post.
Wenn Du das hast, kannst Du in die Prozedur ButtonWeiter.Click dann auch das laden des Bildes mit einbauen, ebenso in die Zurück Prozedur.
Black_Fox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mo 14.04.08 14:04 
ok thx dann werd ich die navi weglassen und eigene buttons verwenden

Hab noch ne Frage:

Kann ich den Pfad so aus der Db lesen? und mit writeln speichern?

ausblenden Delphi-Quelltext
1:
readln(ADOQuery1.FieldByName('Bild').asstring);					


ausblenden Delphi-Quelltext
1:
writeln(ADOQuery1.FieldByName('Bild').asstring);					


Achja und muss die Spalte 'Bild' in meiner Db nun ein Blob Feld sein oder ein Textfeld?
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mo 14.04.08 19:22 
Nein, nicht ganz richtig!!
ReadLn und WriteLn sind Befehle für TextFiles und werden folgendermaßen benutzt:

wenn F vom Typ Textfile ist:
ausblenden Delphi-Quelltext
1:
2:
ReadLn(F,ADOQuery1.FieldByName('Bild').asstring));
WriteLn(F,ADOQuery1.FieldByName('Bild').asstring));


Wobei man beim ReadLn dann erst mal ein Query.edit machen muss, da sich die Datenbank sonst nicht beschreiben lässt.
Nach dem ReadLn muss dann auch noch ein Query.post kommen, damit der Datensatz auch weggeschrieben wird.
Sonst ist er nur im Cache. (Aber erst, wenn alle Felder gelen wurden einen post machen, nicht bei jedem Feld)

Mi WriteLn kannst Du aber keine CSV Datei erstellen wie Du es vorhast.
Dazu musst Du den Write Befehl nehmen und nach jedem Feld auch noch das Trennzeichen schreiben.
Erst wenn das letzte Feld geschrieben wird, dann macht man ein WriteLn.

Bein lesen ist das wieder anders, da liest Du einmal mit Readln in eine Variable und zerlegst diese dann in ihre Felder.

Somit wird das mit dem ReadLn und WriteLn mit Datenfeld direkt sowieso nichts.

Wenn ich es gleich finde, schick ich mal ne Lösung fürs schreiben in csv gleich hier rein.

Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mo 14.04.08 19:34 
Hier ein Beispiel, wie man aus einer CSV Datei liest:

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:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Function GetFeld(a : String; Var z : Integer) : String;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var ProgPath ,a , Konto, SKD, BEschreibung, Land, USTID: String;
    Datei : Textfile;
    Kopf : Boolean;
    z : Integer;
begin
  Kopf := True;
  ProgPath:=ExtractFilePath(paramstr(0));
  opendialog1.InitialDir := ProgPath;
  Opendialog1.Execute;
  AssignFile(Datei, Opendialog1.FileName);
  try
    reset(Datei);
  except
    exit;
  end;
  If Kopf then readln(Datei,a); // Wenn Datei eine Kopfzeile hat, dann erst einmal lesen. (Feldnamenliste)
  While not EOF(Datei) do
    Begin
     z := 1;
     readln(Datei,a);
     Konto := GetFeld(a,z);
     SKD := GetFeld(a,z);
     Beschreibung := GetFeld(a,z);
     Land := GetFeld(a,z);
     USTID := GetFeld(a,z);
     Listbox1.items.add(Konto+ '   '+ SKD + '   '+ Beschreibung + '   '+ Land + '   '+ USTID);
    End;
end;



Function GetFeld(a : String; Var z : Integer) : String;
Begin
  Result := '';
  While z <> Length(a) do
    If a[z] <> ';' then
      Begin
        Result := Result + a[z];
        inc(z);
      End
    Else
      Begin
        inc(z);
        Exit;
      End;

End;


end.