[Delphi] TQuery updaten in DB

Pagina: 1
Acties:
  • 106 views sinds 30-01-2008
  • Reageer

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik haal met een TQuery gegevens uit een database (dit moet wel met een TQuery). Die komen in een paar DBEdit's e.d. Maar de gebruiker kan deze niet bewerken. Da's ook wel logisch, omdat ik de data met een SELECT query ophaal. Maar hoe krijg ik dit goed? Zelf had ik die TUpdateQuery gevonden, maar ik snap niet echt hoe ik die moet gebruiken.

Iemand ervaring met dit soort situaties?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Flikker het in een array mbv een query, en vul je Grid mbv de inhoud van die array.

Als je dan 1 regels van die array wijzigt, zoek je het bijbehorende record op en edit + update je die.

Goed? :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op dinsdag 27 november 2001 22:41 schreef TriCAT het volgende:
Goed? :)
Surrogaat oplossingen kunnen altijd nog. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • ebas
  • Registratie: Maart 2001
  • Laatst online: 20-04-2017

ebas

 

Ik heb delphi op het moment nog niet geinstalleerd staan, maar volgens mij kun je in een query een paar property's instellen, waarin je kunt opgeven wat het insert en update statement moet zijn.
Ook is er een property die je op false moet zetten.
Zit er dus allemaal in, gewoon nog ff goed de help lezen : )

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
In een TUpdateQuery kun je idd 3 SQL statements opgeven. Daar was ik ook al achter. Tevens moet je CachedUpdates van een TQuery die aan de TUpdateQuery zit op True zetten.

Maar ik vraag me af of dit wel de goede oplossing is voor mijn probleem.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • ebas
  • Registratie: Maart 2001
  • Laatst online: 20-04-2017

ebas

 

Ja dat zijn ze : )
ja denk het wel, je kan natuurlijk ook gewoon zelf insert en update statements maken en direct naar db sturen.

Verwijderd

Op dinsdag 27 november 2001 21:15 schreef jelmervos het volgende:
Ik haal met een TQuery gegevens uit een database (dit moet wel met een TQuery). Die komen in een paar DBEdit's e.d. Maar de gebruiker kan deze niet bewerken. Da's ook wel logisch, omdat ik de data met een SELECT query ophaal.
Ik heb zelf een gruwelijke hekel aan data aware components, zeker wanneer ze niet read-only zijn, maarre... RequestLive = True?

Wanneer je query zelf in principe editbaar is (dus geen joins, unions, subselects of selects vanuit bv. een stored procedure), gedraagt je TQuery zich dan net als een TTable, en kun je via Edit/Post de velden wijzigen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Mijn query bevat een innerjoin en dus daardoor (?) is de tabel niet rechtstreeks editbaar... hoe kan ik het dan het best doen?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op dinsdag 27 november 2001 23:00 schreef jelmervos het volgende:
In een TUpdateQuery kun je idd 3 SQL statements opgeven. Daar was ik ook al achter. Tevens moet je CachedUpdates van een TQuery die aan de TUpdateQuery zit op True zetten.
TUpdateSQL bedoel je? (Ik kon TUpdateQuery nergens vinden in Delphi 5 Enterprise en Kylix 1 Developer...)
Ik vind 't een lapmiddel voor een slecht ontwerp, en wanneer je 't nodig hebt zou ik maar 's gaan kijken of de user interface en de onderliggende koppeling met de database wel goed in elkaar zit.

En cached updates is iets wat je in een multi-user omgeving niet wilt, zeker niet wanneer je het programma verkoopt aan klanten. Je laat dan het moment van updaten over aan de BDE, en wanneer je niet expliciet met transacties werkt, heb je geen grip op het moment van updaten.
Stel, je klant verkoopt het laatste tuinstel in voorraad, en de update van het voorraad-bestand wordt nog even gecached. In de tussentijd kunnen 3 andere telefonisten datzelfde tuinstel ook al wel verkocht hebben...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op dinsdag 27 november 2001 23:52 schreef Afterlife het volgende:

[..]

TUpdateSQL bedoel je? (Ik kon TUpdateQuery nergens vinden in Delphi 5 Enterprise en Kylix 1 Developer...)
Ik vind 't een lapmiddel voor een slecht ontwerp, en wanneer je 't nodig hebt zou ik maar 's gaan kijken of de user interface en de onderliggende koppeling met de database wel goed in elkaar zit.
Oops, idd TUpdateSQL, sorry.
Ik geef ook toe dat de database slecht is ontworden, deze is in 1992 ofzo gemaakt (niet door mij). Hij wordt benaderd door een DOS app, nu moet ik hem in Windows maken. Alleen moet de database hetzelfde laten, zodat de klant(en) snel kunnen update naar de Windows versie zonder omwegen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op dinsdag 27 november 2001 23:35 schreef jelmervos het volgende:
Mijn query bevat een innerjoin en dus daardoor (?) klopt is de tabel niet rechtstreeks editbaar... hoe kan ik het dan het best doen?
Ligt eraan hoe de gebruiker de gegevens kan editen.
Is 't in een eigen modalform, dan is daar vrij eenvoudig een update of insert query op los te laten (moet je daarna nog wel een synchronisatie systeem verzinnen om de select query te refreshen en het current record weer op de goede plaats te krijgen).
Bij 'in place' edits (in een grid, treeview, list of whatever) wordt 't wat lastiger, maar is 't ook goed te doen.

Misschien is die join te vervangen door de velden die je joint op te nemen als calculated fields en die client side te in te vullen???

Verwijderd

Op woensdag 28 november 2001 00:00 schreef jelmervos het volgende:
Ik geef ook toe dat de database slecht is ontworden, deze is in 1992 ofzo gemaakt (niet door mij). Hij wordt benaderd door een DOS app, nu moet ik hem in Windows maken.
Ah, legacy conversie. :)
Vergeet wat ik zei over m'n aversie m.b.t. data aware components, en i.p.v. joins idd calculated fields gebruiken. Als die DOS applicatie niet zo bar veel business logic bevat, heb je de kern in een dag of 2 of zo omgezet... :)
En daarna begint de ellende: rapportage, mailmerge (ging nog met WP 5.1), etc...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oke, ik zal er nog es naar kijken.

Het komt er opneer dat ik gegevens ophaal met een SELECT query. Als de gebruiker deze wil wijzigen kan dat niet, omdat het een SELECT query is. BDE geeft een read-only dataset terug, vandaar.
Dit staat ook in de help beschreven.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op woensdag 28 november 2001 00:06 schreef Afterlife het volgende:

[..]

Ligt eraan hoe de gebruiker de gegevens kan editen.
Is 't in een eigen modalform, dan is daar vrij eenvoudig een update of insert query op los te laten
En dat moet dan met die UpdateSQL?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Dat kan met een UpdateSQL, maar ik zou 't niet zo doen. Daarvoor vind ik cached updates te link in een multi-user omgeving.

In dit geval (DOS app porten naar Win) zou ik echt proberen of ik die query zo zou kunnen omvormen dat 'ie niet meer read-only hoeft te zijn, de join eruit halen dus.
Dit is goed te doen met calculated fields en hun OnGetText events: de velden die je nu uit die 2e tabel haalt voeg je toe als calculated fields.
Simpel voorbeeldje: stel je hebt 2 tabellen, Bestellingen en Artikelen. In Bestellingen staan wel de artikelnummers, maar niet de omschrijvingen. Ideaal gevalletje voor een left join dus.
Wanneer je alleen maar de gegevens van Bestellingen in je query ophaalt, en het veld Omschrijving als calculated field toevoegt, zou 't OnGetText event er bv. zo uit kunnen zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Query1OmschrijvingGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  with TQuery.Create(nil) do try
    DatabaseName := Sender.DataSet.DatabaseName;
    SQL.Add('select Omschrijving from Artikelen where Artikel = :Artikel');
    ParamByName('Artikel').AsString := Sender.DataSet.FieldByName('Artikel').AsString;
    Open;
    if not EOF then
    Text := FieldByName('Omschrijving').AsString
    else
    Text := 'Artikel niet gevonden';
  finally
    Free;
  end;
end;

Geen ideaal voorbeeld (kan nog wel 's te zwaar worden), maar het gaat even om 't idee, en hoe je zoiets kunt optimizen (Omschrijvingen van tevoren in een StringList zetten bv.) weet je zelf ook wel.
Voordeel is, dat je bij je query nu RequestLive op True kunt zetten, en dus rechtstreeks in de resultset kunt editten, inserten, enz.

En nogmaals: ik hou niet van data aware controls, dus ik zou 't zelf bij voorkeur niet op deze manier doen. Maar in single-user of kleine multi-user systemen kan 't prima werken. En 't ontwikkelt wel lekker snel... :)
Pagina: 1