Announcement

Collapse
No announcement yet.

SQL: UPDATE-Problem

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

  • SQL: UPDATE-Problem

    Delphi4 C/S, ZEOS Datenkomponenten, postgreSQL unter Linux

    Hallo beisammen,

    ich möchte zum Druck einer Bestellung zunächst einige Datensätze selektieren, dann die Bestellung mit diesen Datensätzen drucken und nach dem Druck diese Datensätze als gedruckt markieren.

    Beim Markieren des Flags 'Bestellt' erhalte ich jedoch die Fehlermeldung "qyBestellPos: Das Feld 'entry' wurde nicht gefunden"

    Das Feld 'entry' ist der Primary Key der Tabelle BestellPos.

    Führe ich die SQL-Anweisung direkt unter postgreSQL aus, funktioniert sie - sie ist syntaktisch ja auch in Ordnung...

    Folgender Code wird verwendet:

    <PRE><CODE>
    procedure TfmBestellungen.btBestellenClick(Sender: TObject);
    begin
    // relevante Datensätze selektieren
    with dmGreenBase.qyBestellPos do
    begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM bestellpos');
    SQL.Add('WHERE lieferantnr = :SuchNr');
    SQL.Add('AND NOT komplett AND NOT bestellt');
    ParamByName('SuchNr').AsInteger := 12345;
    Open;
    end;

    // Bestellung "drucken"
    rpBestellung.Report.Preview;

    // Buchungen vornehmen
    with dmGreenBase.qyBestellPos do
    begin
    Close;
    SQL.Clear;
    SQL.Add('UPDATE bestellpos');
    SQL.Add('SET bestelldatum = CURRENT_TIMESTAMP, bestellt = True');
    SQL.Add('WHERE lieferantnr = :SuchNr');
    SQL.Add('AND NOT komplett AND NOT bestellt');
    ParamByName('SuchNr').AsInteger := 12345;
    Open;
    end;
    end;
    </PRE></CODE>

    Wer kann mir helfen?

    Danke
    Ralph

  • #2
    Hallo,

    normalerweise würde man 2 Instanzen der Query-Komponente verwenden, den SQL-Text fest zuordnen, persistente TFields- und Parameter-Objekte erstellen und im Objektinspektor bei Bedarf konfigurieren, das Ganze mit Prepare vorbereiten und dann erst zur Laufzeit die Parameter-Werte zuweisen und ausführen.

    Was passiert, wenn die dynamische Zuordnung über SQL.Add durch die feste Zuordnung ersetzt wird

    Comment


    • #3
      Hallo<br>
      Probier mal ExecSql statt Open <br>
      <hr>
      Mit ExecSQL können Sie die Anweisung ausführen, die aktuell in der Eigenschaft SQL enthalten ist. Mit ExecSQL können Sie Anweisungen ausführen, die keinen Cursor auf Daten (wie z.B. INSERT, UPDATE, DELETE oder CREATE TABLE) zurückgeben

      Comment


      • #4
        Hallo Andreas (Kosch),

        vielen Dank für die schnelle Antwort!

        2 Instanzen von Query habe ich noch begriffen, SQL fest zuordnen auch... auf die TFields habe ich erst mal bewusst verzichtet - ich dachte, die benötige ich in diesem Fall nicht. Parameter-Objekte sagt mir leider nichts - ich werde aber mal suchen gehen.

        Und die feste Zuordnung der SQL-Anweisung ist in der Tat eine Idee - leider kann ich es erst morgen früh ausprobieren.

        Ich gebe wieder Bescheid!!

        Ralp

        Comment


        • #5
          Hallo Andreas (Horlander),

          auch Dir vielen Dank für die schnelle Antwort.

          ExecSQL werde ich versuchen - klingt auf jeden Fall sehr vernünftig.

          Ralp

          Comment


          • #6
            Hallo Anfreas,

            ==> Nachtrag <==

            Mit ExecSQL anstatt TQuery.Open funktioniert es fehlerfrei.
            Herzlichen Dank!

            Ralp

            Comment

            Working...
            X