Results 1 to 13 of 13

Thread: DBGrid: toevoegen/insert foutmelding: Field <bla> is required, but not supplied

  1. #1

    DBGrid: toevoegen/insert foutmelding: Field <bla> is required, but not supplied

    Hallo allen,

    Heb het al in het Engelse Lazarus forum gevraagd maar nog geen zinvolle antwoorden en het moet heel simpel zijn.

    Ben bezig om een tutorial voor databases uit te breiden.
    Heb nu een form met een grid, wat je kan editen.
    SQL DB Tutorial

    De tabel die wordt geedit heeft een primary key CUST_NO (Firebird employee.fdb voorbeelddatabase). Firebird genereert zelf een nieuwe waarde als je bij een INSERT NULL voor CUST_NO doorgeeft of de kolom niet meeneemt; dat is wat FPC/Lazarus eigenlijk zou moeten doen.

    Helaas, bij invoegen gegevens via grid (waarbij ik CUST_NO niet invul) krijg ik:
    Code:
    SQLQuery1: Field CUST_NO is required, but not supplied.
    Ik heb lopen vrutten met de pfInUpdate ProviderFlags, maar dat werkte ook niet.

    De source code en Windows executable/Firebird DLLS van de versie tot dusver zijn te vinden via deze link

    Heeft iemand een idee hoe dit op te lossen is?
    Alvast dank!
    Last edited by BigChimp; 04-Sep-11 at 04:13. Reason: Daadwerkelijke vraag stellen ;)

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Nee, Lazarus weet niet wat de volgende autoincrement nummer moet zijn. Daarom wordt het door Firebird afgehandeld. Wat een aantal personen doen (vergelijkbaar met de CDS in delphi) is een negatief nummer meegeven aan de key. Na de applyupdates wordt deze vervangen door een echt nummer vanuit Firebird. Na een refresh (of dat dat werkelijk nodig is, weet ik niet) krijg je dan het uiteindelijke key.
    Delphi is great. Lazarus is more powerfull

  3. #3
    John, bedankt.

    Als ik in Flamerobin dit
    Code:
    INSERT INTO CUSTOMER (CUST_NO, CUSTOMER)
     VALUES (
    -100, 'Negative customer'
    )
    run, krijg ik een foutmelding:
    Code:
    Message: isc_dsql_execute2 failed
    
    SQL Message : -625
    The insert failed because a column definition includes validation constraints.
    
    Engine Code    : 335544347
    Engine Message :
    validation error for column CUST_NO, value "-100"
    Dat belooft niet veel goeds...

    Dat invullen van een negatief nummer, doe je dat in het OnEditingDone event van het grid - of misschien beter in de SQLQuery OnNewRecord of BeforeInsert?

    Is er geen manier om Lazarus te laten denken dat die primary key niet vereist is - dan kan hij ook een null doorgeven en moet het werken.
    Maar hoe?

    Hij moet echter wel bij zoeken e.d. de primary key gebruiken.
    Ik zat te denken aan het zetten van pfInWhere (IIRC) hiervoor.

    Het liefst zou ik dit doen zonder de triggers in de Firebird db aan te passen
    Last edited by BigChimp; 04-Sep-11 at 13:30. Reason: Stomme copy/paste fout: had foutmelding niet geplakt.

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik heb wel Lazarus maar geen Firebird tot mijn beschikking. Kan het dus niet zo even testen. Welke foutmelding krijg je dan.
    Is er geen manier om Lazarus te laten denken dat die primary key niet vereist is - dan kan hij ook een null doorgeven en moet het werken.
    Lazarus kan daar niets aan doen. De SQLQuery leest de SQL en vandaar uit worden ook de META-gegevens meegegeven, waaronder ook de primary key.

    Ik zou ook van de triggers afblijven. En als je een 0 gebruikt i.p.v. een negatief nummer?
    Delphi is great. Lazarus is more powerfull

  5. #5
    Sorry, heb nu foutmelding in eerdere post geplakt.
    0 insert via Flamerobin geeft zelfde foutmelding.

    Omdat ik de database tutorial zoveel mogelijk db-onafhankelijk wil hebben, vind ik het ook prima om een workaround voor bijv. Access, DB2, MS SQL Server, MySQL, Oracle of PostgreSQL te testen en aan te passen.

    Ik weet wel dat je handmatig de SQLQuery.InsertSQL, UpdateSQL en DeleteSQL zou kunnen instellen. Misschien is dit een betere optie?

    (Altijd leuk, een tutorial uitbreiden voor iets wat je zelf nog niet goed weet. Maar ik leer er wel van!)

  6. #6
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik weet wel dat je handmatig de SQLQuery.InsertSQL, UpdateSQL en DeleteSQL zou kunnen instellen. Misschien is dit een betere optie?
    Dat zorgt in ieder geval dat je handmatig een NULL kan meegeven in je query, zodat Firebird zijn eigen generator kan gebruiken voor een uniek nummer.

    Ik heb trouwens je voorbeeldje opgehaald en zie dat je gebruik maakt van embedded Firebird. Echer krijg ik een foutmelding :

    tekst Code:
    1. [Window Title]
    2. Read error
    3.  
    4. [Content]
    5. Stream=TForm1: Root=:TForm1
    6. Component Class: TIBConnection
    7. Error reading IBConnection1.LogEvents: Unknown property: "LogEvents"
    8. Stream position: 1621
    9.  
    10. [Continue loading] [Cancel loading this resource] [Stop all loading]
    Welke versie Lazarus gebruik jij?
    Delphi is great. Lazarus is more powerfull

  7. #7
    Bedankt voor het kijken!

    Nee, ik gebruik niet embedded Firebird in de code. Dat zou wel kunnen - de tutorial laat de embedded client DLL fbembed.dll omnoemen naar de gewone Client/Server client fbclient.dll - maar ik heb de code er niet op aangepast.
    Misschien werkt de code wel out of the box na een recente (laatste dag of 2) patch van FPC (als je hostname leeg laat), heb het nog niet getest.

    Ik gebruik Lazarus 0.9.31, snapshot van 3 september, maar heb er ook met eerdere versies aan gewerkt.

    Overigens heb ik nog zitten rommelen; helaas heeft dit:
    Code:
        SQLQuery1.SQL.Text := 'select * from CUSTOMER where COUNTRY = :COUNTRY';
        SQLQuery1.Params.ParamByName('COUNTRY').AsString := Edit1.Text;
        // We need a custom insert statement that ignores the primary key.
        // The database will then generate an autonumber
        // So we set up an SQL statement that inserts all fields except CUST_NO
        // The parameters on the right (those beginning with :) must match
        // the field names exactly for this to work.
        // You might need to adapt this to your table schema if it is different.
        SQLQuery1.InsertSQL.Text:=
          'INSERT INTO CUSTOMER (CUSTOMER, CONTACT_FIRST, CONTACT_LAST, PHONE_NO, ADDRESS_LINE1, ADDRESS_LINE2, CITY, STATE_PROVINCE, COUNTRY, POSTAL_CODE, ON_HOLD) ' +
          'VALUES (:CUSTOMER,:CONTACT_FIRST,:CONTACT_LAST,:PHONE_NO,:ADDRESS_LINE1,:ADDRESS_LINE2,:CITY,:STATE_PROVINCE,:COUNTRY,:POSTAL_CODE,:ON_HOLD);';
        IBConnection1.Connected := True;
        SQLTransaction1.Active := True; //Starts a new transaction
        SQLQuery1.Open;
        SQLQuery1.FieldByName('CUST_NO').ProviderFlags:=[pfInWhere,pfInKey]; //We leave out pfInUpdate
        // Hide the primary key column which is the first column in our queries.
        // We can only do this once the DBGrid has created the columns
        DBGrid1.Columns[0].Visible:=false;
    dezelfde foutmelding als resultaat: Lazarus wil nog steeds die primary key ingevoegd zien!?!?
    Last edited by BigChimp; 04-Sep-11 at 15:02. Reason: Verduidelijking embedded

  8. #8
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    En als je handmatig de parameter CUST_NO zelf de waar NULL meegeeft?
    delphi Code:
    1. SQLQuery1.parambyname('CUST_NO').Value := NULL;
    2.  
    3. of
    4.  
    5. SQLQuery1.parambyname('CUST_NO').Value := 0
    Ik heb 0.9.30 waarin waarschijnlijk de property LoginEvents nog niet bestaat.
    Delphi is great. Lazarus is more powerfull

  9. #9
    Quote Originally Posted by jkuiper View Post
    En als je handmatig de parameter CUST_NO zelf de waar NULL meegeeft?
    delphi Code:
    1. SQLQuery1.parambyname('CUST_NO').Value := NULL;
    Zou kunnen maar waar?
    Quote Originally Posted by BigChimp
    doe je dat in het OnEditingDone event van het grid - of misschien beter in de SQLQuery OnNewRecord of BeforeInsert?
    Deze
    Quote Originally Posted by jkuiper View Post
    delphi Code:
    1. SQLQuery1.parambyname('CUST_NO').Value := 0
    gaat denk ik niet werken, dan had het al met FlameRobin goed moeten gaan.

    Quote Originally Posted by jkuiper View Post
    Ik heb 0.9.30 waarin waarschijnlijk de property LoginEvents nog niet bestaat.
    Heb LogEvents gewoon uit de bestanden gesloopt; ik kan 'm nog openen met Lazarus.

    Heb 'm ook omgebouwd naar embedded, database erbij gegooid.

    Hij is te downloaden van:
    https://bitbucket.org/reiniero/fpc_l...edded4sept.zip
    Compileert die wel bij jou?

    Dank voor de hulp tot nogtoe en hopelijk hierna!
    Last edited by BigChimp; 04-Sep-11 at 16:30. Reason: Verduidelijking vraag waar param aan te passen

  10. #10
    Je zou eens moeten kijken of je in Lazarus de fields kunt definieren net als in Delphi. Bij Delphi is dat een dubbelklik op je dataset, mogelijk bij Lazarus ook.

    Je moet dan de required van het veld uitzetten. Dan zal het waarschijnlijk verder gewoon werken.

    In de Firebird database zal een trigger zitten (before insert), die checkt of je Keyveld NULL is en dan vervolgens via de generator een nieuw ID genereren en invullen.

  11. #11
    maar ik heb de code er niet op aangepast.
    Dat is nu het leuke van Firebird in de server en embedded versie. Je hoeft de code niet aan te passen, ze werken gelijk.

    Bij de embedded variant (je hebt inderdaad wel de DLL nodig) heb je beperkingen op de connecties, je kunt volgens mij maar 1 simultane connectie naar de database hebben.

  12. #12
    Benno, bedankt voor je reacties.

    Quote Originally Posted by Benno View Post
    Dat is nu het leuke van Firebird in de server en embedded versie. Je hoeft de code niet aan te passen, ze werken gelijk.
    Klopt zo ongeveer.
    In recente FPC trunk versies hoef je niets meer te doen als je fbembed.dll in je applicatiedirectory hebt.
    (Bedankt marcov voor de commit )
    Bij oudere versies moet je ofwel een variabele genaamd UseEmbedded (oid) op true zetten, ofwel de fbembed.dll hernoemen naar fbclient.dll om FPC de library te laten laden.

    Maar je hebt gelijk, als je dit gedaan hebt en bij connectie de hostname leeg laat, opent hij daarna vrolijk een embedded database.

    Quote Originally Posted by Benno View Post
    Je zou eens moeten kijken of je in Lazarus de fields kunt definieren net als in Delphi....Je moet dan de required van het veld uitzetten.
    Ok, ga kijken of dat lukt. Zie dat je in Lazarus erbij komt via SQLQuery, object inspector, FieldDefs.
    Helaas, geen succes, zelfde foutmelding bij insert.
    Als ik de velddefinities invul en bijv. voor het veld CUSTOMER (een varchar(25)) required=true maak om te testen, krijg ik uiteindelijk dit in het .lfm (formulier) bestand:
    Code:
      object SQLQuery1: TSQLQuery
        FieldDefs = <    
          item
            Name = 'CUST_NO'
            DataType = ftInteger
            Precision = 0
            Size = 0
          end    
          item
            Name = 'CUSTOMER'
            Attributes = [faRequired]
            DataType = ftString
            Precision = 0
            Size = 25
          end    
          item
            Name = 'CONTACT_FIRST'
            DataType = ftString
            Precision = 0
            Size = 15
          end    
          item
            Name = 'CONTACT_LAST'
            DataType = ftString
            Precision = 0
            Size = 20
          end    
          item
            Name = 'PHONE_NO'
            DataType = ftString
            Precision = 0
            Size = 20
          end    
          item
            Name = 'ADDRESS_LINE1'
            DataType = ftString
            Precision = 0
            Size = 30
          end    
          item
            Name = 'ADDRESS_LINE2'
            DataType = ftString
            Precision = 0
            Size = 30
          end    
          item
            Name = 'CITY'
            DataType = ftString
            Precision = 0
            Size = 25
          end    
          item
            Name = 'STATE_PROVINCE'
            DataType = ftString
            Precision = 0
            Size = 15
          end    
          item
            Name = 'COUNTRY'
            DataType = ftString
            Precision = 0
            Size = 15
          end    
          item
            Name = 'POSTAL_CODE'
            DataType = ftString
            Precision = 0
            Size = 12
          end    
          item
            Name = 'ON_HOLD'
            DataType = ftString
            Precision = 0
            Size = 1
          end>
    ... maar als ik een record wijzig door het veld CUSTOMER leeg te maken, krijg ik geen foutmelding??
    Zoals gezegd krijg ik nog steeds de foutmelding dat CUST_NO vereist is bij inserts.

    Het lijkt erop dat Lazarus mijn velddefinities niet pakt, wellciht omdat ik de SQLQuery1.SQL property tijdens programmarun aanpas??
    Ik ga nu even kijken of ik misschien die faRequired programmatisch kan zetten op 1 v.d. fields van SQLQuery maar dat kan zeker niet...

    Quote Originally Posted by Benno View Post
    In de Firebird database zal een trigger zitten (before insert), die checkt of je Keyveld NULL is en dan vervolgens via de generator een nieuw ID genereren en invullen.
    Dat klopt helemaal ja, zoals ik al eerder had gemeld
    Ter herinnering voor degenen die (terecht) zo'n hele thread niet willen lezen: de trigger pakt de generator/sequence waarde alleen als je NULL doorgeeft voor CUST_NO, niet 0 of een negatief getal.

  13. #13

    [Opgelost] DBGrid: toevoegen/insert foutmelding: Field <bla> is required, but not sup

    Opgelost, dankzij een tip van Michael Van Canneyt in de FPC mailing list:

    Code:
        SQLQuery1.Open;
        {
        Make sure we don't get problems with inserting blank (=NULL) CUST_NO values, e.g.:
        Field CUST_NO is required, but not supplied
        We need to tell Lazarus that, while CUST_NO is a primary key, it is not required
        when inserting new records.
        }
        SQLQuery1.FieldByName('CUST_NO').Required:=false;
    Uiteindelijk was pre-definen van fields gelukkig niet nodig.
    Ik zal het tutorial aanpassen:
    SQLDB Tutorial1

    Iedereen, bedankt voor de hulp!
    Last edited by BigChimp; 05-Sep-11 at 13:02.

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
  •