Autor Beitrag
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 03.09.02 20:53 
Hi Leute,

Habe mir eine IB-Datenbank (genauer Firebird) angelegt. Lookup-Boxen, DBedit - Felder usw. Alles wunderbar, sogar die herrlichen Generatoren, Trigger usw. funktionieren alle. :idea:

Habe halt erst mal sehen wollen, ob ich damit überhaupt zurecht komme und nicht nur mit den einfachen Sachen.

Jetzt wollte ich eine einfache Query haben, die einen Artikel mit Nr. 100 aus der DB sucht und in einer Form, wo die DBedit Felder sind, anzeigt. Oder eben eine entsprechende Fehlermeldung bringt, falls es keinen gibt (das ist das nächste Problem). Klabautermanns Tutorial habe ich mir dann durchgelesen und einmal mit folgenden Zeilen begonnen:(Button1Click:)
ausblenden Quelltext
1:
2:
3:
4:
ArtDataModul.ArtNrQuery.SQL.Clear;
ArtDataModul.ArtNrQuery.SQL.Add ('SELECT * FROM "art" ');
ArtDataModul.ArtNrQuery.SQL.Add ('WHERE nr = 100');
Form1.Show;

Er schreibt da, die Query müsse mit open geöffnet werden, aber bei mir geht das nicht. Die Prozedur ist nicht da. Da das schon nicht geht habe ich mir trotzdem überlegt, woher das Programm denn überhaupt wissen soll, was es anzeigt. Aber im Moment sehe ich halt gar nichts. Klicke den Button an, er führt die Zeilen ohne Fehler aus, das wars.

Vermute, daß er zwar weiß, was er machen soll, aber es nicht macht, da der Befehl (open ?) fehlt. Komme halt nicht weiter.

Weiß jemand weiter ? :?: :shock:

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Di 03.09.02 21:02 
Hi,

du mußt Deinen Codeschnipsel folgendermaßen ändern :

ausblenden Quelltext
1:
2:
3:
4:
5:
ArtDataModul.ArtNrQuery.SQL.Clear; 
ArtDataModul.ArtNrQuery.SQL.Add ('SELECT * FROM art'); 
ArtDataModul.ArtNrQuery.SQL.Add ('WHERE nr = 100');
ArtDataModul.ArtNrQuery.Open; 
Form1.Show;


Desweiteren würde ich Dir empfehlen, das Suchergebnis in einem DBGrid anzuzeigen. Ich persönlich finde das recht übersichtlich.

P.S. : Code ist nicht getestet. Sollte aber funzen.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 04.09.02 00:39 
Hallo bis11!

der Vollständigkeit halber: die Komponenten sind von FIBplus. Da gibt es auch eine OPEN Funktion. Aber keine Prozedur! Dann meckert der Compiler wieder. Ein weiterer Unterschied bei Deinem Schnipsel sind die "" bei art. Bei Dir sind die weg. Wozu sie in Delphi genau dienen weiß ich jetzt auch nicht. Aber bei Interbase motzt er, falls sie fehlen. Das DBgrid war vorher bereits da. Das Grid will ich ja gar nicht, sondern eine Query. Z.B., ist ein Datensatz da oder nicht.

werde mal sehen
Gruß
Hansa
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 04.09.02 21:30 
Hi,

weiß keiner etwas? Habe das select Statement mal direkt mit IBSQL eingegeben. Da ging es so (Delphi-Version):
ausblenden Quelltext
1:
2:
ArtDataModul.ArtNrQuery.SQL.Add ('SELECT * FROM "art" ');
ArtDataModul.ArtNrQuery.SQL.Add ('WHERE "nr" = 111');

Als Ausgabe war nur der Artikel mit Nr. 111 zu sehen, genau so wie ich es brauche.

Man beachte den feinen Unterschied: "art". Weiter oben könnt ihr sehen, daß ich vorher nur art , also ohne " verwendet hatte. Warum ich die " manchmal verwenden muß, ist mir auch noch nicht ganz klar.

Komme aber immer noch nicht dahinter, was eigentlich nach dem SQL.Add ausgeführt werden muß. Laut Klabautermann soll ich bei lesenden Queries open aufrufen. Das ist aber bei FIBplus eine Funktion, die anscheinend nur für Überprüfungszwecke da ist.

Wahrscheinlich liegt es also an FIBplus. Das sieht aber sehr gut aus und läuft auch mit Firebird. Hat sich das denn noch niemand angeschaut? Trotz BDE, Interbase 6.5 usw.? :roll:

Gruß
Hansa :D
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 04.09.02 21:36 
hier ist noch der Quelltext (vielleicht sieht jemand doch noch was) :
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
  

unit ArtVerw;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, StdCtrls, DBCtrls, Mask, Menus, FIBQuery,
  pFIBQuery, ExtCtrls;

type
  TForm1 = class(TForm)
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBLookupComboBox1: TDBLookupComboBox;
    Edit1: TEdit;
    Button1: TButton;
    DBNavigator1: TDBNavigator;
    Button2: TButton;
    DBGrid1: TDBGrid;
    procedure AppException(Sender: TObject; E: Exception);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Edit1Exit(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

USES ArtDatMod;

{$R *.dfm}

procedure TForm1.AppException(Sender: TObject; E: Exception);
  begin
    Messagedlg('Fehler :'+E.ClassName+#10#13, mterror,[mbok,mbCancel,mbignore],0);
  end;

procedure TForm1.FormCreate(Sender: TObject);
  BEGIN
    Application.OnException := AppException;
  end;

procedure Tform1.Edit1Exit(Sender: TObject);
var WGnr : integer;
begin
  WGnr := StrToInt (Edit1.text)
  { Wert in zul. Bereich, jetzt noch prüfen
    ob in DB vorhanden }
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  ArtDataModul.Database.Open;
  ArtDataModul.ArtTransaction.StartTransaction;
  ArtDataModul.ArtDatenSatz.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ArtDataModul.ArtTransAction.Commit;
  ArtDataModul.Database.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ArtDataModul.ArtNrQuery.SQL.Clear;
  ArtDataModul.ArtNrQuery.SQL.Add ('SELECT * FROM "art" ');
  ArtDataModul.ArtNrQuery.SQL.Add ('WHERE "nr" = 111');
  ArtDataModul.ArtNrQuery.ExecQuery;
  Form1.Show;
end;

end.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 07.09.02 12:19 
Es lebe die internationale Zusammenarbeit !

Falls das hier überhaupt einen interessiert, eine Antwort aus Holland (damit ging es wirklich !), das ? bei artno ist der entscheidende Faktor:
Zitat:
> Hello,
>
> I want to use FIBplus, but should I do it?Simply, I want to use a Query
> to select 1 Record from the Database. In all books, they wrote, you must
> use open to have access to the Database. But this procedure isnt
> available. What is the alternative?
> Sample: I want to select a Record with Art.No 300. If I don't get him,
> my program must produce an exception. Thats it!

I think you must use a pFIBDataset to do that (if I am correct pFIBquery can
not get data). Put A pFIBDataBase a pFIBDataset and pFIBTransatcion on your
form. Set the pFIBDataBase up to connect to the GDB (make sure you pick
correct Dialect!). Set the transaction of database to the transaction. In
Transaction set defaultdatabase to the pFIBDatabase.

In pFIBDataset setup the database to pFIBDataBase and the transaction to
pFIBTransaction.

In pFIBDataSet set selectSQL to:
ausblenden Quelltext
1:
2:
Select * from table
Where ARTNO=?ARTNO

In Your delphi code put the following code:
ausblenden Quelltext
1:
2:
3:
4:
pFIBDataSet.Active := False;
pFIBDataSet.ParamByName('ARTNO').AsInteger := HaveToFind {Have to find is
the ID you want }
pFIBDataSet.Active := True;

That;s all, this should work.

And your question on should I use FIB plus, my answer is yes, it is great.
>
> Thanks

Hope this is of some help.


Moderiert von user profile iconTino: Code- & Quote-Tags hinzugefügt.
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: So 08.09.02 06:45 
Hi
die Konstruktion mit ?ArtNo bedeutet nur, dass anstelle der direkt eingetragenen Artikelnummer, ein Parameter verwendet wird.
Wenn die Artikelnummer ein numerisches Feld ist, genügt
ausblenden Quelltext
1:
SELECT * FROM ART WHERE NR = 111					

Wenn die Artikelnummer alphanumerisch ist verwendest du
ausblenden Quelltext
1:
SELECT * FROM ART WHERE NR = '111'					

Anschliessend setzt du die Eigenschaft Active der Abfrage auf True um sie zu öffnen.
Wenn du aktualisierbare Datenmengen brauchst, solltest du FIBDataSet verwenden, für Nur-Lese Abfragen genügt auch FIBQuery. Für die reine Datenmanipulation innerhalb der Datenbank wird FIBSQL verwendet.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 09.09.02 12:25 
Hallo Lothar,

wo und wie genau soll ich den SQL-string einbauen? Verwende eine FIBdataSet. Vor allem so, daß nicht die Zahl 111 sondern der Wert aus einem Editfeld verwendet werden kann.

Bei DBedit-Feldern geht das zwar, aber dann zeigt er mir seltsamerweise die anderen Felder nicht an.

Bei dem Editfeld, das mir aus verschiedenen Gründen lieber wäre gibt es nämlich noch ein Problem. Die nr ist auf NOT NULL gesetzt. Lege ich einen neuen Art. an, so würde die Nr. zwar im Editfeld stehen, aber nicht in der DB. Wie kriege ich es nun hin, der DB mitzuteilen, dies sei die Nr. des neuen Art.? Logischerweise beschwert er sich beim insert nr sei NULL. Glaube es geht irgendwie mit value. Die FIBplus Hilfe sagt halt meistens so etwas wie: "use selectsql to select sql". Mal wieder typisch!

Gruß
Hansa
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mo 09.09.02 12:48 
Hi
also wenn ich dich jetzt richtig verstanden habe, willst du in einem EditFeld eingeben welcher Artikel angezeigt werden soll und anschliessend die Daten anzeigen :?:

Für dieses Feld (ich nenns mal edtSearch), brauchst du einen Ereignisroutine die nach einer Änderung den aktuellen Datensazu anzeigt. Könnte so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Tform1.edtSearchOnExit(Sender: TObject);
begin
  with FIBDataSet do begin
    Active := False;
    SelectSQL.Text := 'SELECT * FROM ART WHERE NR = ' +
                                edtSearch.Text; 
    Active := False;
  end;
end;

Damit würde beim Verlassen des Eingabefeldes dieser Datensatz angezeigt. Um den Inhalt anzuzeigen und zu bearbeiten brauchst du DBEdit-Felder. Alles andere wäre viel zu umständlich.
Wenn du das machen willst, müsstest du nach dem Lesen des Datensatzes alle Inhalte in deine Editfelder übertragen. Das würde ungefähr so aussehen:
ausblenden Quelltext
1:
2:
EditFeldSoundso.Text := FIBDataSet.FieldByName('Soundso').AsString;
...

Anschliessend müsstest du selbst feststellen, wird der Datensatz geändert oder ein neuer angelegt und den ganzen Mist aus den Edits wieder in den Satz übertragen.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
with FIBDataSet do begin
  Edit;  //oder Insert
  FieldByName('Soundso').Value := EditFeldSoundso.Text;
  ...
  //Die Felder müssen je nach Inhalt dabei konvertiert werden
  ...
  try
    Post;  //Speichern
  except
    Cancel;  //Fehler
  end;
end;


Ich hoffe das war erst mal verständlich genug um weiterzukommen. Noch was wichtiges: Wenn du mit FIBDataset Daten bearbeiten willst, musst du auch die Eigenschaften
InsertSQL
ModifySQL
DeleteSQL
RefreshSQL
mit den entsprechenden SQL-Anweisungen belegen.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 09.09.02 18:39 
Hallo Lothar,

das war super ! jetzt geht es. Edits und DBedits zu mischen, das muß ja nicht sein. Damit kam ich aber weiter, als mit den DBedits allein.

Habe jetzt aber meine Testdatenstrukturen reduziert. Das ganze (natürlich noch Feinarbeiten nötig) geht jetzt mit Kundengruppen, die bestehen nur aus der ID, nr und Bez. Wende mich jetzt aber statt Artikeln den Kunden zu. Die DB ist bereits angepaßt. Die Kunden erhalten wie gehabt eine ID, aber die ID der entsprechenden Kundengruppe soll ja auch z.B. als ID_KG den Kunden zugeordnet werden. Bei beiden Dateien müßten die Generatoren und Trigger einwandfrei funktionieren :mrgreen:

Das ist so ein ähnliches Problem. Das vorherige wollte ich ja mit dem Editfeld umgehen. Hier geht es so aber bestimmt nicht. Die Analogie besteht darin, wie vorher, bestimmte Felder der Datenbank zu besetzen.
Hier also ID_KG, die ich später ja auch brauche, um zu wissen welcher Kundengruppe der Kunde überhaupt zugeordnet ist. Wie das wohl geht?

Kannst Du mir dazu noch einen Tip geben ? :D

Gruß
Hansa
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mo 09.09.02 19:25 
Hi Hansa
na mal sehen ob sich das noch hinkriegen lässt. :) Wenn du einen neuen Datensatz mit Werten vorbelegen willst, gibts ja generell zwei Möglichkeiten.
Dein Programm macht es beim OnNewRecord Ereignis
Oder die Datenbank macht es über einen Trigger, der beim Einfügen ausgelöst wird.
Ich fang mal mit der 2. Variante an. Der Trigger eignet sich ganz prima um Standard- oder automatisch generierte Werte in einen neuen Datensatz einzutragen. Nehmen wir mal an du hast so eine Tabelle:
ausblenden Quelltext
1:
2:
3:
4:
5:
CREATE TABLE KUNDEN (
  KD_ID    INTEGER NOT NULL, /*Schlüssel */
  KD_GRP   INTEGER,          /*Kundengruppe */
  KD_WERT  INTEGER,          /*Irgendein Wert */
  PRIMARY KEY (KD_ID));

Dazu passend hast du einen Trigger gebastelt, der beim Einfügen eines neuen Satzes eine neue ID vergibt und das Feld KD_WERT mit 0 füllt.
ausblenden Quelltext
1:
2:
3:
4:
5:
CREATE TRIGGER TR_KUNDEN_B_I FOR KUNDEN BEFORE INSERT AS
BEGIN
  NEW.KD_ID = GEN_ID( KUNDEN_GENERATOR );
  NEW.KD_WERT = 0;
END

So weit, so gut. Wenn du Datensätze direkt mit SQL in die Datenbank einfügst funzt das alles wunderbar. Wenn du mit deinem Programm einen Datensatz einfügst kriegst du gleich 3 verschiedene Fehler.
1. Dein neuer Datensatz hat keine ID
2. Das Feld KD_WERT ist nicht auf 0 gesetzt
3. Du bekommst eine Exception, weil das Feld KD_ID keinen Wert enthält.
Das Problem besteht darin, das dein Prog den Trigger gar nicht mitbekommt, weil er erst dann ausgelöst wird, wenn er bei der Datenbank ankommt (Vereinfacht formuliert). Also erst dann nachdem du ein Post ausgelöst hast. Vorher hat Delphi aber schon festgestellt, dass das Feld KD_ID nicht gefüllt ist aber gefüllt sein muss. Also Exception.
Um das zu umgehen musst du entweder über die Eigenschaft GeneratorField festlegen welche Felder von der Daten gefüllt werden (geht aber glaub ich nur bei IBX und leider nicht bei FIB) oder du verwendest persistente Felder und setzt beim Feld KD_ID die Eigenschaft Required auf False.

Für das Feld KD_GRP kannst du aber keinen Trigger verwenden. Also musst du das selber erledigen beim OnNewRecord-Event.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure TDM.ibsKundenNewRecord(DataSet: TDataSet);
begin
  DataSet.FieldByName('KD_GRP).Value := DeineKundenGruppe;
  //Wenn du willst kannst du auch das hier noch machen
  DataSet.FieldByName('KD_WERT').Value := 0;
end;

Mit der zweiten Zuweisung verlagerst du die Arbeit zwar wieder vom Trigger in dein Programm, dafür kriegst du die 0 gleich beim Einfügen zu sehen.
Die vom Trigger eingetragene ID kriegst du allerdings leider immer erst dann zu sehen, wenn der Datensatz nach dem Einfügen erneut abgerufen wird. Falls bei FIB vorhanden, die Eigenschaft ForcedRefresh auf True setzen.

Uff, Roman fertig, ich geh jetzt Arbeiten :beer:

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 09.09.02 19:50 
Hallo Lothar,

Das sieht recht gut aus (habe nur kurz drüber geguckt). Aber hast Recht, drucke das hier jetzt aus und hol es mit. Kann Schreibtisch nicht mehr sehen. In diesem Sinne :beer:

Gruß
Hansa
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 10.09.02 12:33 
Hallo Lothar,

zu früh gefreut. Ein Gemisch aus Edit- und DBedit-Feldern wäre Unsinn. Das sagst du ja auch. Aber ich bin eigentlich immer noch nicht weiter.

Denn es klappt nur unter Zuhilfenahme eines normalen Edit-Feldes. Das mit select usw. klappt zwar jetzt, aber laut deinem Code:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Tform1.edtSearchOnExit(Sender: TObject); 
begin 
  with FIBDataSet do begin 
    Active := False; 
    SelectSQL.Text := 'SELECT * FROM ART WHERE NR = ' + 
                                edtSearch.Text; 
    Active := False; 
  end; 
end;


brauche ich doch noch das edtSearch.Ttext. Vielleicht habe ich es auch falsch erklärt oder habe etwas grundsätzlich falsch verstanden. Ich will einen Datensatz neu anlegen, oder ändern falls er bereits exist.

Meiner Meinung nach müßte es doch so gehen :

2 DBedit Felder für KG-Nr. und KG-Bez

Im Moment läuft es aber nur, wenn ich ein weiteres "normales" Edit-Feld hinzunehme. Dieses will ich aber "wegrationalisieren", wegen der Logik und weil es eigentlich eine Redundanz bedeutet, ich brauche 2 Felder für einen Wert.

Habe es einmal so probiert (aber nicht lachen) :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
  
WITH DataModule2.KGdatenSatz DO BEGIN
    active := false;
    SelectSQL.Text := 'select * from KG8 where "nr" = ' + DBedit1.text;
    active := true;
    showmessage ('***' + DBedit1.Text+ '***');
END;


DBedit1.Text zeigt hierbei nichts an oder es kommt ein Fehler. Das DBedit Feld wird ja erst gefüllt, falls die SQL ausgeführt wurde. Falls es nicht anders ist kann ich dann also für die Eingabe über eine Art.Nr. das DBedit-Feld sowieso nicht verwenden und brauche tatsächlich noch ein Edit-Feld??

Glaube fast, daß es in diesem Fall so ist. Ich könnte ja dann einfach das DBedit KG-Nr. einfach weglassen. Aber ist wirklich gewährleistet, daß das was später in dem Edit-Feld steht, auch in der DB ist ?

Außerdem sieht es komisch aus, wenn ich später für eine Rechnung eine Art.Nr. in einem editfeld eingebe und genau dieselbe Nr. steht dann zusätzlich in einem DBedit.

Wie machen das die anderen ??


Gruß
Hansa
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 10.09.02 13:21 
Hi Hansa
warum das in deinem Beispiel nicht klappt ist klar. DBEdit1 zeigt den Inhalt des aktuellen Datensatzes an. In dem Moment wo du die Abfrage schliesst, ist da ja nix mehr zum anzeigen und demzufolge auch kein Wert den du für die Abfrage verwenden könntest. :(

Die Problematik der Benutzerschnittstelle bei SQL-Frontends ist nicht ganz ohne. Aber wenn du den Datensatz in Einzelfeldern darstellen willst, und gleichzeitig eine "Suchfunktion" haben willst, brauchst du wohl oder übel eine Kombination mit einem Editfeld.

Ich versuch mal ein Beispiel zusammenzubasteln, weils ein bissel schlecht zu schreiben ist. Dauert aber mal ein paar Minuten.

Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 10.09.02 13:42 
Hallo Lothar,

das mit dem SQL-frontend merke ich jeden Tag mehr. Habe jetzt folgendes gemacht : DBedit1 für die Nr. in Ecke geschoben und visible auf false gesetzt. Alles andere kann ja bleiben.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Edit1Exit(Sender: TObject);
  beginEdit1.Enabled := false;            { darf nicht mehr editiert werden}
  WITH DataModule2.KGdatenSatz DO BEGIN
    active := false;
    SelectSQL.Text := 'select * from KG8 where "nr" = ' + Edit1.text;
    active := true;
    IF DataModule2.KGdatenSatz.IsEmpty THEN BEGIN
      ShowMessage ('neuer Datensatz !');
      insert;
      FieldByName ('nr').value := StrToInt (Edit1.text);
    END;
  END;
end;


Aber jetzt kommt das, was ich vermeiden wollte : In das Edit1-Feld kann ich eingeben, was ich will. Hingegen gehen bei der Bez. nur 25 Zeichen
in das Feld, genauso viele wie in der DB dafür definiert sind.

Dies würde bedeuten, eine Reihe Exceptions zu schreiben. Typumwandlung sowieso.

Weiterhin stellt sich die Frage, in wie weit die Definitionen in der DB von Delphi ausgewertet werden könen? Darüber habe ich noch nichts gelesen.

Ein Editfeld pro Datensatz, das ginge ja noch. Aber falls alle Felder trotz DB-Definition noch von Hand abgecheckt werden müssen, na dann gute Nacht.

Muß mir vielleicht die Exceptions der DB mal genauer ansehen. Wie weit macht Delphi aber da mit?

Gruß
Hansa
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 10.09.02 14:03 
Hi
Das ist so ziemlich genau der Ansatz den ich auch gerade zusammengebastelt habe.
Um die DBEdit-Felder brauchst du dich nicht zu kümmern. Die orientieren sich immer an den Datenbankfeldern. Bei dem einen Edit-Feld wirst du wohl oder übel selbst checken müssen was drinsteht. Welche Delphi Version verwendet du?

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 10.09.02 15:49 
Hi,

D6Pro, notfalls D6Enterprise. DBedit Felder aus DB? um so besser. Will lieber mehr Arbeit in DB investieren, als in Quelltext. Der eingeschlagene Weg scheint ja einigermaßen richtig. Gut zu wissen.

Gruß
Hansa

P.S.: war leider weg, die Adresse ist aber schon übermittelt, hab ich vorher gesehen. :shock:
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 10.09.02 17:42 
Hi
wenn du D6 Pro hast, warum verwendest du dann die FIB und nicht die mitgelieferten IBX Komponenten :?!?: Oder reden wir hier mit zwei verschiedenen Begriffen für ein und dasselbe?

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 11.09.02 11:14 
Hallo Lothar,

Titel :

Tquery in Interbase SQL-Datenbank

Das mit FIBplus ist irgendwie jetzt in dem thread drin. Aber der Titel ist immer noch richtig.

Zitat:

Wenn auch nur die Chance besteht, dass Du Geld einnimmst, dann die FB/FIBPlus Variante nehmen
Copyright by Lemmy.

Das war die Antwort auf die Frage welche Komponenten und DB's wohl gut sind, auch in Zukunft. Kann das im übrigen mittlerweile bestätigen.

Außerdem verwende ich Firebird. Die IBX werden mit Sicherheit demnächst inkompatibel, genauso wie Borland-Interbase. Also ist Ärger oder unnötige Arbeit, die keiner bezahlt bereits vorprogrammiert. Zumindest meiner Meinung nach. Hat jemand bessere Erkenntnisse : her damit.

Gruß
Hansa
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 11.09.02 11:21 
Peinlich, peinlich
Zitat:

Habe mir eine IB-Datenbank (genauer Firebird) angelegt

Wer lesen kann ist klar im Vorteil :oops:

Aber: Die Kombination mit IB und IBX ab 4.5 funktioniert auch beim Kunden recht gut. Sofern man die vorhandenen Stolperstellen umgeht. Meine Erfahrung bis jetzt: Stabil, Schnell und keine Probleme.
Muss allerdings zugeben, dass ich schon seit Jahren keinen Blick mehr auf die FIB Komponenten geworfen habe. Sollte ich vielleicht mal nachholen :roll:

Gruss Lothar
*derseittagendokumentationschreibt*

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...