MasterDrive.it   
Vai indietro   MasterDrive.it > Software Development > Delphi



Rispondi
 
Strumenti della discussione Modalità di visualizzazione
Vecchio 16-02-2010, 17:30   #1 (permalink)
Nuovo della community

 
5 Messaggi

tacuceti novizio della comunita' ( + 10 )
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?

tacuceti non è in linea   Bookmark and Share Rispondi quotando
Vecchio 17-02-2010, 01:45   #2 (permalink)
Very Important Person

 L'avatar di cyberlaundry

 
626 Messaggi

cyberlaundry con qualche commento positivo ( + 50 )
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;
__________________
Vienimi a trovare: http://www.cyberlaundry.net

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

cyberlaundry non è in linea   Bookmark and Share Rispondi quotando
Vecchio 17-02-2010, 08:28   #3 (permalink)
Nuovo della community

 
5 Messaggi

tacuceti novizio della comunita' ( + 10 )
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
tacuceti non è in linea   Bookmark and Share Rispondi quotando
Vecchio 17-02-2010, 14:13   #4 (permalink)
Neofita della community

 
67 Messaggi

nicholas77 novizio della comunita' ( + 10 )
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.
nicholas77 non è in linea   Bookmark and Share Rispondi quotando
Vecchio 17-02-2010, 16:20   #5 (permalink)
Nuovo della community

 
5 Messaggi

tacuceti novizio della comunita' ( + 10 )
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:
tacuceti non è in linea   Bookmark and Share Rispondi quotando
Vecchio 18-02-2010, 09:12   #6 (permalink)
Very Important Person

 L'avatar di cyberlaundry

 
626 Messaggi

cyberlaundry con qualche commento positivo ( + 50 )
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?
cyberlaundry non è in linea   Bookmark and Share Rispondi quotando
Vecchio 18-02-2010, 11:35   #7 (permalink)
Nuovo della community

 
5 Messaggi

tacuceti novizio della comunita' ( + 10 )
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':
tacuceti non è in linea   Bookmark and Share Rispondi quotando
Vecchio 18-02-2010, 12:17   #8 (permalink)
Very Important Person

 L'avatar di cyberlaundry

 
626 Messaggi

cyberlaundry con qualche commento positivo ( + 50 )
Intendevo "allega uno zip"...
Comunque.
Perché usi NewValue?

Fai semplicemente
ADOTable1.Edit;
ADOTable1Data.AsDate:=Encodedate(myYear,MyMonth,My Day);
ADOTable1.Post;
cyberlaundry non è in linea   Bookmark and Share Rispondi quotando
Vecchio 18-02-2010, 12:31   #9 (permalink)
Nuovo della community

 
5 Messaggi

tacuceti novizio della comunita' ( + 10 )
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?
tacuceti non è in linea   Bookmark and Share Rispondi quotando
Vecchio 18-02-2010, 13:54   #10 (permalink)
Very Important Person

 L'avatar di cyberlaundry

 
626 Messaggi

cyberlaundry con qualche commento positivo ( + 50 )
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").
__________________
Vienimi a trovare: http://www.cyberlaundry.net

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

cyberlaundry non è in linea   Bookmark and Share Rispondi quotando
Rispondi

Strumenti della discussione
Modalità di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è attivo
Le smilies sono attive
Il codice IMG è attivo
il codice HTML è disattivato
Trackbacks are attivo
Pingbacks are attivo
Refbacks are disattivato

Salto del forum


Tutti gli orari sono GMT +2. Attualmente sono le 09:50.


Powered by vBulletin versione 3.8.0
Copyright © 2000 - 2010, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.2.0

Valid XHTML 1.0 Transitional  Creative Commons License

Eccetto dove diversamente specificato, i contenuti pubblicati in questa comunità sono rilasciati sotto Licenza
Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia License.
La comunita' di MasterDrive.it non e' responsabile di eventuali imprecisioni presenti nelle pagine.