anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 [quote:053ad2184e="Johan Stokking"] Wat gebruik je, de TZMySqlQuery of the TZMySqlTable? Zet je de data in een Grid?[/quote:053ad2184e] Ik gebruik nu TZMySqlTable en zet elk veld in een apart DBEdit veld. Voor screenshot: [url=http://www.dbgardenproducts.nl/screenshots/screenshot1.gif]Klik hier[/url] Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Ziet er goed uit man! (fa[b:4c5a0456fb]c[/b:4c5a0456fb]turen is met een c...) Je gebruikt zo te zien een TDBNavigator, als je de button Insert en Update (niet persé nodig, je kan ook de procedure Post gebruiken) visible maakt kan je een record toevoegen (met lege data). Vervolgens kan de gebruiker dan de knop Post gebruiken (of een eigen knop die de procedure Post aanroept) om de data te "updaten". Misschien werkt hiervoor de procedure Update ook wel die jij gevonden had... Beetje vaag verhaal.... maar moet vast lukken! :) Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Weet jij toevalling hoe ik de systeemdatum in een DBEdit veld kan weergeven als er een nieuw record wordt aangemaakt? Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Tijd + Datum: DateTimeToStr(Now);, dan krijg je bijvoorbeeld 01-09-2002 17:30 Datum: DateToStr(Now);, voor alleen de datum (01-09-2002) Tijd: TimeToStr(Now);, alleen de tijd, bijvoorbeeld 17:31. Succes! Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Ik kom er niet uit. Dit werkt niet (logisch) [code:1:f237837a75] Table1.FieldValues['Opvoerdatum'] := DateToStr(DBEdit25.text); [/code:1:f237837a75] Hoe moet dit wel? Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 [quote:e9ad4b6d64="George W. Bush"]Ik kom er niet uit. Dit werkt niet (logisch) [code:1:e9ad4b6d64] Table1.FieldValues['Opvoerdatum'] := DateToStr(DBEdit25.text); [/code:1:e9ad4b6d64] Hoe moet dit wel?[/quote:e9ad4b6d64] Dat komt omdat DBEdit25.Text geen Date is, je kan dus niet DateToStr doen. De functie Now geeft een TDateTime terug waar het dus wel mee kan. Wat wil je in de Opvoerdatum zetten? Ik neem aan een datum, maar is in de database dit ook een datum-veld? Dan neem ik aan dat je StrToDate (of StrToDateTime) kan gebruiken. Als het geen datum-veld is moet je een functie zien te vinden die de datum valideert. Ik ga zo is kijken of ik dat kan maken, maar ga eerst eten... Zet je btw wel ff "m.m.v. Johan Stokking" in je about-box? :D Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Gelukt! :lol: Dit is de functie, hij geeft True terug als het een geldige datum is en False als het geen geldige datm is: [code:1:8dbd41bcf4] function GeldigeDatum(const S: String): Boolean; begin try StrToDate(S); Result := True; except Result := False; end; end; [/code:1:8dbd41bcf4] En dit is dan een voorbeeldje met m'n geboortedatum erin: [code:1:8dbd41bcf4] procedure TForm1.Button1Click(Sender: TObject); begin if GeldigeDatum('01-06-1987') then ShowMessage('Geldig!') else ShowMessage('Ongeldig!'); end; [/code:1:8dbd41bcf4] Let op! Als de gebruiker in Windows heeft ingesteld dat 01/06/1987 een datum is, dan is 01-06-1987 fout! Gebruik hiervoor een TMaskEdit en maak een Mask met streepjes ("-") of forward-slashes ("/") o.i.d. Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Het is gelukt: [code:1:db1011c74b] DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date);[/code:1:db1011c74b] Wat die about-box betreft... ik ben nu eenmaal beginner en moethet toch van iemand leren! :) Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 [quote:4ee39655ca="George W. Bush"]Toch klopt het niet helemaal volgens mij. Als ik op de knop druk als ik het programma uitvoer dan krijg ik een error. Met de code is niks mis volgens Delphi, maar werken doet het ook niet: [code:1:4ee39655ca]procedure TKlantenForm.ToolButton1Click(Sender: TObject); begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantenTabel.FieldValues['Opvoerdatum'] := StrToDate(DBEdit25.text); end;[/code:1:4ee39655ca] Wat die about-box betreft... ik ben nu eenmaal beginner en moethet toch van iemand leren! :)[/quote:4ee39655ca] Hier gebeurt hetzelfde als dit: [code:1:4ee39655ca] procedure TKlantenForm.ToolButton1Click(Sender: TObject); begin if not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantenTabel.FieldValues['Opvoerdatum'] := StrToDate(DBEdit25.text); end; [/code:1:4ee39655ca] Hij doet dus alleen KlantenTabel.Last als hij EOF is, de rest doet hij altijd! De correctie: [code:1:4ee39655ca] procedure TKlantenForm.ToolButton1Click(Sender: TObject); begin if not KlantenTabel.Eof then begin KlantenTabel.Last; KlantenTabel.Insert; KlantenTabel.FieldValues['Opvoerdatum'] := StrToDate(DBEdit25.text); end; end; [/code:1:4ee39655ca] Jah? Spring altijd in, is heel belangrijk voor het "lezen". Delphi maakt er overigens geen verschil tussen. Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Stapje voor stapje komen we er wel! Dus opnieuw een vraagje: (schaam me bijna ;) ) Met behulp van een MySQlQuery haal ik het laatste klantennummer uit mijn klanten tabel. Maar hoe kan ik bij het resultaat 1 optellen en dat vervolgens displayen in DBEdit1 na het drukken op een button. Ik heb nu dit maar doe iets verkeerd: procedure TKlantenForm.ToolButton1Click(Sender: TObject); begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; [b:d96a76e725] DBEdit1.text := KlantIDQuery+1;[/b:d96a76e725] DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; Help me werderom! Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 [quote:b0eda6b990="George W. Bush"]Stapje voor stapje komen we er wel! Dus opnieuw een vraagje: (schaam me bijna ;) ) Met behulp van een MySQlQuery haal ik het laatste klantennummer uit mijn klanten tabel. Maar hoe kan ik bij het resultaat 1 optellen en dat vervolgens displayen in DBEdit1 na het drukken op een button. Ik heb nu dit maar doe iets verkeerd: procedure TKlantenForm.ToolButton1Click(Sender: TObject); begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; [b:b0eda6b990] DBEdit1.text := KlantIDQuery+1;[/b:b0eda6b990] DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; Help me werderom![/quote:b0eda6b990] Geeft niet, daar is het forum voor :D Uhmm.... ff denken.... die procedure werkt niet door twee oorzaken. 1. Alleen KlantenTabel.Last wordt uitgevoerd als hij daar nog niet is, wil je dit zo? Dan staat het er goed, maar voor de leesbaarheid is het dan makkelijker dat je twee spaties inspringt. 2. Er is een Delphi een verschil tussen een String (tekst) en een Integer (getal). Je kan bijvoorbeeld niet een getal bij een tekst optellen (wat je hier wilt doen). Je kunt Strings naar Integers converteren en omgekeerd. Dat gaat zo: [code:1:b0eda6b990] var I: Integer; S: String; begin I := 1; S := IntToStr(I); end; [/code:1:b0eda6b990] Nu "converteer" (met IntToStr) je het getal 1 naar "1" (tekst). Het kan ook omgekeerd: [code:1:b0eda6b990] var I: Integer; S: String; begin S := '1'; I := StrToInt(I); end; [/code:1:b0eda6b990] Hier "converteer" (dmv StrToInt) je de tekst "1" naar het getal 1. Dit is eigenlijk wel iets wat je moet snappen, het is niet moeilijk en best belanrijk. Oke weer terug naar je code: [code:1:b0eda6b990] procedure TKlantenForm.ToolButton1Click(Sender: TObject); begin If not KlantenTabel.Eof then KlantenTabel.Last; // inspringen voor de leesbaarheid KlantenTabel.Insert; KlantIDQuery.Open; DBEdit1.text := KlantIDQuery+1; // de fout! DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; [/code:1:b0eda6b990] Bij de fout probeer je het getal 1 op te tellen bij een tekst, zoals hierboven genoemd kan dit niet! Eerst moet je KlantIDQuery.Text converteren naar een getal, dus het wordt dan [b:b0eda6b990]StrToInt(KlantIDQuery.Text)[/b:b0eda6b990]. Vervolgens tel je er 1 bij op, dus: [b:b0eda6b990]StrToInt(KlantIDQuery.Text) +1[/b:b0eda6b990]. Dit moet weer geconverteerd worden naar een tekst omdat DBEdit1.Text een String is. Het wordt dus dit: [code:1:b0eda6b990] DBEdit1.Text := IntToStr(StrToInt(KlantIDQuery.Text)+1); [/code:1:b0eda6b990] Lang verhaal en belangrijk. Als je het niet snapt moet je het zeggen hoor! Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Ik snap wat je bedoelt maar het werkt nog niet helemaal. Ik krijg namelijk bij het runnen een fout: Undeclared identifier 'Text' Voor de volledigheid nog ff de code: PS: ik spring ook in bij elke regel, maar dat gaat verloren bij het plakken van de code op dit forum [code:1:13b0e4e154] begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; DBEdit1.Text := IntToStr(StrToInt(KlantIDQuery.Text)+1); DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; [/code:1:13b0e4e154] Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 [quote:4794313b0d="George W. Bush"]Ik snap wat je bedoelt maar het werkt nog niet helemaal. Ik krijg namelijk bij het runnen een fout: Undeclared identifier 'Text' Voor de volledigheid nog ff de code: PS: ik spring ook in bij elke regel, maar dat gaat verloren bij het plakken van de code op dit forum [code:1:4794313b0d] begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; DBEdit1.Text := IntToStr(StrToInt(KlantIDQuery.Text)+1); DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; [/code:1:4794313b0d][/quote:4794313b0d] Sorry... foutje :D kan iedereen overkomen... ik controleer m'n code niet namelijk... :) Dit moet het precies zijn: [code:1:4794313b0d] begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; DBEdit1.Text := IntToStr(StrToInt(DBEdit1.Text)+1); DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-MM-yyyy',Date); end; [/code:1:4794313b0d] Ik had trouwens nog niet aan FormatDateTime gedacht... :D leer ik ook wat van jou 8) Quote Link naar reactie
anoniem Geplaatst: 1 september 2002 Auteur Delen Geplaatst: 1 september 2002 Er zitten geen errors in de code, maar er mist toch nog iets. Die 1 telt hij nu namelijk nergens bij op. De bedoeling is dat hij bij het resultaat van de Query 1 optelt, dat gebeurt nu niet. (Dus als de uit de query 3 komt moet dat 4 worden) Die KlantIDQuery is een ZMySQLQuery met de volgende query bij de propertie 'sql' : [code:1:3c3ff4051c] SELECT KlantID FROM Klanten ORDER BY KlantID DESC LIMIT 0,1[/code:1:3c3ff4051c] Je ziet de Query haalt KlantID uit de tabel Klanten, ordert ze aflopend en pakt dan de eerste record. Op die manier heb je het laatst gebruikte klantnummer. De bedoelingen is nu dat als ik een nieuwe klant wil aanmaken dat daar 1 bij opgeteld wordt. Hoe kan die 1 bij het resultaat optellen van de Query? Quote Link naar reactie
anoniem Geplaatst: 2 september 2002 Auteur Delen Geplaatst: 2 september 2002 [quote:5642e2fb95="George W. Bush"]Met behulp van een MySQlQuery haal ik het laatste klantennummer uit mijn klanten tabel. Maar hoe kan ik bij het resultaat 1 optellen en dat vervolgens displayen in DBEdit1 na het drukken op een button. Help me werderom![/quote:5642e2fb95] Dit raad ik je niet aan om deze methode te gebruiken! Dit i.v.m. concurrency problemen die op kunnen treden. Je moet de database engine/server het volgende number laten genereren. Ik heb niet zo veel kennis van MySQL, maar ik dacht dat deze een AUTO_INCREMENT veldtype heeft. Gebruik deze dus. Hoe je het eerstvolgende nummer kan bepalen voordat je werkelijk een record hebt toegevoegd, dat is een ander verhaal... Quote Link naar reactie
anoniem Geplaatst: 2 september 2002 Auteur Delen Geplaatst: 2 september 2002 Ik wil geen autonummering gebruiken, omdat het klantennummer niet bij 1 moet begiinnen maar bij 200. Quote Link naar reactie
anoniem Geplaatst: 2 september 2002 Auteur Delen Geplaatst: 2 september 2002 Dan zou ik tóch autonummering gebruiken (AUTO_INCREMENT idd), en voor het zicht in het programma er 200 bij optellen. De database blijft dan toch "schoon". Als je dan wilt zoeken tel je er gewoon 200 bij op. Kost misschien wat extra moeite maar dit is wel de beste oplossing, ook als je later het programma verder wilt uitbreiden (want een goed begin is het halve werk :D ) Quote Link naar reactie
anoniem Geplaatst: 2 september 2002 Auteur Delen Geplaatst: 2 september 2002 Het is me gelukt zonder auto nummering. De procedure is nu als volgt: [code:1:6aee2da67f] procedure TKlantenForm.ToolButton1Click(Sender: TObject); var KlantNR: Integer; begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; KlantNR := KlantIDQuery.FieldByName('KlantID').AsInteger; DBEdit1.text := IntToStr(KlantNR+1); DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; [/code:1:6aee2da67f] Nu weer verder klooien naar het volgende knelpunt! :) Quote Link naar reactie
anoniem Geplaatst: 2 september 2002 Auteur Delen Geplaatst: 2 september 2002 Haha :D Je hebt talent man :D Wat moet er precies gebeuren als je op ToolButton1 drukt? Want volgens mij staat het er nog niet helemaal goed... :o Quote Link naar reactie
anoniem Geplaatst: 2 september 2002 Auteur Delen Geplaatst: 2 september 2002 [quote:8c6186b922="George W. Bush"]Het is me gelukt zonder auto nummering. De procedure is nu als volgt: [code:1:8c6186b922] procedure TKlantenForm.ToolButton1Click(Sender: TObject); var KlantNR: Integer; begin If not KlantenTabel.Eof then KlantenTabel.Last; KlantenTabel.Insert; KlantIDQuery.Open; KlantNR := KlantIDQuery.FieldByName('KlantID').AsInteger; DBEdit1.text := IntToStr(KlantNR+1); DBEdit12.text := 'Nederland'; DBEdit25.text := FormatDateTime('dd-mm-yyyy',Date); end; [/code:1:8c6186b922] Nu weer verder klooien naar het volgende knelpunt! :)[/quote:8c6186b922] En nu wordt je applicatie ook door een andere gebruiker opgestart en deze wil op hetzelfde moment ook een Klant toevoegen. Tsjakka.... :D You have been warned 8) Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen