Toon posts:

Probleem met ADOTable (Insert)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een programma aan het maken die in Form1 de database van de artikelen laat zien in een DBGrid.
Daaronder zitten de knoppen: Toevoegen, Verwijderen en Wijzigen.
Als je op wijzigen klikt, dan opent hij Form2.
Waarin 4 velden (DBEdit boxen)staan: Artikelnummer, Zoeknaam, Prijs excl. btw, en BTW percentage (behalve BTW percentage is een gewone Edit box).

De bedoeling is, dat als ik het BTW Bedrag excl. btw verander, dat hij met de hand van het percentage het BTWbedrag incl. btw moet berekenen, en dat alles invullen in de database.

Ik heb bij de Excl.btw veld bij de OnChange actie het volgende neer gezet:

procedure TForm2.DBEdit4Change(Sender: TObject);
var
fdbedit4 : single;
fdbedit5 : string;
fedit1 : single;
begin
if DBEdit4.Text = '' then
begin
DBEdit4.Text := formatfloat ('0.00',0);
end;
fdbedit4 := strtofloat (dbedit4.Text);
fedit1 := strtofloat (edit1.text);
fdbedit4 := fdbedit4 * fedit1;
fdbedit5 := floattostr (fdbedit4);
Form1.ADOTable1.Insert;
Form1.ADOTable1.FieldByName('PRIJSINCL').Text := (fdbedit5);
Form1.ADOTable1.post;
end;


Maar elke regel die ik onder Form1.ADOTable1.Insert; zet geeft hij een foutmelding.
Dus het lijkt mij dat daar iets niet goed mee is.

Meestal krijg ik deze fout: Gegevenstypen komen niet overeen in criteriumexpressie!

Weet iemand wat dit kan zijn, of hoe ik het kan oplossen?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:04

Creepy

Tactical Espionage Splatterer

Tip: gebruik de code tags [code] en [/code] om je code beter leesbaar te krijgen in een post.

Over je probleem: Wat voor type veld is PRIJSINCL? Nu behandel je het als een tekst veld en stop je er een edit object in. Zelfs als het een tekst veld is dan kan je er geen edit object in stoppen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Dat is een veld (kolom) in de database. Gaat dat zo niet?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:04

Creepy

Tactical Espionage Splatterer

Gaat wat niet zo? Je probeert nu direct een edit veld te gebruiken als inhoud voor een database veld. Nee, dat gaat niet ;). Je wilt de textvalue van dit edit veld in de database zetten en niet het edit veld zelf.

Daarnaast behandel je alles als text. Indien je het type veld weet (currency, integer, whatever) gebruik dan de bijbehorende .AsXxx (AsInteger, AsCurrency, AsFloat, AsString) etc.

Overigens zijn er prima tutorials te vinden die dit behandelen. Heb je die al eens bekeken? En zo ja, kan je dat niet gebruiken in je eigen code?

[ Voor 15% gewijzigd door Creepy op 03-08-2006 11:14 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Hmm, het lukt nog steeds niet.

Ik heb al wel gezocht naar tutorials, maar het wil niet echt lukken.
Hebben jullie een goede link naar een tutorial voor dit probleem?

Verder heb ik nog een ander probleem:
Hoe kan ik informatie uit een database in een Editblokje zetten (een normaal Edit blokje)?

En hoe kan ik maken dat als ik een DBEdit blokje aanpas, dat hij het ook in de Database aanpast?

  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 11:34:
Hmm, het lukt nog steeds niet.

Ik heb al wel gezocht naar tutorials, maar het wil niet echt lukken.
Hebben jullie een goede link naar een tutorial voor dit probleem?
Wat lukt er niet? Nog steeds dezelfde melding dat het type niet klopt?

Voor stringvelden moet je aTable.FieldByName('aStringField').asString := 'EenString'; gebruiken. Voor numerieke velden .AsInteger, etc etc. Post je huidige sourcecode nog eens?

Heb je toevallig je tabel aangepast, nadat je velden toegevoegd hebt aan je dataset? Dan zou het kunnen zijn dat de types niet meer overeenkomen met de daadwerkelijke veldtypes.
Verder heb ik nog een ander probleem:
Hoe kan ik informatie uit een database in een Editblokje zetten (een normaal Edit blokje)?
En hoe kan ik maken dat als ik een DBEdit blokje aanpas, dat hij het ook in de Database aanpast?
Bij een TEdit kun je

edtIets.Text := aTable.FieldByName('aColumn').AsString;

gebruiken.

Die DBEdits zijn data-aware, het lezen en schrijven gaat daardoor automatisch. Daarvoor moet je een datasource aan je dataset koppelen en vervolgens die datasouce bij de property datasource van je DBEdit invullen en de kolomnaam bij fieldname kiezen.
Ik ben overigens geen voorstander van data-aware componenten. Ik bepaal liever zelf wanneer er gelezen of geschreven wordt.

Andere tip nog, stap aub zo spoedig mogelijk van die defaultnamen af. Met 1 tabel is dat te overzien, maar je kunt niet vroeg genoeg beginnen met zinvolle naamgeving. fsedit1, adotable1? Maak er edtPrijs en tblProduct van bijvoorbeeld. Creepy maakt bijvoorbeeld hierboven door die vage naamgeving ook een fout. Je voegt geen edit object in een textveld namelijk, maar die stringvariabele heeft gewoon een dubbelzinnige naam.

[ Voor 16% gewijzigd door Ozzy op 03-08-2006 14:10 ]

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


Verwijderd

Topicstarter
YES, het werkt. Bedankt allemaal!!

Alleen hoe moet ik nou maken dat als ik DBEdit verander dat hij het ook metteen in de DB aanpast?
Of door als je op een opslaan knop drukt.
Iemand enig idee?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:04

Creepy

Tactical Espionage Splatterer

Ozzy schreef op donderdag 03 augustus 2006 @ 13:55:
[...]
Andere tip nog, stap aub zo spoedig mogelijk van die defaultnamen af. Met 1 tabel is dat te overzien, maar je kunt niet vroeg genoeg beginnen met zinvolle naamgeving. fsedit1, adotable1? Maak er edtPrijs en tblProduct van bijvoorbeeld. Creepy maakt bijvoorbeeld hierboven door die vage naamgeving ook een fout. Je voegt geen edit object in een textveld namelijk, maar die stringvariabele heeft gewoon een dubbelzinnige naam.
:D

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 14:38:
YES, het werkt. Bedankt allemaal!!

Alleen hoe moet ik nou maken dat als ik DBEdit verander dat hij het ook metteen in de DB aanpast?
Of door als je op een opslaan knop drukt.
Iemand enig idee?
Dat heb ik in mijn vorige post aangegeven. Dat gaat dus automatisch, als je de properties goed invult.

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


Verwijderd

Topicstarter
Ik heb het nou zover, dat als ik op opslaan klik, dat hij het dan wel toevoegd, MAAR hoe kan ik aangeven dat hij het in rij1 van de tabel moet zetten, want nu zet hij het er een rijtje onder.

  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 15:31:
Ik heb het nou zover, dat als ik op opslaan klik, dat hij het dan wel toevoegd, MAAR hoe kan ik aangeven dat hij het in rij1 van de tabel moet zetten, want nu zet hij het er een rijtje onder.
Dan roep je ergens zelf een .insert aan. Het zou kunnen dat als je een lege tabel hebt, dat een DBEdit automatisch een insert doet, maar verder edit je met DBcontrols altijd het actieve record. Voor de duidelijkheid, die DBEdit werkt als je de twee properties (.datasource en .fieldname) hebt ingevuld helemaal vanzelf. Daar komt geen code meer aan te pas in een OnChange event of iets dergelijks.

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


Verwijderd

Topicstarter
Klopt, ik doe dat met Insert, maar ik dacht dat dat altijd moest voordat je iets kan toevoegen aan de DB.

Hoe kan ik dan iets toevoegen aan de database (gegevens komen uit een editbox), toch gewoon met:

edtIets.Text := aTable.FieldByName('aColumn').AsString;

Of moeten er nog meer regels bij?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:04

Creepy

Tactical Espionage Splatterer

Je pakt nu de huidige rij op, pakt de waarde van de betreffende kolom en stopt dat in een edit veld. Verder doe je niks. Als je een rij in de database wilt aanpassen dan gebruik je uiteraard niet de insert maar iets anders (druk op f1 en je weet meer ;) ).

Maar nogmaals: er zijn echt wel Delphi tutorials te vinden die je met het gebruik van TTables (en afgeleiden hiervan zoals TADOTable). Ook de meeste Delphi boeken behandelen dit onderwerp aangezien dit een redelijk basic Delphi iets is ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik heb nou:

ADOTable1.FieldByName('TABELNAAM').Text := Edit1.text;

Maar daarbij doet hij helemaal niks. Hij zet de data uit de editbox niet in de database...
Ben ik wat vergeten? Moeten er regels bij ofzo?
De tekst uit de Editbox moet dus in regel1/rij1 van de tabel komen...

[ Voor 75% gewijzigd door Verwijderd op 03-08-2006 17:00 ]


  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 16:37:
Klopt, ik doe dat met Insert, maar ik dacht dat dat altijd moest voordat je iets kan toevoegen aan de DB.

Hoe kan ik dan iets toevoegen aan de database (gegevens komen uit een editbox), toch gewoon met:

edtIets.Text := aTable.FieldByName('aColumn').AsString;

Of moeten er nog meer regels bij?
Een insert geeft een nieuwe rij inderdaad. Maar je zegt zelf dat je dat niet wilt, maar je wilt de huidige rij aanpassen. Als je dat met hand wilt doen, dan gebruik je een .Edit, waarmee je de huidige rij aanpast.

Die regel doet precies het omgekeerde van wat jij wilt.
Naar de database schrijven doe je zo:
code:
1
2
3
aTable.Edit;
aTable.FieldByName('aColumn').AsString := edtIets.Text; 
aTable.Post;

of naar een nieuwe regel schrijven
code:
1
2
3
aTable.Insert;
aTable.FieldByName('aColumn').AsString := edtIets.Text; 
aTable.Post;

Maar je moet eerste kiezen of je TEdit's of TDBEdits wilt gebruiken. Het kan ook doorelkaar, maar dat is vragen om ellende.

TEdit's -> je zult dan in code velden uit de database moeten lezen en schrijven met regels als :
aTable.FieldByName('aColumn').AsString := edtIets.Text; // schrijven naar de DB
edtIets.Text := aTable.FieldByName('aColumn').AsString; // lezen uit de DB
Je moet dus ook zelf zorgen dat de DB uit browsemode wordt gehaald om de data te manipuleren.

TDBEdits -> voor datamanipulatie geen source code nodig, dat doet het component voor je. Je hebt dus geen .Edit nodig. Uiteraard wel een .Insert, voor als je een nieuwe rij wilt starten.

Mijn voorkeur gaat uit daar de eerste mbv TEdit's omdat je hiermee meer invloed en controle hebt over de database en wanneer er geschreven wordt.
Verwijderd schreef op donderdag 03 augustus 2006 @ 16:57:
Ik heb nou:

ADOTable1.FieldByName('TABELNAAM').Text := Edit1.text;

Maar daarbij doet hij helemaal niks. Hij zet de data uit de editbox niet in de database...
Ben ik wat vergeten? Moeten er regels bij ofzo?
De tekst uit de Editbox moet dus in regel1/rij1 van de tabel komen...
code:
1
2
3
4
5
6
7
8
9
10
if ADOTable1.RecordCount > 0 then
begin   
    ADOTable1.First;
    ADOTable1.Edit;
end
else
    ADOTable1.Insert;
 
ADOTable1.FieldByName('KOLOMNAAM').Text := Edit1.text;
ADOTable1.Post;

[ Voor 14% gewijzigd door Ozzy op 03-08-2006 17:39 . Reden: TABELNAAM --> KOLOMNAAM ]

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


Verwijderd

Topicstarter
Hij geeft nou de foutmelding:

De Query is te complex... Procces gestopt...

[ Voor 81% gewijzigd door Verwijderd op 03-08-2006 17:14 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:04

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op donderdag 03 augustus 2006 @ 17:12:
Hij geeft nou de foutmelding:

De Query is te complex... Procces gestopt...
Dat word dan debuggen en de query aanpassen :)

Vragen stellen is niet erg. Dat je een beginner met Delphi bent (nofi uiteraard) is ook niet erg. Maar we verwachten hier wel van je dat je zelf in eerste instantie dit soort zaken probeert op te lossen en dat je ook aangeeft wat je nu hebt geprobreerd en wat daar niet mee lukte. Dit mist nu totaal in je post. Zie ook Programming Beleid en dan met name Programming Beleid - De Quickstart

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1