+ Rispondi
Risultati da 1 a 10 di 10

Discussione: Salvataggio dati su Database

  1. #1
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    5

    Salvataggio dati su Database

    inizio subito con la prima domanda

    premetto che ho creato un mio database partendo da un inport di un file txt in un mdb

    a questo dbase apporto con un ciclo di controllo delle modifiche e poi nel momento in cui tenti di ssalvarlo per poi richiamarlo nuovamente per crearmi un report mi ritornano a video i dati di partenza...

    per il salvataggio uso:

    begin
    form1.ADOTable1.Connection:=nil;
    form1.ADOConnection1.Connected:=False;
    form1.ADOConnection1.Connected:=True;
    form1.ADOTable1.Connection:=form1.ADOConnection1;
    try
    form1.ADOTable1.UpdateBatch(arAll);
    finally
    form1.ADOTable1.Connection:=nil;
    form1.ADOConnection1.Connected:=False;

    end;

    non so se e' esatto ma il risultato e' quello sopra citato.

    saprebbe qualcuno aiutarmi?

  2. #2
    Very Important Person L'avatar di cyberlaundry
    reputazione complessiva: 8 8

    Messaggi
    634
    Non uso TADOTable, ma da quel poco che so quello che fai è

    Codice:
    form1.ADOTable1.Connection:=nil;   // Scollego il componente dal database
    form1.ADOConnection1.Connected:=False;  // Scollego il database (?)
    form1.ADOConnection1.Connected:=True;  // Ricollego il database (?)
    form1.ADOTable1.Connection:=form1.ADOConnection1; // Riconnetto il componente al database
    Prima domanda: non potevi semplicemente lasciarlo connesso?

    Codice:
    try
      form1.ADOTable1.UpdateBatch(arAll);  // Aggiorni una tavola appena aperta. Cioé senza alcuna modifica (l'hai appena aperta!)
    finally
      form1.ADOTable1.Connection:=nil; // nuovamente disconnetti il componente dal database
      form1.ADOConnection1.Connected:=False; // nuovamente disconnetti il database
    end;
    Seconda domanda: a che serve questo codice?
    Non conosco il metodo UpdateBatch, ma se tanto mi dà tanto, aggiorna il database applicando tutte le modifiche che hai apportato al dataset ADOTable1.
    Ora... un dataset appena aperto non può essere stato modificato da nessuno, quindi non ci sono modifiche da apportare.

    Se le modifiche ai dati di ADOTable1 le avevi fatte prima di questo codice che hai postato, probabilmente puoi sostituire tutto con qualcosa del tipo

    Codice:
      ADOConnection1.BeginTrans; // Inizio una transazione
      try
        ADOTable1.UpdateBatch(arAll);  // Aggiorno il database con le modifiche apportate ai dati contenuti in ADOTable1
        ADOConnection1.CommitTrans; // Tento di chiudere la transazione
      except
        ADOConnetcion1.RollbackTrans; // Errore, qualcosa non va nei dati, annullo la transazione
        raise; // risollevo l'eccezione, da gestire da programma
      end;
    Lettura consigliata: Come porre le domande in modo intelligente

    RICORDA
    che il
    modo migliore per ringraziare chi ti dà supporto è di fare click su "reputazione"
    Se risolvi da solo il problema che hai postato, condividi con noi la soluzione. Potrebbe essere utile ad altri.


  3. #3
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    5

    Unhappy

    Cyber innansitutto grazie per la tua risposta
    ho provato anche come dici tu ma il problema non cambia
    cerco di spiegarmi meglio
    1.parto da un database mdb riempito con dei dati
    2.tramite una routine modifico all'occorrenza un determinato campo
    .- sino a qua tutto funziona benissimo il mio database visualizzato sul dbgrid mi visualizza i cambiamenti che voglio
    3. a questo punto devo solo riprendere questo database che ho caricato in memoria e risalvarlo nel mio nomefile.mdb e' qua che non funziona e che una volta che lo faccio mi ripropone gli stessi record che avevo prima dell'elaborazione.

    ci sto perdendo il aiutooooooooooo

  4. #4
    Neofita della community
    reputazione complessiva: 2 2

    Messaggi
    70

    Ciao

    Prova ha dare la stringa di connessione dopo aver chiuso l'oggetto ADotable1 e prima di aprirlo; nel seguente modo:

    form1.ADOTable1.Connection:=nil;
    form1.ADOConnection1.Connected:=False;
    form1.ADOTable1.Connection:=form1.ADOConnection1;
    form1.ADOConnection1.Connected:=True;


    Fammi sapere.

  5. #5
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    5
    ciao nicolas grazie anche a te per l'aiuto
    purtroppo anche cosi non raggiungo l'aggiornamento del mio mdb
    anzi mi genera un errore in quanto l'adotable e' chiusa e quindi non riesce ad aggiornare
    ma possibile che non ci siaa un comando che una volta aperto ed elaborato un mdb permetta di salvare gli aggiornamenti fatti nello stesso file? sono letterelamente ridotto cosi:

  6. #6
    Very Important Person L'avatar di cyberlaundry
    reputazione complessiva: 8 8

    Messaggi
    634
    Sicuramente c'é qualcosa che non sappiamo. Conviene che posti un esempio. Prepara un progettino campione con solo lo stretto necessario (mdb e il progetto Delphi con la form, la grid e il tuo codice) in modo intanto da "isolare" il tuo problema, poi di permetterci di vedere dov'é l'errore.
    Ce lo alleghi nella prossima risposta?

  7. #7
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    5

    progetto

    lo posto immediatamente e grazie sempre a tutti per il vs interessamento


    Codice:
    unit Pv100Read;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, Grids, DBGrids, ExtCtrls, DBCtrls,printers, StdCtrls,
      QRPrntr, ComCtrls, jpeg;
    
    type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADOTable1: TADOTable;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        ProgressBar1: TProgressBar;
        Label1: TLabel;
        Image1: TImage;
        Label2: TLabel;
        Label3: TLabel;
        ADOConnection1: TADOConnection;
        ADOTable1Kod: TIntegerField;
        ADOTable1Descriptio: TWideStringField;
        ADOTable1Qyt: TIntegerField;
        ADOTable1Price: TIntegerField;
        ADOTable1fpa: TIntegerField;
        ADOTable1Data: TDateTimeField;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    uses RpPrint;
    
    {$R *.dfm}
    procedure ctrl_data;
    var
    
      i: integer;
      db:Tadotable;
      d1,d2:Tdate;
      prova:string;
      myYear,myyear2, myMonth,mymonth2, myDay:word;
      data1,data2:string;
    begin
      i:=0;
      form1.ProgressBar1.min:=0;
      form1.ProgressBar1.Max:=form2.ADOTable1.RecordCount;
      for I := 0 to form1.ADOTable1.RecordCount do
        begin
          form1.progressbar1.Position:=i;
          form1.Refresh;
          d1:=form1.ADOTable1Data.Value;
          data1:=datetostr(d1);
          data2:=datetostr(d2);
          prova:=form1.ADOTable1Descriptio.Text;
          if i=0 then
            d2:=d1;
          if abs(d1-d2)>200 then
            begin
              DecodeDate(d1, myYear, myMonth, myDay);
              data1:=datetostr(d1);
              data2:=datetostr(d2);
              myyear:=myyear+1;
              form1.ADOTable1Data.NewValue:=Encodedate(myYear,MyMonth,MyDay);
              data1:=datetostr(form1.ADOTable1Data.NewValue);
              d1:=form1.ADOTable1Data.NewValue;
              d2:=d1;
            end
          else
            d2:=d1;
          form1.ADOTable1.Next;
          form1.Label1.Caption:='Record N. '+inttostr(i)+' Of '+inttostr(form2.ADOTable1.RecordCount)+' '+ prova;
          form1.Label1.Refresh;
        end;
        showmessage(inttostr(i));
        begin
          form1.ADOConnection1.BeginTrans; // Inizio una transazione
          try
            form1.ADOTable1.UpdateBatch(arAll);  // Aggiorno il database con le modifiche apportate ai dati contenuti in ADOTable1
            Form1.ADOConnection1.CommitTrans; // Tento di chiudere la transazione
          except
            on exception do
              begin
                showmessage('Processing Error');
                form1.ADOConnection1.RollbackTrans;// Errore, qualcosa non va nei dati, annullo la transazione
              end;
          end;
        end;
      end;
    
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      rpprint.Form2.QuickRep1.Preview;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      rpprint.Form2.QuickRep1.PrinterSettings;
      rpprint.Form2.QuickRep1.Print;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      ctrl_data;
    end;
    
    end.

    mentre il dbase e':

  8. #8
    Very Important Person L'avatar di cyberlaundry
    reputazione complessiva: 8 8

    Messaggi
    634
    Intendevo "allega uno zip"...
    Comunque.
    Perché usi NewValue?

    Fai semplicemente
    ADOTable1.Edit;
    ADOTable1Data.AsDate:=Encodedate(myYear,MyMonth,My Day);
    ADOTable1.Post;

  9. #9
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    5
    sei un grande cyber wow funziona alla grande

    l'unica cosa e' che rallenta moltissimo l'elaborazione e trattandosi di un database con almeno 300000 record immagina il tempo che ci impiega ma credo non posso chiedere di meglio giusto?

  10. #10
    Very Important Person L'avatar di cyberlaundry
    reputazione complessiva: 8 8

    Messaggi
    634
    Evita di fare Form1.refresh e usa una funzione tipo DaysBetween della Unit DateUtils.
    Se vuoi aggiornare la progressbar a video, fai una
    Application.ProcessMessages

    Edit: comunque MOOOOLTO probabilmente quello che fai da codice spazzandoti un record alla volta, puoi farlo con una query di aggiornamento (vedi "UPDATE").
    Lettura consigliata: Come porre le domande in modo intelligente

    RICORDA
    che il
    modo migliore per ringraziare chi ti dà supporto è di fare click su "reputazione"
    Se risolvi da solo il problema che hai postato, condividi con noi la soluzione. Potrebbe essere utile ad altri.


+ Rispondi

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi