| Autor |
Beitrag |
foxy
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Mo 19.05.03 08:33
ok mach ich
hier die trigger
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Mo 19.05.03 08:49
japp die werte habe ich ... das ist es ja
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 19.05.03 09:11
Du hast ja ein Dataset, mit dem du postest. Dort übergibst du einfach im OnBeforePost-Ereignis den Feldwert.
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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Mo 19.05.03 09:27
heee???
*nixpeil*
emm ich glaub ich könnt
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 19.05.03 09:41
Was für Datasets verwendest du gleich? TIBDataset?
|
|
foxy 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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:
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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 19.05.03 10:43
Hi,
der Klarheit wegen poste ich mal foxys Tabellenstruktur (von mir bereinigt) :
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).  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. 
_________________ Gruß
Hansa
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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
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)
|
|
|