Newsgroup: it.comp.lang.delphi
Titolo: Domanda credo banale

Salve a tutti
Ho un dataBase con :
un campo di nome ID di tipo contatore
un campo di nome IDsec di tipo testo
Vorrei che ogni volta che inserisco un record nuovo il campo IDSec prendesse
il valore di ID (che si aggiorna automaticamente) + un suffisso fisso.
Non riesco a capire in quale evento bloccare la cosa visto che il campo ID
sembra che lo valorizzi solo alla fine !!!!
Sapreste aiutarmi
grazie

 il valore di ID (che si aggiorna automaticamente) + un suffisso fisso.
usa l'evento AfterPost della tabella:
with tabella do begin
 OnAfterPost:=nil;
 edit;
fieldbyname('IDSec').asString:=inttostr(fieldbyname('ID').asInteger)+Suffiss
o;
 post;
 OnAfterPost:=TabellaAfterPost;
end;
Ciao, Sandro

 end;
funziona assegnando l'afterPost dopo il post?
non dovrebbe essere una cosa el genere:
with tabella do
begin
  edit;
  fieldbyname('IDSec').asString:=inttostr(fieldbyname('ID').asInteger)+XYZ;
  OnAfterPost:=TabellaAfterPost
  post;
  OnAfterPost:=nil;
end;
  ciao
  Mak

   post;
    ^^^^
se fai il post senza PRIMA assegnare NIL all'evento, al momento di fare il
post scateni lo stesso evento, rientri quindi nella stessa identica
procedura, ricorsivamente, all'infinito, e hai un bello stack overflow :D
Ciao, Sandro

 procedura, ricorsivamente, all'infinito, e hai un bello stack overflow :D
ok ... specificando che tutto il codice che hai scritto
va messo nell'evento ...
mi torna tutto ;) anche il mio stack Overflow ...
  ciao
  Mak

 il valore di ID (che si aggiorna automaticamente) + un suffisso fisso.
Se il suffisso che devi memorizzare è sempre lo stesso più che utilizzare un
nuovo campo per memorizzare id + suffisso io lo imposterei direttamente
nella query quando estraggo i dati.
es:
StringaSQL:='SELECT     (ID + '''+suffisso+''') as IDSec, ID ' +
                    'FROM         NomeTabella';
Se riesci ad utilizzare questo sistema ottieni di non dover inserire un
ulteriore campo per memorizzare dati che otterresti cmq e quindi sbattimento
in meno a gestirlo.
Ciauz
Tymba

 il valore di ID (che si aggiorna automaticamente) + un suffisso fisso.
potresti usare anche gli eventi OnGetText ed OnSetText del TField
in questa maniera hai un interfaccia al livello del singolo campo
sia in input che in output
dopo i saluti ti posto il codice di una piccola demo con
1 Datset (Ado per l'eveninza ricordati di cambiare la connectionString e di
attivare il dataset prima del Run) -> Tabella1 con campi "id","idAndSuff"
1 Datasource -> Dataset
1 DBNavigator -> Datasource (per muoversi fra i record o inserire,
modificare, eliminare un record)
1 DBEdit -> Datasource (DataFiled: IdAndSuff) (per inserire, modificare il
suffisso)
1 DBGrid ->Datasource (per vedere il record)
dopo aver creato un db Access (poi usi il DB che vuoi)
in cui è presente una tabella con nome "Tabella1"
con campi:
id (contatore)
idAndSuff (testo)
collegalo al dataset (AdoTable nel caso in questione)
mediante la connectionstring o una adoConnection
Attiva il dataset e dai il Run ...
dovrebbe andare ...
spero che faccia al caso tuo
  Ciao
  Mak
/////////////////////////codice unit//////////////////////////////////
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, DBCtrls, DB, Grids, DBGrids, ADODB, ExtCtrls;
type
  TForm1 = class(TForm)
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    ADOTable1id: TAutoIncField;
    DBEdit1: TDBEdit;
    DBNavigator1: TDBNavigator;
    ADOTable1idAndSuff: TWideStringField;
    DBGrid1: TDBGrid;
    procedure ADOTable1IdAndSuffSetText(Sender: TField;
      const Text: String);
    procedure ADOTable1IdAndSuffGetText(Sender: TField; var Text: String;
      DisplayText: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ADOTable1IdAndSuffSetText(Sender: TField;
  const Text: String);
begin
        //ShowMessage(Text);
        ADOTable1idAndSuff.AsString := ADOTable1id.AsString + Text;
end;
procedure TForm1.ADOTable1IdAndSuffGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
        //ShowMessage(Text);
        Text :=
Copy(ADOTable1idAndSuff.AsString,Length(ADOTable1id.AsString)+1,Length(ADOTa
ble1idAndSuff.AsString));
end;
end.
/////////////////////////////////codice
DFM//////////////////////////////////////////
object Form1: TForm1
  Left = 192
  Top = 114
  Width = 353
  Height = 204
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  DesignSize = (
    345
    170)
  PixelsPerInch = 96
  TextHeight = 13
  object DBEdit1: TDBEdit
    Left = 216
    Top = 8
    Width = 121
    Height = 24
    Anchors = [akLeft, akTop, akRight]
    DataField = 'idAndSuff'
    DataSource = DataSource1
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
    TabOrder = 0
  end
  object DBNavigator1: TDBNavigator
    Left = 8
    Top = 8
    Width = 200
    Height = 25
    DataSource = DataSource1
    TabOrder = 1
  end
  object DBGrid1: TDBGrid
    Left = 8
    Top = 40
    Width = 329
    Height = 121
    Anchors = [akLeft, akTop, akRight, akBottom]
    DataSource = DataSource1
    ReadOnly = True
    TabOrder = 2
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
  end
  object ADOTable1: TADOTable
    CursorType = ctStatic
    TableName = 'Tabella1'
    Left = 8
    Top = 8
    object ADOTable1id: TAutoIncField
      DisplayWidth = 12
      FieldName = 'id'
      ReadOnly = True
    end
    object ADOTable1idAndSuff: TWideStringField
      FieldName = 'idAndSuff'
      OnGetText = ADOTable1IdAndSuffGetText
      OnSetText = ADOTable1IdAndSuffSetText
      Size = 50
    end
  end
  object DataSource1: TDataSource
    DataSet = ADOTable1
    Left = 40
    Top = 8
  end
end

 spero che faccia al caso tuo
ovviamente subito dopo aver premuto
invia vengono fuori degli ottimi motivi per pentirti
del post inviato ;D
ciň che ti ho postato fa al caso tuo solo
per la modifica del valore IdAndSuff
in questo momento ho notato che
in inserimento ha il problema di prelevare un id vuoto
e cioč lo stesso problema del tuo primo post
niente di fatto ... apprezza almeno l'impegno ;)
oggi non ne posto una buona ...
  ciao
  Mak

 niente di fatto ... apprezza almeno l'impegno ;)
la mia testardaggine ogni tanto mi fa sbagliare
e se questo è il caso, spero che ci sia qualcuno
che mi riporti sulla retta via ...
per far andare, la demo che ti ho postato,
anche in inserimento di un nuovo record
potresti utilizzare l'OnAfterInsert in questa maniera
procedure TForm1.ADOTable1AfterInsert(DataSet: TDataSet);
begin
      ADOTable1idAndSuff.AsString := '';
      //Assegna il giusto valore all'id
      ADOTable1.Post;
      //riporta il dataset in Edit
      ADOTable1.Edit;
      //da qui in poi va tutto bene.
      //Lo state del dataset
      //è passato da dsInsert a dsEdit .
end;
comunque a questo punto anche l'AfterPost va bene
pensavo di riuscire a risolvere tutto con gli eventi del field
ma sono comunque costretto a ricorrere
agli eventi del DataSet.
sorry per il multi post.
  ciao
  Mak

 ha scritto nel messaggio
news:9_ppa.59974$DT4.1...@twister1.libero.it...


 e cioè lo stesso problema del tuo primo post


 ha scritto nel messaggio
news:_ospa.60233$DT4.1...@twister1.libero.it...


 Grazie.... grazie mille
nulla ...
cerco di ricambiare anche io piaceri ricevuti
dal Newsgrup in tante occasioni
comunque poichè l'argomentazione del thread
mi interessa, vorrei sapere se hai risolto ...
e se ti va mi dici come?
sei riuscito a non cambiare lo stato della tabella la insert a edit?
questo era ciò che mi faceva storcere il naso del mio codice,
ma purtroppo se non esci da Insert
il Contatore non lo incrementa ...boh
  ciao
  Mak