Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Subquery (https://www.delphipraxis.net/151114-subquery.html)

khh 6. Mai 2010 09:55

Datenbank: Firebird • Version: 2.1 • Zugriff über: zeos

Subquery
 
hallo zusammen,
mit:
SQL-Code:
select * from artprod p , artikel a
where p.artikel_id =a.artikel_id
order by p.lieferdatum desc;
fülle ich ein db-grid
nun lässt das Grid aber Änderungen nur zu, wenn die Daten aus einer einzigen Tabelle stammen.
Ich hab irgendwo gelesen dass es auch mit inner- oder outer-join funktionieren soll ;-)

Leider kenn ich mich da in der (relativ neuen) Syntax nicht aus, da wir bisher alles über Subquerys umgesetzt haben.

Danke für eure Hilfe.

Gruss KHH

mkinzler 6. Mai 2010 10:05

Re: Subquery
 
Ein impliziter Join ist immer ein Inner Join
SQL-Code:
select
    a*, p.*
from
    artprod p
        join artikel a on a.artikel_id =p.artikel_id
order by
    p.lieferdatum desc;

joachimd 6. Mai 2010 10:36

Re: Subquery
 
Zitat:

Zitat von khh
SQL-Code:
select * from artprod p , artikel a
where p.artikel_id =a.artikel_id
order by p.lieferdatum desc;
fülle ich ein db-grid
nun lässt das Grid aber Änderungen nur zu, wenn die Daten aus einer einzigen Tabelle stammen.
Ich hab irgendwo gelesen dass es auch mit inner- oder outer-join funktionieren soll ;-)
H

ob's in Lazarus geht, weiß ich nicht ... aber in Delphi würde ich in diesem Fall Lookup-Felder nehmen.

khh 6. Mai 2010 10:46

Re: Subquery
 
Zitat:

Zitat von joachimd
Zitat:

Zitat von khh
SQL-Code:
select * from artprod p , artikel a
where p.artikel_id =a.artikel_id
order by p.lieferdatum desc;
fülle ich ein db-grid
nun lässt das Grid aber Änderungen nur zu, wenn die Daten aus einer einzigen Tabelle stammen.
Ich hab irgendwo gelesen dass es auch mit inner- oder outer-join funktionieren soll ;-)
H

ob's in Lazarus geht, weiß ich nicht ... aber in Delphi würde ich in diesem Fall Lookup-Felder nehmen.


die query mit dem join funktioniert zwar richtig um das Grid zu füllen, ein Ändern ist aber leider auch so nicht möglich.

---Cannot update a complex query with more then one table--

muss ich mir die Sache mit den Lookupfeldern wohl mal ansehen :-(

mkinzler 6. Mai 2010 11:04

Re: Subquery
 
Hast du es mal mit einem UpdateObjekt versucht?

khh 6. Mai 2010 11:25

Re: Subquery
 
Zitat:

Zitat von mkinzler
Hast du es mal mit einem UpdateObjekt versucht?

nee, gibts dazu wo ein Beispiel?

borwin 6. Mai 2010 11:34

Re: Subquery
 
Welche Werte von welcher Tabelle werden denn geändert?
Du brauchst ja für jeder Tabelle ein eigenes Update.
In der Komponente kann nur ein Update angesprochen werden.
Wenn alles in einen Rutsch gehen soll, brauchst Du eine SP in der DB.
Der übergibst Du alle Parameter und die führt dann die Updates nacheinander aus.

Gruß Borwin

khh 6. Mai 2010 11:37

Re: Subquery
 
Zitat:

Zitat von borwin
Welche Werte von welcher Tabelle werden denn geändert?
Du brauchst ja für jeder Tabelle ein eigenes Update.
In der Komponente kann nur ein Update angesprochen werden.
Wenn alles in einen Rutsch gehen soll, brauchst Du eine SP in der DB.
Der übergibst Du alle Parameter und die führt dann die Updates nacheinander aus.

Gruß Borwin

geändert werden soll ein Feld in der Haupttabelle,
heisst aus der Subquery brauch ich nur die Artikelnummer und -bezeichnung zur Anzeige im Grid.

rapante 6. Mai 2010 11:49

Re: Subquery
 
Wenn du Zeos nutzt, kannst du TZUpdateSQL verwenden.

Einfach auf die Form packen und in der Query bei UpdateObject auswählen.
Die Kompo besitzt auch einen UpdateSQl-Editor. Da kannst du dir bequem deine
Statements zusammen klickern.

khh 6. Mai 2010 11:52

Re: Subquery
 
Zitat:

Zitat von rapante
Wenn du Zeos nutzt, kannst du TZUpdateSQL verwenden.

Einfach auf die Form packen und in der Query bei UpdateObject auswählen.
Die Kompo besitzt auch einen UpdateSQl-Editor. Da kannst du dir bequem deine
Statements zusammen klickern.

ja das versuch ich gerade
nach dem schema
SQL-Code:
update artprot set menge = ???
aber wie bekomme ich den Bezug zu dem geänderten feld?

mkinzler 6. Mai 2010 11:53

Re: Subquery
 
Parameter sollte :old_menge heissen.
Am Besten benutzt du den Query-Editor der Komponente

khh 6. Mai 2010 12:20

Re: Subquery
 
Zitat:

Zitat von mkinzler
Parameter sollte :old_menge heissen.
Am Besten benutzt du den Query-Editor der Komponente

hab ich jetz gemacht


die update-query siehts so aus:

SQL-Code:
UPDATE artprod SET
  MENGE = :MENGE
WHERE
  ((artprod.MENGE IS NULL AND :OLD_MENGE IS NULL)
OR (artprod.MENGE = :OLD_MENGE))
dennoch bekomme ich die meldung
errorcode -804 data type unknown
update ... set menge = ? where ....

rapante 6. Mai 2010 12:51

Re: Subquery
 
Und wenn du den tabellenbezeichner hinzuschreibst?
SQL-Code:
UPDATE artprod SET
  artprod.MENGE = :MENGE
WHERE
  ((artprod.MENGE IS NULL AND :OLD_MENGE IS NULL)
OR (artprod.MENGE = :OLD_MENGE))

khh 6. Mai 2010 12:54

Re: Subquery
 
Zitat:

Zitat von rapante
Und wenn du den tabellenbezeichner hinzuschreibst?
SQL-Code:
UPDATE artprod SET
  artprod.MENGE = :MENGE
WHERE
  ((artprod.MENGE IS NULL AND :OLD_MENGE IS NULL)
OR (artprod.MENGE = :OLD_MENGE))

keine Änderung :-(

mkinzler 6. Mai 2010 13:13

Re: Subquery
 
Setzte mal Testweise einen Typ für den Parameter

khh 6. Mai 2010 13:36

Re: Subquery
 
Zitat:

Zitat von mkinzler
Setzte mal Testweise einen Typ für den Parameter

du meinst unter updatesql1.params?
hab ich gemacht, jetzt lautet die Fehlermeldung :
column unknown MENGE at line...
:-(


das lässt mich überlegen die Daten redundant in dieser Tabelle zu halten, dann wäre ich die Probleme los.
ist aber auch nicht der Wahrheit letzter Schluss :-(

mkinzler 6. Mai 2010 13:49

Re: Subquery
 
Oder im Statement:
SQL-Code:
UPDATE artprod SET
  MENGE = Cast(:MENGE as Double Precision)
WHERE
  ((artprod.MENGE IS NULL AND :OLD_MENGE IS NULL)
OR (artprod.MENGE = :OLD_MENGE));

khh 6. Mai 2010 14:47

Re: Subquery
 
Zitat:

Zitat von mkinzler
Oder im Statement:
SQL-Code:
UPDATE artprod SET
  MENGE = Cast(:MENGE as Double Precision)
WHERE
  ((artprod.MENGE IS NULL AND :OLD_MENGE IS NULL)
OR (artprod.MENGE = :OLD_MENGE));

auch mit der Typzuweisung im Statment kommt die gleiche Fehlermeldung
column unknown MENGE at line 15
wobei es sich bei dieser Position um die der :MENGE handelt, wenn man der Angabe in der Meldung glauben darf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz