Avatar billede vint Nybegynder
01. marts 2007 - 22:46 Der 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?
Avatar billede stone Forsker
01. marts 2007 - 23:40 #1
dbgrid har en bug som går på at bruger man piletasten oprettes en ny post, brug følgene i din dbgrid....

http://www.swissdelphicenter.ch/en/showcode.php?id=1354
Avatar billede martinlind Nybegynder
02. marts 2007 - 15:59 #2
Har du prøvet at sætte dit dataset til ReadOnly eller DataSource autoedit prop til false
Avatar billede vint Nybegynder
02. marts 2007 - 17:31 #3
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
Avatar billede stone Forsker
02. marts 2007 - 18:40 #4
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.

Prøv den og se om den stadig laver fejlen.....
Avatar billede vint Nybegynder
03. marts 2007 - 11:49 #5
Hej Stone.

Jeg er ikke hjemme i weekenden, men prøver i næste uge.

Men taler vi ikke forbi hinanden? Jeg ØNSKER, at der bliver oprettet en ny linie, når man står i bunden af grid'en og trykker pil ned.

Det jeg ønsker at fange er, hvis jeg IKKE indtaster noget og forlader den nye linie, så skal den annulleres.
Avatar billede hrc Mester
05. marts 2007 - 09:53 #6
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...
Avatar billede a_nor Nybegynder
16. marts 2007 - 07:44 #7
.
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.
.
Avatar billede hrc Mester
18. marts 2007 - 21:59 #8
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.
Avatar billede vint Nybegynder
19. marts 2007 - 22:36 #9
Hej hrc

Hvordan gøres det, når man vil bruge OnValidate til at validere.

Mit ønske: Tjek om feltet, der valideres er null. Hvis ja, så meld fejl.
Avatar billede hrc Mester
21. marts 2007 - 09:48 #10
Nå så har jeg fået kigget lidt på det.

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.
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