Avatar billede vanilli Nybegynder
06. april 2001 - 20:57 Der er 6 kommentarer og
2 løsninger

IBQuery + DBGrid + identifikation af felt.

300 points til den der kan fortælle mig hvordan jeg får lov til at rette et DBGrid-felt under runtime - (der vises vha. DataSource der er knyttet på en IBQuery). Problemet opstår kun ved brug af query - hvorimod der ikke er nogle problemer ved brug af IBTabel.

Sidst men ikke mindst - hvordan aflæses et bestemt \"felt\" i DBGrid? F.eks. hvis man ønsker at læse felt(Row=3, Col=4).

På forhånd tak.
Avatar billede nico26 Nybegynder
07. april 2001 - 05:22 #1
Hvis du bruger en query, er du nødt til at bruge sql, for at opdatere databasen. I nedenstående eksempel har jeg brugt en tabel der hedder Adresser, med tre fields: Navn, Adresse og TLF.
Som du kan se, kan man bruge fields propertyen til at aflæse et bestemt field i den aktuelle record.

procedure TForm1.Button1Click(Sender: TObject);
const
  UpdateSQL = \'UPDATE Adresser SET Navn=\"%s\", Adresse=\"%s\", TLF=\"%s\" WHERE Navn=\"%s\"\';
var
  Navn: string;
begin
  Navn := DBGrid1.Fields[0].AsString;

  Query1.Close;
  Query1.SQL.Text := Format(UpdateSQL, [Edit1.Text, Edit2.Text, Edit3.Text, Navn]);
  Query1.ExecSQL;

  Query1.SQL.Text := \'SELECT * FROM Adresser\';
  Query1.ExecSQL;
  Query1.Open;
end;
Avatar billede pellelil Nybegynder
07. april 2001 - 07:34 #2
Du kan knytte en IBUpdateSQL til din IBQuery for den vej at \"få hul igemmen\", men jeg vil i stedet foreslå at du bruger IBDataSet (da denne indeholder det der skal til).

Indsæt således en IBDataSet på din form. Skriv din sql (der udvælger de felter/poster du vil vise i din grin i propertien \"SelectSQL\". Dernæst højreklikker du på dit IBDataSet og vælger punktet (i menuen) \"Dataset Editor\". Du kommer nu ind på en ny form hvor du basalt bare skal klikke på knapperne i venstre side fra toppen og nedefter (Get Table Fields, Dataset Defaults, Select Primary Keys, Generate SQL). Dette vil automatisk generere nogle \"standard scripts\" på baggrund af det du skrev i \"SelectSQL\".

Så fremt du ønsker det kan du efterfølgende rette i disse, deres værdier er af finde i IBDataSet\'ets properties: DeleteSQL, InsertSQL, ModifySQL og RefreshSQL.
Avatar billede martinlind Nybegynder
07. april 2001 - 16:17 #3
En TQuery er meget \"kræsen\" mht. til og dit resultset bliver readonly eller ej, det kan godt lade sig gøre at få et ikke readonly resultset, men en god fingerregl er at regne med at alle udtræk vha. TQuery resultere i readonly resultset, det nemmeste er som pellelil, men det er dog nemere at fejlfinde og debug\'e hvis du bruger nico22\'s metode
Avatar billede vanilli Nybegynder
09. april 2001 - 14:12 #4
Jeg takker for de indsendte svar - men de har desværre ikke været tilstrækkelig fleksibel, som jeg oprindelig havde håbet de ville være. Jeg har undersøgt hvilke muligheder Delphi stiller for \"live\" ændringer af DBGrid via. TQuery og til dem der måtte være interesseret kan jeg sige, at den \"nemme løsning\" blot er det lille nøgleord: \"RequestLive\".

Opskriften følger i nedenstående:

1.  Indsæt en Tquery
2.  Sæt properties: RequestLive til True + UpdateMode til upWhereAll (søger for at result af Query IKKE er readonly)

Dette er tilstrækkelig til du under runtime kan definere dit/dine egen SQL-kald - og på den måde få rettighed til at ændre værdier i din database vha. af DBGrid.

Husk blot at \"clear\" SQL-kald inden du indsætter et nyt SQL-kald.

(Ovenstående kræver selvfølgelig af du har indsat en Database, DataSource samt en DBGrid)

Ps: 10 point til: nico22 samt 10 point til: pellelil.
Avatar billede martinlind Nybegynder
09. april 2001 - 14:19 #5
Vanilli >> RequestLive til True + UpdateMode til upWhereAll (søger for at result af Query IKKE er readonly) , Dette er også Tildels Rigtigt men også kun tildels, for hvis du havde undersøgt det til bunds ville du opdage at delphi hjælpen har en lille note :


Note:    All multi-table queries return read-only result sets. Other conditions may cause a query to return a read-only result set. For local tables (such as dBASE and Paradox), see the local SQL help file for rules governing live result sets (updatable queries). For other table types (such as InterBase, Oracle, and Sybase), consult the documentation for the specific database system.

Så hvis vi skal have en opskrift, så lad os lige få en der er rigtig ikk\' *S*

/Martin
Avatar billede martinlind Nybegynder
09. april 2001 - 14:20 #6
Næsten alle DB\' er retunerer READONLY hvis du bruger ORDER BY eller lign.
Avatar billede vanilli Nybegynder
09. april 2001 - 18:13 #7
Jeg mener ikke jeg på nogen måde har givet udtryk for at min \"opskrift\" på nogen måde skulle være en endegyldig løsning -  uanset hvilket SQL-request man måtte fyre af, tværtimod.
Løsningen virker på 1 tabel, hvilket vil sige, at såfremt du laver udtræk fra n-tabeller VIL result være readonly.
Dvs. at f.eks. ORDER BY på 1 tabel vil returnere et resultset der IKKE er readonly - hvorimod at resultset er readonly ved udtræk fra n-tabeller.

Ps.: Jeg vil meget gerne høre hvad \"lign.\" f.eks. kunne være.

Avatar billede martinlind Nybegynder
10. april 2001 - 09:43 #8
Union, Group BY osv. læs i hjælpen *S*
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester