Visualizzazione dei risultati da 1 a 7 su 7

Discussione: delphi dbnavigator

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    delphi dbnavigator

    salve a tutti,

    ho creato una form e in essa visualizzo e modifico record di una tabella.

    ho inserito un oggetto dbnavigator per spostarmi sui vari record della tabella, a questo punto io posso modificare e aggiungere record....

    pero...al momento della conferma delle modifiche apportate ai campi del record vorrei controllare i valori immessi affinche questi soddisfino particolari esigenze.....

    ad esempio : vorrei controllare se in campo "codice" della tabella, e' vuoto, e in tal caso visualizzare un messaggio che indichi di riempirlo.

    non riesco a capire dove fare questo controllo...

    avevo pensato di farlo su un evento della dbnavigator....ma non ci riesco...

    mi aiutate??'

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Devi usare l'evento OnBeforePost del componente che rappresenta la tabella (TTable e affini...).

    Secondo me, non è corretto intercettare l'azione di Post sul navigatore poichè questa azione potrebbe essere eseguita anche richiamando via codice il metodo Post stesso, oppure tentando di inserire dati in una nuova riga (operazione che conferma in modo implicito il salvataggio della precedente).

    Se intercetti l'evento OnBeforePost, puoi controllare i valori immessi per i campi e richiamare la procedura Abort che provvede a generare un'eccezione silenziosa, cioè un errore che non provoca la visualizzazione di alcun messaggio (a differenza delle altre eccezioni) ma di fatto interrompe l'operazione di Post in corso riportandola allo stato precedente e consentendo all'operatore di modificare i dati del record tentando nuovamente la Post quando finito.

    Ovviamente, è utile che a seguito di un controllo sui dati venga presentato un messaggio di errore in modo da far capire all'utente cosa c'è che non va.

    Se premi F1 sull'evento OnBeforePost, ti apparirà l'argomento relativo della Guida in linea che ti spiegherà ulteriori dettagli e potrai esaminare anche un esempio d'uso.

    In generale, specialmente quando ci si appoggia ad un database client/server come InterBase, è buona abitudine sfruttare le potenzialità del database stesso per inserire controlli di validazione sui dati dal lato server, in modo che un dato non valido per un record venga respinto per qualsiasi applicazione, desktop o Web o altro ancora, che tenta di memorizzarlo.

    Però è utile anche dotare l'applicazione dei controlli lato client più semplici come stai facendo tu, perchè così eviti di interagire con il server e generare traffico di rete per inviare dati che sai già non verranno accettati.

    Credo di averti dato sufficienti indicazioni.

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

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    si, l'evento beforepost va bene.

    io riesco ad intercettare la conferma del record e quindi controllo....


    allora io sto gestendo questa tabbella nomi

    codice c 7
    nome c 40

    "navigo" in questa tabella con dbnavigator e poi ad un certo punto aggiungo un record, e quindi inserisco un nome nuovo....
    il codice lo lascio vuoto, inquanto lo voglio assegnare automaticamente da programma.

    quindi ho scritto questo codice:

    procedure TForm1.Table1BeforePost(DataSet: TDataSet);
    begin
    if DBEdit1.Text = '' then
    MessageDlg( 'on BeforePost codice vuoto', mtInformation, [mbOK], 0);
    DBEdit1.Text:='77777777';
    end;

    in questo caso ho assegnato il valore 7777777 al codice,...o almeno volevo assegnarlo in modo che questo venisse scritto fisicamente nel record.
    Ma in pratica viene aggiunto 1 record con codice vuoto e non 7777777


  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    visto che ci siamo approfitto x chiederti un ulteriore chiarimento...

    quando io inserisco un nuovo record (premendo il tasto '+' del navigatore).... questo viene subito aggiundo fisicamente alla tabella o resta in una "memoria flash" del computer fino a quando non viene data conferma x la scrittura (che abbiamo visto avviene subito dopo evento post "beforepost")?

    grazie e ciao

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Premere il tasto "+" del DBNavigator equivale a richiamare il metodo Insert del DataSet (TTable, ...) al quale è collegato tramite il componente DataSource.

    Il DataSet entra nello stato di inserimento preparando un nuovo record da riempire; è possibile quindi compilarne i campi, ma per passare alla modalità "browse" (sfoglia) occorre confermare il nuovo record (Post) o annullarlo (Cancel).

    Fino a quando la Post non viene invocata, chiamando il metodo Post o premendo il pulsante relativo sul navigatore associato, il record non viene scritto (o inviato al server SQL nel caso di database client/server).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    si, l'evento beforepost va bene.

    io riesco ad intercettare la conferma del record e quindi controllo....


    allora io sto gestendo questa tabbella nomi

    codice c 7
    nome c 40

    "navigo" in questa tabella con dbnavigator e poi ad un certo punto aggiungo un record, e quindi inserisco un nome nuovo....
    il campo "codice" lo lascio vuoto, inquanto lo voglio assegnare automaticamente da programma.

    quindi ho scritto questo codice:

    procedure TForm1.Table1BeforePost(DataSet: TDataSet);
    begin
    if DBEdit1.Text = '' then
    MessageDlg( 'on BeforePost codice vuoto', mtInformation, [mbOK], 0);
    DBEdit1.Text:='77777777';
    end;

    in questo caso ho assegnato il valore 7777777 al codice,...o almeno volevo assegnarlo in modo che questo venisse scritto fisicamente nel record.
    Ma in pratica viene aggiunto 1 record con codice vuoto e non 7777777



  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Se fossi in te, lascerei da parte un attimo l'esempio della Guida che non è ottimale in quanto fa riferimento al valore contenuto in un DBEdit, controllo che potresti anche non avere sulla form (non è obbligatorio mettere un Data Control per ogni campo della tabella su cui lavori).

    Prova in questo modo:
    codice:
    procedure TForm1.Table1BeforePost(DataSet: TDataSet);
    begin
      if Table1.FieldByName('CODICE').IsNull then
      begin
        Table1.FieldByName('CODICE').AsInteger := 777
        ShowMessage('Il codice è stato assegnato automaticamente');
      end;
    end;
    Chiaramente, il codice è a puro titolo esemplificativo: viene mostrato come accedere al campo CODICE della tabella per impostarne un valore intero nel caso in cui il campo stesso sia Null, cioè non abbia ancora un valore assegnato.

    Se il tuo errore persiste, forse occorre dare un'occhiata alla struttura della tabella o al resto del codice dell'applicazione.

    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.