Toon posts:

[Borland C++] Inhoud datasource wijzigen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Weet iemand hoe ik de inhoud van een DataSource kan veranderen? Wat ik precies bedoel is:

Ik heb een TQuery: query1
en een TDataSource: datasource

vervolgens zorh ik ervoor dat er in de query wat data komt te staan en dan koppel ik de query aan de datasource:
datasource->DataSet = query1;

en nu wil het volgende doen:

als query1 een waarde tegenkomt, bijvoorbeeld 100, dan wil ik dat veranderen naar een andere waarde, maar dan alleen de output, dus niet in de database zelf.

iemand een idee?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je zult je Query RequestLive moeten maken.
Dan kan je waarden in je query veranderen, zolang je de Post() method niet oproept, worden de waarden niet naar de DB weggeschreven.

https://fgheysels.github.io/


Verwijderd

Topicstarter
en hoe verander ik de data erin dan?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 05 november 2003 @ 15:31:
en hoe verander ik de data erin dan?
Ehm....

Staat mooi in de help:

code:
1
TQuery.FieldByName("veldnaam").AsString = "RTFM";

https://fgheysels.github.io/


Verwijderd

Topicstarter
ja dat had ik al geprobeerd maar dat pikt ie niet...

ik krijg de fout "Invalid use of keyword. Token: ,"

m'n sql klopt want zodra ik dat regeltje code wat ik net heb toegevoegd heb uitgezet doe ie het wel weer...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Waar zet jij dan wel een komma?
Als je de foutmelding interpreteerd, moet je ergens een komma gezet hebben die daar niet hoort.
Is dat een compiler-error of een runtime-error die je krijgt?

https://fgheysels.github.io/


Verwijderd

Topicstarter
nou nogmaals met m'n SQL is denk ik niets mis, de volgende code doet het:

C++:
1
2
3
4
5
6
7
 
        query->SQL->Add(sql);
        query->Params->Items[0]->AsString = sorteerOp;
        datasource->DataSet = query;
//        query->RequestLive = true;
        query->Active = true;
//        query->FieldByName("Werkpleknummer")->AsInteger = 0;


als de regels code die nu commentaar zijn aanzet dan doet ie het niet opeens meer :'( Dus waar ie die komma nou in ene vandaan haalt :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Het zal toch aan je SQL liggen.

Je kan een Query enkel als 'RequestLive' behandelen als hij slechts uit 1 tabel gegevens haalt.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ah dan ligt het daar dus aan ik haal data uit 3 tabellen. is daar geen andere oplossing voor dan?

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:39
Bij mijn weten moet RequestLive juist op false staan, want anders wordt de onderliggende database WEL aangepast.

en velden van je query editeren moet je voor laten gaan met Edit () en nadien Post () oproepen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        query->SQL->Add(sql);

        //je kan hier ook de naam van de parameter gebruiken:
        query->ParamByName("naamParameter")->AsString = sorteerOp;

        datasource->DataSet = query;

        //RequestLive staat standaard op false, en moet dus niet ingesteld worden
        // tenzij voordien RequestLive op true stond
        //query->RequestLive = false;

        query->Open ();

        // hier via First (), Next (), ... naar de correcte record navigeren (of via een grid)

        query->Edit ();
        query->FieldByName("Werkpleknummer")->AsInteger = 0;
        query->Post ();

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
schoene schreef op 05 november 2003 @ 16:15:
Bij mijn weten moet RequestLive juist op false staan, want anders wordt de onderliggende database WEL aangepast.
Zolang je de gegevens niet post() dmv de Post() method op te roepen, of door naar een ander record te gaan, worden de waarden niet naar de DB geschreven.

https://fgheysels.github.io/


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:39
whoami schreef op 05 november 2003 @ 16:16:
Zolang je de gegevens niet post() dmv de Post() method op te roepen, of door naar een ander record te gaan, worden de waarden niet naar de DB geschreven.
Als je niet eerst de query in Editmode zet via Query->Edit (), krijg je 'EDatabaseError: Dataset not in Edit or Insert mode'. En je query constant in Editmode zetten, zonder effectief te posten is toch ook niet de bedoeling

Verwijderd

Topicstarter
schoen:

als ik het op jouw manier probeer, wat me op zich de juiste lijkt, krijg ik de fout "Can not modify a read-only dataset"

C++:
1
2
3
4
5
6
7
8
9
10
        query->Open();
        query->Edit();
        datasource->DataSet = query;
        while(!query->Eof) {
                if(query->FieldByName("Werkpleknummer")->AsInteger == 100000) {
                        query->FieldByName("Werkpleknummer")->AsInteger = 0;
                }
                query->Next();
        }
        intList.clear();

[ Voor 9% gewijzigd door Verwijderd op 05-11-2003 16:25 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
In welke control toon je die data?
Kan je die gegevens gewoon niet aanpassen in de control zelf, zonder dat ze naar de DataSource moeten gaan?

Je kan natuurlijk ook altijd gebruik maken van 3 queries die je Requestlive maakt.
In de Query die je dan uiteindelijk aan je DataSource koppelt, maak je 'LookUpFields' naar de andere queries, en in de Post() event ofzo van die ene query, zorg je ervoor dat de data niet naar de DB geschreven worden.
Maar dat is een ranzige oplossing vind ik.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik gebruik een DBGrid... dus ik kan niet direct via de grid de data wijzigen.. (toch?)

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:39
C++:
1
2
3
4
5
6
7
8
9
10
11
        query->Open();
        
        datasource->DataSet = query;
        while(!query->Eof) {
                if(query->FieldByName("Werkpleknummer")->AsInteger == 100000) {
                        query->Edit ();
                        query->FieldByName("Werkpleknummer")->AsInteger = 0;
                        query->Post ();
                }
                query->Next();
        }


Probeer dit eens. Als ik me niet vergis moet je Edit en Post per record gebruiken. Zorg er wel voor dat RequestLive op false staat, want anders wordt je DB wel aangepast (maar dat staat standaard goed).

Gewoon nog een extra opmerkingkje: die datasource is in deze code totaal overbodig, dus ik weet niet of je deze voor iets anders nodig hebt, maar anders kan je hem weglaten

mvg,

schoene

Verwijderd

Topicstarter
ik gebruik die datasource om de inhoud van die query aan een DBGrid te koppelen. Kan dit soms ook direct via een query?

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:39
Neen, dan is het correct. Maar ik kon dit niet uit de code halen uiteraard.

Verwijderd

Topicstarter
hmm ik weet niet hoe het kan maar hij gaat zodra hij de eerste keer bij de volgende regel komt al de fout in:

C++:
1
query->Edit ();


|:(

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
schoene schreef op 05 november 2003 @ 16:29:


Probeer dit eens. Als ik me niet vergis moet je Edit en Post per record gebruiken. Zorg er wel voor dat RequestLive op false staat, want anders wordt je DB wel aangepast (maar dat staat standaard goed).

Gewoon nog een extra opmerkingkje: die datasource is in deze code totaal overbodig, dus ik weet niet of je deze voor iets anders nodig hebt, maar anders kan je hem weglaten

mvg,

schoene
Als je Query niet RequestLive is, dan kan je er gewoon niets in aanpassen.
Dan krijg je de error die petekneet al vermeldde , nl. 'Cannot update a read only dataset'.

offtopic:
Je hoeft niet iedere keer te groeten onder een post hoor. Dat leest een beetje irritant

https://fgheysels.github.io/


Verwijderd

Topicstarter
Verwijderd schreef op 05 november 2003 @ 16:41:
hmm ik weet niet hoe het kan maar hij gaat zodra hij de eerste keer bij de volgende regel komt al de fout in:

C++:
1
query->Edit ();


|:(
oja en het maakt niet uit of ik RequestLive op true of false zet...

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:39
whoami schreef op 05 november 2003 @ 16:42:
Als je Query niet RequestLive is, dan kan je er gewoon niets in aanpassen.
Dan krijg je de error die petekneet al vermeldde , nl. 'Cannot update a read only dataset'.
Jah, je hebt gelijk, waar zijn mijn gedachten. 8)7
Hoe dan ook is het vreemd om in een grid gegevens te wijzigen zonder ze te wijzigen in de database. Als je dat wil doen, gebruik je beter een Memory Table. (je kan er vinden op http://www.torry.net/db_memory.htm)
whoami schreef op 05 november 2003 @ 16:42:
offtopic:
Je hoeft niet iedere keer te groeten onder een post hoor. Dat leest een beetje irritant
Heb ik 1 keer gedaan? :?

Verwijderd

Je kunt de query ook aan een andere tdataset koppelen.
Deze cached dan vervolgens de data. Mooi voorbeeld is de TClientdataset.
Welke versie van CBuilder gebruik je?

Verwijderd

Topicstarter
Verwijderd schreef op 05 november 2003 @ 16:58:
Je kunt de query ook aan een andere tdataset koppelen.
Deze cached dan vervolgens de data. Mooi voorbeeld is de TClientdataset.
Welke versie van CBuilder gebruik je?
Ik gebruik versie 6 Enterprise. Maar ik heb ondertussen nog steeds m'n probleem niet opgelost. Nogmaals... ik krijg een fout als ik query->Edit() aanroep...

Verwijderd

Topicstarter
ik heb ff gezocht in de help file en ik denk dat ik TDataField nodig heb, maar hoe dit precies werkt? iemand hier meer ervaring mee?

Verwijderd

Topicstarter
IEMAND??!?!?!


modbreak:
schoppen doe je pas na 24h.
Jouw topic staat nog altijd in de topiclist, dus is het niet nodig om na 2 uur al te schoppen.

[ Voor 87% gewijzigd door whoami op 06-11-2003 11:15 ]


  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Als het lockType van je Query ReadOnly is dan kun je inderdaad niet wijzigen. Dus kijk even of je LockType niet ReadOnly is.
Pagina: 1