Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Datenübertragung von DB zu LV zu Grid (https://www.delphipraxis.net/164823-datenuebertragung-von-db-zu-lv-zu-grid.html)

Impulz 1. Dez 2011 10:33

Delphi-Version: 7

Datenübertragung von DB zu LV zu Grid
 
Hallo liebe Comunity,

ich habe ein Problem.
Ich habe eine Datenbank mit einem Online Bücher Shop. Dazu eine Oberfläche, wo man Daten auslesen kann. (Bsp Kunden,Buecher Usw.)
diese werden im TListView angezeigt. nun möchte ich diese wiederrum aus dem ListView rausnehmen und an ein TIB_Grid in einem Pop-Up Fenster übertragen.

Habe in der Hilfe gesucht aber keinen Ansatz gefunden.

Wäre nett wenn jemand eine Anregung für mich hätte.

Grüße,
Danil

DeddyH 1. Dez 2011 10:37

AW: Datenübertragung von DB zu LV zu Grid
 
Sry, aber *Bahnhof* :gruebel: Du liest Daten aus einer DB und stellst sie in einer ListView (vermutlich vsReport) dar, soweit richtig? Und das PopUp soll dann eine Detailanzeige des aktuellen Datensatzes der ListView sein, auch richtig?

Impulz 1. Dez 2011 10:42

AW: Datenübertragung von DB zu LV zu Grid
 
das PopUp soll die Daten aus dem ListView dann wieder in einem String Grid darstellen ( damit ich dort die Daten editieren kann)
Sprich das Pop UP soll sowas wie ein edit fenster sein

DeddyH 1. Dez 2011 10:45

AW: Datenübertragung von DB zu LV zu Grid
 
OK. Aber was genau ist denn nun das Problem?

Bummi 1. Dez 2011 10:46

AW: Datenübertragung von DB zu LV zu Grid
 
Wo sind die Daten , in welchem Format.
Lokal bei Dir in einer Datenbank, oder im Web und Du siehst sie im Browser ?

Impulz 1. Dez 2011 10:49

AW: Datenübertragung von DB zu LV zu Grid
 
Die Übertragung aus dem ListView and das TIB_GRID

ich habe da keinen Ansatz. keine Ahnung wie ich das machen sollte.
(Tut mir Leid ich programmiere noch nicht solange und lerne das erst, deshalb fehlt mir manchmal der Ansatz)

In der Hilfe habe ich auch geschaut welchen Befehl ich da nutzen könnte, habe aber leider nichts gefunden.
Mir ist klar, dass ich eine Funktion benötige, die die Daten übergibt, jedoch weiß ich nicht wie diese aussehen sollte.

PS: es ist nicht die selbe Unit ( einmal eine Oberfläche und einmal eine UDatenedit) die hier relevant sind.
PPS: meine daten sind Lokal

Impulz 1. Dez 2011 11:05

AW: Datenübertragung von DB zu LV zu Grid
 
@Bummi Die Daten sind Lokal und die DB wurde mit IB-Expert erstellt falls du dies meintest

DeddyH 1. Dez 2011 11:24

AW: Datenübertragung von DB zu LV zu Grid
 
Wenn Du nicht gleich ein OPF bauen willst, wieso nimmst Du keine DB-Controls? Auf dem Hauptformular ein DBGrid zur Anzeige, auf dem anderen Formular dann DBEdits und Konsorten zum Editieren des aktuellen Datensatzes. So erscheint mir das logisch und nicht zu kompliziert aufgebaut.

Impulz 1. Dez 2011 11:51

AW: Datenübertragung von DB zu LV zu Grid
 
Kann ich leider nicht.
Meine aufgabe ist es die Daten in einem ListView darzustellen

Impulz 1. Dez 2011 11:54

AW: Datenübertragung von DB zu LV zu Grid
 
Die andere Möglichkeit wäre einen Stringgrid zu verwenden.
Wäre das vorteilhafter?

Impulz 1. Dez 2011 11:55

AW: Datenübertragung von DB zu LV zu Grid
 
Bei bedarf könnte ich mein Programm als Quellcode posten, wenn das jemandem weiterhilft

jobo 1. Dez 2011 12:03

AW: Datenübertragung von DB zu LV zu Grid
 
Wieso änderst Du nicht einfach nur die Reihenfolge in Deiner Komponenten Architektur?
Code:

DB>Dataset>Listview
          >DBGrid[>DBEdit]
Wenn du etwas editiert hast, landet es automatisch wieder in der DB und wenn Du neu abrufst, wird die LV wieder aus dem Dataset befüllt.

Ps.: Das sieht nicht so aus wie ich wollte. mist
Ps2: Jetzt kann man es glaub ich erkennen.

Impulz 1. Dez 2011 12:11

AW: Datenübertragung von DB zu LV zu Grid
 
danke erstmal,

aber wie soll der schritt aussehen:

Listview--> Grid dafür habe ich halt keine idee

DeddyH 1. Dez 2011 12:34

AW: Datenübertragung von DB zu LV zu Grid
 
Nicht ListView -> Grid, sondern Dataset -> Grid, Du greifst ja auf dieselben Daten zu.

jobo 1. Dez 2011 12:40

AW: Datenübertragung von DB zu LV zu Grid
 
Mein Vorschlag war nicht Listview>Grid, sondern Dataset>Listview und separat Dataset>Grid.
Ein DBGrid ist nicht dazu gedacht aus einem Listview befüllt zu werden. Ein Grid schon eher, aber wenn Du sowieso mit einer DB arbeitest ist der erste Schritt sehr naheliegend:
1. DB > Dataset
2. "danach" aus dem Dataset Listview und DBGrid befüllen
3. Editieren im DBGrid oder DBEdits, speichern

(rote Box) DeddyH war schneller, aber ich hab keine Lust es zu löschen.

Impulz 1. Dez 2011 12:42

AW: Datenübertragung von DB zu LV zu Grid
 
okay, danke :) ich probier das gleich mal aus :)

DeddyH 1. Dez 2011 14:35

AW: Datenübertragung von DB zu LV zu Grid
 
Ich hab da mal eine kleine Demo geschrieben, wie man so etwas machen kann. Die Listview erzeuge ich dynamisch, damit auch die Einstellungen auf jeden Fall passen. Das Dataset ist nur gefaked, wichtig ist der untere Teil im FormCreate.
Delphi-Quellcode:
unit DSFake;

interface

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

type
  TFakeField = class
  private
    FValue: string;
    function GetAsString: string;
  public
    property Value: string read FValue write FValue;
    property AsString: string read GetAsString;
  end;

  TFakeDataset = class
  private
    FIndex: integer;
    FNames,
    FFirstnames,
    FDaysOfBirth: TObjectList;
    function GetEOF: Boolean;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Open;
    procedure Close;
    procedure Next;
    procedure First;
    function FieldByName(const Fieldname: string): TFakeField;
    property EOF: Boolean read GetEOF;
  end;

  TfrmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FDataset: TFakeDataset;
    FListview: TListView;
  public
    { Public-Deklarationen }
    property Dataset: TFakeDataset read FDataset;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

{ TFakeDataset }

procedure TFakeDataset.Close;
begin
  //Brauch ma nich
end;

constructor TFakeDataset.Create;
var
  aName, aFirstname, aBirthday: TFakeField;
begin
  (* Wir tun mal so, als wäre das hier eine Ergebnismenge *)
  FNames := TObjectList.Create;
  FFirstNames := TObjectList.Create;
  FDaysOfBirth := TObjectList.Create;
  aName := TFakeField.Create;
  aFirstname := TFakeField.Create;
  aBirthday := TFakeField.Create;
  aName.Value := 'Korn';
  aFirstname.Value := 'Klara';
  aBirthday.Value := '12.12.1912';
  FNames.Add(aName);
  FFirstnames.Add(aFirstname);
  FDaysOfBirth.Add(aBirthday);
  aName := TFakeField.Create;
  aFirstname := TFakeField.Create;
  aBirthday := TFakeField.Create;
  aName.Value := 'Cron';
  aFirstname.Value := 'Maria';
  aBirthday.Value := '01.12.1924';
  FNames.Add(aName);
  FFirstnames.Add(aFirstname);
  FDaysOfBirth.Add(aBirthday);
  aName := TFakeField.Create;
  aFirstname := TFakeField.Create;
  aBirthday := TFakeField.Create;
  aName.Value := 'Beam';
  aFirstname.Value := 'Jim';
  aBirthday.Value := '12.10.1899';
  FNames.Add(aName);
  FFirstnames.Add(aFirstname);
  FDaysOfBirth.Add(aBirthday);
  aName := TFakeField.Create;
  aFirstname := TFakeField.Create;
  aBirthday := TFakeField.Create;
  aName.Value := 'Fiddich';
  aFirstname.Value := 'Glen';
  aBirthday.Value := '02.10.1990';
  FNames.Add(aName);
  FFirstnames.Add(aFirstname);
  FDaysOfBirth.Add(aBirthday);
end;

destructor TFakeDataset.Destroy;
begin
  FNames.Free;
  FFirstNames.Free;
  FDaysOfBirth.Free;
  inherited;
end;

procedure TFakeDataset.First;
begin
  FIndex := 0;
end;

function TFakeDataset.GetEOF: Boolean;
begin
  Result := FIndex >= FNames.Count;
end;

function TFakeDataset.FieldByName(const Fieldname: string): TFakeField;
begin
  if AnsiSameText(Fieldname, 'Name') then
    Result := TFakeField(FNames[FIndex])
  else if AnsiSameText(Fieldname, 'FirstName') then
    Result := TFakeField(FFirstNames[FIndex])
  else if AnsiSameText(Fieldname, 'DayOfBirth') then
    Result := TFakeField(FDaysOfBirth[FIndex])
  else
    Result := nil;
end;

procedure TFakeDataset.Next;
begin
  inc(FIndex);
end;

procedure TFakeDataset.Open;
begin
  First;
end;

{ TFakeField }

function TFakeField.GetAsString: string;
begin
  Result := FValue;
end;

(* Ende Fake, Anfang Simulation *)

procedure TfrmMain.FormCreate(Sender: TObject);
var
  Item: TListItem;
  Column: TListColumn;
begin
  FListview := TListview.Create(self);
  FListview.Parent := self;
  FListview.Align := alClient;
  FListview.ViewStyle := vsReport;
  Column := FListView.Columns.Add;
  Column.Caption := 'Name';
  Column.Width := 120;
  Column := FListView.Columns.Add;
  Column.Caption := 'Vorname';
  Column.Width := 120;
  Column := FListView.Columns.Add;
  Column.Caption := 'Geburtsdatum';
  Column.Width := 120;
  FDataset := TFakeDataset.Create;
  (* So sähe das in etwa auch bei einem "normalen" Dataset aus *)
  Dataset.Open;
  while not Dataset.EOF do
    begin
      Item := FListview.Items.Add;
      Item.Caption := Dataset.FieldByName('Name').AsString;
      Item.SubItems.Add(Dataset.FieldByName('Firstname').AsString);
      Item.SubItems.Add(Dataset.FieldByName('DayOfBirth').AsString);
      Dataset.Next;
    end;
  Dataset.Close;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  Dataset.Free;
end;

end.

Impulz 2. Dez 2011 05:22

AW: Datenübertragung von DB zu LV zu Grid
 
Vielen Dank ;) klappt alles soweit :). Danke, dass ihr mit mir die Geduld hattet


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz