| Autor |
Beitrag |
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 02.11.02 22:34
Hi Leute,
wie zu erwarten war, taucht noch viel ungeklärtes auf. Habe jetzt 4 1/2  Tables konvertiert und in der IB-DB drin. Jetzt habe ich folgendes getestet : Bei jedem Kunden soll eine Auswahlmöglichkeit für Kundengruppen zur Verfügung stehen. Sobald der User also in das Feld Kundengruppe kommt, soll er diese sehen.
Jetzt wollte ich es im OI so machen:
1. Datasource : Kundendatei (enthält Fremdschlüssel)
2. DataField : IDfremd des Kunden, also die geerbte ID der Kundengruppe (habe ich als Foreign Key mit referencies ID (KG) hinterlegt).
soweit so gut.
3. Listsource : Kundengruppen, müßte stimmen.
4. KeyField, Listfield : Ich komme immer nur an die Table Kunde bzw. deren Felder ran. Das KeyField müßte doch wahrscheinlich die ID der Kundengruppe sein und das Listfield ein Datenfeld derselben, oder nicht ?
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 03.11.02 10:25
Hi Hansa
eigentlich vollkommen richtig.
ListSource ist die DataSource Kundengruppe mit entsprechender Tabelle.
KeyField ist das Schlüsselfeld das von der DBLookupCombo zurückgegeben wird, also deine Kundengruppe.
ListField das Anzeigefeld für die Combo, in der Regel die Bezeichnung für die Kundengruppe.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 03.11.02 12:16
Hi Lothar,
und jetzt ?  Auf meinem Datamodul ist folgendes :
- Database
- Transaction
- KuSource für Kunden-Table
- KgSource für Kundengruppen-Table
- KuDataSet : Kunde
- KgDataSet : Kundengruppe
Was mir noch auffällt: bei dem Kunden-DS kann ich Kundentable und Kundengruppentable als Datasource auswählen, bei dem Kundengruppen-DS : keine Auswahl vorgeschlagen.
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 03.11.02 12:46
Tja, wie gesagt: eigentlich alles richtig.
Probier doch mal ob KgDataSet auf die richtige Datenbank zugreift und ob es in Verbindung mit KgSource überhaupt Daten liefert. Am besten einfach mal mit nem DBGrid.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 03.11.02 13:18
Hi Lothar,
habe kurzerhand die DS gelöscht und von vorne angefangen. Jetzt geht es, ein Denkfehler war es wohl nicht. Das war wohl so ein falscher Fehler. Ich nähere mich anscheinend dem Stadium "besser es funktioniert und keiner weiß warum". Bisher war es umgekehrt.
Da taucht aber trotzdem noch eine, nein zwei Fragen auf : Ich habe es folgendermaßen vor : Der User soll entweder die Kundengruppennr. direkt eingeben oder aus der Liste wählen. Deshalb gibt es bei mir 3 Komponenten : DBLookupBox, DBedit, DBtext. Wähle ich aus der Box werden die anderen beiden richtig aktualisiert. Nur, wenn ich im Klartext die Kundengruppennr. eingebe, wie sage ich das dann der DB ? Ich will ja die ID als foreign Key an die Kunden-Table weiterreichen.
Das zweite ist, daß ich die KG-Nr. mit der Bez. in der Listbox haben will. Z.B.: "2 Privatkunde". D.h. der anzuzeigende String müßte variiert werden, nur wo ?
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 03.11.02 14:00
Hi
es genügt in beiden Fällen wenn du beim direkten Eintragen der Kundengruppe, diesen Wert auch der Eigenschaft KeyValue der DBLookUpCombo zuweist.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 04.11.02 13:23
Hi,
finde nix mit KeyValue. Ich erkläre nochmal, was ich will bzw. gemacht habe : 1 x DBedit 1 x DBtext 1 x DBlistBox. Der User soll folgendes tun können :
1. Kundengruppen-Nr. direkt ins DBedit eingeben, ohne in der Listbox zu scrollen
2. Zur besseren Orientierung Anzeige von Nr. UND Bez. in der Box
Ich kann aber doch nur ein Listfield benennen ! Ändere ich das Feld durch Auswahl in der Listbox, funktioniert alles, aber nicht, wenn ich die Kundengruppen-Nr. von Hand eingebe.
Habe es mal so probiert im OnExit des DBedits:
Quelltext 1: 2:
| KuDatenSatz.FieldByName ('ARKGHAUPT').value := KGdatenSatz.FieldByName ('ID').value; |
Das ARKGHAUPT ist der Foreign Key der Kunden-Table.
Das korrespondierende DBtext, wo halt die aktuelle Bezeichnung der Kundengruppe drinsteht ändert sich aber nicht. Irgendwie schmeißt er mir die Daten auch noch durcheinander. Betrachte den Versuch deshalb als vorerst gescheitert.
Gruß
Hansa
[/quote]
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 04.11.02 13:43
Hi
| hansa hat folgendes geschrieben: |
Deshalb gibt es bei mir 3 Komponenten : DBLookupBox, DBedit, DBtext.
|
und
| hansa hat folgendes geschrieben: |
Ich erkläre nochmal, was ich will bzw. gemacht habe : 1 x DBedit 1 x DBtext 1 x DBlistBox.
|
Wie denn jetzt
Mit DBListBox kann das nicht funktionieren. Mit DBLookupBox gehts mit am besten mit OnChange beim Feld:
Quelltext 1: 2: 3: 4:
| procedure TDM.KuDatensatzARKGHAUPTChange(Sender: TField); begin DBLookupComboBox1.KeyValue := TField(Sender).Value; end; |
Würde aber auch mit OnExit oder sonstwas funktionieren. KeyValue ist der Wert des aktuell ausgewählten Schlüssels. Wird der geändert, ändert sich automatisch auch der zugehörige Text (oder eben das Feld das in der Combo angezeigt wird).
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 04.11.02 14:32
Hi,
jaja natürlich DBlookupBox, nicht DBlistbox. Bin aber trotzdem zu blöd. Kriege das so nicht hin. OnChange oder so gibts bei mir nicht oder ich finde das nicht.
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 04.11.02 14:53
Hi
Sorry, OnChange gibts nur wenn du persistente Felder verwendest. Im Grunde ist es aber völlig egal, es muss nur ein Ereignis sein an dem du erkennen kannst, dass sich der Inhalt eines Feldes geändert hat. Du kannst an der Stelle auch OnDataChange der DataSource verwenden. Wenn sich der Inhalt des Feldes 'ARKGHAUPT' geändert hat, wird der geänderte Wert an die Eigenschaft KeyValue der DBLookupCombo übertragen.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Di 05.11.02 20:29
Hi Lothar,
erstmal Glückwunsch zu über 500 Beiträgen. Wenn ich mir mal überlege, daß von meinen 150 bestimmt 80% Fragen sind.
Vielleicht kannst Du mir ja nochmal helfen :
| Zitat: | . Wenn sich der Inhalt des Feldes 'ARKGHAUPT' geändert hat, wird der geänderte Wert an die Eigenschaft KeyValue der DBLookupCombo übertragen.
|
So sollte es gehen aber ich habe nur KeyField, kein KeyValue. Persistente Felder, das sind doch die mit dem FieldsEditor erzeugten, oder? Habe so etwas bisher eigentlich noch nicht gebraucht. Wo empfiehlt es sich denn das zu benutzen ? Jetzt habe ich den Fieldseditor benutzt, weiß aber immer noch nicht wozu. Egal.
Aber der geänderte Wert soll ja nicht in die LookupBox übertragen werden, sondern umgekehrt. Die ID der Kundengruppe soll als Fremdschlüssel an die Kunden-Table übergeben werden. Ich will ja die Kundengruppen-Nr, die in der Box zu sehen ist eingeben können, selbst dann, wenn die Box gar nicht aufgeklappt ist. Das umgekehrte habe ich jetzt irgendwie hingekriegt. Ich kann jetzt beim Eingeben eines Kunden die Nr. einer Kundengruppe ändern !!!
Gruß
Hansa
Ach so : Bin jetzt bei einer DBlookupComboBox angelangt. Ist meiner Ansicht nach für seltenes nachschauen die beste.
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 06.11.02 09:39
Hi Hansa
| Zitat: |
erstmal Glückwunsch zu über 500 Beiträgen. Wenn ich mir mal überlege, daß von meinen 150 bestimmt 80% Fragen sind.
|
Danke, danke. Aber genau deshalb treffen wir uns doch hier.
Mit deiner Frage komm ich allerdings net ganz klar. Die Übetragung DBLookupCombo in den Kundensatz geschieht doch automatisch. Dafür weisst du ja ein DataField und DataSource zu. Wenn du in der Combo eine Kundengruppe auswählst, wird ihr Schlüssel (der KeyValue) in das zugeordnete Feld des Kundensatzes übertragen.
Die Zuweisung an KeyValue brauchst du nur, wenn du die Kundengruppe im Kundensatz anders festlegst (z. B. über DBEdit) und die Anzeige in der Combo passend synchronisieren willst.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 06.11.02 11:54
Hi,
| Zitat: | Wenn du in der Combo eine Kundengruppe auswählst, wird ihr Schlüssel (der KeyValue) in das zugeordnete Feld des Kundensatzes übertragen.
|
Soweit geht das schon. Dafür brauch ich nicht viel zu machen. Aber  ich glaube es jetzt so formulieren zu können, daß man die Frage versteht. DBedit (KG-Nr.) und DBcomboLookupBox (KG-Bez.)stehen direkt nebeneinander. Wähle ich einen Eintrag aus der Box, ändert sich das DBedit mit der Nr. Gebe ich die Nr. von Hand ein, sollte diese nur akzeptiert werden, wenn die entsprechende KG überhaupt existiert. In der NICHT aufgeklappten Box sollte idealerweise noch die dann aktuelle Bezeichnung drin stehen.
Im Moment kann ich in das DBedit aber alles eingeben und verfälsche meine Kundengruppen. Ein Schlaraffenland für einen DAU.  Um es noch krasser zu sagen : würde in dem DBedit die ID stehen, könnte das nicht passieren. Aber so gehts ja wohl auch nicht. Bei dem jetzigen Konstrukt ist es ganz klar : in der Box steht die Datenmenge zur Verfügung, die per SELECT ... WHERE ausgewählt ist. In der Realität muß ich sogar die Kundengruppen-Table noch in 2 Bereiche aufteilen, was ich aber über eine Abgrenzung der Nr. mache und halt mit WHERE. Da sehe ich schön, daß er genau das macht was er soll.
Durch die Eingabe einer KG-Nr. in das DBedit wird ganz einfach das zugeordnete Feld der verbundenen Table geändert. So sag ichs ihm doch. Ich muß dem Computer jetzt aber sagen : So nicht ! Du sollst nur gucken, welche ID die Kundengruppe (sofern vorhanden) hat, die der User über die Nr. ausgewählt hat. Diese ID übergibst du dann an die Kunden-Table und sagst ihr, sie solle sie als ForeignKey behandeln und entsprechend abspeichern.
Das meinte ich mit umgekehrt. Wird das DBedit als eine Art DBtext behandelt (also R/O), so geht alles. Wo ich das hier schreibe kriege ich die böse Ahnung, daß es nur über den Umweg eines normalen Edit - Feldes geht.
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 06.11.02 12:03
Ok, jetzt hab ichs gerafft. Sehe ich zwei Möglichkeiten. Die einfache Möglichkeit: das DBEdit für die Kundengruppe wegzulassen. Auswahl nur über die Combo und Basta. Wenn du dem User beide Möglichkeiten anbietest, bekommst du erst mal von 100% aller User die Frage "Warum?" und dann verwenden 99,9998% nur die ComboBox.
Wenn du es bei dem DBEdit belassen willst, musst du dich einfach mal von dem Gedanken lösen alles selbst kontrollieren zu wollen. Der Server macht das schon. Wenn du versuchst einen nicht existierenden Fremdschlüssel in deinem Kundensatz zu speichern, wird eine Exception ausgelöst, die fängst du ab, präsentierst eine mehr oder weniger böse Fehlermeldung und das wars. Wenn du vorher noch selbst prüfen willst, machst du bloss die Arbeit des Servers in deinem Programm.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 06.11.02 12:41
Hi,
| Zitat: | bekommst du erst mal von 100% aller User die Frage "Warum?" und dann verwenden 99,9998% nur die ComboBox.
|
Es ist nicht zu fassen.  Weißt Du was ich gestern mittag gemacht habe ? Habe hier eine Praktikantin (im Moment noch DAU, für so was aber genau das richtige  ), die hab ich gestern mittag mit genau dieser Frage konfrontiert. Hab ihr eine Form mit 2 Boxen gezeigt, bei der einen war das zugehörige DBedit zu sehen. Das gefiel ihr besser. Hätte ich eine Suggestivfrage gestellt, wäre es kein Problem gewesen die eine oder andere Antwort zu erhalten, aber genau das wollte ich ja nicht.
Ich erwische mich noch des öfteren dabei, daß ich DataSet als Datensatz betrachte, allein schon weil es sich ähnlich anhört. Das heißt aber "Datenmenge". Ja und dann Client/Server, da gilt ähnliches.
Aber ich habe trotzdem noch eine Idee. Lege ich für das eine DBedit ein eigenes Dataset an, könnte es doch gehen, oder nicht, bzw. was spricht dagegen ? Eigentlich kommt es doch nur auf das richtige SelectSQL an.
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 06.11.02 13:52
Hi
| Hansa hat folgendes geschrieben: |
...Hab ihr eine Form mit 2 Boxen gezeigt, bei der einen war das zugehörige DBedit zu sehen. Das gefiel ihr besser.
|
Volltreffer! Du hast eine von den 0,0002% erwischt die keine Legastheniker oder Mäuseschieber sind
| Hansa hat folgendes geschrieben: |
Lege ich für das eine DBedit ein eigenes Dataset an, könnte es doch gehen, oder nicht, bzw. was spricht dagegen ?
|
Ne, geht nicht. Du willst mit dem Edit doch einen Wert in die Kundentabelle schreiben. Also muss das Dataset die Kundentabelle darstellen und das DBEdit auf das entsprechende Feld verweisen. Und ein zweites Dataset geht nicht. Genau dafür gibts ja die Loopup-Elemente.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 06.11.02 14:16
Hi Lothar,
| Zitat: | Volltreffer! Du hast eine von den 0,0002% erwischt die keine Legastheniker oder Mäuseschieber sind
|
Auch das noch, Hiiiiiilfe !!! Dabei ist sie doch sogar blond.
Frage jetzt vorsichtshalber meinen Vater, der kommt mit den Mäusen auch nicht so richtig klar. Dem wäre es wahrscheinlich auch anders lieber. Ich gaukle ihm aber vor, es würde vermutlich nicht anders gehen.
Notfalls muß ich es eben mit Hilfe eines normalen Edits erledigen.
Gruß
Hansa
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 06.11.02 21:05
Hi,
 Noch ein Volltreffer.
hier kommt die Antwort :"Ich bin aber daran gewöhnt die Zahl einzugeben".
Und das nur, weil er das seit 10 Jahren so macht, weil ich eben noch keine Combo-Box hatte. Wußte doch, warum ich das alles zuerst mit einer Listbox machen wollte. Mittlerweile gefällt mir die ComboBox aber besser.
Wenn ich es aber vorerst mit einer Listbox mache, fange ich später wieder da an, wo ich aufgehört habe. Arrrrgh!!!!
Gruß
Hansa
Mir reichts jetzt. 
|
|
|