Avatar billede slowaterz Nybegynder
15. september 2004 - 15:43 Der er 5 kommentarer og
1 løsning

Rettelser af data i en DBGrid, som viser en TQuery

Jeg har en SQL query :

SELECT sparepart, description, bought, '0' newpurchase
FROM purchasing WHERE machineNr=:sMachNr

Den skal hente bestillingsnumre, beskrivelser og antal allerede indkøbt for den maskine, brugeren har valgt. Desuden henter jeg en konstant streng '0' i feltet "Nyt indkøb". Meningen er, at brugeren skal kunne rette denne streng og indtaste det antal, der ønskes bestilt. Det er ikke data, der skal skrives direkte til databasen - programmet skal undersøge de rækker, hvor antallet er ændret, "bestille" varerne og rette i databasen.

Det datasæt, query'en returnerer viser jeg i en DBGrid, men dér kan jeg ikke få lov til at rette i kolonnen "Nyt indkøb". Både i query'ens Fields og i DBGrid'ens Columns er den kolonnes ReadOnly property sat til "False".

Er der nogen, der kan forklare mig, hvad jeg gør forkert ?
Avatar billede slowaterz Nybegynder
15. september 2004 - 16:24 #1
Jeg har også prøvet at tilføj en "tom" kolonne til min DBGrid, som ikke peger på noget felt i query'en - samme resultat - jeg kan ikke rette indholdet af den kolonne.
Avatar billede hrc Mester
15. september 2004 - 23:21 #2
Jeg har prøvet at lege lidt med det, men der er nogle problemer. Har genskabt dit oplæg og jeg kan umiddelbart heller ikke rette i et felt (jeg dobbeltklikkede på ADOQueryen og tilføjede alle felter + et som jeg satte til dataopslag)

Direkte rette i feltet kunne jeg ikke hitte ud af. Selvom jeg debuggede VCL'et så kom jeg ikke nærmere hvordan griddet skal sættes op. Endte med at placere TUpDown der fulgte med den pågældende record (som en mini TSpinEdit)- når så data skiftede så kunne jeg opdaterede NewPurchase.

Alternativt tilføjede jeg alle kolonnerne i DBGridden og så lige den ekstra. Den kunne jeg så fylde med værdier i en picklist, men det er ikke holdbart hvis man både kan købe P4 3500GHz og 2,5mm spændskiver.

Derfor, for der er ikke nogen nem løsning til spørgsmålet. Jeg kunne overveje om jeg skulle lave endnu et felt i tabellen. Brugerne kunne taste alt muligt ind og først når de lukkede handlen, flyttede programmet værdierne over vha. en "update set NewPurchase = NewPurchase + Amount where MachineID = :sMachineID"

Ulempen er naturligvis at man skal nulstille dem på et eller andet tidspunkt.

En anden løsning var at lave en InMemory tabel som man kopierede til diskbaserede tabel når handlen blev lukket.
Avatar billede slowaterz Nybegynder
17. september 2004 - 15:44 #3
Min umiddelbare konklusion er, at jeg ikke kan rette i NewPurchase i min DBGrid, fordi min query returnerer en konstant værdi - '0'.

Jeg har Delphi Help læst mig frem til følgende : "... internally calculated fields ... can be edited, but the changes are discarded."
Jeg har derfor forsøgt at pille ved værdien i query'ens OnCalcFields event og sætte FieldKind property for NewPurchase til "fkInternalCalc" - det rokkede ikke ved noget.

Det kan være en anderledes formuleret SQL sætning er svaret ?

Jeg vil gerne beholde den nuværende løsning med en TQuery og en TDBGrid. Der skal med tiden nok tilføjes oplysninger om leverandør, pakkestørrelse, pris m.m. Og jeg vil gerne kunne sortere resultaterne efter (næsten) alle kolonnerne.
Avatar billede hrc Mester
17. september 2004 - 16:09 #4
Den letteste var at udvide tabellen med et felt som du bruger til at indeholde hvad brugeren taster ind - det løser også nogle problemer med hvilken record der skal opdateres - for det er vel ikke meningen at købsdata opdateres i tabellen med det samme, men at du efterbehandler "bestillingen" og justerer felterne, ikke?
Avatar billede slowaterz Nybegynder
21. september 2004 - 08:31 #5
Jeg må tilstå, at jeg har snydt lidt : den SQL sætning, jeg startede indlægget med, er stærkt reduceret. Den fulde forespørgsel er sammensat af flere sub-queries både med inner- og outerjoins. Der findes kun records i PURCHASING tabellen for de reservedele, der er købt hjem. Som systemet er nu, kan jeg ikke afsætte en kolonne i tabellen til midlertidigt at gemme et nyt antal reservedele, der skal købes.
Avatar billede slowaterz Nybegynder
25. august 2010 - 15:32 #6
Der har ikke været nogen indlæg i et stykkr tid, så jeg lukker den her ...
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