Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Vraag door oude Pascaller

137 Berichten
2 Gebruikers
0 Reactions
17.5 K Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
 

Dank je Gerard,

Lijkt me inderdaad misschien een goed artikeltje voor de toekomst - misschien ook een cursus SQL ...

Ik zal op m'n rug letten! Die is al naar de knoppen, dus kleine hoeveelheden tillen en regelmatig pauzeren. 


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Wat ik nu fout doe begrijp ik niet.

Waar geeft deze instructie geen fout meling

   SQLite3Connection1.ExecuteDirect('INSERT INTO Pedicures (NummerP, NaamPedicure, Plaats) VALUES (100,',"Gerard","Heemstede")'); 

en deze wel

   test1:='Gerard';

   test2:='Heemstede';  

SQLite3Connection1.ExecuteDirect((CHR(39)+'INSERT INTO Pedicures (NummerP, NaamPedicure, Plaats) VALUES ('+test+CHR(44)+CHR(34)+test1+CHR(34)+CHR(44)+CHR(34)+test2+CHR(34)+CHR(41)+CHR(39))); 

Waar ik dus mee blijf knoeien is de opbouw van de ExecuteDirect string,

vanalles nu getracht.


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Hoi Hans,

hier een zip file.

VeCoZo moet op je C schijf staan. (is nu tijdens programmeren)

Waar het programma staat maakt niet uit.

Compileren alleen als je op het form Beveiliging staat

Patiënten gaat in principe goed, alleen de data niet.

Als je meer dan 2 keer van patiënten naar aantekeningen gaat, krijg je een fout melding

Het programma is nog steeds in de opzet fase en veel delen zijn al apart geprogrammeerd en werken en moeten alleen nog overgezet worden.

Alle aanbevelingen zijn welkom.

Dank.

PS: ik neem aan dat je na het uploaden van de files het direct ook kan verwijderen???

groetjes gerard

PSS; Ik zit trouwens met het zelfde internet probleem, loop momenteel via de TV kabel op een snelheid "slak min". :-)


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
 

Hoi Gerard,

sorry dat i zo weinig tijd en middelen heb op het moment om een helpende hand te bieden.

De regel:

SQLite3Connection1.ExecuteDirect((CHR(39)+’INSERT INTO Pedicures (NummerP, NaamPedicure, Plaats) VALUES (‘+test+CHR(44)+CHR(34)+test1+CHR(34)+CHR(44)+CHR(34)+test2+CHR(34)+CHR(41)+CHR(39))); 

Kan beter beschreven worden als:

SQLite3Connection1.ExecuteDirect(’INSERT INTO Pedicures (NummerP, NaamPedicure, Plaats) VALUES (‘+IntToStr(test)+','+QuotedStr(test1)+','+QuotedStr(test2)+')'); 

(ik hoop even dat ik geen type fouten heb gemaakt, en ik neem even aan dat de variable "test" een numerieke waarde heeft, b.v. 100).

Het kan ook zijn dat dit werkt:

SQLite3Connection1.ExecuteDirect(’INSERT INTO Pedicures (NummerP, NaamPedicure, Plaats) VALUES (‘+IntToStr(test)+',"'+test1+'","'+test2+'")'); 

De functie QuotedStr (zie FreePascal Docs) handelt het haakjes er om heen zetten helemaal voor je af. Bij andere SQL enignes (MySQL bijvoorbeeld) kun je zowel enkele als dubbele haakjes gebruiken en dan werkt de twee methode ook. Geen idee of SQLite dat ook goed gaat doen.

Ik heb nog geen kans gehad om naar jouw code te kijken - heb even geen Windows ter beschikking (zit in de container).
Wat vaak wel het geval is dat bepaalde queries afgevuurd worden op minder geschikte momenten en daarmee een conflict veroorzaken.
Dus b.v. als je een query draaid met een "OnShow" event maar je hebt de voorgaande query niet afgesloten of de voorgaande query triggered een ander event dat conflicteert.

Internet is eindelijk actief hier maar van de beloofde 10 Mb/s haalt het net 2 Mb. De beloofde HDTV kanalen werken niet en de Interactieve TV ook niet. Ik kreeg al de waarschuwing dat als ik TV ga kijken (gewonen niet HD kanalen) dat dan mijn Internet ook plat gaat. Lekker is dat in een maatschappij waar Internet een must is geworden. Vreemd dat de overheid er geen subsidie regelingen voor heeft en de buitenaf gelegen gebieden lekker negeert maar toch eist dat we alles electronisch gaan doen. 


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Hans, hoe ga je nu. Al meer spullen binnen of alles nog steeds in de container?

Ik zat je net een bericht via je mail hier te schrijven maar dat lukt niet.

Ik ben na een maand klooien eigenlijk klaar met SQlite. Wat een k*t programma.

ik denk dat ik alles terugbouw naar een simpel textfile die in codeer en oncodeer en dan alles ermee doen.

data is veel simpeler dan SQLite met al haar frustratie codes

Gerard


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Waarom werkt dit niet?

procedure TForm1.DBEdit10Exit(Sender: TObject);

var Naam : string;

     ii : integer;

begin

  IF Length(DBEdit10.Caption) < 1 THEN

  BEGIN

    Label29.Caption:='Minimaal 1 letters als eigen naam invoeren.';

    DBEdit10.SetFocus;

  END

  ELSE

  BEGIN

    Naam:=UpperCase(DBEdit10.Caption[1]);

    FOR ii:=2 TO Length(DBEdit10.Caption) DO Naam:=Naam+LowerCase(DBEdit10.Caption[ii]);

    DBEdit10.Caption:=Naam;

    Label29.Caption:='';

  END;

end;   

Procedure wijzigingen opslaan!!!!

   SQLQuery2.Edit;

   SQLQuery2.UpdateMode:=UpWhereChanged;

   SQLQuery2.ApplyUpdates;

   SQLTransaction1.Commit;

   SQLQuery2.Close;

   SQLQuery2.Open;              

Gerard


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
 

Hoi Gerard!

Ja, ik kan me de frustratie voorstellen - SQLite is leuk maar minder transparant dan b.v. MySQL (maar daar heb je dan weer een server voor nodig en dat is niet wat jij zoekt).

Ik zit nog midden in de rommel en dozen - mijn huis in de VS was zeker 4x groter dan mijn huidige huis dus het is wat proppen. Moet dus op zoek gaan naar kasten en zaken in de schuur gaan opslaan. Het weer helpt daarbij natuurlijk ook niet mee ... wat een hitte en dan geen A/C hebben ... haha

Voor jouw toepassing is SQLite een van de betere oplossingen. Het geklooi met de datum is inderdaad een dikke ellende - lang leve standaarden he? ;-)

Ik heb nog steeds geen toegang tot m'n spullen - veel zit er nog in dozen enzo - maar ik zal proberen of ik een snelle uitweg voor je kan vinden.

Als eerste kun je bij deze link een hoop info vinden m.b.t. datum/tijd functies voor de SQL in SQlite, maar misschien is dat een beetje te veel van het goede: https://www.sqlite.org/lang_datefunc.html

Voor zover ik me kan herinneren kun je een datum als tekst doorgeven in het formaat "YYYY-MM-DD HH:MM:SS.SSS", waarbij tijd, seconden, en milliseconden optioneel zijn.

Om dan een tijd vanuit Pascal in dat formaat te krijgen, kun je "FormatDateTime" gebruiken. ( http://www.freepascal.org/docs-html/rtl/sysutils/formatdatetime.html ) b.v.:

FormatDateTime('YYYY-MM-DD',Now()))

Waarbij "now()" de huidige tijd/datum is. De tekst zou dan in het juiste formaat doorgestuurd worden naar SQLite. De query kan dan zoiets zijn:

query := 'INSERT MijnDatum="'+FormatDateTime('YYYY-MM-DD',Now()))+'" INTO MijnDatabase';

(hopelijk heb ik niet te veel type fouten gemaakt)

Je moet dan natuurlijk wel weten in welk formaat de datum ingevoerd werd door de gebruiker, maar als je dat toch al opvangt met een TDateTime, dan kun je die waarde plaatsen waar in dit voorbeeld "now()" staat.

Als je echter besluit iets anders te gaan gebruiken dan SQlite, dan zou mijn eerste gedachte zijn om een array van records te gebruiken. Nadeel is wel dat je veel programmeer werk er omheen moet maken. De array kan (zoals je al weet) dus dynamisch zijn en gewoon weggeschreven worden. Maar ja, je moet dan ook steeds wel alles inlezen of doorlezen.

Als je hier kijkt: http://wiki.freepascal.org/Databases

dan zie je dat er ook nog mogelijkheden zijn op basis van text (memory), FoxPro, Paradox en dBase (van vroeger).

Ik heb weleens lopen rommelen met een in-memory dataset maar dat was toch lastig om mee te werken.

FoxPro, dBase en Paradox werken prima, maar hebben weer het nadeel dat je echte SQL queries kunt bouwen.

Voor dBase: http://wiki.freepascal.org/Lazarus_Tdbf_Tutorial

Hopelijk helpt dit je een beetje op weg - en mijn excuses voor de stilte de laatste weken. Het is en blijft een drukte om te verhuizen.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
 

Voor wat jouw code betreft:

Het is nooit een goed idee om op deze manier met DBEdit te werken. Het is beter om dan met een gewone TEdit te werken en de database handmatig te updaten. Als je namelijk een DBEdit verlaat (exit) dan gaat de DBEdit zelf al aan de slag met het update van het betreffende record. Jouw code echter steekt daar een stokje voor en dan loopt dus alles in het honderd.


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Hans, 

Als je de kans hebt: hoe zou jij de code ombouwen.

Ik wil dus bij het verlaten van het veld (en zo heb ik er inmiddels 30 verschillende velden met verschillende eisen) op het form, dat het veld de juiste tekst / datum / nummer heeft, en dat pas bij het op de knop wijzigingen opslaan de db wordt bijgewerkt. De gebruiken kan het veld ook niet meer verlaten als de "tekst" niet aan de voorwaarden voldoet.

In principe werkt de exit procedure overal (behalve de datum), dus daar zit het probleem niet. Label29 = een info / communicatie veld met de gebruiker.

Bij de procedure "opslaan", tracht ik te bewerkstelligen dat de wijzigingen opgeslagen worden en de gegevens vanuit de db opnieuw in de velden op het form getoond worden.

Ik ben je dank voor voor je support en te horen dat je we weer bent.

Gerard

----------- verlaten van veld edit10 -------------------

procedure TForm1.DBEdit10Exit(Sender: TObject);

var Naam : string;

     ii : integer;

begin

  IF Length(DBEdit10.Caption) < 1 THEN

  BEGIN

    Label29.Caption:=’Minimaal 1 letters als eigen naam invoeren.';

    DBEdit10.SetFocus;

  END

  ELSE

  BEGIN

    Naam:=UpperCase(DBEdit10.Caption[1]);

    FOR ii:=2 TO Length(DBEdit10.Caption) DO Naam:=Naam+LowerCase(DBEdit10.Caption[ii]);

    DBEdit10.Caption:=Naam;

    Label29.Caption:=’';

  END;

end;   

----------- einde verlaten van veld edit10 -------------------

Procedure wijzigingen opslaan!!!!

   SQLQuery2.Edit;

   SQLQuery2.UpdateMode:=UpWhereChanged;  << hier wordt toch de velden klaargezet voor wijzigen naar de db>>

   SQLQuery2.ApplyUpdates;                                << hiermee worden ze ingevoerd >>

   SQLTransaction1.Commit;                                << hiermee bevestigd >>

   SQLQuery2.Close;                                              << db dicht >>

   SQLQuery2.Open;                                              << db open >>


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

He Hans,

Sorry voor de frustratie mijnerzijds, maar ik begrijp het gewoonweg niet.
Het zou toch simpel moeten zijn, en dan steeds weer terug naar het begin.

Houd vol, is ben recentelijk van 680m2 naar 60m2 huis + 25m2 zolder gegaan, en dat lukte ook. Voordeel was dat de vliegtuigen niet meer rakelings over mijn huis vliegen en de kosten aanzienlijk minder. Het weer slaat eerdaags wel weer om en dan heb je de verwarming nodig.

Succes met je inrichting.

Gerard


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Ok Hans,
Na weer de frustratie opzij gezet te hebben en wat code gewijzigd (zuchT) werkt het weer.

Ik heb een paar velden omgebouwd van TDBEdit naar TEdit en vlak voor  //   SQLQuery2.ApplyUpdates;   //  de TDBEdit := TEdit ingevoerd en na  // SQLQuery2.Open;   // TEdit := TDBEdit;

Dit lijkt te werken.

Voordat ik het hele programma omgooi; is dat wat jij denkt dat stabiliteit zal brengen?

Dank 


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Ga dit weekend eens kijken naar je voorstel van datum.

Had zoiets al geprobeerd maar dat ging ook niet.

Gerard


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
 

Hoi Gerard!

Ik snap jouw frustraties helemaal - heb zelf ook in dat bootje gezeten haha ... 

Dank je wel voor wat betreft de steun met de verhuis. Ik ga eens lekker opzoek naar goedkope kasten, dan kan ik het e.e.a. makkelijker opslaan. Nooit geweten dat een simpele witte kast met wat plankjes erin zo over de 150 Euro schiet.

Omzetten van betreffende TDBEdit's naar TEdit's werkt zeker beter. De methode die jij gebruikt (TDBEdit.Text := TEdit.Text) is misschien de mooiste, maar zeker wel de simpelste manier. Je zou eventueel ook een SQL kunnen bouwen voor de update, maar dat kost wat meer tijd en moeite.

Voor wat de velden die "regeltjes" nodig hebben: ik probeer deze vaak in 1 of meer korte procedures te vangen om het e.e.a. wat onderhoud vriendelijker te maken. B.v. als je meerdere datum velden hebben, dan kun je 1 procedure maken die dit test voor al deze velden. Simpel voorbeeld:

procedure OnExitTextVeld(Sender:TObject);
begin
  if Sender is TEdit then //even zeker maken dat de Sender een TEDit is
  begin
    // controleer input en corrigeer eventueel
    // lezen: mijnvariable := TEdit(Sender).Text;
    // Schrijven: TEdit(Sender).Text := '123';
  end;
end;

En als de gebruiker de "Submit" knop drukt, de TDBedit.Text := TEdit.Text doen en dan de gebruikelijk andere stappen (zoals je al deed).

Het is belangrijk zo min mogelijk TDBEdit (en andere Database aware componenten) aan te raken in code. Zorgt vaak alleen maar voor problemen en verwarring.

De procedure die je had (maar dan TEdit ipv TDBedit) ziet er aardig uit. Die zou ik zelf niet zo heel veel anders doen.


   
BeantwoordenCiteren
(@hengst)
Trusted Member
Deelgenomen: 10 jaar geleden
Berichten: 83
Topic starter  

Hoi Hans,
Kijk eens op marktplaats, daar staan vele kasten welke je voor weinig kunt ophalen, maar ook leveranciers.
Andres kan je ze zelf altijd bouwen, zoals ik gedaan hebt (zie foto), op wieltjes en passen op zolder onder het schuine dak.

Waar ben je neergestreken in Nederland, beetje mooie natuur? Ik zit tegenwoordig op de Veluwe.

----

Ik heb een gedeelte van de code herschreven, maar de db wordt niet geupdate.
Enig idee?

Procedure wijzigingen opslaan

   WaarWasIk:=(BSNummer.Caption);

   BSNummer. Caption:=Edit5.Caption;

   DBEdit1. Caption:=Edit6.Caption;

   DBEdit11. Caption:=Edit7.Caption;

   DBEdit2. Caption:=Edit4.Caption;

   SQLQuery2.Edit;

   SQLQuery2.UpdateMode:=UpWhereChanged; 

   SQLQuery2.ApplyUpdates;

   SQLTransaction1.Commit;

   SQLQuery2.Close;

   SQLQuery2.Open;

   Edit5.Caption:=BSNummer.Caption;

   Edit6.Caption:=DBEdit1.Caption;

   Edit7.Caption:=DBEdit11.Caption;

   Edit4.Caption:=DBEdit2.Caption;

   SQLQuery2.Locate('BSN',WaarWasIk,[]);  


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
 

Leuke kastjes! 
Maar ik zoek toch een beetje iets dat een deur heeft zeg maar. Heb in het verleden vaker m'n eigen (open) kastjes en bureau's gebouwd, maar nooit met deurtjes.

Wat jou code betreft,... ik zie een spatie in de DBEdit regels "DBEdit2. Caption" ... is dat een type fout ??
Zou "DBEdit2.Caption" moeten zijn (zie ook de andere regels).


   
BeantwoordenCiteren
Pagina 6 / 10
Deel: