Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    [delphi] valore ID_GENERATOR

    ciao a tutti,

    ho una IBtabellaMovimenti con un campo ID_MOVIMENTI, a questa e' collegato un TRIGGER che agisce sull'evento Before Insert al fine di generare un progressivo univoco:
    codice:
    CREATE TRIGGER MOVIMENTI_BI0 FOR MOVIMENTI
    ACTIVE BEFORE INSERT POSITION 0
    AS
    begin
      /* Trigger text */
          NEW.id_movimenti = GEN_ID(prog_movimenti , 1);
    end
    quindi, questo evento si verifica non appena si inserisce un nuovo record.

    il mio problema e' quello di ottenere il valore progressivo generato.

    in pratica nel momento che io eseguo Ibtable.applyupdates viene generato questo numero....che non riesco a catturare.

    ho provato a leggere il field id_movimenti subito dopo...
    codice:
    IBTable1.ApplyUpdates ;
    Edit1.Text:= IBTable1.fieldbyname('id_movimenti').AsString ;
    ma non riesco a vedere il numero generato...


    mi sapete aiutare?

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Il problema è dovuto al fatto che Delphi tenta di ottenere il record aggiornato attraverso una query di selezione eseguita verso il database server. Per selezionare il record, viene utilizzato il valore della chiave primaria (campo ID?), solo che il valore di tale campo viene determinato lato server al momento dell'inserimento, pertanto la ricerca non va a buon fine e, in sostanza, non è possibile completare l'aggiornamento e nel peggiore dei casi si manifesta un errore.

    La soluzione "ammazza problema" è quella di utilizzare sì il generatore, ma di ottenere il suo valore dall'applicazione Delphi e assegnarlo al record prima di effettuare l'inserimento (se il campo autoincrementale è ancora NULL e pertanto non assegnato).

    In una discussione precedente ti avevo già segnalato un link da leggere con la trattazione di questo problema (in parte).

    Si tratta di acquisire il generatore da Delphi e assegnarlo al record (in questo modo, se il record viene accettato, l'applicazione possiede già l'ID numerico per poter rinfrescare i propri dati).

    Il trigger che hai creato va benissimo, ma andrebbe complementato con un confronto che impedisca l'assegnazione del generatore quando esso è già determinato. Un esempio (non testato, da adattare):
    codice:
    CREATE TRIGGER nometrigger FOR nometabella
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
      if (new.id is null) then
      begin
        new.id = gen_id(nomegeneratore, 1);
      end;
    end
    Per maggiori dettagli, soprattutto sull'acquisizione del generatore in Delphi, leggi la discussione che ti ho linkato.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.