Autor Beitrag
MadMacTennents
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 30.03.23 19:10 
Hallo zusammen,

ich habe eine kleine Frage. Und zwar lese ich die Datensätze einer Datenbank-Datei ein (was auch funktioniert), nur mein Problem ist, dass ich absolut keine Ahnung habe, wie ich die eingelesenen Datensätze in meiner Datenbank-Datei speichere. Ich verwende Delphi 10.4, Windows 10, ApolloDB zum Einlesen der Daten und UniDAC zum Speichern. Hier der komplette Code, den ich zum Einlesen verwende:

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:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
unit UnitToolsHKAbrImportieren;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls,Vcl.ExtCtrls, Data.DB,
  ApoDSet, AdvProgr;

type
  TFormToolsHKAbrImportieren = class(TForm)
    ButtonPause: TButton;
    ButtonAbbrechen: TButton;
    LabelImportiereCaption: TLabel;
    LabelHinzugefuegtCaption: TLabel;
    LabelAktualisiertCaption: TLabel;
    LabelGeloeschtCaption: TLabel;
    LabelHinzugefuegt: TLabel;
    LabelAktualisiert: TLabel;
    LabelGeloescht: TLabel;
    LabelFehlerCaption: TLabel;
    LabelFehler: TLabel;
    LabelVerarbeitetCaption: TLabel;
    LabelVerarbeitet: TLabel;
    LabelUebersprungenCaption: TLabel;
    LabelUebersprungen: TLabel;
    PanelLog: TPanel;
    MemoLog: TMemo;
    ApolloTableHKabrImportAkteKz: TApolloTable;
    AdvProgress: TAdvProgress;
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormToolsHKAbrImportieren: TFormToolsHKAbrImportieren;
// Globale Variablen deklarieren
  ZeilenNummerHKAbr: Integer;
// TListItems für die Datenbanken
  AkteKzHKAbr: TListItem;
  AkteKz     : TListView;
  KundeHKAbr : TListItem;
// Benötigte Variablen
  Datenzaehler: Integer;
  DatenGesamt: Integer;
  HKRbrDatenPfad: String;

implementation

{$R *.dfm}

// benötigte Units einbinden
uses
  UnitMain, UnitDataModuleAlleDatenbanken;

procedure TFormToolsHKAbrImportieren.FormShow(Sender: TObject);
begin
// Formular zentriert anzeigen
  Left := FormMain.Left + (FormMain.Width - Width) div 2;
  Top := FormMain.Top + (FormMain.Height - Height) div 2;

// Globale Variable "ZeilenNummerHKAbr" initialisieren
  ZeilenNummerHKAbr := 0;

// Globale Variable "Datenzaehler" initialisieren
  Datenzaehler := 0;

// Globale Variable "DatenGesamt" initialisieren
  DatenGesamt := 0;

  HKRbrDatenPfad := FormMain.JvBrowseForFolderDialog.Directory + '\';
// sProgressBarAkteKz auf 0 setzen
  AdvProgress.Position := 0;
{******************************************************************************}
{* Import der Datenbank "AKTEKZ.DBF"                                          *}
{* Im Objekt-Inspector beim Table "OEMTranslate" auf TRUE setzen, damit die   *}
{* Sonderzeichen korrekt dargestellt werden.                                  *}
{******************************************************************************}
// ListView "AkteKz" erzeugen
  AkteKz := TListView.Create(Self);
// Parent für das ListView setzen
  AkteKz.Parent := FormToolsHKAbrImportieren;
// ListView-Style ausblenden
  AkteKz.Visible := FALSE;
// ListView-Style setzen
  AkteKz.ViewStyle := vsReport;
// Spalte hinzufügen
  AkteKz.Columns.Add;
// Titel der ersten Spalte
  AkteKz.Columns[0].Caption := 'AKTEKZNR';
// Spalte hinzufügen
  AkteKz.Columns.Add;
// Titel der zweiten Spalte setzen
  AkteKz.Columns[1].Caption := 'AKTEKZBEZ';

  ApolloTableHKabrImportAkteKz.TableName := HKRbrDatenPfad + 'aktekz.dbf';
  ApolloTableHKabrImportAkteKz.Active := TRUE;
//  ShowMessage(IntToStr(ApolloTableHKabrImportAkteKz.RecordCount));
// Variable "DatenGesamt" initialisieren
  DatenGesamt := 0;
// Der ProgressBar den RecordCount der HKAbr-Datendatei als Maximalwert zuweisen
  AdvProgress.Max := ApolloTableHKabrImportAkteKz.RecordCount;
// Bei dem Label "sLabelLeseAkteKz" die Beschriftung entsprechend ändern
//  MemoLog.Lines.Add(' Importiere "Aktekz": ' + IntToStr(Datenzaehler) + ' von ' + IntToStr(ApolloTableHKabrImportAkteKz.RecordCount) + ' gelesen');
// Den Datenzeiger auf den Anfang der importierten Datenbank setzen
  ApolloTableHKabrImportAkteKz.First;
// Solange die Datensätze noch nicht durchlaufen sind, ...
  while NOT ApolloTableHKabrImportAkteKz.Eof do
    begin
// ListItem erstellen
    AkteKzHKAbr := AkteKz.Items.Add;
    AkteKzHKAbr.Caption := IntToStr(ApolloTableHKabrImportAkteKz.FieldByName('AKTEKZNR').AsInteger);
    AkteKzHKAbr.SubItems.Add(ApolloTableHKabrImportAkteKz.FieldByName('AKTEKZBEZ').AsString);
// ProgressBar aktualisieren
    AdvProgress.Position := AdvProgress.Position + Datenzaehler;
// Bei dem Label "sLabelLeseAkteKz" die Beschriftung entsprechend ändern
    MemoLog.Lines.Add(' Importiere "Aktekz": ' + IntToStr(Datenzaehler + 1) + ' von ' + IntToStr(ApolloTableHKabrImportAkteKz.RecordCount) + ' gelesen');
// Nächster Datensatz
    ApolloTableHKabrImportAkteKz.Next;
// Zähler um 1 erhöhen
    INC(Datenzaehler);
    end// While NOT ApolloTableHKabrImportAkteKz.Eof ...
end;

end.



Also, wie gesagt, wie kann ich nun die in die ListView eingelesenen Daten (per SQL?) in meine UniDAC-Datenbank-Datei (Name: Aktenkennz) reinschreiben?

Ich bedanke mich schon mal im voraus und beste Grüße...

Mad MacTennents
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 04.04.23 16:16 
Hallo. Deine Daten Stehen doch schon in einer Tabelle. Warum packst du sie nun in eine unsichtbare Listview? Selbst wenn du die Daten vorm Speichern anpassen musst ist das doch nicht nötig.

Deine Datenbankverbindung via UniDac steht? Also du kannst auch dort deine Tabelle öffnen und auslesen?
Speichern geht wie üblich und überall. Einzig erzeugen von Autoinc einträgen ist mit UniDac manchmal ein bisschen ein Kampf.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
UniTable.Append;
UniTable.FieldByName('AKTEKZNR').AsInteger := ApolloTableHKabrImportAkteKz.FieldByName('AKTEKZNR').AsInteger;
UniTable.FieldByName('AKTEKZBEZ').AsString := ApolloTableHKabrImportAkteKz.FieldByName('AKTEKZBEZ').AsString;
UniTable.Post;

Für jeden Datensatz natürlich.

Was ist denn deine ZielDB?
Du könntest auch mit einem Parameterisierten Insertscript in deine DB einfügen.
Das würde auch eventuell Autoinc Probleme lösen. Es sei denn eines der Felder die du schreiben musst ist AutoInc.
Aber ohne die Ziel DB zu kennen ist alles nur stochern im Sumpf.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: MadMacTennents