Autor Beitrag
Josef-B
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: So 20.07.03 10:04 
Ich habe folgenden Code:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
sqlstring := 'Insert into auftragkopfs (Auftragsnummer, Konto_nr, Bediener, '
+ 'LKW) values (' +dbedit1.text +',' +dbedit7.text +',' + '1,1)';
ibdatasetauftragskopf.active:= false;
ibdatasetauftragskopf.selectSQL.TEXT := sqlstring;
ibdatasetauftragskopf.active:=true;
ibdatasetauftragskopf.transaction.commitretaining;


Wenn ich jetzt z.b. den Befehl

ibdatasetauftragskopf.first oder prior oder next oder last eingebe, kommt die Fehlermeldung Zugriffsverletzung.

Wenn ich ihm anstatt commitretaining, commit aufgebe. Ist ja das
Dataset geschlossen. Wenn ich es wieder aktiviere, wird doch der SQL-Befehl wiederholt, gibt also auch wieder nen Fehler.

Was mache ich falsch? Danke im Voraus für Eure Hilfe.

Josef


Zuletzt bearbeitet von Josef-B am Di 22.07.03 20:49, insgesamt 1-mal bearbeitet
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 20.07.03 11:19 
ausblenden Quelltext
1:
(' +dbedit1.text +',' +dbedit7.text +',' + '1,1)'					


Das ergibt "+dbedit1.text++dbedit7++1,1)" oder so ähnlich. Das willst Du in die DB als Wert eintragen. Das kann so nicht gehen. Ich glaube da sind noch mehr Fehler. Muß aber leider weg.

_________________
Gruß
Hansa
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: So 20.07.03 11:36 
hallo

Zitat:
'Insert into auftragkopfs (Auftragsnummer, Konto_nr, Bediener, '
+ 'LKW) values (' +dbedit1.text +',' +dbedit7.text +',' + '1,1)';


Also der sqlstring sieht richtig aus,

aber das ist ein insert statement, damit erhältst du keine daten zurück. Deshalb kannst du kein first oder prior ausführen.
Wie gesagt, damit fügst du nur daten ein, das dataset weiß aber nicht, woher es dann hinspringen soll, weil du ja das ganze als selectsql eingestzt hast.
Du fügst daten ein, hast das aber im selectSql reingepackt, damit weiß dann das dataset nicht, welche daten es anzeigen soll.

Nimm ein IBQuery und füg das sql dort ein und mach execute, anschließend kannst du mit dem ibdataset weiter arbeiten.

Gruß
ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: So 20.07.03 19:13 
ja der SQL String funktioniert ja auch.

Ich will aber nochmals auf dem Dataset rumduskiturien. Deine Ausführungen sind einleuchtend.

Ich habe mir jetzt gedacht, ich schreibe den String jetzt in die Eigenschaft InsertSql, aber da passiert gar nichts. Der Satz wird nicht gespeichert. Vorher bei SelectSQL wurde er ordnungsgemäß gespeichert.

Wieso geht das denn nicht so?
Oder muss ich das InsertSQL noch mit nem extra Befehl ausführen?
Ich finde es eigentlich etwas kompliziert jetzt noch ein IBQuery aufzumachen. WIeso hat denn dann das IBDataset diese ganzen Eigenschaften, ich meine Select-, Insert-, Update- und Delete-SQL? Das verstehe ich überhaupt nicht.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
sqlstring := 'Insert into auftragkopfs (Auftragsnummer, Konto_nr, Bediener, '
+ 'LKW) values (' +dbedit1.text +',' +dbedit7.text +',' + '1,1)';
ibdatasetauftragskopf.active:= false;
showmessage ('String = ' +sqlstring);
ibdatasetauftragskopf.insertSQL.TEXT := sqlstring;
ibdatasetauftragskopf.active:=true;
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: So 20.07.03 20:28 
hallo,

ich glaube, du musst dann noch IBDataset.Insert; sagen

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
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 20.07.03 20:39 
Hallo
Josef-B hat folgendes geschrieben:
ja der SQL String funktioniert ja auch.

Ich will aber nochmals auf dem Dataset rumduskiturien. Deine Ausführungen sind einleuchtend.

Ich habe mir jetzt gedacht, ich schreibe den String jetzt in die Eigenschaft InsertSql, aber da passiert gar nichts. Der Satz wird nicht gespeichert. Vorher bei SelectSQL wurde er ordnungsgemäß gespeichert.

Logisch. Die Anweisung in InsertSQL wird nur ausgeführt, wenn du mit der Insert Methode des Dataset einen neuen Datensatz einfügst.

Josef-B hat folgendes geschrieben:
WIeso hat denn dann das IBDataset diese ganzen Eigenschaften, ich meine Select-, Insert-, Update- und Delete-SQL? Das verstehe ich überhaupt nicht.

Eigentlich ist das ganz simpel wenn du das mal mit einer normalen TTable Komponente vergleichst. Da gibts Methoden wie Insert, Delete, Edit, Refresh usw. Genau die gleichen Methoden hat auch IBDataset. Nur müssen hier die entsprechenden SQL-Statements an die Datenbank abgesetzt werden.
Wenn du das Dataset öffnest, wird SelectSQL ausgeführt. Wenn du einen neuen Satz einfügst InsertSQL, für Edit wird UpdateSQL und fürs Löschen DeleteSQL benötigt.
Damit ist es auch logisch, dass dein Insert-Statement im SelectSQL funktioniert, weil es beim Öffnen sofort ausgeführt wird. Allerdings ist das nicht die feine Art :mrgreen:
Wenn du nur ein einzelnes Insert absetzen willst, dann solltest du dem Vorschlag von CanBells folgen und ein IBQuery oder noch besser ein IBSQL verwenden.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: So 20.07.03 20:46 
ja und wo und wie genau muss ich jetzt das insert setzen?

Wenn ich es nach dem aktivieren des Datasets setze geht es ja auch nicht?!
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 20.07.03 20:55 
Hallo
machs doch mal ganz einfach. In SelectSQL kommt rein:
ausblenden Quelltext
1:
SELECT * FROM AUFTRAGSKOPF					

Dann klickst du mit der rechte Maustaste auf das Dataset, wählst Dataset Editor und lässt dir die restlichen SQL Anweisungen generieren.
Im Programm gehst du dann so vor:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
with Dataset do begin
  Active := True;
  Insert;   //Neuer Datensatz
  FieldByName('Auftragsnummer').Value := InhaltDeinerEditFelder;
  ...
  //Alle weiteren Felder füllen
  Post;
  Transaction.CommitRetaining;
  Active := False; //oder alles andere was du sonst noch machen willst
end;


Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: So 20.07.03 21:39 
Danke. die Routine hat funktioniert.

Ich kann jetzt speichern und das blättern in den Datensätzen funktioniert auch.

Die SQL Abfragen für Delete, Update und Refresh habe ich auch schon vorher in dem Dataset-Editor generiert.

Nur wofür ist das denn eigentlich?

Diese SQL-Anweisungen, die dann auch ja im Objekt-Inspektor unter den Properties vom Dataset stehen, wie werden die denn gestartet?
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 21.07.03 14:49 
Das Dataset ist am besten für ein DBGrid geeignet, damit dieses automatisch Änderungen, Neueinträge usw. ausführen kann, für solche manuellen Sachen nimmt man Queries, SQL-Kompos usw.
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 21.07.03 16:27 
Hi
Josef-B hat folgendes geschrieben:

...Diese SQL-Anweisungen, die dann auch ja im Objekt-Inspektor unter den Properties vom Dataset stehen, wie werden die denn gestartet?

Siehe mein erstes Posting.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: Mo 21.07.03 16:41 
Hallo Lothar,

ja ich habe ja deinen Rat angenommen.

Aber jetzt schau doch mal mein anderes Thema hier im Forum an.

(Datensätze editieren)

Da komm ich jetzt wieder nicht weiter.
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: Di 22.07.03 20:57 
Also jetzt hab ichs mal so gemacht:

Ich habe das IB-Dataset zum Anlegen, Vor- und Rückwärts- Navigieren der Datensätze.

Zum Ändern der Sätze habe ich ein IBSQL zugefügt und an die gleiche Datasource und Transaction gehängt. Das funktioniert auch. So weit, so gut.

Ich habe jetzt aber auch noch mal gelesen, dass es eigentlich doch auch mit dem IBDataset gehen würde. Ich lass da eben nicht locker, weil ich es eben nicht kapieren will, dass das nicht mit dem Dataset gehen sollte.

Also habe ich folgenden Code noch ausprobiert:
Das Problem ist, die Routine läuft ohne Fehlermeldung durch, aber in der Datenbank wird nix gespeichert. Am SQL.Text kanns eigentlich nicht liegen, weil der bei IBSQL genauso funktioniert. Da gehts auch mit dem Speichern.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
with ibdatasetpositionen do
begin
edit;
ID_Auftragspos := (strtoint(dbedit1.Text)*100) + strtoint(dbedit5.text);
ModifySQL.Text := 'UPDATE Auftragspositionensped SET ' +
     ' ID_Auftrags_Position = ' + inttostr(ID_Auftragspos)+
     ', Auftragsnummer = ' + dbedit1.text +
     ', Positionsnummer = ' + dbedit5.text +
     ', Lade_Name_1 = ' + quotedstr(dbedit6.text) +
     ' where ID_Auftrags_Position = ' + inttostr(id_auftragspos);
open;
transaction.commitretaining;
end;


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt