Autor Beitrag
hussl1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mo 23.05.11 21:58 
Hallo zusammen :)

nachdem ich in der Schule die Grundlagen in Delphi eingetrichtert bekommen habe versuche ich mich nun an meinem ersten Programm. Bisher läuft alles sehr gut.
Das Programm soll aus einer Acces-Datenbank Daten auslesen und dann in eine bereits vorliegende DBF/MDX Datei schreiben.

Es funktioniert soweit, nur ein Problem habe ich. Zum Programmablauf:

1. Acces-Daten auslesen
2. DBF-Datei leeren
3. DBF-Datei füllen

Beim ersten Programmdurchlauf wird die DBF korrekt geleert und dann mit den Access-Daten gefüllt.
Führe ich das Programm erneut aus, werden die Datensätze nicht mehr gelöscht sondern nur noch angehängt.
Abhilfe schaffen kann ich nur indem ich die dbf lösche und eine Sicherung einspiele. Dann geht es wieder,
aber nur einmal.

Datenverbindung läuft über eine ADOConnection und eine ADOQuery.

Der Verbindungsstring zur DBF lautet:

ausblenden Quelltext
1:
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\DB_Routenplaner\access\;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=18;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;					


loginprompt ist false, connected ist true.

(nicht vom Verzeichnsnamen irritieren lassen, das hat mit Access nichts zu tun)

Die ADOQuery2 hat dann den Inhalt:DELETE * FROM FritzAdr; und hat die ADOConnection1 als Connection.

Über die ADOQuery1 lass ich dann die INSERT INTO laufen um die Datei zu füllen.

Das ganze sieht dann so aus:

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:
procedure TFritzAdressliste.inFritzAdrSchreiben;
var
  i: integer;
  sqlstring, anzeigename, name, vorname, telefon, telefax: string;
  datensatz: TFritzAdresse;
begin
  // Leeren des vorhandenen Fritz-Adressbuches

  // SQL-Abfrage Starten

  FritzAdrZugriff.DataModule2.ADOQuery2.ExecSQL;

  // Zählen der vorzunehmenden Einträge
  i := Count;

  // Liste in Adressbuch schreiben

  While i-1>=0 do
    begin
      datensatz := TFritzAdresse(items[i-1]);
        anzeigename := datensatz.anzeigename;
        name := datensatz.name;
        vorname := datensatz.vorname;
        telefon := datensatz.telefon;
        telefax := datensatz.telefax;
      sqlstring := 'INSERT INTO FritzAdr (BEZCHNG, NAME, VORNAME, TELEFON, TELEFAX, TRANSPROT)' +
      ' VALUES (''' +
      anzeigename +
      ''', ''' +
      name +
      ''', ''' +
      vorname +
      ''', ''' +
      telefon +
      ''', ''' +
      telefax +
      ''', ''A'');';

      // SQL-String in ADO löschen
      FritzAdrZugriff.DataModule2.ADOQuery1.SQL.Clear;

      // SQL-String in ADO schreiben

      FritzAdrZugriff.DataModule2.ADOQuery1.SQL.Add(sqlstring);

      // SQL-Abfrage Starten

      FritzAdrZugriff.DataModule2.ADOQuery1.ExecSQL;

      i := i-1;

    end;

end;




Ich hoffe mit dieser Info könnt ihr etwas anfangen =)

Gruß

Matthias

Moderiert von user profile iconMartok: Tags hinzugefügt
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 23.05.11 22:17 
Hallo!

Willkommen in der Entwickler-Ecke! :welcome:

Bitte verwende für Quellcode die entsprechenden [delphi]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:
ausblenden Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG5dd201015b5433acb238df365f03b6a0}</span></span>					

Wird:
ausblenden Delphi-Quelltext
1:
var Test: integer;					


Ähnlich gibt es auch [code]- und [sql]-Tags, wie ich sie oben mal nachgetragen habe.

Viele Grüße,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaevencooler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 166
Erhaltene Danke: 6

MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
BeitragVerfasst: Di 24.05.11 07:13 
Guten Morgen,


ich bin zwar nicht der ausgewiesene ADO Experte, aber musst Du Deiner Transaction nicht auch irgendwie ein commit geben ?

Vielleicht sind die eingefügten Datensätze noch im Bearbeitungsmodus, und haben ein Record Lock ? bzw. ein Table Lock,
DBase Dateien benehmen sich da schon ein bischen seltsam, ab und zu.


Beste Grüße
Michael

_________________
Wissen ist Macht, nichts wissen macht auch nichts...
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Di 24.05.11 08:29 
ich vermute auch mal, das da einfach nur ein commit fehlt.

füg mal die 3 Zeilen hinzu
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
      FritzAdrZugriff.DataModule2.ADOQuery1.SQL.Clear;

      // SQL-String in ADO schreiben

      FritzAdrZugriff.DataModule2.ADOQuery1.SQL.Add('commit;'); 

      // SQL-Abfrage Starten

      FritzAdrZugriff.DataModule2.ADOQuery1.ExecSQL;

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 24.05.11 14:36 
Hallo zusammen,

habe den beschriebenen Code eingefügt und das Programm laufen lassen.

Ich erhalte nun die Fehlermeldung:

"Sie haben versucht eine Transaktion zu Ende zu führen (Commit) oder zurückzusetzen (Rollback), ohne zuvor die Begin-Trans-Methode zu verwenden."


Was hat es denn damit auf sich ?
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Di 24.05.11 22:05 
user profile iconjaevencooler hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht sind die eingefügten Datensätze noch im Bearbeitungsmodus, und haben ein Record Lock ? bzw. ein Table Lock,
DBase Dateien benehmen sich da schon ein bischen seltsam, ab und zu.


Hallo,

seltsam schon, aber einfacher: DBF-Records werden nicht gelöscht, sondern erhalten nur einen Marker, dass sie gelöscht werden sollen. Endgültig verschwinden sie erst bei einem Reorg-Lauf.

Dass Dateien mit Löschmarker nicht mehr auftauchen sollen, muss man bei manchen Zugriffsprogrammen extra einstellen ("If not deleted" o.ä.). Ich wundere mich daher schon lange nicht mehr, wenn gelöschte Datensätze plötzlich wieder da sind.

Gruss Reinhard
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 25.05.11 12:15 
Hallo,

das würde natürlich eine schlüssige Erklärung sein. Wie kann man so einen Reorg.-Lauf den aufrufen?
Habe festgestellt, dass sich die Dateigröße beim Löschen nicht verändert.
Vor dem ersten Durchlauf: 15 Mb
Nach dem ersten Durchlauf löschen: 15Mb , Excel zeigt leere Datenbank
Nach dem ersten Durchlauf: 45 Mb, Excel zeigt volle Datenbank
Nach dem zweiten Durchlauf: 75 Mb, Alte Daten noch da, neue angehängt.

Das würde doch dafür sprechen, dass mein Delete-Durchlauf nur Flags setzt?


Gruß

Matthias
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 25.05.11 12:42 
Das nennt sich packen, aber ob das über OleDB geht... keine Ahnung.

Muss es denn unbedingt ausgerechnet eine DBase-Datenbank sein? Und wenn das sein muss, musst du darauf über den OleDB Provider zugreifen?

Es gibt auch Komponenten wie VK DBF 1.0.9, die direkte Zugriffe ermöglichen. Und bessere Datenbanken als DBase gibt es sehr viele...
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 25.05.11 14:17 
Hey,

ich bin auch kein Freund von dBase. Hat ja ewig gedauert bis die Connection mal lief.
Normalerweise nehme ich Access, habe ich nie Probleme mit. Aber ich hab ja das Programm geschrieben
um nicht alle meine Kontakte in Access und im Fritz!-Adressbuch doppelt zu verwalten (Mit Fritz
lasse ich meine Anrufe und Fax verarbeiten.)

Wie ich auf die Datenbank zugreife ist mir herzlich egal =) Ich habe halt die ADO genommen, da ich
in der Schule Delphi in Kombination mit SQL gelernt habe. Da war das keine große Umstellung.

Besten Dank für weitere Auskünfte =)

Matthias

PS: Wenn ich eine neue Komponente hinzufüge, steckt die dann in der EXE oder braucht man die dann auf jedem Rechner auf dem das Programm läuft?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 25.05.11 14:22 
Die genannte Komponente greift direkt auf die Datenbank zu ohne irgendwelche System-Komponenten. Es reicht die Exe und der Komponente musst du nur den Dateinamen sagen.
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 25.05.11 14:48 
hm das hört sich doch prima an =)

das werde ich gleich mal probieren. Mal sehen wie weit ich komme =)
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 25.05.11 15:28 
user profile iconhussl1 hat folgendes geschrieben Zum zitierten Posting springen:
hm das hört sich doch prima an =)


Hallo,

bei DBF ist Packen und Reindizieren ein Vorgang, den man extra aufrufen muss. Ich habe zu meiner Produktions-Verwaltungssoftware ein (Uralt-)Tool geschrieben (siehe Screenshot) auf Basis der Codebase-Software. Im äussersten Notfall kann man auch ein altes DBase IV istallieren, damit geht es auch. Ich weiss allerdings nicht, unter welchen Windowsversionen das noch läuft. Das ist noch DOS mit Fenstern, durchaus bedienbar, aber an Kunden kann man sowas nicht mehr ausliefern.

Codebase ist eine Zugriffssoftware für DBF (DBase, Clipper, Foxpro), da kann man alles als C/C++ Funktion aufrufen, hochprofessionell, kostet aber.

Gruss Reinhard
Einloggen, um Attachments anzusehen!
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 25.05.11 15:36 
Hallo,

ganz anderer Ansatz: mach dir eine DBF-Datei mit 0 Records als Template, kopier sie als aktive, füll sie mit Werten und schmeiss sie nachher weg. Geht viel schneller und einfacher.

Gruss Reinhard
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 25.05.11 15:38 
Die genannte Komponente hat dafür einfach den Befehl Pack... ;-)
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 25.05.11 15:53 
wow,

ihr überhäuft mich ja hier mit lösungen, vielen dank dafür =). werde eines nach dem anderen durchgehen und schauen wie das so läuft.
Habe mir von besagter Homepage die Datei EDB107.zip geladen und wollte dann die Komponente hinzufügen.
Jetzt habe ich hier aber fast 20 Units, muss ich da jede einzeln hinzufügen?

Gruß

Matthias
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 25.05.11 16:00 
Man kann natürlich auch einfach die Datei direkt bearbeiten. Einfach die Anzahl der Datensätze im Header korrekt einstellen und die Datei an der richtigen Stelle abschneiden. Hier ein Link für die Datei-Struktur: www.dbase.com/knowle...int/db7_file_fmt.htm

Allerdings kann man sich dann auch einfach immer eine leere Datei irgendwo ablegen und bei Bedarf kopieren. Ich glaube das hat Reinhard aber schon geschrieben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 25.05.11 16:07 
user profile iconhussl1 hat folgendes geschrieben Zum zitierten Posting springen:
Habe mir von besagter Homepage die Datei EDB107.zip geladen und wollte dann die Komponente hinzufügen.
Jetzt habe ich hier aber fast 20 Units, muss ich da jede einzeln hinzufügen?
Das ist der Quelltext eines Tools... das brauchst du gar nicht...

Der erste Download reicht schon. Und in der Vkdbf2009.zip sind im Verzeichnis Bin auch Packages drin um die Komponente zu installieren...
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 02.06.11 15:57 
Hallo,

ich komme hier nicht so wirklich weiter. Habe nun mit Datei-->öffnen die Datei VKDBF2009.dpk geöffnet. Dann klicke ich rechts auf VKDBF2009.dpl und klicke dann auf installieren. Ich erhalte die Fehlermeldung: "Das Laden von Drittkomponenten und IDE-Addins ist bei dieser Version nicht lizenziert."

Ich verwende unsere Schulversion. Habe ich damit überhaupt die Chance Addins zu verwenden ?

Viele Grüße

Matthias
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.06.11 16:01 
Dann nutzt du also Turbo Delphi Explorer?

Da geht das so nicht, da musst du die Komponente manuell erstellen. Heißt: Bibliothekspfad setzen, die Unit VKDBFDataSet in die uses schreiben und dann per Code eine Instanz der Klasse erstellen, das müsste die TVKDBFNTX sein.
hussl1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 02.06.11 16:35 
Hey,

danke für die schnelle Antwort. Das geht aber alles etwas schnell :P
Ja ich nutze Turbo Delphi. Wusste gar nicht, dass es etwas anderes gibt =)
Also gut, ich muss das ganze in meine Uses aufnehmen.
Heißt ich muss die betreffende Unit in mein Projektverzeichnis kopieren.

Dann erstelle ich also ein Objekt der Klasse TVKDBFNTX

ausblenden Delphi-Quelltext
1:
  TFritzDBF = class(TVKDBFNTX)					


und kann dann mit diesem Objekt meine Datenbank bearbeiten?
Wenn ja, wie setze ich da den Pfad zur DBF?
Wie bearbeite ich dann die DBF?

Vielen Dank =)