Ga naar inhoud

[Delphi] MDI-applicatie vraag


anoniem

Aanbevolen berichten

  • Reacties 72
  • Aangemaakt
  • Laatste reactie

Beste reacties in dit topic

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! :)
Link naar reactie
[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
Link naar reactie
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.
Link naar reactie
[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.
Link naar reactie
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!
Link naar reactie
[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!
Link naar reactie
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]
Link naar reactie
[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)
Link naar reactie
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?
Link naar reactie
[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...
Link naar reactie
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 )
Link naar reactie
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! :)
Link naar reactie
[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)
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen


×
×
  • Nieuwe aanmaken...