Autor Beitrag
foxy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 07:57 
hi all
ok ich mal wieder

also ich beschreibe alles mal kurz ...

Hansa hat mir ne DB aufgesetzt die auch wunderbar läuft.
Es gibt nur ein Problem, und zwar
Ich habe 3 tabellen, jede Tabelle einen generator und 3 Trigger, diese sollen den anderen Tabellen den ID-Wert der vorherigen übermitteln und updaten.

Die betonung liegt auf sollten :?
weil wenn ich nun einen datensatz einfüge wird die ID der masterTabelle generiert diese ID soll natürlich dann auch in der untergeordneten tabelle erscheinen , tut sie aber nicht

ich hab es schon mit foreigkeys versucht kein Erfolg .. ich weis echt nicht weiter :?

das einzichste was noch sein könnte, das ich meinem datamodule irgendwas falsch verknüpft habe.
Dies beschreibe ich kurz wie ich das gemacht habe

Für jede tabelle ein Dataset, diese ist unter der IBTransaction.
In jedem Dataset ist eine Datasource enthalten.

die knöpfe also Post und delete etc. habe ich selber geschrieben also kein DBNav.
er schreibt den datensatz zwar in die db aber eben es gibt keine abhängigkeit zwischen den tabellen

ich hoffe ihr versteht das irgendwie ... ich begreif es selber nicht abr ich habe so gut es ging einmal das Problem beschrieben... hoffe ihr könnt damit was anfangen

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 08:28 
Hallo!

Du solltest das ein wenig genauer erläutern. Du hast 3 Tabellen. Wie sind die Beziehungen untereinander? Was soll überhaupt erreicht werden durch die Trigger?

Zitat:
wenn ich nun einen datensatz einfüge wird die ID der masterTabelle generiert diese ID soll natürlich dann auch in der untergeordneten tabelle erscheinen


Das ist verwirrend. Wenn du einen DS in der Mastertabelle anlegst, können doch zu diesem Zeitpunkt noch gar keine abhängigen Datensätze auf Detailebene existieren. Wo soll denn der Trigger da bitte schön die ID hinschreiben? Oder soll der Trigger auch Datensätze selber anlegen?

Vielleicht postest du einfach mal die Tabellenstruktur sowie den Triggercode, so ist das nur schwer verständlich.

Auch solltest du erklären, was bei den Foreign-Keys nicht geklappt hat. Ich benutze sie sehr gerne, sie funktionieren einwandfrei.

Cu,
Udontknow
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 08:33 
ok mach ich
hier die trigger

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:
/* Trigger: ANGEBOTE_BI0 */
CREATE TRIGGER ANGEBOTE_BI0 FOR ANGEBOTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID (GEN_ANGEBOTE_ID,1);
 /* Trigger text */  /* Trigger text */
end
^

/* Trigger: ANPOSTEN_BI0 */
CREATE TRIGGER ANPOSTEN_BI0 FOR ANPOSTEN
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID (GEN_ANPOSTEN_ID,1);
 /* Trigger text */
end
^

/* Trigger: FIRMEN_BI0 */
CREATE TRIGGER FIRMEN_BI0 FOR FIRMEN
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID (GEN_FIRMEN_ID,1);
 /* Trigger text */
end
^


ich weis das dies schwer verständlich ist ... aber ich weis nicht wie ich das beschreiben soll ... und eigentlich sollen die trigger schon einen datesatz anlegen, aber nur auf der detail ebene :?

die trigger sind nicht von mir geschreiben das sag ich gleich

und das mit der ID meinte ich einfach, das wenn in der master tabelle eine ID generiert wird, wenn ich dann auf den datensatz klicke soll meine detail tabelle erscheinen und genau NUR zu diesem datensatz die details erscheinen ... also eine abhängigkeit
hoffe ist nun bischen klarer

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 08:44 
Also, ich fasse mal zusammen:

Du hast die Tabellen Firmen, Angebote und Anposten (Angebotsposten).

Die stehen in folgender Relation:

Es gibt mehrere Firmen. Einer Firma können n Angebote zugeordnet werden, welche wiederum jeweils m Posten haben.

Soweit, so gut. Die Trigger vergeben aber immer nur einen neuen Wert an das Feld ID (ID ist wahrscheinlich dein Primärschlüssel). Um nun eine Master-Detail-Beziehung herzustellen, musst du weitere Felder haben: Deine Tabelle Angebote benötigt das Feld Firma_ID(Zu welcher Firma gehört das Angebot?), deine Tabelle Anposten benötigt das Feld Angebot_ID. Diese müssen dann von deinem Programm bestückt werden.

Cu,
Udontknow
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 08:49 
japp die werte habe ich ... das ist es ja :D

ok soweit hast dus wirklich verstanden juhuu

aber dann sollte ja in Firma_ID sollte dann doch die ID stehn von der tabelle Firma

also von dem datensatz den ich ausgewählt habe
steht sie aber nicht

der aufbau war schon richtig nur unter angebot ist eben die details von der firma untergebracht also standort etc. und bei anposten sind die angebote also mehrere .... aber das passt alles nicht so zusammen der zeit immer alle datensätze an und das ist ja nich sinn der sache

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 09:04 
Pffff....

Also: Du legst einen FirmenDS an, der erhält durch den Trigger die Nummer 200. Wenn du in deinem Programm dann auf "Neues Angebot" gehst, wird in der Tabelle "Angebote" ein neuer Datensatz mit der ID 500 angelegt. Du musst im Programm dafür sorgen, daß dieser DS im Feld Firma_ID dann die ID der ausgewählten Firma erhält (also 200). Trigger oder Foreign-Keys nehmen dir diese Arbeit nicht ab, wie sollten sie auch?
Foreign-Keys sorgen aber z.B. dafür, daß, wenn man den Hauptdatensatz (also den DS aus der Tabelle Firma) löscht, auch sämtliche untergeordneten (alle DS aus der Tabelle Angebote mit der ID des zu löschenden FirmenDS) entfernt werden.

Cu,
Udontknow
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 09:07 
ja und wie gebe ich das an ....

sry ich hab echt noch 0 plan ...

soll ich das per SQL abfrage irgendwie machen wenn ja wie :D

muss ich sagen:
ID_firma ist glei ID der tabelle firma , und nur wenns gleich ist dann auch nur diesen aufrufen?

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 09:11 
Du hast ja ein Dataset, mit dem du postest. Dort übergibst du einfach im OnBeforePost-Ereignis den Feldwert.

ausblenden Quelltext
1:
2:
3:
4:
procedure MeinAngebotsDatasetBeforePost(Dataset:TDataset);
begin
  MeinAngebotsDataset.FieldByName('Firma_ID').Value:=MeinFirmaDataset.FieldByName('ID');
end;


Cu,
Udontknow


Zuletzt bearbeitet von Udontknow am Mo 19.05.03 09:17, insgesamt 1-mal bearbeitet
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 09:16 
ahhh ... ok wunderbar ... bin ich schonmal ein schritt weiter *gg*

ok nur noch eine frage... ich muss doch dann überprüfen, das wenn ich auf den entsprechenden datensatz klicke auch dann nur die entsprechende details kommen....

also muss ich das dann irgendiwe filtern?

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 09:20 
Manuell filtern musst du nicht. Dafür gibt es die Eigenschaften Mastersource sowie Masterfields, die du dann bei deinem Angebotsdataset bestücken musst.

Cu,
Udontknow
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 09:27 
heee???
*nixpeil*
:shock:

emm ich glaub ich könnt :puke:

ne im ernst wieder ... was ist das , wo trage ich das ein etc. :)

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 09:41 
Was für Datasets verwendest du gleich? TIBDataset?
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 09:42 
japp

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 10:23 
Hmm, da ist es ein bisschen komplexer. Du musst dort die Eigenschaft Datasource setzen. Über die TStrings-Eigenschaft SelectSQL kannst du ja das SQL-Statement setzen.
Dies müsste dann in Angebote etwa so aussehen:

ausblenden Quelltext
1:
select * from angebote where Firma_ID=:ID					


":ID" wird dabei als Parameter erkannt, und Delphi versucht daraufhin, das Feld ID aus der Datasource "DS_Firmen" (oder wie auch immer sie bei dir heisst) zu holen und dort einzufügen.

Cu,
Udontknow
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 19.05.03 10:43 
Hi,

der Klarheit wegen poste ich mal foxys Tabellenstruktur (von mir bereinigt) :

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:
/******************************************************************************/
/****          Generated by IBExpert 2.5.0.19 19.05.2003 11:29:02          ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE '\delphi\foxy.gdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/

CREATE TABLE FIRMEN (
    ID        INTEGER NOT NULL,
    FIRMA     CHAR(40),
    ANGEBOTE  CHAR(1)
);

CREATE TABLE ANGEBOTE (
    ID        INTEGER NOT NULL,
    ID_FIRMA  INTEGER,
    CODE      CHAR(20),
    FIRMA     CHAR(40),
    STANDORT  CHAR(40),
    ASRESSE   CHAR(40),
    TELNR     CHAR(40),
    TEST      BLOB SUB_TYPE 1 SEGMENT SIZE 60
);


CREATE TABLE ANPOSTEN (
    ID                INTEGER NOT NULL,
    ID_ANGEBOT        INTEGER NOT NULL,
    ANGEBOTPOSTENBEZ  CHAR(40)
);

/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE ANGEBOTE ADD CONSTRAINT PK_ANGEBOTE PRIMARY KEY (ID);
ALTER TABLE ANPOSTEN ADD CONSTRAINT PK_ANPOSTEN PRIMARY KEY (ID);
ALTER TABLE FIRMEN ADD CONSTRAINT PK_FIRMEN PRIMARY KEY (ID);


Wobei ich nur für die IDs und Trigger verantwortlich bin (Nomenklatur und sonstiges hat foxy verbrochen). 8) Die ID_FIRMA und ID_ANGEBOT habe ich neu eingeführt. Dann die 3 Trigger, die nur als AutoInc Funktion der Primary Keys sorgen, sonst aber nichts :!:

Ansonsten hat UdontKnow doch schon geschrieben, was noch passieren muß. Und foxy, dann gehts doch ganz einfach weiter, z.B.: "SELECT * FROM ANGEBOT WHERE ID_FIRMA = : ID" listet Dir dann alle Angebote einer einzelnen Firma auf, wobei :ID ein Parameter ist, z.B. Edit1.Text. Und das wird dann wohl die nächste Frage. :lol:

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 19.05.03 10:48 
@Hansa:

":ID" ist ein Parameter, der von Delphi automatisch aus der dem IBDataset zugeordneten Datasource bestückt wird. Du musst also keinen weiteren Code tippen. Einfach als Datasource eine Datenquelle von FirmaDataset bei AngebotDataset angeben, fertig ist die Sache. Wenn du dann also im Firmengrid eine andere Firma anwählst, bekommt das das AngebotDataset auch sofort mit und aktualisiert sich.

Cu,
Udontknow
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 19.05.03 11:05 
also brauch ich sozusagen nur eine datasource, und die ist in meiner mastertabelle und alle anderen datasets mit der verbinden und fertig?? O_o

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Di 20.05.03 07:33 
hi jungs ich wieder

also ich hab mal bischen nachgeforscht ... Udont deine möglichkeit mit den values hat der mir immer einen error gebracht...

nun hab ich was gefunden weis aber nicht ob ich das so machen kann

ausblenden Quelltext
1:
SELECT Firmen.ID, Angebote.ID_Firma FROM Firmen JOIN Angebote ON Firmen.ID = Angebote.ID_Firma					


das habe ich gerade gefunden ....

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 20.05.03 08:38 
Ein Join ist in keinster Weise zu bearbeiten, daher nicht unbedingt zu empfehlen. Vielleicht sagst du einfach mal, was für Probleme du mit der obigen Variante hast?
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Di 20.05.03 08:47 
ja also ich hab das in diese ereignis geschrieben... aber wenn dieses ereignis also die prozedure aufgerufen wird kommt ein sql statement fehler code 303

edit:
ich glaube ihr versteht meine probleme alle nicht :rofl:
hab mir das ganze nomma durchgelesen .... es ist so, das ich eine abhängigkeit von meiner master tabelle schaffen will das, wenn ich einen datensatz anklicke auch nur diese informationen in meinem neuen grid erscheinen dies verbindung will ich herstellen sonst nüx =)

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)