AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DBGrid-Feld bearbeiten und Feld mit Daten füllen
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid-Feld bearbeiten und Feld mit Daten füllen

Ein Thema von DADAMAN · begonnen am 27. Feb 2006 · letzter Beitrag vom 27. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
DADAMAN

Registriert seit: 21. Feb 2006
Ort: Rotenburg an der Fulda
9 Beiträge
 
Delphi 6 Professional
 
#1

DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 09:22
Datenbank: MSSQL • Zugriff über: BDE
Guten Morgen,

ich hab ein, vermutlich kleines, Problem.

Die Sache ist folgende: Ich habe ein DBGrid welches auf eine Tabelle zugreift.
Dieses Grid zeigt zwei Spalten an. Eine ArtikelNr und ein dazugehöriger Text.

Um Artikel hinzuzufügen, soll der Benutzer die ArtikelNr in die erste Spalte eintragen.
Verlässt er die Spalte, soll ein Ereignis ausgelöst werden, welches mittels der ArtikelNr, die zugehörige Bezeichnung aus einer anderen Tabelle ausliest und in die Tabelle, aus der das DBGrid die Daten bezieht, einträgt.
Danach wird die Query geschlossen und geöffnet um die aktuellen Daten anzuzeigen.

Momentan habe ich das über ein ColEnter-Ereignis gelöst. Die Query hinter dem DBGrid steht auf RequestLive und ich habe noch ein TDBNavigator-Element eingesetzt, um das hinzufügen von Datensätzen zu ermöglichen.

Funktionieren tut das ganze auch, aber eben nur einigermassen. Je nachdem in welche Spalte oder Zeile gewechselt wird, werden leere Datensätze in der Datenbank angelegt oder es führt zu Datenbankfehlern. Ausserdem ist es so nicht wirklich möglich bereits angelegte Datensätze zu überarbeiten. Zumindest nicht vernünftig.

Also alles in allem eine ziemlich klapprige Angelegenheit...

Deshalb wollte ich mal fragen ob ihr mir vielleicht weiterhelfen könnt indem ihr mir nen besseren Weg, das ganze zu lösen, aufzeigt.
Bin mir nicht sicher, vielleicht lässt es sich ja über Ereignisse des DataSets lösen, habe aber noch nicht sonderlich viel Erfahrung mit Delphi...

Wäre klasse wenn ihr mir weiterhelfen könntet.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 10:01
Herzlich willkommen in der Delphi-PRAXiS.

Die BDE und MSSQL - Fisch und Fahrrad - zur Not geht es, aber warum nimmst du nicht die ADO-Komponenten?

Für die Einblendung von Informationen, die nicht zur selben Basistabelle gehören, kannst du auch berechnete Felder oder Lookup-Tabellen verwenden. Wenn du etwas mehr über die Struktur deiner Daten schreibst, dann ist auch konkretere Hilfe möglich.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
DADAMAN

Registriert seit: 21. Feb 2006
Ort: Rotenburg an der Fulda
9 Beiträge
 
Delphi 6 Professional
 
#3

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 10:38
Hi und danke

Ja, dass BDE und MSSQL nicht wirklich optimal sind, hab ich schon des öfteren gelesen, aber ich muss die beiden Sachen leider benutzen, da alle anderen Projekte hier auch schon auf diese Kombi setzen.

Mmmh, um die Struktur nochmal zu verdeutlichen. Im Prinzip dreht es sich um zwei Tabellen. Die eine enthält Artikelnummern und Bezeichnungen, die andere enthält dasselbe plus eine ID, die den Datensatz einem Protokoll zuordnet.

Die Tabelle in der die ProtokollID gespeichert ist, wird mittels einer Query, wo RequestLive auf true gesetzt ist, im angesprochenen DBGrid angezeigt.

Trägt man jetzt eine Artikelnummer in die erste Spalte ein, dann soll aus der anderen Tabelle die dazugehörige Bezeichnung ausgelesen werden und in die andere Tabelle kopiert werden.

Und das funktioniert mit dem ColEnter-Ereignis momentan eher schlecht als Recht.

Delphi-Quellcode:
if DBGrid_Komponenten.SelectedIndex = 1 then
   begin
      Datenbank.Hole_Bezeichnung.ParamByName('ArtikelNr').AsString := DBGrid_Komponenten.DataSource.DataSet.FieldByName('ArtikelNr').AsString;
      Datenbank.Hole_Bezeichnung.Open;
      DBGrid_Komponenten.SelectedField.Value := Datenbank.Hole_Bezeichnung.FieldByName('Bezeichnung').AsString;
      Datenbank.Insert_Komponente.ParamByName('ID').AsInteger := ID;
      Datenbank.Insert_Komponente.ParamByName('ArtikelNr').AsString := Datenbank.Hole_Bezeichnung.FieldByName('ArtikelNr').AsString;
      Datenbank.Insert_Komponente.ParamByName('Bezeichnung').AsString := Datenbank.Hole_Bezeichnung.FieldByName('Bezeichnung').AsString;
      Datenbank.Insert_Komponente.ExecSQL;
      Datenbank.Hole_Bezeichnung.Close;
      Datenbank.Hole_Komponenten.Close;
      Datenbank.Hole_Komponenten.Open;
   end;
Aber dir Query um das in die Datenbank einzufügen scheint eh überflüssig zu sein wenn ichs mir recht überlege, da es ja auf RequestLive steht... Irgendwie bin ich grad voll verwirrt und komm nicht weiter.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 11:03
Eine Tabelle ARTIKEL mit den Spalten (NUMMER, BEZEICHNUNG) ist akzeptabel. Eine zweite Tabelle PROART mit den Feldern (NUMMER, BEZEICHNUNG, PROTOKOLL_ID) ist ein Modellierungsfehler, weil das Feld BEZEICHNUNG durch den Wert von NUMMER bereits determiniert ist. Wenn du also eine Tabelle PROTOKOLLE (ID, BEZEICHNUNG) hast, dann hängt es davon ab, ob die Tabellen PROTOKOLLE und ARTIKEL in einer m:n oder einer 1:n Beziehung stehen. Ich tippe auf letzteres - dann müsste deine zweite Tabelle PROART die Felder(NUMMER, PROTOKOLL_ID) aufweisen.

Wenn du genau diese zweite Tabelle in einem Grid bearbeiten möchtest, dann solltest du dem Grid einfach eine passende Query unterlegen - zweckmäßigerweise:

select * from PROART where ID = :protokoll_id Über eine Auswahlliste kannst du den Benutzer die Sicht auf ein bestimmtes Protokoll einschränken lassen, so dass nur noch die Artikel zugeordnet werden müssen (geht auch über Table mit MasterSource). Für eine visuelle Kontrolle bei manuell erfassten Artikelnummern kannst du dann noch ein lookup field definieren, welches dir die Artikel-Bezeichnung beisteuert, sobald eine Artikel-Nummer eingetragen wurde.

marabu
  Mit Zitat antworten Zitat
DADAMAN

Registriert seit: 21. Feb 2006
Ort: Rotenburg an der Fulda
9 Beiträge
 
Delphi 6 Professional
 
#5

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 11:20
Ich hoffe ich hab dich jetzt richtig verstanden.

Das mit der "Dopplung" der Daten hat einen Sinn. Und zwar soll der Benutzer, wenn er, sei es absichtlich oder zufällig, die Bezeichnung des Artikels editiert damit nicht auch die Bezeichnung in der Tabelle der anderen Datenbank editiert, sondern nur lokal, so, dass dies keine Auswirkungen auf andere Programme hat.

Für die Bearbeitung bereits eingetragener Artikelnummern habe ich jetzt zumindest schon scheinbar eine Lösung gefunden. Dies müsste über das AfterEdit Event des DataSets in Verbindung mit einer UPDATE-Anweisung ganz gut zu machen sein.

Mmmh, das AfterEdit Event müsste sich ja dann eigentlich auch für die Eingabe der Artikelnummer und auslesen der zugehörigen Bezeichnung nutzen lassen, wenn ich vorher überprüfe, ob die Bezeichnung schon "gesetzt" ist, oder?!

Ich glaub damit sollte jetzt auch mein Problem relativ deutlich geworden sein.

Kleine Zusatzfrage dazu... Kann ich einzelne Spalten auf readonly schalten? Eher nicht, oder?!

Kann im Moment leider nur nicht testen, da ein Kollege heute morgen aus Versehen meine Datenbank gelöscht hat...


EDIT: Wenn ich jeweils nach eintreten des AfterEdit Events entweder ein INSERT oder UPDATE ausführe, bringt das in Kombination mit dem RequestLive und dem TDBNavigator Probleme mit sich? Hab keinen anderen Weg gefunden automatisch neue Datensätze zu generieren, ohne den TDBNavigator.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 11:34
Zitat von DADAMAN:
Und zwar soll der Benutzer, wenn er, sei es absichtlich oder zufällig, die Bezeichnung des Artikels editiert damit nicht auch die Bezeichnung in der Tabelle der anderen Datenbank editiert, sondern nur lokal, so, dass dies keine Auswirkungen auf andere Programme hat.
Wenn du die Bezeichnung nicht redundant speicherst, dann hast du dieses Problem überhaupt nicht.

marabu
  Mit Zitat antworten Zitat
DADAMAN

Registriert seit: 21. Feb 2006
Ort: Rotenburg an der Fulda
9 Beiträge
 
Delphi 6 Professional
 
#7

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 11:44
Zitat von marabu:
Wenn du die Bezeichnung nicht redundant speicherst, dann hast du dieses Problem überhaupt nicht.
Habe ich nicht?

Dachte eigentlich, wenn die Query hinter dem DBGrid die Komponenten ausliest und dann anhand der Artikelnummer die Bezeichnung sucht, dann kann der Benutzer doch auch, da es RequestLive ist, die Bezeichnung bearbeiten. Oder bin ich jetzt absolut auf dem Holzweg?!

Möchte das ganze eigentlich so optimal wie möglich machen also bin ich für jeden Tipp dankbar.

Achja, wäre nett, wenn du mein Edit in dem Beitrag vor dir vielleicht noch kommentieren könntest. Das würde mir enorm weiterhelfen.
  Mit Zitat antworten Zitat
DADAMAN

Registriert seit: 21. Feb 2006
Ort: Rotenburg an der Fulda
9 Beiträge
 
Delphi 6 Professional
 
#8

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 13:09
So, habe jetzt mal das AfterEdit-Event ausprobiert, aber das bringt leider auch nicht die gewünschten Resultate...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 14:28
Eines vorweg - für jedes Feld eines Dataset kannst du die Eigenschaft ReadOnly setzen, wenn du willst. Aber ich denke das führt in die falsche Richtung.

Zitat von DADAMAN:
Dachte eigentlich, wenn die Query hinter dem DBGrid die Komponenten ausliest und dann anhand der Artikelnummer die Bezeichnung sucht, dann kann der Benutzer doch auch, da es RequestLive ist, die Bezeichnung bearbeiten.
Es fällt mir schwer hier richtig oder falsch zu antworten, da ich das E/R-Modell nicht kenne, welches deiner Datenbank zugrunde liegt. Hast du überhaupt eines erstellt?

Ich kenne aus deinen Beiträgen hier zwei Entitäten (Artikel, Protokoll). Daraus leitest du auf jedenfall zwei Basistabellen (Artikel, Protokolle) ab. Wenn jetzt jedem Artikel mehrere Protokolle zugeordnet werden können und umgekehrt, dann brauchst du eine weitere Tabelle für diesen Beziehungsdatentyp, der die Primärschlüssel der beiden Basistabellen aufnimmt und eventuell zusätzliche Attribute. Ist es aber nur so, dass einem Protokoll mehrere Artikel zugeordnet werden können, dann brauchst du keine zusätzliche Tabelle und die Tabelle Artikel wird einfach um einen Verweis auf das Protokoll (Fremdschlüssel) erweitert.

Hier musst du jetzt mal erläutern, welchen Weg wir weiter gehen wollen, damit ich nicht zu viele Fallunterscheidungen machen muss.

marabu
  Mit Zitat antworten Zitat
DADAMAN

Registriert seit: 21. Feb 2006
Ort: Rotenburg an der Fulda
9 Beiträge
 
Delphi 6 Professional
 
#10

Re: DBGrid-Feld bearbeiten und Feld mit Daten füllen

  Alt 27. Feb 2006, 15:38
Klar, ein ER-Modell existiert, ist zuhause aber leider nicht verfügbar.
Habe jetzt der Einfachheit halber mal ein kleines Bild gemalt.

Danke für deine Hilfe.
Miniaturansicht angehängter Grafiken
db_828.jpg  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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