01. marts 2007 - 22:46Der er
9 kommentarer og 1 løsning
Korrekt måde til at fange manglende indtastning
Hej.
Jeg har en Database, som er sat sammen med et clientdataset og herefter forbundet til diverse DB-Aware komponenter via en datasource.
Hvordan fanger jeg korrekt en manglende indtastning, hvor det er påkrævet pga. feltet er sat til primary key og/eller not null?
I øjeblikekt får jeg en fejlmeddelelse, som jeg ikke kan komme af med ved følgende scenarie.
I en DBGrid indsætter jeg en ny linie, når jeg i nederste linie trykker på pil ned. Jeg kan også indsætte en ny linie ved at klikke på en knap, som jeg har oprettet.
I scenariet fortryder jeg indtastningen helt og trykker på pil op for at gå til linien ovenover, men nu kommer fejlboksen frem.
Jeg har prøvet diverse beforepost events mv. men jeg kan ikke fange den korrekt.
Er det i ClientDataSettet eller i grid'en jeg bør fange den og hvordan fanger jeg den og får den til at annulere den indtastede linie?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Problemet er jo, at jeg ønsker, at man skal kunne rette i grid'en, hvorfor ReadOnly skal være false og AutoEdit true.
Problemet er:
Når den nye linie bliver lavet og jeg "fortryder" og går væk fra linien uden den har fået et påkrævet indtastning, så skal jeg på en eller anden måde annullere den oprettede, men jeg får en fejlmeddelelse pga. feltet der er "not null" indstillet er tomt
Har du prøvet min kommentar, for den fejl opstod netop inden jeg indsatte koden som gør at man scroller ned i bunden af sin grid, så laver den en ny post.
I en almindelig grid er det noget med at validere linjerne i OnExit-eventen. Hvis din sidste linje ikke er Postet til tabellen kan du fyre en Abort af i OnExit. Alternativt, når nu det er et tabel, kan du måske køre et SQL-script der sletter linjer hvorpå der intet står? Ved ikke lige hvordan DB-aware komponenterne har det med den fremgangsmåde...
. Så vidt jeg kan se har DBGrid ikke events du kan bruge til at teste på om du forlader et felt udover OnColExit. Så må det være en af den tilknyttede DataSource's events du kan bruge f.eks. OnUpdateData for at teste for tomt felt ved Pilop-tast. .
Nu har jeg netop kastet mig over TClientDataSet (bedre sent end aldrig) og den har da også en OnValidate tingest hvor du må kunne kigge på felterne og "raise" en "du mangler dette felt" indtastning; eller sådan noget.
Alternativt kan du åbne en form ovenpå griddens, hvori du styrer indtastningen selv. Når formens modalresult = mrOK, kan du jo validere data via OnCloseQuery. Derefter er det en smal sag at sætte en valid record ind i datasættet.
På TClientDataSet er der en BeforePost-event du kan bruge:
procedure TDMAttribut.cdsAttributBeforePost(DataSet: TDataSet); begin try if DataSet.FieldByName('navn').IsNull then raise Exception.Create('Navn skal angives'); except on e: exception do raise; // Abort; end; end;
Bemærk: Mit TClientDataSet er placeret på et TDataModule og det komplicerer det lidt idet jeg ikke vil have en MessageDlg poppende op derfra - den slags skal komme fra en form.
Når en valideringsfejl opstår kan man re-raise (eller helt fjene try-except blokken) den exception der kommer. Derved popper der et fejlvindue op på formen. Alternativt kan man lave den "lydløs" ved at bruge "abort" hvorved man låses til linjen indtil man trykker <esc> eller klarer valideringen.
Synes godt om
Ny brugerNybegynder
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.