Announcement

Collapse
No announcement yet.

Leeres Feld im DBGrid

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

  • Leeres Feld im DBGrid

    Hallo,<br>
    irgendwo habe ich mir etwas Tolles eingebaut : Ich benutze D5, UP1, IB6.0.1, IBX 4.6. Komponente: IBDataset und DBgrid. Angezeigt werden 4 Zeilen mit 6 Spalten. Die SQL-Dateien sind wie im Redsysdemo eingetragen mit dem Unterschied, das ich als Parameter eine ID Nummer übergebe. Jede ID hat 4 DB-Zeilen mit Werten. Tippe ich jetzt Werte ein ist alles ok, bis ich die letzte Spalte verlasse. An der letzten Stelle bleibt das Grid leer. Öffne und schließe ich das Dataset, wird alles angezeigt, auch die Eingaben in den leeren Feldern.<br>
    Ist das ein IBX - Bug ?

    Gruß Günter

  • #2
    Hallo,

    lässt sich dieser Effekt mit einem kleinen Beispielprojekt reproduzieren? Wenn ja, wie sieht dieses Beispiel und die dazugehörende CREATE TABLE-Anweisung aus?

    Wie unterscheidet sich SelectSQL von RefreshSQL für diese TIBDataSet-Instanz?
    &#10

    Comment


    • #3
      Hallo,

      die SQL lauten :
      select : select id,messort,w1,w2,w3,w4,w5 <br>
      from messwert where id = :Wert order by messort<br>
      refresh : select id,messort,w1,w2,w3,w4,w5<br>
      from messwert where id = :OLD_ID and messort = :OLD_Messort
      <br>
      die tabelle :<br>
      id integer, messort varchar(30), w1-w5 integer
      ohne schlüssel, da die ID jeweils 4 - 6 mal vorkommt

      gruß Günte

      Comment


      • #4
        Hallo,

        ich habe das Ganze einmal nachgebaut (Delphi 5.01; IBX 4.62; InterBase 6; Windows 2000 Professional):

        1. Datenbanktabelle:
        <pre>
        CREATE TABLE forster (
        id integer not null primary key,
        messort varchar(30),
        w1 integer,
        w2 integer,
        w3 integer,
        w4 integer,
        w5 integer)
        </pre>
        2. TIBDataSet: <b>SelectSQL</b>:
        <pre>
        select ID, MESSORT, W1, W2, W3, W4, W5 from FORSTER
        </pre>
        3. TIBDataSet: <b>DataSet-Editor</b> generiert die restlichen SQL-Anweisungen automatisch (Button <i>SQL generieren</i> anklicken, nachdem die Primärschlüsselspalte ausgewählt wurde).

        4. Programm starten: Datensatz anlegen, <b>alle Werte</b> werden im TDBGrid angezeigt.

        PAS:
        <pre>
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        Db, IBCustomDataSet, ExtCtrls, DBCtrls, Grids, DBGrids, IBDatabase;

        type
        TForm1 = class(TForm)
        IBDatabase1: TIBDatabase;
        IBTransaction1: TIBTransaction;
        IBDataSet1: TIBDataSet;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        DBNavigator1: TDBNavigator;
        IBDataSet1ID: TIntegerField;
        IBDataSet1MESSORT: TIBStringField;
        IBDataSet1W1: TIntegerField;
        IBDataSet1W2: TIntegerField;
        IBDataSet1W3: TIntegerField;
        IBDataSet1W4: TIntegerField;
        IBDataSet1W5: TIntegerField;
        private
        { Private-Deklarationen }
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        end.
        </pre>
        DFM:
        <pre>
        object Form1: TForm1
        Left = 279
        Top = 108
        Width = 696
        Height = 480
        Caption = 'Form1'
        Color = clBtnFace
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        OldCreateOrder = False
        PixelsPerInch = 96
        TextHeight = 13
        object DBGrid1: TDBGrid
        Left = 24
        Top = 104
        Width = 641
        Height = 120
        DataSource = DataSource1
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'MS Sans Serif'
        TitleFont.Style = []
        end
        object DBNavigator1: TDBNavigator
        Left = 24
        Top = 80
        Width = 320
        Height = 25
        DataSource = DataSource1
        TabOrder = 1
        end
        object IBDatabase1: TIBDatabase
        Connected = True
        DatabaseName = 'C:\Database\IB6\NEU6D3.GDB'
        Params.Strings = (
        'user_name=sysdba'
        'password=masterkey'
        'lc_ctype=ISO8859_1')
        LoginPrompt = False
        DefaultTransaction = IBTransaction1
        IdleTimer = 0
        SQLDialect = 3
        TraceFlags = []
        Left = 24
        Top = 16
        end
        object IBTransaction1: TIBTransaction
        Active = True
        DefaultDatabase = IBDatabase1
        AutoStopAction = saNone
        Left = 24
        Top = 48
        end
        object IBDataSet1: TIBDataSet
        Database = IBDatabase1
        Transaction = IBTransaction1
        BufferChunks = 1000
        CachedUpdates = False
        DeleteSQL.Strings = (
        'delete from FORSTER'
        'where'
        ' ID = :OLD_ID')
        InsertSQL.Strings = (
        'insert into FORSTER'
        ' (ID, MESSORT, W1, W2, W3, W4, W5)'
        'values'
        ' (:ID, :MESSORT, :W1, :W2, :W3, :W4, :W5)')
        RefreshSQL.Strings = (
        'Select '
        ' ID,'
        ' MESSORT,'
        ' W1,'
        ' W2,'
        ' W3,'
        ' W4,'
        ' W5'
        'from FORSTER '
        'where'
        ' ID = :ID')
        SelectSQL.Strings = (
        'select ID, MESSORT, W1, W2, W3, W4, W5 from FORSTER')
        ModifySQL.Strings = (
        'update FORSTER'
        'set'
        ' ID = :ID,'
        ' MESSORT = :MESSORT,'
        ' W1 = :W1,'
        ' W2 = :W2,'
        ' W3 = :W3,'
        ' W4 = :W4,'
        ' W5 = :W5'
        'where'
        ' ID = :OLD_ID')
        Active = True
        Left = 72
        Top = 16
        object IBDataSet1ID: TIntegerField
        FieldName = 'ID'
        Origin = 'FORSTER.ID'
        Required = True
        end
        object IBDataSet1MESSORT: TIBStringField
        FieldName = 'MESSORT'
        Origin = 'FORSTER.MESSORT'
        Size = 30
        end
        object IBDataSet1W1: TIntegerField
        FieldName = 'W1'
        Origin = 'FORSTER.W1'
        end
        object IBDataSet1W2: TIntegerField
        FieldName = 'W2'
        Origin = 'FORSTER.W2'
        end
        object IBDataSet1W3: TIntegerField
        FieldName = 'W3'
        Origin = 'FORSTER.W3'
        end
        object IBDataSet1W4: TIntegerField
        FieldName = 'W4'
        Origin = 'FORSTER.W4'
        end
        object IBDataSet1W5: TIntegerField
        FieldName = 'W5'
        Origin = 'FORSTER.W5'
        end
        end
        object DataSource1: TDataSource
        DataSet = IBDataSet1
        Left = 112
        Top = 16
        end
        end
        </pre>
        Warum wird für RefreshSQL <b>OLD_xyz</b> verwendet

        Comment


        • #5
          Hallo,

          zur Erklärung des Projektes :
          Drei Tabellen :<br>
          a. Adresse : ID primary key,NAme varchar(50),Strasse varchar(50),etc<br>
          b. Materialeinsatz : id (nicht primary),artikelnummer,anzahl<br>
          c. Messwert: id (nicht primary),messort,w1,w2,w3,w4,w5 <br>

          Wird ein neuer a. angelegt, so wird gleichzeitig 3-10 Zeilen von b. und c. angelegt, je nach Gebäudeart.(Messpunkte Kabelfernsehen)<br>

          Die Auftragsseite rufe ich über die ID auf (Auftragsnummer), die vom laufenden programm in eine integervariable des Auftragsformulars übergeben wird. Im OnShow öffne ich die TAbellen : <br>
          IBDatasetauftrag.params[0].asinteger := aktuell, <br>
          IBDatasetauftrag.open; <br>
          IBDatasetmesswert.params[0].asinteger := aktuell;
          IBDatasetmesswert.open.<br>

          Der Datensatz a. wird angezeigt, b. und c. selectiert mit 'where ID : Wert'.<br>

          Alles wird korrekt angezeigt. Im refresh steht :<br>
          select messort,w1,w2,w3,w4,w5 from messwert
          where id = :ID
          and messort = :Messort
          order by messort<br> da ich 3 - 10 Zeilen pro Auftrag habe muß ich mit ID und Messort die aktuelle Zeile erreichen.<br>

          Das gleiche bei Tabelle Materialeinsatz.

          Als Fehler ist auch nach Neuanlage über den Editor und erweiterung des Textes (s.o.)der Wert w5 unsichtbar, wenn ich die Tabellenzeile nach dem editieren verlasse.<br>
          Schließe ich das Blatt und öffne wieder,dann ist der Wert da.

          Die Materialtabelle hat nur 3 Spalten, hier tritt der Effekt nicht auf.<br>

          Gibt es eine elegantere Lösung ?

          Gruß Günte

          Comment


          • #6
            Nochmal Hallo,

            Try and error ! Der Fehler war in der DBGRid-Komonente. Ich wollte eine neue Datset anschließen und hatte beim Aufruf des Feldeditors die Meldung : 'Fehler, private Anweisung.' Ich konnte auch keine Felder zur Liste des Editors hinzufügen.

            Grid gelöscht, neu. Jetzt geht es. Kann die Meldung aus Win2000 kommen ? Oder sollte ich mal Delphi neu installieren ? Da ich die Ursache nicht kenne, ist das natürlich unbefriedigend.

            Schönen Abend noch. Günte

            Comment

            Working...
            X