Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBctrlGrid (https://www.delphipraxis.net/4906-dbctrlgrid.html)

Hansa 16. Mai 2003 13:22


DBctrlGrid
 
Hi,

folgendes Problem: ich muß aus 5 Tabellen ein DBctrlGrid zusammenbauen. Nun sind folgende Fragen aufgetaucht:

1.diesem Grid kann ich ja nur eine datasource zuordnen. Also muß alles da drin sein, was ich aus den 5 Tables brauche. Wie soll ich das machen? Irgendwie mit Join oder wie ? Das ganze soll eine Eingabemaske werden, also weiß ich ja vorher gar nicht, was da rein kommt.

2. Ich habe das mal mit einer einzigen Tabelle getestet, da taucht noch ein weiteres Problem auf: in dem DBctrlGrid ist alles bereits vorbesetzt. Setze ich das DataSet auf false, so kann ich nichts eingeben.

MrSpock 16. Mai 2003 13:26

Hallo Hansa,

wie du korrekterweise bemerkt hast, benötigst du genau eine Datenmenge, wenn du sie in einem Grid anzeigen willst. Diese musst du aus den 5 Tabellen erstellen, das geht in der Regel über SQL Statements.

Wenn ein Grid mit einer Tabelle verbunden ist, und diese wird geöffnet, siehst du Daten dieser Tabelle. Ist die Tabelle geschlossen, siehst du nichts, kannst aber auch nichts eingeben. Füge der Anwendung am besten eine Navigator Komponente hinzu, dort kann der Nutzer "neuen Datensatz einfügen" anwählen und Daten eingeben. Oder du benutzt eigene Schalter "neuer Datensatz", dem du dann den Code:

Delphi-Quellcode:
myTable.Append;
myGrid.SetFocus;
zuweist.

Hansa 16. Mai 2003 13:48

Zitat:

Zitat von MrSpock
...das geht in der Regel über SQL Statements...

Und wie ? Hast Du vielleicht ein Bsp.? Wie gesagt vor der Eingabe soll das Grid leer sein. Gebe ich was ein, soll die Gültigkeit überprüft werden, dann Anuzeige weiterer Felder und nächste Eingabe, oder Fehlermeldung (z.B.: "keine Daten vorhanden"). Ich guck jetzt mal in meinem Rechnungsprogramm, da war auch noch so was ähnliches.

Hansa 17. Mai 2003 01:18

hmmm, weiter komm ich nicht, mist!

MrSpock 19. Mai 2003 08:06

Hallo Hansa,

um Infos zu bekommen, wie das notwendige SQL zu schreiben ist, muss du uns die genaue Struktur der 5 Tabellen zeigen. Wenn du dann eine Datenmenge erhälst, die aus diesen 5 Tabellen zusammengesetzt wird, ist zu prüfen, ob du überhaupt eine "editierbare" Datenmenge erhälst. Das hängt wiederum von der Struktur des SQL Statements ab.

Möglicherweise ist es deshalb notwendig, die Tabellen einzeln zu modifizieren oder z.B. ein Eingabeformular zu erzeugen, dass auch nicht datensensitive Eingabefelder enthält, und anschließend die Werte dieser Felder an die korrekte Stelle der zugehörigen Tabelle zu schreiben.

Um hier eine guten Tip zu geben ist es deshalb notwendig mehr Infos zu bekommen über die Idee, die du umsetzen willst und über die Struktur der Datenbank.

Übrigens, das mit dem "leeren" Eingabeformular basiert möglicherweise auf einer falschen Sichtweise. Wenn du eine nicht leere Datenmenge hast und datensensitive Elemente nutzt, wird die immer der "aktuelle Datensatz" angezeigt. Wenn du z.B. über "myTable.Append" einen neuen Datensatz einfügst, wird ein neuer noch leerer Datensatz erzeugt, der schließlich mit "myTable.Post" übernommen oder durch "myTable.Cancel" verworfen werden kann. Du kannst dem Nutzer auch die Navigator-Komponente zur Verfügung stellen, die u.a. Schalter für "Neuer Datensatz" und "Datensatz speichern" enthält.

Hansa 19. Mai 2003 11:01

Hi MrSpock,

Zitat:

Zitat von MrSpock
...Möglicherweise ist es deshalb notwendig, die Tabellen einzeln zu modifizieren oder z.B. ein Eingabeformular zu erzeugen, dass auch nicht datensensitive Eingabefelder enthält...

Das erste kapier ich nicht, aber ich vermute mal, Du willst darauf hinaus, irgendeine Hilfstabele zu verwenden. Und nicht datensensitive Eingabefelder gehen mit einem DBctrlGrid nicht.

MrSpock 19. Mai 2003 12:40

Hallo Hansa,

ich meine das so: Du erstellst ein Formular, in dem z.B. sowohl DBEdit, als auch einfache Edit Felder sein können. Wenn der Nutzer dann "Speichern" anklickt, überträgst du den Inhalt der normalen Editfelder in die entsprechenden Tabellen.

Wie gesagt, ob das notwendig oder sinnvoll ist, hängt von der Struktur deiner Tabellen und der Komplexität der geplanten Verknüpfung zwischen den Tabellen ab.

Hansa 19. Mai 2003 13:00

Hi,

ich machs mal ganz einfach (wie bei Deinem Beispiel Rechnung) :

1. Art.Nr. wird eingeben, zugehörige Art.Bez. wird angezeigt
2. Menge wird eingegeben. hierzu wird dann ein neuer Datensatz erzeugt und die Menge aus dem Feld übernommen.

Hierzu brauche ich doch 2 DBedit - Felder und 1 DBtext (für Bez.) wobei das DBedit1 mit einem Feld aus der Artikel-Table verknüpft ist und das andere mit der Rechnungs-Pos. Table. Wie kriege ich jetzt das unter einen Hut, wo das DBCtrlGrid doch nur EINE Datasource zuläßt :?:

Hansa 21. Mai 2003 12:44

hab da was gefunden, es ging um das Eintragen von Daten in mehrere Tabellen gleichzeitig :

Zitat:

Zitat von Borland
Sounds like a stored proc is the way to go. You'd pass all the columns as params, and then do the separate inserts within the body of the stored proc.

Da wollte einer Daten von irgendwo importieren und in IB-DB einfügen. Das ist doch fast dasselbe, wie das was ich bräuchte, oder ? Nur weiß ich nicht wie genau. Ich habe bisher sagenhafte 1 Stored Procedure gebastelt, die funktioniert. 8) Und da war nichts mit Insert oder so.

MrSpock 21. Mai 2003 20:44

Hallo Hansa,

wie gesagt, es ist in einem DBGrid nicht möglich auf mehrere Datasources zu verweisen. Aber um bei dem Beispiel mit der Rechnung zu bleiben:

Die Rechnungskopfdaten werden in einer eigenen Tabelle gehalten. Die Positionen erscheinen im DBGrid, die Kopfdaten auf einem extra Panel, da sie ja für alle Positionen gelten. Die Artikelnummer kannst du über eine DBLookupComboBox realisieren, wo du die Artikeldaten direkt aus der Artikeltabelle auswählst und die Anzahl wird über ein DBEdit Feld der Positionstabelle realisiert. Auch das Artikelnummernfeld gehört zu dieser Tabelle. So muss das DBGridControl nur mit einer Datasource verbunden werden.

Hansa 23. Jun 2003 13:34

Ich verwende jetzt eine Zusatztabelle als DataSource, in der alles notwendige drin ist. Es gibt 2 DBEdits, aber wo mache ich jetzt das append und post genau hin? Es kommt immer irgendwann "DataSet not in Edit / Insert - Mode"

MrSpock 23. Jun 2003 22:55

Hallo Hansa,

wie bereits erwähnt, solltest du eine Navigator Komponente hinzufügen, die mit derselben DataSource verbunden ist. Dort kann der Benutzer den Schalter "Datensatz hinzufügen" betätigen, dann wird die Datenmenge automatisch in den Insert Mode gesetzt.

Alternativ fügst du einen normalen Schalter ins Formular und beschriftest ihn z.B. mit "Neu". Dem OnClick Event fügst du dann die Zeile:

Delphi-Quellcode:
myTable.Append;
zu, wobei myTable deine neue Tabelle ist. Dann benötigst du noch einen Schalter "Datensatz übernehmen", der einfach nur

Delphi-Quellcode:
myTable.Post;
durchführt. (Oder wie gesagt DBNavigator :mrgreen: )

traudl 6. Jan 2006 01:24

Re: DBctrlGrid
 
Hallo DPler, ich habe ein ähliches Problem, ich habe ein Append am Anfang eingefügt dann die anweisung, abr ich bekomme einen Exception Fehler

Delphi-Quellcode:
procedure TMainFrm.btnInsertClick(Sender: TObject);
var DataSet:TdataSet;
begin
      if dlgOpen.Execute then begin
        if not SameText(ExtractFileExt(dlgOpen.FileName), '.jpg') then
          raise Exception.Create('Falsches Dateiformat!' +#13#10+ 'Nur JPG erlaubt');
        TblKunden.Append;
        TblKunden.FieldByName('KdBldName').AsString := ExtractFileName(dlgOpen.FileName);
        TBlobField(DataSet.FieldByName('KdBild')).LoadFromFile(dlgOpen.FileName);
        TblKunden.Post;
        grdKd.SetFocus;
      end;
end;
Bei dem TBlobField kommt der Exception Fehler. Hat jemand eine Idee?

Danke Gruß Udo

MPirnstill 6. Jan 2006 07:49

Re: DBctrlGrid
 
Hi Leute! :hi:

Ich hatte desöfteren bereits das gleiche Problem. Nämlich mehrere Tabelle in einem DBCtrlGrid anzeigen zu wollen, und habe mir immer irgendwie einen Behelf zusammen gebastelt. Mal habe ich es nur zur Anzeige wendet und die Eingaben dann irgendwie anders realisiert, und mal habe ich versucht mehrere DBCtrlGrid zu verwenden und diese zu synchronisieren.

Aber Hansa hat mich damit, eine Tabelle die alle Daten die im Grid verfügbar sein sollen enthält, und dann im Anschluß irgendwie wieder auf die eigentlichen Tabellen verteilen, auf eine Idee :idea: gebracht.

Ginge das, daß man einen View auf den verschiedenen Tabellen erzeugt, der dann automatisch die Daten auf die verschiedenen Tabellen verteilt. Durch den View hätte man doch dann eine einzige DataSource für das DBCtrlGrid.

Leider habe ich bis jetzt noch nie praktisch mit Views gearbeitet. Man kann doch darüber auch updaten, oder nicht? :?:
Das wäre jetzt wohl der Knackpunkt bei der Frage. :gruebel:

Gruß

mschaefer 6. Jan 2006 09:29

Re: DBctrlGrid
 
Moin, zusammen,

Hansa hat den Thread etwas vor 3 Jahren eröffnet sodass dieses Problem wohl schon irgendwie gehandhabt wurde. Das Grundproblem ist letztlich wohl nicht das DBGrid, sondern, dass aus mehrfachtabellierten SQL-Statements viele DataSet-Komponenten nur Lesezugiff zulassen. Das gilt auch heute noch. Der Weg wäre auch heute das DBGrid nur zur Anzeig zu nutzen und durch anklicken eine Eingabeseite auf einem Form mit mehreren DaTasets (Query/Table) aufzurufen, also eine extra Eingabemaske zu bauen.

Grüße // Martin



PS: Das obige Bild in Blob-Problem ist ein anderes Thema/Thread und da gib es in der DP Beispiele, also Suche: "Bild Blob laden".


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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 by Thomas Breitkreuz