Announcement

Collapse
No announcement yet.

Select- und Update-SQL-Text wird nicht gespeichert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Select- und Update-SQL-Text wird nicht gespeichert

    Hallo,

    Betrifft: IBQuery, IBDataset der "original" D5 IBX-Komponenten:

    Ich habe festgestellt, daß in der IDE Änderungen der Eigenschaft SelectSQL bzw. SQL nicht übernommen werden. <br>
    Beispiel:
    1. Der SelectSQL-Text eines TIBDataset lautet "Select * from ADRESSE", <br>
    2. ich ändere nun den Text nach "Select * from ADRESSE order by PLZ" <br>
    3. Ich schließe den SQL-Editor der Komponente <br>
    4. Ich öffne de SQL-Editor der Komponente und sehe nun wieder den "alten" Text:"Select * from ADRESSE" <br>
    Wenn ich diese Prozedur nach einem Neustart des Rechners (manchmal auch nach einem Neustart von Delphi) wird die Änderung korrekt übernommen.<br>
    <br>
    In der Hoffnung, daß dies durch Update auf die IBX-Komponenten Version 4.2 beseitigt wird, installierte ich die Updates 4.1 gefolgt von 4.2. <br>
    <br>
    Nun habe ich dieses Verhalten auch in den UpdateSQL-Eigenschaften(InsertSQL, ModifySQL, DeleteSQL, RefreshSQL) der IBUpdateSQL-Komponente und der IBDataset-Komponente, wenn ich diese durch den Editor generieren lasse. <br>
    Allerdings nützt hier ein Neustart nichts. <br>
    Ich muß diese Eigenschaft mühsam per Hand eintragen. <br>
    <br>
    Weiß jemand Rat? <br>
    Hat dieses Verhalten außer mir schon mal jemand bemerkt ? <br>
    <br>
    Gruß <br>
    Wolfgang Bierl

  • #2
    Hallo,

    ich kann das Verhalten mit Delphi 5 UpdatePack#1 und IBX-Patch 4.2 nicht nachvollziehen. Um alle Missverständnisse auszuschliessen, liste ich alle Arbeitsschritte auf: <br>
    1. TIBDatabase und TIBTransaction in das Hauptformular legen. <br>
    2. Beide Komponenten gegenseitig verbinden (DefaultDatabase, DefaultTransaction) <br>
    3. TIBDatabase auf die Delphi-Demodatenbank employee.gdb konfigurieren und öffnen. <br>
    4. TIBDataSet in das Hauptformular legen. <br>
    5. Objektinspektor: TIBDataSet.SelectSQL = SELECT * FROM COUNTRY <br>
    6. Rechter Mausklick auf TIBDataSet -> Dataset-Editor -> SQLs generieren -> Dialog schließen<br>
    7. Objektinspektor: TIBDataSet.SelectSQL wird geändert (ORDER BY) <br>
    8. Bei nachfolgenden Aufrufen ist der SQL-Text ungeändert, die ORDER BY-Anweisung wird zur Laufzeit verwendet (Sortierte Anzeige)

    Comment


    • #3
      Hallo!

      Vielen Dank für die schnelle Reaktion.

      Bis 7. ist alles richtig.
      Mein Problem ist, daß der in der IDE geänderte/generierte SQL-Text (5. und 6.) nicht gespeichert wird. D.h. ich gebe den Text ein, aber beim Ausführen der Anwendung wirkt er nicht (DataSet kann nicht editiert werden). Zurück in der IDE: Wenn ich mir dann die UpdateSQL-Texte im Objektinspektor ansehe, sind diese leer.

      Ich spreche hier von <b>einem</b> Problem in zwei verschiedenen "Ausbaustufen":<br>
      <br>
      1. Standardzustand=Delphi5 UpdatePack #1<br>
      2. Standardzustand=Delphi5 UpdatePack #1 und IBX-Patch 4.2<br>
      <br>
      Bei Ausbaustufe 1. wurden <b>Änderungen</b> am SelectSQL bei IBDatasete und IBQuery nicht übernommen. D.h. beim ersten mal Eingeben wurde ordnungsgemäß gespeichert.
      UpdateSQL in der IBUpdateSQL-Komponenten ordnungsgemäß generiert und gespeichert.<br>
      Die IBDataSet hatte noch keinen Generator für UpdateSQL.<br>
      <br>
      In der Ausbaustufe 2 hat IBDataSet auch einen Generator für UpdateSQL.
      Die hier generierten SQL-Statments werden nicht gespeichert, das gleiche Problem gibt es jetzt bei der IBUpdateSQL-Komponente (scheinbar der gleiche Generator wie bei IBDataset). <br>
      <br>
      Ich habe dieses Problem im Delphi.InterbaseExpress-Formum gepostet und bekam die Information, daß dieses Problem in der englischen Version nicht auftritt.
      <br>
      <br>
      Gruß <br>
      Wolfgang Bier

      Comment


      • #4
        Hallo,

        das Problem tritt auch in der deutschen Version nicht auf ;-) <br>
        In der README.TXT von den verschiedenen IBX-Patches (und von denen gibt es ja reichliche) stand immer der Satz zu lesen, dass ein De-Installieren eines eingespielten Patches nicht möglich ist. Glücklicherweise habe ich unmittelbar vor IBX 4.2 meinen Entwicklungs-Rechner gewechselt, so dass Delphi 5 neu installiert wurde und sowohl das UpdatePack#1, das ADO-Patch#3 und das IBX-Patch#4.2 hinterher neu aufgespielt wurde. Und in dieser Konfiguration läuft alles prima. Ich habe mir das Ganze jedoch auf einem anderen Rechner angesehen, der seit Delphi 4 in Verwendung ist. Dort tritt das Problem ebenfalls nicht auf, allerdings kann ich nicht beschwören, dass dort alle vorherigen IBX-Patches eingespielt wurden.

        Ich würde daher Delphi 5 vollständig deinstallieren, die Verzeichnisse aufräumen und neu installieren. Spätestens dann sollte das Problem beseitigt sein.

        P.S. Liegen eventuell noch alte DCUs bzw. Packages rum, die seit dem Einspielen von 4.2 nicht aktualisiert wurden

        Comment


        • #5
          Hallo!

          Also doch (wie befürchtet) die "harte Tour".

          Lese ich da zwischen den Zeilen, daß die IBX-Version 4.1 übersprungen werden kann ?

          Gruß
          Wolfgang Bier

          Comment


          • #6
            Hallo,<br>
            <br>
            Ich habe Delphi komplett neu installiert, das hat leider nichts gebracht.<br>

            <br>
            Kann es sein, daß es an der Version des InterBase Client liegt, das ist auf diesem Rechner die Version 5.5

            Comment


            • #7
              Hallo,

              nein - offiziell ist IBX auch für den InterBase 5.x einsetzbar. Der einzige Unterschied zwischen InterBase 5.x und 6 besteht darin, dass beim Starten von Delphi nachgeschaut wird, ob die GDS32.DLL-Version des InterBase 6 vorhanden ist. Wenn ja, werden die zusätzlichen Komponenten auf der IBAdmin-Palette angezeigt

              Comment


              • #8
                Hallo,
                <br>
                ...es ist scheinbar <b>immer</b> die einfachste Ursache.<br>
                <br>
                Wenn man große Schriftarten verwendet sind im Dialogfenster zum Generieren der UpdateSQL-Statements keine Schaltflächen sichtbar (auch nicht wenn man den Dialog auf Vollbild vergrößert). So ist das Speichern natürlich nicht möglich (außer mit [alt]+[o]).<br>
                <br>
                <b>Aber es ist trotzdem ein BUG, zwar ein anderer, aber ein BUG!</b> ;-

                Comment


                • #9
                  hallo ich habe ein Problem mit updatesql
                  Ich habe 2 tabellen die in einem DBgrid angezeigt werden beide tabellen haben primarey key (Id) ,
                  jetzt möchte ich die beiden tabellen bearbeiten(löschen,insert,update) wobei es bei mir nicht so funktioniert wie ich möchte.
                  Kann man überhaupt in einen deltetext der updatekomponente 2 spalten auf einmal updaten???

                  ich habe jetzt bisher im delete text stehen:
                  <br>
                  delete from name,vorname
                  where
                  name.id = :OLD_name.id
                  and
                  vorname.id=ld_vorname.id
                  <br>bisher bekomme ich immer ein sql error

                  Comment


                  • #10
                    Hallo,

                    wenn eine SQL-Anweisung nicht erfolgreich über das SQL-Fenster der IBConsole abgeschickt werden kann, darf man auch nicht erwarten, dass es mit IBX funktioniert.

                    Wenn bei einer Aktion mehrere Arbeitsschritte abzuarbeiten sind, würde ich auf die Kombination von <b>Cached Updates</b> und der Ereignisbehandlungsmethode für <b>OnUpdateRecord</b> zurückgreifen. Das folgende IBX-Beispiel demonstriert, wie anstelle von SQL-Anweisungen spezielle Stored Procedures aufgerufen werden. Somit kann der Client mit nur einem Aufrufe mehrere SQLs direkt auf dem Server ausführen lassen (solange alle diese Anweisungen in eine Stored Procedure verpackt werden):
                    <pre>
                    { Cached Update über OnUpdateRecord-Ereignisbehandlungsmethode als
                    Alternative zu einer TUpdateSQL-Komponente }

                    procedure TDataModule2.IBDataSet2UpdateRecord(DataSet: TDataSet;
                    UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction);
                    begin
                    if UpdateKind = ukDelete then
                    begin
                    IBStoredProcDELETE.Params[0].Value := IBDataSet2ID.OldValue;
                    IBStoredProcDELETE.ExecProc;
                    end;
                    if UpdateKind = ukInsert then
                    begin
                    IBStoredProcINSERT.Params[1].Value := IBDataSet2LAND.Value;
                    IBStoredProcINSERT.Params[2].Value := IBDataSet2HAUPTSTADT.Value;
                    IBStoredProcINSERT.ExecProc;
                    if GetGeneratorID then
                    begin
                    FID := IBStoredProcINSERT.Params[0].Value;
                    ShowMessage('Neue ID:' + IntToStr(FID));
                    // Vom Generator vergebenen Primärschlüsselwert einsetzen
                    IBDataSet2ID.NewValue := FID;
                    end;
                    end;
                    if UpdateKind = ukModify then
                    begin
                    IBStoredProcUPDATE.Params[1].Value := IBDataSet2LAND.NewValue;
                    IBStoredProcUPDATE.Params[2].Value := IBDataSet2HAUPTSTADT.NewValue;
                    IBStoredProcUPDATE.ExecProc;
                    end;
                    UpdateAction := uaApplied;
                    end;
                    </pre>
                    P.S: Das vollständige Beispielprojekt ist in meinem Buch <i>InterBase Datenbankentwicklung mit Delphi</i> zu finden

                    Comment

                    Working...
                    X