Page 1 of 2 1 2 LastLast
Results 1 to 15 of 17

Thread: simpel database programma

  1. #1

    simpel database programma

    Ik werk al jaren met Delphi en Firebird.
    Echter de gebruiker had hierbij zelf weinig tot geen toegang tot de data
    Nu moet ik echter een editor maken waarbij de gebruiker middels wat filters data kan inladen en deze eventueel kan bewerken
    Uiteraard kan ik dit weer helemaal zelf gaan schrijven maar volgens mij hebben we juist hier de database componenten voor.
    Weet iemand wat voorbeelden

  2. #2
    Quote Originally Posted by cpri View Post
    Nu moet ik echter een editor maken waarbij de gebruiker middels wat filters data kan inladen en deze eventueel kan bewerken
    Dat heet toch gewoon een programma (die je zelf moet programmeren)

    Natuurlijk kun je zelf aan de gang met de volgende componenten en het heel simpel houden:
    TIBDatabase + TIBTransaction -> TIBQuery -> TDataSource -> TDBGrid -> TEdits

    (of iets met FireDac in elkaar draaien)

    Je kunt ze ook een Firebird Database Manager geven.
    FlameRobin, TurboBird (in Delphi geschreven), IB_SQL, DBeaver en nog een hoop andere.

    Er zal volgens mij geen kant en klaar component zijn want dat is erg afhankelijk van de database zelf.
    "Kant en Klaar" is gewoon een database component gekoppeld aan een Query met een TDBNavigator en wat Edits.

    Eerste vraag is dan, met welke wil je gaan werken. Is het voor Client/Server of alleen lokaal op 1 computer?
    Heb je Delphi Pro of Enterprise (belangrijk voor de vraag als je FireDac wil gebruiken in Client/Server settings).

    Zelf gebruik ik IBX. (dus de TIBDatabase etc van hierboven)

  3. #3
    Ok hier nog wat uitleg.
    Het gaat dus om een client server applicatie.
    Zelf maak ik tot nu gebruik van de FireDac componenten.

    Ik snap dat ook zelf wat moet programmeren

    Momenteel maak ik altijd de interface zelf en koppel ik de data aan wat Tedits of Tlabels.
    Nadat de gebruiker dan wat gecontrollerd/aangepast heeft schrijf ik de data weer terug in de database, maar hiervoor schrijf ik dus heel insert/update query zelf.

    Waar ik dus naar op zoek ben zijn wat voorbeelden hoe je dit via een dbgrid achtig iets kan doen zodat je niet zelf meer de insert en update routines hoeft te schrijven.

  4. #4
    Tja, er zijn waarschijnlijk boeken vol over geschreven, maar de basis staat al in het antwoord van rvk. Je kan simpelweg de componentjes aan elkaar knopen.

    Maar vooruit, met iets meer context:

    De UI

    - TDBEdit (en andere DB aware componenten), kunnen zelf signalen over wijzigingen doorgeven aan de datalaag, of deze ontvangen uit de datalaag.

    - TDBNavigator zou kunnen gebruiken als eerste stap voor het navigeren door de rijen, bewerken, opslaan e.d

    - OPTIONEEL: Eigen navigatieknoppen. Je kan de navigator nog een beetje customizen, maar vaak zie je dat een applicatie niet dit component gebruikt, maar vaak zie je dat mensen toch hun eigen knoppen gebruiken. Misschien zijn ze eigenwijs of vinden ze de navigator niet mooi. Geen probleem: er ook standaard TActions voor acties als edit, post, next enzovoorts. Dus als je wat ervaring hebt met TActionList kan je zonder een regel code te schrijven zelf een navigator bouwen met je eigen knoppen. Is dat te hoog gegrepen, blijf dan vooral nog even bij die nagivator. Die werkt ook prima.

    De koppeling naar je data

    - TDataSource is het component dat al deze UI componenten koppelt aan een datacomponent. Dit is dus echt het doorgeefluik, en is in feite het stekkertje van het form dat in het stopcontactje van een datamodule hoort (ervanuitgaande dat je de database componenten op een datamodule zet. Dat is niet verplicht, maar wel aanbevolen).
    De DB aware componenten hebben een DataSource property die je aan de data source koppelt.

    DBEdit, TDBText e.d. heeft ook een datafield wat aangeeft welk veld het moet tonen of bewerken.
    TDBGrid zal een hele dataset tonen
    TDBLookupCombobox wil nog een tweede datakoppeling voor het lijstje. ListSource, ListField en Keyfield geven dan aan waar de lijst vandaan komt. Dit heb je niet nodig als het lijstje niet uit een database komt. Je kan ook een TDBCombobox gebruiken en zelf de lijst met waardes in je programma bepalen.

    Tot zo ver is het nog helemaal los van de data. Je hebt een scherm dat zonder verdere code een databron kan lezen of bewerken. Tof he.

    De Data

    TDataSource is alleen een doorgeefluik. De data moet ergens vandaan komen. TDataSource heeft daarom een DataSet property. Daaraan koppel je een TQuery, TADODataSet, een Firedac component, of zelfs een REST component. Zolang het maar afgeleid is van TDataSet.

    OPTIONEEL. Er is ook een TClientDataset. Misschien gebruik je 'm al. Die wordt gebruikt voor lokale in-memory versies van de data. Die is breed inzetbaar als memory-dataset, of als buffer voor het efficient werken met meerdere gebruikers (optimistic locking), of voor databronnen waarnaar je überhaupt geen verbinding kan openhouden (REST clients, XML files). Niet nodig voor je eerste schreden, maar als je 'm al gebruikt, dan koppel je de datasource aan de clientdataset, niet aan een eventuele andere dataset die daar nog achter hangt.

    Je kent Firedac al, dus je hebt waarschijnlijk al ervaring met het werken met een dataset en de onderliggende database-verbinding. Zet een verbinding op met een dataset of query component zoals je gewend bent.
    Wijs de dataset property van de TDataSource naar de dataset, en je bent eigenlijk al klaar. Je kan in feite in de designer al zien hoe de data in je grid geladen wordt. Je kan je programma runnen zonder verder een regel code te schrijven.

    En natuurlijk komt er daarna nog wel iets meer bij kijken om er echt een volledige database-applicatie van te maken, maar ik zou het zo maar eens proberen, er wat gevoel mee krijgen, en informatie putten uit de vele duizenden voorbeelden die het internet rijk is. Mocht er dan nog een concrete vraag overblijven, dan zijn we natuurlijk weer hier.
    Last edited by GolezTrol; 07-Mar-23 at 12:29.
    1+1=b

  5. #5
    Quote Originally Posted by cpri View Post
    Waar ik dus naar op zoek ben zijn wat voorbeelden hoe je dit via een dbgrid achtig iets kan doen zodat je niet zelf meer de insert en update routines hoeft te schrijven.
    Schrijft FireDAC niet automatisch de UPDATE en INSERT queries als je een SELECT opgegeven hebt?

    Zelf gebruik ik een eigen routine die UPDATE en INSERT automatisch aanmaakt a.d.h.v. een SELECT (op basis van een linknummer).

    Maar ik dacht dat FireDAC juist bedoeld was om dit soort dingen grotendeels te automatiseren.
    Maar ik gebruik geen FireDAC want ik heb geen (dure) Enterprise versie van Delphi.

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (Zeos doet dat ook voor enkelvoudige queries Als je gaat joinen en met koppeltabellen gaat werken, gaat dat niet meer geloof ik)

  7. #7
    Thanks voor de info.

    Ga het idd eens proberen met de uitleg van Goleztrol.
    Dat je geen updates kan doen in gejoinde query was al bekend.

    Dat Zeos nog bestaat, was geloof ik de eerste componenten set die ik gebruikte voor mijn toen nog Interbase database.

  8. #8
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik ben daarmee begonnen toen Borland componenten nog geen Postgresql/mysql ondersteunden, en het is eigenlijk altijd zo gebleven.

    Met het voordeel dat de hele CRM app onder Lazarus compileert, en onder Linux werkt.

  9. #9
    Inmiddels kan ik idd zonder al te veel code het resultaat van een query tonen.
    Wanneer ik een veld wijzig (op het veld gaan staan en de F2 drukken) wordt deze waarde wel opgeslagen in het grid maar niet in de database.
    Het post knopje van de navigator wordt dan ook niet actief.

    Daarnaast loop ik tegen het probleem aan dat wanneer ik een veld probeer te wijzigen via code dan krijg ik de foutmelding dat de dataset niet in edit/insert mode staat
    Code:
    procedure TF176B724.DBGrid1CellClick(Column: TColumn);
    
    begin
    if Column.Field.DataType =  ftTimeStamp then
    begin
        Column.Field.AsDateTime:=now;
    end;
    
    end;
    wat ik dus zou willen is dat ik de waardes in de velden kan aanpassen en daarna de wijzigingen op kan slaan
    Het liefst doe ik dit zonder dat ik zelf bij houd welke records er gewijzigd zijn en zonder een eigen update routine te schrijven.
    Niet dat ik dat niet wil (of kan) maar meer dat ik de indruk heb dat dit standaard functionaliteit is.
    Zo niet dan kan beter het weer op mijn eigen manier gaan doen.

  10. #10
    Quote Originally Posted by cpri View Post
    Inmiddels kan ik idd zonder al te veel code het resultaat van een query tonen.
    Wanneer ik een veld wijzig (op het veld gaan staan en de F2 drukken) wordt deze waarde wel opgeslagen in het grid maar niet in de database.
    Het post knopje van de navigator wordt dan ook niet actief.
    Volgens mij wordt de Post al gedaan op het moment dat je uit het veld weg klikt.

    Maar er is toch ook een ApplyUpdates (Commit?) knopje?
    Heb je die wel gedrukt want anders worden de wijzigingen niet opgeslagen.

    Quote Originally Posted by cpri View Post
    Daarnaast loop ik tegen het probleem aan dat wanneer ik een veld probeer te wijzigen via code dan krijg ik de foutmelding dat de dataset niet in edit/insert mode staat
    Als je dat met code wilt doen (voor het editen gaat ie automatisch in edit stand) moet je de dataset wel in edit mode zetten.
    Dus Column.Field.Dataset.Edit; ervoor.
    (als dat niet werkt dan TDataset.Edit)

  11. #11
    Het ApplyUpdates knopje gevonden (staat standaard niet op visible)
    Inmiddels worden de mutaties netjes weggeschreven.
    Echter wanneer ik na het wegschrijven nog een verandering maak en deze probeer weg te schrijven krijg ik 2 foutmeldingen
    1 Exact affected [0] rows, while [1] was requested
    2 Update command updated [0] instead of [1] record, Possible reason: Update table does not have pk or row identifier, record has been changed/deleted by other users


    Nu laat ik idd niet het indexveld zien in mijn dataset (deze is er wel en is ook gedefinieerd als primary key)
    De wijziging wordt ook wel weggeschreven

    Ik refresh mijn dataset niet nadat ik de eerst wijziging heb doorgevoerd.
    Ik heb al gekeken of ik een event kan afvangen nadat ik de ApplyUpdates uitvoer maar ik kan hiervoor zowel bij mijn dbgrid als ook bij dbnavigator niks voor vinden.
    Wellicht is dit ook totaal niet nodig en kan je dit ook op een andere manier afdwingen

  12. #12
    Mhhh nog een ander puntje
    Ik kan wel een record in het dbgrid toevoegen en de velden waardes toekennen
    Daarna kan ik een post uitvoeren via de navigator en eventueel ook een ApplyUpdates echter het nieuwe record wordt niet weggeschreven
    Wanneer ik een record uit het grid verwijder wordt deze na een post wel uit de database verwijderd.

    Kortom een hoop werkt al maar nog niet alles

  13. #13
    Heb een oplossing gevonden voor het refreshen van de data.
    Blijkbaar kan je wel de click op de navigator zelf afvangen.
    Middels een check op het type button kan je dan een refresh uitvoeren wanneer het de ApplyUpdate button is geweest

    Quote Originally Posted by cpri View Post
    Het ApplyUpdates knopje gevonden (staat standaard niet op visible)
    Inmiddels worden de mutaties netjes weggeschreven.
    Echter wanneer ik na het wegschrijven nog een verandering maak en deze probeer weg te schrijven krijg ik 2 foutmeldingen
    1 Exact affected [0] rows, while [1] was requested
    2 Update command updated [0] instead of [1] record, Possible reason: Update table does not have pk or row identifier, record has been changed/deleted by other users

  14. #14
    Quote Originally Posted by cpri View Post
    Het ApplyUpdates knopje gevonden (staat standaard niet op visible)
    Nu laat ik idd niet het indexveld zien in mijn dataset (deze is er wel en is ook gedefinieerd als primary key)
    Primary key moet wel in je dataset zitten (anders gaat het met UPDATE en DELETE ook mis, die hebben die primary key nodig).

    Je zou hem wel in de TDBGrid verborgen kunnen maken (column width op 0 of gewoon helemaal verwijderen).
    Je kunt dan nog steeds bij de PK door TDataset.FieldByName('PK').asInteger te gebruiken.

  15. #15
    Heb nu ook het index veld meegenomen en do kolom op visible = false gezet.
    Wanneer ik nu een insert wil doen dan krijg ik de foutmelding (bij de post) dat het ID veld niet leeg mag zijn.
    Dit klopt idd echter dit veld heeft een autoincrement generator en wordt dus door de database zelf ingevuld.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •