Results 1 to 9 of 9

Thread: Insert Into ... (sql)

  1. #1

    Post Insert Into ... (sql)

    Ik ben een eenvoudig invoer van gegevens aan het maken.
    Wanneer ik tabellen wil invoeren zonder generator, maar toch wil ik bij dubbel de fout opvangen krijg ik foutmeldingen.


    Code:
    Goede code maar voor een generator
    -----------------------------------
    
    procedure TFormMagazijnlokatie.SaveRecord;
    begin
      With DataModule1.IBQuery_Magazijnlokatie do
        begin
          Close;
          SQL.Clear;
          SQL.Add('INSERT INTO Magazijnlokatie');
          SQL.Add('VALUES(Gen_ID(GEN_MAGAZIJNLOKATIE,1),:Plaats)');
          Params[0].AsString := DBEdit_plaats.text;
          try
            ExecSQL;
          except on E:EIBInterbaseError do
          begin
           if (E.SQLCode = -803) then
             ShowMessage('Bestaat reeds !');
          end;
        end;
      end;
      HerzienStatusBar;
      DBedit_plaats.Enabled := false;
      DataModule1.IBTransaction.Commit;
      Datamodule1.IBTable_Magazijnlokatie.Open;
    end;
    
    foute code zonder generator
    ---------------------------
    
    procedure TFormGemeente.ToolButton_PostenClick(Sender: TObject);
    begin
      With DataModule1.IBQuery_Gemeente do
        begin
          Close;
          SQL.Clear;
          SQL.Add('INSERT INTO Gemeente');
    
          SQL.Add('VALUES(Postcode,GemeenteNaam)');
          Params[0].AsString := DBEdit_Postcode.text;
          Params[1].AsString := DBEdit_GemeenteNaam.text;
    
          try
            ExecSQL;
          except on E:EIBInterbaseError do
          begin
           if (E.SQLCode = -803) then
             ShowMessage('Bestaat reeds !');
          end;
        end;
      end;
      HerzienStatusBar;
      DBEdit_Postcode1.Enabled := false;
      DBEdit_GemeenteNaam1.Enabled := false;
      DataModule1.IBTransaction.Commit;
      Datamodule1.IBTable_Gemeente.Open;
    end;
    
    Foutmeldingen:
    --------------
    [Error] Form_Gemeente.pas(136): Undeclared identifier: 'EIBInterbaseError'
    [Error] Form_Gemeente.pas(138): ')' expected but identifier 'SQLCode' found
    [Error] Form_Gemeente.pas(152): Undeclared identifier: 'key'
    [Error] Form_Gemeente.pas(169): Statement expected but 'PROCEDURE' found
    [Error] Form_Gemeente.pas(40): Unsatisfied forward or external declaration: 'TFormGemeente.FormKeyPress'
    [Fatal Error] Eindwerk.dpr(23): Could not compile used unit 'Form_Gemeente.pas'
    

  2. #2
    Staat de IB unit in je uses? Daar staat de EIBInterbaseError in gedefiniëerd.
    Marcel

  3. #3
    even over die EIBInterbaseError daar heb ik geen id

    maar werkt je query zo wel.. ben niet zo'n expert maar ik doe dat meestal iets anders nl.
    Code:
      SQL.Clear;
      SQL.Add('INSERT INTO Gemeente');
    
      SQL.Add('VALUES(Postcode,GemeenteNaam)');
      Params[0].AsString := DBEdit_Postcode.text;
      Params[1].AsString := DBEdit_GemeenteNaam.text;
    Values zijn de waarde die het veld gaat krijgen, wat jij wil is params. dus moet je het vervangen door:
    Code:
      SQL.Add('VALUES(:Postcode,:GemeenteNaam)');
    maar dat weet ik niet zeker...
    Last edited by Dees; 22-May-04 at 19:06.

  4. #4
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    waarom zet je die generator in je code? als je gewoon een trigger op je tabel zet die de generator waarde voor dat veld invult op moment voor het posten, dan wordt dat gewoon gedaan voor je en kun je in de code bijvoorbeeld een nul invullen (maakt niet uit, wordt toch overschreven vlak voor de post)
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  5. #5
    Code:
    Hoe kan ik deze foutmelding op een korte mannier oplossen ?
    
    code:
    --------
    procedure TFormGemeente.SaveRecord;
    begin
      With DataModule1.IBQuery_Gemeente do
        begin
          Close;
          SQL.Clear;
          SQL.Add('INSERT INTO Gemeente');
          SQL.Add('VALUES(:Postcode,:GemeenteNaam)');
          Params[0].AsString := DBEdit_Postcode.text;
          Params[1].AsString := DBEdit_GemeenteNaam.text;
          try
            ExecSQL;
          except on E:EIBInterbaseError do
          begin
           if (E.SQLCode = -803) then
             ShowMessage('Bestaat reeds !');
          end;
        end;
      end;
      HerzienStatusBar;
      DBEdit_Postcode.Enabled := false;
      DBEdit_GemeenteNaam.Enabled := false;
      DataModule1.IBTransaction.Commit;
      Datamodule1.IBTable_Gemeente.Open;
    end;
    
    
    
    Foutmelding:
    
    IBTable_Magazijnlokatie: Cannot perform this operation on a close datase

  6. #6
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Dat is een beetje lastig op te lossen voor ons.
    In de foutmelding wordt gesproken van IBTable_Magazijnlokatie en deze vinden we in je code niet terug.
    Krijg je de foutmelding wel in het door jouw geplaatste brokje code dan moet je eens kijken naar welke events er worden opgeroepen.
    Stap eens met F7 door je code hun en geef dan (als je de oplossing nog niet hebt gevonden) eens aan waar de code precies de mist in gaat.
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  7. #7
    Het probleem is wanneer ik in tabel "gemeente" gegevens heb ingebracht, daarna deze tabel terug sluit.
    Vervolgens tabel "magazijnlokatie" opent wordt er een foutmelding gegeven.

    Het vorige zou dan niet volledig afgesloten zijn nl. het sluiten van de dataset.

  8. #8
    Lijkt mij op een probleem met een transactie of zo. Als je in IBX een transactie commit, sluiten de bijbehorende datasets. Verder heb je het probleem dat de gekoppelde datasets sluiten als je de master sluit. Gelet op de melding zou ik het eens in die hoek zoeken.

    Succes,

    Benno

  9. #9
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    Lijkt me inderdaad een transaction probleem. Je commit op het einde van je code een transaction, maar ik zie die nergens gestart worden? Je moet (nou ja, moeten is een groot woord) een transactie altijd starten en sluiten binnen eenzelfde stuk code. Ik bedoel daar dus mee dat je er voor moet zorgen dat tussendoor de controle niet wordt teruggegeven aan de gebruiker. Dan zou die namelijk een kopje koffie kunnen gaan drinken en dan blijft je transaction de hele tijd active. De kans op fouten is dan veel groter. meestal gebruik je transactions op ongeveer de volgende manier:

    Code:
    transaction.starttransaction
    try
    ...
    except
      transaction.rollback;
    end
    transaction.commit;
    dit ligt natuurlijk aan je specifieke situatie, maar het is een voorbeeld.
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

Thread Information

Users Browsing this Thread

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

Similar Threads

  1. Replies: 20
    Last Post: 28-Oct-04, 10:10
  2. ADO SQL insert open en terug
    By Siemons in forum Databases
    Replies: 11
    Last Post: 29-Feb-04, 22:22
  3. Date-time in SQL (zonder Delphi parameters)
    By Baldo in forum Databases
    Replies: 16
    Last Post: 14-Jan-04, 16:23

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
  •