Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Projekt "kopieren" (https://www.delphipraxis.net/72480-projekt-kopieren.html)

davar 1. Jul 2006 05:57

Datenbank: MySQL • Version: 4.x • Zugriff über: Zeos

Projekt "kopieren"
 
Hallo Leute,

ich habe ein Projekt "Kundendatenverwaltung" geschrieben. Dieses hat drei Formulare, eine Menge Komponenten und noch eine Menge Code. Nun möchte ich diese Kundenverwaltung kopieren und daraus eine Artikelverwaltung erstellen. Gern hätte ich Ideen dazu, wie ich den Kopiervorgang vereinfachen könnte.

Eine Möglichkeit, die mir einfällt, wäre, das Projekt von Anfang anzufangen und per Copy&Paste zu arbeiten und die zweite, das Projekt komplett zu kopieren und den Inhalt ändern. Aber gibt es vielleicht eine weitere, einfachere Möglichkeit? Hat jemand da eine Idee?


MfG

davar

chaosben 1. Jul 2006 06:10

Re: Projekt "kopieren"
 
Imho birgt die Copy and Paste Methode die Gefahr, das du eine Sache übersiehst und es nicht gleich merkst. Das Programm wird trotzdem funktionieren bis irgendwann irgendjemand diese eine Aktion macht und dann knallts.

Meiner Meinung nach ist jetzt der Zeitpunkt gekommen, wo du beginnen solltest deine Anwendung zu abstrahieren und objektorientierter zu arbeiten. Z.b. könntest du eine Klasse TEditor haben von der du später einen TEditorPersonal und einen TEditorArtikel ableitest. (Das ist jetzt nur ein ganz triviales Beispiel). Dann könntest du auch noch die Objekte der DB abstrahieren. Ein Kollege hat das Konzept neulich so angefangen: Es gibt eine Klasse vom TBuisnessLogicElement. Davon abgeleitet ist ein TBLArtikel. Wenn er jetzt einen TBLArtikel mit der richtigen Artikelnummer instanziert, geht der Artikel erstmal in die Datenbank und holt sich selbst alle Daten die er braucht. Wenn diese (zugegeben sehr umfangreiche) Struktur erstmal steht, dann programmierst du in der richtigen Anwendung nur noch mit kleinen 5-Zeilern. Und das macht dann richtig Spass. :)

Warum ich dir sowas rate? Weil du damit sehr zukunftsorientiert porgammierst. Stell dir vor, es kommt noch eine Modellverwaltung, eine Zeitenverwaltung, eine Bestellverwaltung, ... hinzu. Jedesmal würdest du wie "rumfrickel" müssen. Wenn du dir jetzt eine richtige Grundlage legst, sparst du dir in Zukunft viel Arbeit.

davar 1. Jul 2006 06:21

Re: Projekt "kopieren"
 
Also das "Was" habe ich verstanden, aber bei "Wie" hakt es..

Beispiel: ich habe ein Datenmodul mit DataSource- und Query-Komponenten, und ich habe ein Formular mit einer Menge Edits und Memos.

Ändern müsste ich jetzt:
a) die Querys (Tabellenname und Feldnamen)
b) Bezeichnungen der Komponenten (Edit, Memo usw.) und Zuweisung der Datenbankfelder zu diesen Komponenten.

Was kann ich nun wie und wovon ableiten?

Igotcha 1. Jul 2006 09:19

Re: Projekt "kopieren"
 
Zitat:

Zitat von davar
Also das "Was" habe ich verstanden, aber bei "Wie" hakt es..

Im Groben so:

In meinem aktuellen Projekt gibt es z.B. eine Klasse TContact:
Delphi-Quellcode:
type
  TContact = class(TObject)
  private
    FContactID:          integer;
    FSalutation:         integer;
    FTitle:              integer;
    FFName1:             String;
    FFName2:             String;
    FLName:              String;
    FBirthdate:          TDateTime;
    FPAddStreet:         String;
    ...
    OQuery:              TZQuery;
    ...
    procedure SetFCcontactID(const Value: Integer);
    procedure SetFFName1(const Value: String);
    procedure SetFSalutation(const Value: Integer);
    procedure SetFTitle(const Value: Integer);
    procedure SetFBirthdate(const Value: TDateTime);
    procedure SetFFName2(const Value: String);
    procedure SetFLName(const Value: String);
    procedure SetFPAddStreet(const Value: String);
    ...
  public
    property ContactID:      Integer  read FContactID write SetFCcontactID;
    property Salutation:     Integer  read FSalutation write SetFSalutation;
    property Title:          Integer  read FTitle write SetFTitle;
    property ForeName1:      String   read FFName1  write SetFFName1;
    property ForeName2:      String   read FFName2  write SetFFName2;
    property LastName:       String   read FLName write SetFLName;
    property Birthdate:      TDateTime read FBirthdate write SetFBirthdate;
    property Street:         String   read FPAddStreet write SetFPAddStreet;
    ...
    procedure LoadContact(aID: Integer);
    procedure AddCustomer(aCustomer: TCustomer);
    procedure RemoveCustomer(aID: Integer);

    constructor create;
...

procedure TContact.LoadContact(aID: Integer);
var
  myCustomer: TCustomer;
begin
    OQuery.SQL.Text:='SELECT * FROM kom_ko2000 WHERE id=:id';
    OQuery.ParamByName('id').AsInteger:=aID;
    OQuery.Open;
    If OQuery.RecordCount > 0 then
    begin
      Salutation:=OQuery.fieldbyname('salutation').AsInteger;
      Title:=OQuery.fieldbyname('title').AsInteger;
      ForeName1:=OQuery.fieldbyname('fname1').AsString;
      ForeName2:=OQuery.fieldbyname('fname2').AsString;
      ForeName1:=OQuery.fieldbyname('fname1').AsString;
      LastName:=OQuery.fieldbyname('lname').AsString;
      Birthdate:=OQuery.fieldbyname('birthdate').AsDateTime;
      Street:=OQuery.fieldbyname('street').AsString;
      Postal:=OQuery.fieldbyname('postal').AsString;
      City:=OQuery.fieldbyname('city').AsString;
      Region:=OQuery.fieldbyname('region').AsString;
      Country:=OQuery.fieldbyname('country').AsInteger;
      AddNote:=OQuery.fieldbyname('addnote').AsString;
      Phone1:=OQuery.fieldbyname('phone1').AsString;
      Phone2:=OQuery.fieldbyname('phone2').AsString;
      Mobile:=OQuery.fieldbyname('mobile').AsString;
      Fax:=OQuery.fieldbyname('fax').AsString;
      EMail1:=OQuery.fieldbyname('email1').AsString;
      EMail2:=OQuery.fieldbyname('email2').AsString;
      ContactBy:=OQuery.fieldbyname('contactby').AsInteger;
      ContactDate:=OQuery.fieldbyname('contactdate').AsDateTime;
      ContactCreatedBy:=OQuery.fieldbyname('contactcreatedby').AsInteger;
      MaritalStatus:=OQuery.fieldbyname('maritalstatus').AsInteger;
      MALetter:=OQuery.fieldbyname('maletter').AsInteger;
      MAEmail:=OQuery.fieldbyname('maemail').AsInteger;
      MAFax:=OQuery.fieldbyname('mafax').AsInteger;
      MAPhone:=OQuery.fieldbyname('maphone').AsInteger;
      Note:=OQuery.fieldbyname('note').AsString;
      // Customer zu Contact laden
      CustomerList.Clear;
      OQuery.SQL.Text:='SELECT c.id FROM kom_ko3000 cc JOIN kom_ko1000 c ON c.id = cc.custid WHERE cc.contactid=:contactid ORDER BY c.name1 ASC';
      OQuery.ParamByName('contactid').AsInteger:=ContactID;
      OQuery.Open;
      While not OQuery.Eof do
      begin
        myCustomer:=TCustomer.Create;
        myCustomer.LoadCustomer(OQuery.fieldbyname('id').AsInteger);
        AddCustomer(myCustomer);    
      OQuery.Next;
      end;
      // ====================================================================
    end;
    OQuery.Close;
end;
In meinem Hauptprogramme mache ich dann z.B. folgendes:
Delphi-Quellcode:
        OKONTAKT.LoadContact(iContactID);
        Edit41.Text:=OKONTAKT.ForeName1;
        Edit43.Text:=OKontakt.ForeName2;
        Edit42.Text:=OKontakt.LastName;
        DateTimePicker1.Date:=OKontakt.Birthdate;
        Edit47.Text:=OKontakt.Street;
Viele Grüße
Igotcha

davar 1. Jul 2006 12:46

Re: Projekt "kopieren"
 
Also komplett verstanden habe ich es ehrlich gesagt immer noch nicht.

Ich kann jetzt eine Klasse TKunden erstellen. In dieser Klasse selbst kann ich drei Formulare erstellen und in diesen drei Formularen wiederum kann ich alle Komponenten erstellen und positionieren, und zwar alles zur Laufzeit. Das ganze soll später nämlich in eine dll-Datei ausgelagert werden. Also habe ich ein paar hundert Zeilen Quellcode für die Klasse TKunden.

Nur, wo spare ich jetzt Arbeit, wenn ich die Klasse TKunden in die Klasse TArtikel kopieren möchte? Dann muss ich doch trotzdem sämtliche Formulare, sämtliche Komponenten und sämtliche Prozeduren durchgehen und einzeln ändern oder nicht? Schließlich habe ich bei den Artikeln einen ganz anderen Tabellen-, Formular- und Komponentenaufbau.


MfG

davar

Igotcha 1. Jul 2006 16:21

Re: Projekt "kopieren"
 
Der Ansatz ist ein anderer: In meinem Beispiel sind die Klassen TContact (und andere) erstmal völlig losgelöst von irgendwelchen Forms (also Logik von GUI getrennt).

Der Vorteil daraus ist, dass ich meine grafische Ausgabe auch später gestalten, erweitern, reduzieren, etc. kann, ohne jemals wieder die Klasse TContact anfassen zu müssen, da ich durch die Benutzung eines TContact-Objekts immer und von überall auf die "Properties" und "Methoden" des Objekts zugreifen und mir so alle Informationen holen und setzen kann.

Du vermischst Form und Klassen. Bei Dir heisst eine Form z.B. TKunde, ist aber eigentlich kein "Kundenobjekt".

Was machst Du z.B., wenn Du noch in einer anderen Form Daten aus Deinem "Kundenobjekt" anzeigen lassen möchtest? Geht bei Dir gar nicht anders, als dass Du für die neue Form ebenfalls ein "Kundenobjekt" programmierst.

In meinem Fall erstelle ich einfach in der neuen Form auch ein TContact-Objekt und kann, genauso wie in der alten Form, mit diesem Objekt arbeiten. Also einmal implementiert, überall verwendbar.

Viele Grüße
Igotcha

davar 1. Jul 2006 16:50

Re: Projekt "kopieren"
 
Zitat:

Zitat von Igotcha
Der Ansatz ist ein anderer: In meinem Beispiel sind die Klassen TContact (und andere) erstmal völlig losgelöst von irgendwelchen Forms (also Logik von GUI getrennt).

Also gut.

Ich habe eine Klasse "TKunden". Darin habe ich sagen wir mal drei Prozeduren "Kunde auslesen", "Kunde einfügen" und "Kunde ändern". In diese Prozeduren schreibe ich jeweils den Code hinein.

Nun erstelle ich - unabhängig davon - die Oberfläche. Ich erstelle ein Formular und setze dort die Komponenten hinein. Und als Prozedur gebe ich z.B. "TKunden.Kundeauslesen" ein. Hab ich das jetzt richtig verstanden?

Wenn ja, liegt also die Arbeitsersparnis darin, dass ich (beim Kopieren zu TArtikel) die Prozeduren beibehalte und lediglich ihren Inhalt - bezogen auf die Tabellen - ändere?

davar 3. Jul 2006 16:47

Re: Projekt "kopieren"
 
Zitat:

Zitat von Igotcha
Delphi-Quellcode:
type
  TContact = class(TObject)
  private
    OQuery:              TZQuery;
  public
    constructor create;
In meinem Hauptprogramme mache ich dann z.B. folgendes:
Delphi-Quellcode:
        OKONTAKT.LoadContact(iContactID);
        Edit41.Text:=OKONTAKT.ForeName1;
        Edit43.Text:=OKontakt.ForeName2;
        Edit42.Text:=OKontakt.LastName;
        DateTimePicker1.Date:=OKontakt.Birthdate;
        Edit47.Text:=OKontakt.Street;
Viele Grüße
Igotcha

Hallo,

so langsam komm ich jetzt wohl doch mit. Aber zwei kurze Sachen noch:

1. Wie erstelle ich die Komponenten (DataSource, Query)? Wenn ich ein neues Formular erstelle und dort zur Laufzeit die Komponenten erstelle, geht es. Wenn ich aber eine neue Unit nehme (ohne Formular) geht es nicht. Brauch ich unbedingt ein Formular dafür?

2. Wie ist es mit datensensitiven Komponenten? Was gebe ich bei einem DBGrid als DataSource an?

SirThornberry 3. Jul 2006 17:19

Re: Projekt "kopieren"
 
Neben der Variante des ableitens gibt es auch noch die Variante mit Compiler-Schaltern zu arbeiten.

Igotcha 3. Jul 2006 22:58

Re: Projekt "kopieren"
 
Zitat:

Zitat von davar
so langsam komm ich jetzt wohl doch mit. Aber zwei kurze Sachen noch:

1. Wie erstelle ich die Komponenten (DataSource, Query)? Wenn ich ein neues Formular erstelle und dort zur Laufzeit die Komponenten erstelle, geht es. Wenn ich aber eine neue Unit nehme (ohne Formular) geht es nicht. Brauch ich unbedingt ein Formular dafür?

2. Wie ist es mit datensensitiven Komponenten? Was gebe ich bei einem DBGrid als DataSource an?

Nee, noch nicht richtig verstanden ;-)

zu 1. Die erstellst Du nicht auf dem Formular, sondern in Deiner Klasse. Stell Dir mal bitte Klasse und Anzeigeformular als 2 Dinge vor, die rein gar nichts voneinander wissen.

Also in der Klasse z.B. im Create-Event:
Delphi-Quellcode:
  OQuery:=TZquery.Create
Du musst das Ganze abstrakter sehen:

- "Hallo, ich bin ein Formular und habe mir gerade ein TKontakt-Objekt names 'Kontakt' erstellt"
Delphi-Quellcode:
Kontakt := TKontakt.Create;
- "Kontakt, beschaffe Dir mal bitte die Kontaktdaten für die ID 4711"
Delphi-Quellcode:
Kontakt.LoadData(4711);
- "Hallo Kontakt, ich brauche mal bitte den 'Nachnamen' aus Deinen Kontaktdaten, da ich diesen im Edit1 anzeigen lassen möchte"
Delphi-Quellcode:
Edit1.Text := Kontakt.Nachname;
- "Hallo Kontakt, jetzt brauche ich mal bitte die Liste der Vorgänge, damit ich diese in einer Listbox anzeigen lassen kann"
Delphi-Quellcode:
For ix:=0 to Kontakt.VorgangsListe.Count -1 do
  begin
    ListBox1.Items.Add(TVorgang(Kontakt.Vorgangsliste[ix]).Bezeichnung);
  end;
zu 2. Geh bitte von den datensensitiven Komponenten weg, da diese mehr Probleme als Nutzen bereiten. Nimm stattdessen normale Edit, etc. Für Listen empfehle ich den VirtualStringTree.

Viele Grüße
Igotcha

Hansa 4. Jul 2006 01:35

Re: Projekt "kopieren"
 
Ausgangspunkt :

Zitat:

Zitat von davar
ich habe ein Projekt "Kundendatenverwaltung" geschrieben. Dieses hat drei Formulare, eine Menge Komponenten und noch eine Menge Code. Nun möchte ich diese Kundenverwaltung kopieren und daraus eine Artikelverwaltung erstellen. Gern hätte ich Ideen dazu, wie ich den Kopiervorgang vereinfachen könnte.
...

Aber wegen dem hier :

Zitat:

Zitat von Igotcha
Du musst das Ganze abstrakter sehen:

muß ich meinen Senf dazugeben. Das sieht in der Praxis nämlich allesandere als abstrakt aus. Er muß den größten gemeinsamen Nenner finden. Möglichst viel gleichartiges in allgemeine Form einbauen. Also die "Komponenten", auch Events, Datasets (ohne SQLs) usw. Das alles in die Objektablage schieben. Von diesem Formular ableiten und die konkreten Sachen besetzen. Also dann erst die SQLs besetzen. Labels/edits usw. richtig anordnen. Um sich letzteres zunutze zu machen reicht es eben nicht so etwas zu schreiben : TMyForm = class (TForm). Die VCL-Vorteile wären dann eben weg.

Und wer sich die Mühe macht, das Beschriebene mal durchzuexerzieren, der soll sich mal die aus der Objektablage abgeleitete Form ansehen. Insbesondere auch die DFM. Jede Eigenschaft, die verändert wurde steht dann da drin als INHERITED.

P.S.: Igotchas Bedenken wegen datensensitiver Komponenten kann ich nur bestätigen.

davar 4. Jul 2006 04:31

Re: Projekt "kopieren"
 
Zitat:

Zitat von Igotcha
Nee, noch nicht richtig verstanden ;-)

zu 1. Die erstellst Du nicht auf dem Formular, sondern in Deiner Klasse. Stell Dir mal bitte Klasse und Anzeigeformular als 2 Dinge vor, die rein gar nichts voneinander wissen.


:pale: :cry:

Ich glaube bei mir fehlt einfach das Fundament..

Also, ich starte Delphi zum allerallerersten mal und weiss nicht, was man so damit machen muss :stupid: . Wo erstelle ich nun die Klasse TKontakt (bzw. bei mir TKundendaten)? Sage ich "Neue Anwendung" und schreibe den gesamten Code unter Unit1, oder sage ich "Neu/Unit", erstelle dort die Klasse und binde sie später zu meinem Projekt? Letzteres habe ich versucht und bei

Delphi-Quellcode:
Kundendaten:= TKundendaten.Create;
ständig die Fehlermeldung
Zitat:

Nicht genügend wirkliche Parameter
bekommen.

Und bei
Delphi-Quellcode:
Kundendaten:= TKundendaten.Create(Self);
sagt der mir ständig
Zitat:

Inkompatible Typen: 'TComponent' und 'TKundendaten'

P.S.: Bitte nicht denken, dass ich hier nur auf Antworten warte. Ich schlage mich nebenbei durch Bücher und Tutorials durch, um die ganze Sache mit Klassen und Objekten zu verstehen. :)

chaosben 4. Jul 2006 05:13

Re: Projekt "kopieren"
 
Zitat:

Zitat von davar
Ich glaube bei mir fehlt einfach das Fundament..

...

Delphi-Quellcode:
Kundendaten:= TKundendaten.Create;
ständig die Fehlermeldung
Zitat:

Nicht genügend wirkliche Parameter
bekommen.

Und bei
Delphi-Quellcode:
Kundendaten:= TKundendaten.Create(Self);
sagt der mir ständig
Zitat:

Inkompatible Typen: 'TComponent' und 'TKundendaten'

Mach am besten dafür einen neuen Thread auf; dann kannst du dich vor Antworten und Hilfestellungen nicht mehr retten. :)
Und dann noch ein Vorschlag: Wenn du den Inhalt des neuen Threads vollständig in deinen Kopf injiziert hast :D reden wir über das Problem dieses Threads hier weiter. :)

woki 4. Jul 2006 07:55

Re: Projekt "kopieren"
 
Hi,

wenn dieses Projekt kein reines Spaß und Lernprojekt ist, und es einfach darum geht aus drei Formularen sechs zu machen, und das Ding auch noch dieses Jahr fertig werden soll, (wegen des bei dir ansonsten noch nötigen know how Aufbbaus), und du das beruflich brauchst, würde ich einfach folgendes Copy Paste Vorgehen empfehlen:

Einfach Formular in der IDE aktivieren, "speichern unter" anwählen, das alte Formular wieder dem Projekt hinzufügen, und das für alle drei Formulare und dann halt die neuen Anpassen.

Oder einfach (s. Hansa) Formulare der Objektverwaltung hinzufügen, und von da wieder dem Projekt hinzufügen. Und dann die Änderungen anbringen. Auch in diesem Fall würde ich aber kopieren, und für dich noch nicht vererben empfehlen.

Während du das tust, kannst du ja so nebenbei mal schauen, wie Objektorientierung und Vererbung es dir ermöglichen, Dinge die in beiden Funktionalitäten identisch sind, nur einmal zu coden.


Woki

Igotcha 4. Jul 2006 09:26

Re: Projekt "kopieren"
 
Zitat:

Zitat von davar
P.S.: Bitte nicht denken, dass ich hier nur auf Antworten warte. Ich schlage mich nebenbei durch Bücher und Tutorials durch, um die ganze Sache mit Klassen und Objekten zu verstehen. :)

Na gut, dann wollen wir mal ;-)

Delphi-Quellcode:
unit UContact;

interface

uses
  Contnrs, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, xMain,
  Dialogs, UCustomer;

type
  TContactCustomerAdds = class(TObject)
  private
    FCustomerID:         integer;
    FPhone1:             String;
    FPhone2:             String;
    FMobile:             String;
    FFax:                String;
    FEmail:              String;
    FAssName:            String;
    FAssPhone:           String;
    FAssEmail:           String;
    procedure SetFCustomerID(const Value: integer);
    procedure SetFPhone1(const Value: String);
    procedure SetFAssEmail(const Value: string);
    procedure SetFAssName(const Value: string);
    procedure setFAssPhone(const Value: string);
    procedure SetFEmail(const Value: string);
    procedure SetFFax(const Value: string);
    procedure SetFMobile(const Value: string);
  public
  property CustomerID:   integer read FCustomerID write SetFCustomerID;
  property Phone1:       String read FPhone1  write SetFPhone1;
  property Phone2:       String read FPhone2  write SetFPhone1;
  property Mobile:       string read FMobile write SetFMobile;
  property Fax:          string read FFax write SetFFax;
  property Email:        string read FEmail write SetFEmail;
  property AssName:      string read FAssName write SetFAssName;
  property AssPhone:     string read FAssPhone write setFAssPhone;
  property AssEmail:     string read FAssEmail write SetFAssEmail;

  constructor create;
end;

type
  TContact = class(TObject)
  private
    FContactID:          integer;
    FSalutation:         integer;
    FTitle:              integer;
    FFName1:             String;
    FFName2:             String;
    FLName:              String;
    FBirthdate:          TDateTime;
    FPAddStreet:         String;
    FPAddPostal:         String;
    FPAddCity:           String;
    FPAddRegion:         String;
    FPAddCountry:        Integer;
    FPhone1:             String;
    FPhone2:             String;
    FMobile:             String;
    FFax:                String;
    FEMail1:             String;
    FEmail2:             String;
    FContactBy:          Integer;
    FContactDate:        TDateTime;
    FContactCreatedBy:   Integer;
    FMaritalStatus:      Integer;
    FMALetter:           integer;
    FMAEmail:            integer;
    FMAFax:              integer;
    FMAPhone:            integer;
    FNote:               String;
    FAddNote:            String;
    FCustomerList:       TObjectList;
    FCustomerAddsList:   TObjectList;
    OQuery1, OQuery2:              TZQuery;
    procedure SetFCcontactID(const Value: Integer);
    procedure SetFFName1(const Value: String);
    procedure SetFSalutation(const Value: Integer);
    procedure SetFTitle(const Value: Integer);
    procedure SetFBirthdate(const Value: TDateTime);
    procedure SetFFName2(const Value: String);
    procedure SetFLName(const Value: String);
    procedure SetFPAddStreet(const Value: String);
    procedure SetFPAddCity(const Value: String);
    procedure SetFPAddPostal(const Value: String);
    procedure SetFPAddRegion(const Value: String);
    procedure SetFPhone1(const Value: String);
    procedure SetFEMail1(const Value: String);
    procedure SetFFax(const Value: String);
    procedure SetFMobile(const Value: String);
    procedure SetFPhone2(const Value: String);
    procedure SetFEMail2(const Value: String);
    procedure SetFPAddCountry(const Value: Integer);
    procedure SetFContactBy(const Value: Integer);
    procedure SetFContactDate(const Value: TDateTime);
    procedure SetFContactCreatedBy(const Value: Integer);
    procedure SetFMaritalStatus(const Value: Integer);
    procedure SetFMALetter(const Value: integer);
    procedure SetFMAEmail(const Value: integer);
    procedure SetFMAFax(const Value: integer);
    procedure SetMAPhone(const Value: integer);
    procedure SetFNote(const Value: String);
    procedure SetFAddNote(const Value: String);
    procedure SetFCustomerList(const Value: TObjectList);
    procedure SetFCustomerAddsList(const Value: TObjectList);
  public
    property ContactID:      Integer  read FContactID write SetFCcontactID;
    property Salutation:     Integer  read FSalutation write SetFSalutation;
    property Title:          Integer  read FTitle write SetFTitle;
    property ForeName1:      String   read FFName1  write SetFFName1;
    property ForeName2:      String   read FFName2  write SetFFName2;
    property LastName:       String   read FLName write SetFLName;
    property Birthdate:      TDateTime read FBirthdate write SetFBirthdate;
    property Street:         String   read FPAddStreet write SetFPAddStreet;
    property Postal:         String   read FPAddPostal write SetFPAddPostal;
    property City:           String   read FPAddCity write SetFPAddCity;
    property Region:         String   read FPAddRegion write SetFPAddRegion;
    property Country:        Integer  read FPAddCountry write SetFPAddCountry;
    property AddNote:        String   read FAddNote write SetFAddNote;
    property Phone1:         String   read FPhone1 write SetFPhone1;
    property Phone2:         String   read FPhone2 write SetFPhone2;
    property Mobile:         String   read FMobile write SetFMobile;
    property Fax:            String   read FFax write SetFFax;
    property EMail1:         String   read FEMail1 write SetFEMail1;
    property EMail2:         String   read FEMail2 write SetFEMail2;
    property ContactBy:      Integer  read FContactBy write SetFContactBy;
    property ContactDate:    TDateTime read FContactDate write SetFContactDate;
    property ContactCreatedBy:Integer  read FContactCreatedBy write SetFContactCreatedBy;
    property MaritalStatus:  Integer  read FMaritalStatus write SetFMaritalStatus;
    property MALetter:       integer  read FMALetter write SetFMALetter;
    property MAEmail:        integer  read FMAEmail write SetFMAEmail;
    property MAFax:          integer  read FMAFax write SetFMAFax;
    property MAPhone:        integer  read FMAPhone write SetMAPhone;
    property Note:           String   read FNote write SetFNote;
    property CustomerList:   TObjectList read FCustomerList write SetFCustomerList;
    property CustomerAddsList:   TObjectList read FCustomerAddsList write SetFCustomerAddsList;
    procedure LoadContact(aID: Integer);
    procedure AddCustomer(aCustomer: TCustomer);
    procedure AddCustomerAdds(aCustomerAdds: TContactCustomerAdds);
    procedure RemoveCustomer(aID: Integer);

    constructor create;
end;



implementation

{ TContact }

procedure TContact.AddCustomer(aCustomer: TCustomer);
begin
    FCustomerList.Add(aCustomer);
end;

procedure TContact.AddCustomerAdds(aCustomerAdds: TContactCustomerAdds);
begin
    FCustomerAddsList.Add(aCustomerAdds);
end;

constructor TContact.create;
begin
    OQuery1:=TZQuery.Create(nil);
    OQuery1.Connection:=XForm.XBASDBC;
    OQuery2:=TZQuery.Create(nil);
    OQuery2.Connection:=XForm.XBASDBC;
    FCustomerList:=TObjectList.Create(true);
    FCustomerAddsList:=TObjectList.Create(true);
end;

procedure TContact.LoadContact(aID: Integer);
var
  myCustomer: TCustomer;
  myCustomerAdds: TContactCustomerAdds;
begin
    OQuery1.SQL.Text:='SELECT * FROM kom_ko2000 WHERE id=:id';
    OQuery1.ParamByName('id').AsInteger:=aID;
    OQuery1.Open;
    If OQuery1.RecordCount > 0 then
    begin
      Salutation:=OQuery1.fieldbyname('salutation').AsInteger;
      Title:=OQuery1.fieldbyname('title').AsInteger;
      ForeName1:=OQuery1.fieldbyname('fname1').AsString;
      ForeName2:=OQuery1.fieldbyname('fname2').AsString;
      ForeName1:=OQuery1.fieldbyname('fname1').AsString;
      LastName:=OQuery1.fieldbyname('lname').AsString;
      Birthdate:=OQuery1.fieldbyname('birthdate').AsDateTime;
      Street:=OQuery1.fieldbyname('street').AsString;
      Postal:=OQuery1.fieldbyname('postal').AsString;
      City:=OQuery1.fieldbyname('city').AsString;
      Region:=OQuery1.fieldbyname('region').AsString;
      Country:=OQuery1.fieldbyname('country').AsInteger;
      AddNote:=OQuery1.fieldbyname('addnote').AsString;
      Phone1:=OQuery1.fieldbyname('phone1').AsString;
      Phone2:=OQuery1.fieldbyname('phone2').AsString;
      Mobile:=OQuery1.fieldbyname('mobile').AsString;
      Fax:=OQuery1.fieldbyname('fax').AsString;
      EMail1:=OQuery1.fieldbyname('email1').AsString;
      EMail2:=OQuery1.fieldbyname('email2').AsString;
      ContactBy:=OQuery1.fieldbyname('contactby').AsInteger;
      ContactDate:=OQuery1.fieldbyname('contactdate').AsDateTime;
      ContactCreatedBy:=OQuery1.fieldbyname('contactcreatedby').AsInteger;
      MaritalStatus:=OQuery1.fieldbyname('maritalstatus').AsInteger;
      MALetter:=OQuery1.fieldbyname('maletter').AsInteger;
      MAEmail:=OQuery1.fieldbyname('maemail').AsInteger;
      MAFax:=OQuery1.fieldbyname('mafax').AsInteger;
      MAPhone:=OQuery1.fieldbyname('maphone').AsInteger;
      Note:=OQuery1.fieldbyname('note').AsString;
      // Customer zu Contact laden
      CustomerList.Clear;
      OQuery1.SQL.Text:='SELECT c.id FROM kom_ko3000 cc JOIN kom_ko1000 c ON c.id = cc.custid WHERE cc.contactid=:contactid ORDER BY c.name1 ASC';
      OQuery1.ParamByName('contactid').AsInteger:=ContactID;
      OQuery1.Open;
      While not OQuery1.Eof do
      begin
        myCustomer:=TCustomer.Create;
        myCustomer.LoadCustomer(OQuery1.fieldbyname('id').AsInteger);
        AddCustomer(myCustomer);
        // Kundenspezifische Informationen zum Kontakt laden
        OQuery2.SQL.Text:='SELECT * FROM kom_ko3010 WHERE custid=:custid AND contactid=:contactid';
        OQuery2.ParamByName('custid').AsInteger:=OQuery1.fieldbyname('id').AsInteger;
        OQuery2.ParamByName('contactid').AsInteger:=ContactID;
        OQuery2.Open;
        myCustomerAdds:=TContactCustomerAdds.create;
        myCustomerAdds.FCustomerID:=OQuery1.fieldbyname('id').AsInteger;
        myCustomerAdds.FPhone1:=OQuery2.fieldbyname('phone1').AsString;
        AddCustomerAdds(myCustomerAdds);
        OQuery2.Close;
        // =================================================
      OQuery1.Next;
      end;
      // ====================================================================
    end;

    OQuery1.Close;
end;
Hierbei sind alle "property"-Methoden mal weggelassen worden (durch SHIFT+STRG+C werden diese automatisch erstellt.

xMAIN in der uses-Klausel ist mein Core-Modul in meinem Projekt (da steht quasi die DB-Verbindung drin), xForm ist die Main-Form meines Anwendungssystems. Du könntest auch das OnCreate-Event überschreiben und als Parameter Deine ZConnection mitgeben, damit Du dann die DB-Connection hast.

In der Unit gibt es 2 Klassen:

1. TContact und
2. TContactCustomerAdds (das sind zusätzliche Firmeninfos zu einem Kontakt [bei mir eine Person]. Eine Person kann bei mir in mehreren Firmen aktiv sein).

Dann wird weiter unten noch die Klasse TCustomer verwendet, die analog "Firmen-Objekte" abbildet.

Die o.g. Unit bindest Du in Deine Mainform ein. Entweder benutzt Du dann eine globale Variable "Kontakt", die vom Typ TContact ist, oder Du erstellst diese in den jeweiligen Proceduren, wo Du mit Kontaktdaten arbeitest.

Gruß Igotcha

davar 4. Jul 2006 10:47

Re: Projekt "kopieren"
 
Zitat:

Zitat von Igotcha
Delphi-Quellcode:
OQuery1:=TZQuery.Create(nil);

Aha. Das war meine letzte Hürde :)

Vielen Dank für die Mühe und die verständlichen Antworten an alle, insbesondere an Igotcha :hi:

MfG

davar


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr.

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