Autor Beitrag
Kostas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 13.03.10 11:12 
Hallo Zusammen,

ich arbeite seit vielen Jahren mit IBO. Eine Sache hat mich schon immer gestört
und ich frage mich ob es dafür möglichweise doch eine Lösung gibt.

In einem TIB_Query habe ich ein Select mit einer weiteren Tabelle die über Join eingebunden ist.

Ein kleines Beispiel:
Select R.RechnungID, R.AdressID, A.Firma
from Rechnungen R
join Adressen A on (A.AdressID = R.AdressID)

In einer Form werden die Rechnungsdaten und die Adresse des Rechnungsempfängers angezeigt.
Sobald die AdressID zugewiesen wird, sollte die Daten aus der Join-Tabelle aktualisiert werden.
Das passiert jedoch nicht sondern erst beim Post oder Postretaining.

Kennt jemand eine Möglichkeit die Daten aus der Join-Tabelle ohne eine post zu aktualisieren?
Der Hintergrund ist, bei BeforePost werden die Daten auf Gültigkeit geprüft. BeforePost wird
auch beim Postretaining gefeuert. Es kann eben vorkommen das zu dem Zeitpunkt noch nicht alle
notwendigen Daten eingegeben wurden.
Aktuell mache ich PostRetaining, setzte defaultwerte in alle notNull Felder und lösche sie
anschließend. Nachteil dabei ist, wenn der user auf Abort klickt, sind die defaultwerte in der
DB.


Gruß Kostas
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Sa 13.03.10 12:08 
evtl. im Onchange/OnExit des AdressId-Feldes mit Hilfe eines 2ten Query immer die Adressdaten zu der Id lesen und die dann in deinen 'gejointen Query' übertragen ?

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Kostas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 13.03.10 12:21 
user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
evtl. im Onchange/OnExit des AdressId-Feldes mit Hilfe eines 2ten Query immer die Adressdaten zu der Id lesen und die dann in deinen 'gejointen Query' übertragen ?


Die Daten manuell zu überführen von einer Query auf die andere geht nicht, denn die Joining Tabelle ist ja Readonly.

Wenn ich die Daten nicht in ein Grid darstellen muss sondern in Feldern, ist es recht einfach.
Man nimmt eine zweite Query die nur die Adresse beinhaltet, bindet die TIB_Edit mit dem datasource uns
mach sobald die AdressID übergeben wurde ein refresh auf die zweite Query. Manschmal kommt es vor das die
Daten in ein Grid garsgestellt werden müssen. Dann geht das eben nicht.

Ich hätte erwartet dass eine Methode gibt etwa RefreshJoining.
Ich habe gerade eine property entdeckt "IsPostRetaining" damit kann ich zumindest bei OnBeforePost
raushupfen wenn gerade ein PostRetaining anliegt und meine Datenprüfung nicht durchführen.
Es bleibt jedoch weiterhin das Problem mit den "falschen" default werten in der DB.

Gruß Kostas
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Sa 13.03.10 13:05 
Probleme dieser Art bei Darstelung im Grid umgehe ich gerne, in dem ich das Grid nicht mit dem Query verbinde, sondern die Daten in einem ClientDataset (CDS) darstelle. Das CDS erzeuge ich mir automatisch mit der Struktur und den Daten des Query's, ab dann bin ich unabhängig beim lesen/ändern oder Anzeigen der Daten (im CDS bearbeiten kann ich dann, wie ich will, in DB schreibe ich dann eh immer die Daten aus dem CDS).
Prinzipielle Vorgehensweise:
Lesen aus DB > Query
Query in CDS schaufeln (ab da schliesse ich meist auch die Query's wieder)

Anzeigen in Masken (Form) > Grid mit CDS als Datasource
User in CDS ändern lassen (und ggf Daten nachlesen usw.)

Speichern in DB > CDS abschreiben (die Tabellen mit Query einzeln schreiben, dabei Feldprüfungen, Defaultwerte setzen, etc.)

Ist nur grob umrissen, aber das Thema ist etwas zu komplex um Dir hier eine allgemein gültige Antwort geben zu können. Hängt auch immer vom Anwendungsfall, DB-Design's und Programmdesign's ab. Hoffe aber, du verstehst meine ungefähre Herangehensweise.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Kostas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 13.03.10 13:24 
Habs verstanden. Wenn die Daten aus der TIB_Query extrahiert werden ist sicherlich alles möglich.
Der Aufwand ist enorm. Mal sehen was Jason dazu sagt.
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Sa 13.03.10 14:10 
naja, der Aufwand hält sich in Grenzen, was das Übertragen des Query's in ein Clientdataset betrifft. Ich geb dir mal ein bissl code, wie ich das mache (und für mich bislang immer fehlerfrei gearbeitet hat), vielleicht hilft dir das ja.

ausblenden volle Höhe Delphi-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:
procedure UebertrageDatenVonQueryInCDS(xQuery : TDataSet; 
                                      xCDS : TClientDataSet;
                                      xCdsLeeren : Boolean = True;
                                      xMitStrukturUebernehmen : boolean = False);
var
 i : integer;
begin
 if xMitStrukturUebernehmen then
 begin
  xCDS.FieldDefs.Clear;
  for i := 0 to xQuery.FieldCount-1 do
  begin
   if (xQuery.Fields[i].DataType = ftString) then
    xCDS.FieldDefs.Add(xQuery.Fields[i].FieldName, xQuery.Fields[i].DataType, xQuery.Fields[i].DataSize)
   else
    xCDS.FieldDefs.Add(xQuery.Fields[i].FieldName, xQuery.Fields[i].DataType)
  end;
  xCDS.CreateDataSet;
 end;

 if xCdsLeeren then
 begin
  if (xCDS.RecordCount > 0then
   xCDS.EmptyDataSet;
 end;

 xQuery.First;
 while not xQuery.Eof do
 begin
  xCDS.Append;
  for i := 0 to xQuery.Fields.Count-1 do
  begin
   xCDS.Fields[i].AsVariant := xQuery.Fields[i].AsVariant;
  end;
  xCDS.Post;
  xQuery.Next;
 end;
 xCDS.First;
end;


Sollte selbsterklärend sein, wenn du noch fragen hast: ab Montag, denn jetzt mach ich endlich Wochenende ;)

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Kostas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 13.03.10 19:02 
Ja, Danke sehr interessant.

Gruß Kostas