![]() |
Tabelleninhalt in Checklistbox anzeigen
Hallo, ich stehe vor folgendem Problem.
Ich möchte in einer Kundendatenbank diverse Kategorien mit abspeichern. d. h. in einer eigenen Tabelle sind die div. Kategorien abgelegt - z. B. Bau,Metall,Holz usw. Diese sollen dann in einer Eingabemaske einem Kunden zugeordnet werden können. Es wäre am einfachsten, wenn das über eine Checklistbox geht. Zu einem Kunden können aber auch mehrere Kategorien gehören. (m:n - Beziehung) Kann mir jemand helfen dies zu realisieren ? |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
wo genau brauchst du Hilfe. Willst du wissen wie man einen Eintrag in eine Listbox schreibt? Willst du wissen wie man auf eine Datenbanktabelle zugreift (dann sag uns noch welche DB und ggf. welche Komponentensammlung du nutzt)? |
Re: Tabelleninhalt in Checklistbox anzeigen
Hab mich zu ungenau ausgedrückt.
Benutze Paradox Datenbanken. Habe 2 Tabellen; eine davon enthält die Adresse und die andere unterschiedliche Branchen. Nun habe ich eine Eingabemaske erstellt, die auf der einen Seite die Adressdaten enthält und auf der anderen sollen die jeweils zugehörigen Branchen in einer Checklistbox angekreuzt werden. Die Datenbankanbindung über die Table-Komponente funktioniert ja. Nur wie stelle ich es an, dass die zu einer bestimmten Adresse die jeweiligen Branchen in einer Checklistbox angezeigt werden. Oder gibt es vielleicht eine elegantere Lösung hierzu, als diese in einer Checklistbox anzeigen zu lassen ? Hab mir halt die vorgestellt, weil man hier nur die entspr. Haken setzen muss. Diese sollen dann in der Branchen Tabelle gespeichert werden. Gibt es so was wie eine DBCheckListBox ? Ich hoffe, dass ich es nun besser erklären konnte. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
das sind zwei Probleme. Zunächst einmal willst du jeder beliebigen Adresse m verschiede Branchen aus der Branchentabelle zuordnen. Das macht man in der Regel über eine dritte Tabelle. Nenne die dritte Tabelle einfach AdressenBranchen. Diese hat nur 2 Felder, nämlich die ID der Adresse und die ID der Branche. Beide Felder zusammen bilden den Schlüssel. Alternativ dazu kannst du noch eine eigene ID in der dritten Tabelle definieren, die den Schlüssel darstellt. Jetzt könntest du in deinem Formular einfach eine Master-Detail Verbindung herstellen, wobei der Master die Adresstabelle ist und die neue AdressenBranchen Tabelle die Detaildatensätze zur Verfügung stellt. Über einen Lookup zeigst du aber nicht die ID der Branche, sondern die Bezeichnung an. Die Anzeige über eine Checklist ist natürlich auch eine gute Lösung. Dazu fügst du zunächst alle möglichen Branchen als Items ein. Dann gehst du durch die Detail Tabelle und stellst fest, welche Branchen für diese Adresse bereits eingetragen sind und markierst diese in der ChecklistBox. Bei jeder Änderung in der Checklistbox fügst einen Datensatz in die Detailtabelle ein oder löscht den entsprechenden Eintrag. Eine DBCheckList bietet sich hier nicht an, weil dieses nur den Zustand eines Feldes darstellt, der in der Regel ein Boolscher Wert ist. |
Re: Tabelleninhalt in Checklistbox anzeigen
OK, vielen Dank,
den Lösungsweg hab ich verstanden, hab aber noch einige Fragen dazu. Soll ich in der AdressenBranchen-Tabelle einen zusammengesetzen Schlüssel (Adr_ID + BR_ID) definieren? Kannst du mir noch genau angeben wie das mit der Master/Detailverbindung genau funktioniert ? Hab jetzt folgende 3 Tabellen: 1. Tabelle Adressen Nr : Zähler Name : String 2. Tablelle AdressenBranchen Nr : Zähler Adr_ID : LongInt Bra_ID : LongInt 3. Tablle Branchen Nr : Zähler Gruppe : Integer Bez : String Was stelle ich genau bei MasterSource in welcher Tabelle ein. Wei mache ich es dann mit dem Lookup ? Für ein paar mehr Details wäre ich dir sehr dankbar. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
zunächst musst du für Tabelle AdressenBranchen noch einen SekundärIndex definieren. Nenne ihn "nachAdressen" und wähle das Feld Adr_ID aus. Jetzt packst du 3 TTable Objekte auf dein Formular und 2 Sourcen. Verbinde die 3 Tabellen Objekte mit je einer Tabelle. Setze jetzt MasterSource von TabAdrBra auf SrcAdressen (DataSource auf die Adressentabelle). Wähle MasterField aus und selektiere dort zunächst den neuen Index "nachAdressen", den du mit dem Nr Feld aus Adressen verbindest. Wenn du jetzt noch 2 DBGrids auf das Formular packst und mit SrcAdressen bzw. SrcAdrBra verbindest, kannst du nach dem Öffnen der Tabellen schon einmal sehen, wie die Verbindung funktioniert. Füge über den Feldeditor alle Felder von Adressen und AdressenBranchen hinzu. Klicke mit der rechten Taste im Feldeditor der Tabelle TabAdrBra und wähle "Neues Feld": Name = Branchen, Typ = (gleicher Typ wie Bez in Tabelle Branchen), Größe (wie Bez in Branchen), FeldTyp = Nachschlagen, Schlüsselfelder = Adr_Br, Datenmenge = TabBranchen, Schlüssel = Nr, ErgebnisFeld = Bez. Jetzt setzt du noch die Eigenschaft Visible von den Feldern aus TabAdrBra auf false, die nicht angezeigt werden sollen. Und FERTIG! :mrgreen: |
Re: Tabelleninhalt in Checklistbox anzeigen
Super,
bin jetzt schon einen riesen Schritt weiter; Aber wie man die Branchen dann in einer Checklisbox auswählen kann, könntest du mir noch verraten. Und wie verknüpft man die dann ? |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
zur Initialisierung der Checklistbox läufst du z.B. beim OnCreate des Formulars durch die Branchentabelle und fügst alle Einträge zur Items Eigenschaft hinzu. Das DataSource Object, dass der Adressen Tabelle zugeordnet ist, zeigt an, wenn ein anderer Datensatz aktiviert wird und zwar über sein OnDataChange Event. In diesem Fall läufst du durch die Detailtabelle TabAdrBra und aktivierst für alle gefundenen Einträge die entsprechende CheckBox in der CheckBoxList, damit sind diese beiden Elemente zunächst synchronisiert. Jetzt musst du nur noch auf das OnClickCheck Event der CheckListBox reagieren und die Änderung, die der Benutzer in der CheckListBox durchgeführt hat in die TabAdrBra Tabelle übernehmen. |
Re: Tabelleninhalt in Checklistbox anzeigen
Tausend Dank erstmal,
werde das gleich mal probieren. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hat alles geklapt, nur mit der letzten Problematik komm ich noch nicht ganz klar.
Wie setzt man den Haken in der CheckListBox beim Durchlaufen der TabAdrBra ? Und wie sieht die OnClickCheck Routine aus ? Wie aktualisiere ich dann die TabAdrBra Tabelle ? Kannst du mir hier vielleicht nochmals behilflich sein ? Vielleicht ein paar Codeschnipsel oder so. Besten Dank im voraus. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
du läufst durch die Tabellee und suchst den entsprechenden Bezeichner in der Liste mit IndexOf:
Delphi-Quellcode:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var i, index: Integer; begin for i := 1 to CheckListBox1.Count do CheckListBox1.State[i-1] := cbUnchecked; Table2.Open; Table2.First; while not Table2.Eof do begin index := CheckListBox1.Items.IndexOf(Table2Branchen.AsString); if index > -1 then CheckListBox1.State[index] := cbChecked; Table2.Next; end; end; |
Re: Tabelleninhalt in Checklistbox anzeigen
Danke für die schnelle Antwort;
Warum zum Teufel bekomme ich jetzt die Compilermeldung, dass 'cbUnchecked' ein undefinierter Bezeichner ist. Hab ich irgendetwas nicht eingebunden (uses) oder so ? Habs doch auch richtig geschrieben. Tut mir leid - bin halt kein Ass im Programmieren. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
in Delphi 7 sind die Konstanten cbChecked und chUnchecked in der Unit StdCtrls definiert. |
Re: Tabelleninhalt in Checklistbox anzeigen
Ok - jetzt benötige ich nur mehr die OnClickCheck-Event Routine, den Rest kann ich dann noch verfeinern.
Danke im voraus. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
wo ist denn das Problem? Wie weit bist du gekommen als du versucht hast die Methode zu schreiben? Ich hab zwar eine Lösung geschrieben, aber die möchte ich dir nicht einfach so geben. Du solltest zunächste einmal deine OnCreate Methode so anpassen, dass du dir neben dem Bezeichner der Branche auch die ID merkst. Das könntest du z.B. mit AddObject machen, wobei du als Objekt einfach einen gecasteten Integer übergibst, denn TObject ist ja letztlich eine Adresse und bietet damirt genug Platz für einen Integer. Du könntest als Objekt also z.B. TObject(TabBranchenNr.AsInteger) benutzen. Versuche dann einmal die OnClickCheck Methode zu schreiben, bzw. sage genau wo das Problem ist. |
Re: Tabelleninhalt in Checklistbox anzeigen
Also das mit dem TObject hab ich nicht verstanden.
Hab versucht folgendes zu schreiben:
Delphi-Quellcode:
bin aber dann doch nicht weiter gekommen.
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var i : integer; begin i := CheckListBox1.ItemIndex; Table2.Append; Table2Branchen.Value := CheckListBox1.Items[i]; Table2BR_ID.Value := CheckListBox1.Items.IndexOf(Table2Branchen.AsString); ... end; Muss noch über den CheckListBox-Index auf die richtige BRA_ID kommen. |
Re: Tabelleninhalt in Checklistbox anzeigen
Hallo needatip,
Zitat:
Delphi-Quellcode:
Beim Klicken:
procedure TForm1.FormCreate(Sender: TObject);
begin TabBranchen.Open; while Not TabBranchen.Eof do begin CheckListBox1.Items.AddObject(TabBranchenBezeichner.AsString, TObject(TabBranchenNr.AsInteger));//<- Nr als Object speichern TabBranchen.Next; end; DataSource1DataChange(Self, nil); end;
Delphi-Quellcode:
Jetzt musst du dir noch überlegen, was in die DataDourceChange Methode muss, die aufgerufen wird, wenn der Nutzer zu einer anderen Adresse geht.
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var i : Integer; begin for i := 0 to CheckListBox1.Count-1 do begin if CheckListBox1.State[i] = cbChecked then begin if Not TabAdrBra.Locate('Bra_ID', Integer(CheckListBox1.Items.Objects[i]), []) then begin TabAdrBra.Append; // TabAdrBraNr.AsInteger wird über AutInc gesetzt TabAdrBraAdr_ID.AsInteger := TabAdressenNummer.AsInteger; TabAdrBraBra_ID.AsInteger := Integer(CheckListBox1.Items.Objects[i]); // hier wird die Nr wieder ausgelesen TabAdrBra.Post; end; end else begin if TabAdrBra.Locate('Bra_ID', Integer(CheckListBox1.Items.Objects[i]), []) then TabAdrBra.Delete; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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