Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: tiberi72 - Aprile 10, 2012, 04:26:54 pm

Titolo: inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 04:26:54 pm
ciao a tutti,
ho realizzato un programmino abbastanza semplice che gestisce una tabella di un db firebird

Posto il codice:
Codice: [Seleziona]
unit pagamenti;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, IBConnection, sqldb, pqconnection, odbcconn, db, SdfData,
  FileUtil, LR_Class, LR_DBSet, LR_View, LR_DSet, LR_BarC,
  LResources, Forms, Controls, Graphics, Dialogs, DbCtrls, DBGrids, StdCtrls,
  ComCtrls, EditBtn, Menus, ExtCtrls;

type

  { TFPagamenti }

  TFPagamenti = class(TForm)
    CmdIndietro: TButton;
    Datasource1: TDatasource;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBGrid2: TDBGrid;
    DBNavigator2: TDBNavigator;
    DBRadioGroup1: TDBRadioGroup;
    IBConnection1: TIBConnection;
    Label1: TLabel;
    Label2: TLabel;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure CmdIndietroClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  FPagamenti: TFPagamenti;

implementation

{ TFPagamenti }

function depura(inzvar:string):string;
var
  i:integer;
  app:string;

begin
  app:= '';
  app:=stringReplace(inzvar, '''', '´', [RfReplaceAll]);
  app:=stringReplace(app, '&', 'e', [RfReplaceAll]);
  result:=app;
end;

Function estrai_var(var campo: string):string;
// legge un campo dalla stringa e lo cancella
var appstring: string;
begin
  appstring := '';
  if pos('^', campo)>0 then
  begin
    appstring := copy(campo,1,pos('^', campo)-1);
    Delete(campo,1,pos('^', campo));
  end;
  result:=appstring;
end;

function depuranum(inzvar:string):string;
var app:string;
begin
  app:= '';
  app:=stringReplace(inzvar, ',', '.', [RfReplaceAll]);
  result:=app;
end;
function destra(s: string; num:integer):string;
var k:string;
begin
  k:='';
  if num <= length(s) then
  begin
    k := copy(s,length(s) - num +1, num);
  end;
  result:=k;
end;

procedure TFPagamenti.CmdIndietroClick(Sender: TObject);
begin
  close;
end;

initialization
  {$I pagamenti.lrs}

end.

Funziona tutto, solo che se inserisco un record, lo confermo e poi aggiorno la videata, mi accorgo che il record non e' stato inserito.
Logicamente mi da lo stesso errore se inserisco un record, lo confermo e poi esco dalla form.
Cosa sto sbagliando?
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: xinyiman - Aprile 10, 2012, 04:27:52 pm
Ma quale errore ti restituisce?!
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 04:30:40 pm
non mi da nessun errore, solo che appena esco e rientro non trovo piu' il record inserito
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 04:34:14 pm
Praticamente ho creato una form, inserito e configurato gli oggetti IBconnection, SQLTransaction,SQLQUery, DataSource, Dbedit e DbNavigator
Penso di aver configurato tutto abbastanza correttamente, riesco a vedere i record ed a modificarli.
Anche i record inseriti riesco a vederli finche rimango nella form, solo che quando esco (o quando clicco aggiorna sul dbnavigator) perdo le modifiche effettuate come se non andasse a buon fine la transaction
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: xinyiman - Aprile 10, 2012, 04:35:16 pm
Prima di uscire prova a scrivere

SQLTransaction1.CommitRetaining;

Sempre che l'oggetto TSQLTransaction si chiami SQLTransaction1!

Facci sapere
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 04:42:58 pm
Ho provato ma fa la stessa cosa.
Aldila' dell'operazione close, se inserisco un record cliccando il '+' su dbnavigator e poi confermo sempre dal dbnavigator, e poi clicco su refresh del dbnavigator, il record inserito scompare
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 04:48:33 pm
Inserisco i sorgenti in questione
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: xinyiman - Aprile 10, 2012, 04:49:04 pm
Ma quel comando lo hai inserito prima o dopo aver chiuso il recordset?!

Prova ancora con

SQLTransaction1.Commit;
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 04:52:59 pm
allora, ho provato a fare questo:
per essere sicuro di fare l'operazione quando ancora il recordset e' attivo ho aggiunto alla form un bottone, sull'evento onclick ho inserito sqltransaction1.commit.
Dopo aver inserito il record ho fatto click sul bottone: a quel punto il record e' sparito e la tabella si e' chiusa (quindi il commit ha avuto effetto).
Quando esco e rientro nel programma non trovo nessun record inserito
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: xinyiman - Aprile 10, 2012, 04:55:32 pm
Fai una cosa, comprimi l'esempio in un solo file zippato! Possibilmente allega il db se è sqlite o qualcosa di portatile
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 05:02:59 pm
fatto, il db e' su firebird 2.5, ma se vuoi puoi fare la stessa prova inserendo un db qualsiasi e creando questa tabella

Codice: [Seleziona]

CREATE TABLE PAGAMENTI (PACOD INTEGER NOT NULL,
        PADES VARCHAR(30),
        PATIPO SMALLINT,
        PARATE SMALLINT,
        PAFINE SMALLINT,
        PAGGMESESUCC SMALLINT,
CONSTRAINT PK_PAGAMENTI PRIMARY KEY (PACOD));
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 05:09:10 pm
non so se puo' essere utile: finora ho parlato di inserimenti, ma il problema si ripresenta su qualsiasi modifica (anche nella variazione ad esempio di un record)
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: xinyiman - Aprile 10, 2012, 05:11:54 pm
E' buona norma e regola creare un applicazione (possibilmente con solo oggetti standard) in maniera tale da poter direttamente compilare. Non basta mettere solo la unit e la form. Ci vuole proprio un progetto!
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 05:18:17 pm
ora dovrebbe andare: devi andare sul menu principale dell'applicazione e scegliere poi "pagamenti".
Su banche da lo stesso errore
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: tiberi72 - Aprile 10, 2012, 05:37:33 pm
trovato: mancava sqlquery1.applyupdate prima di sqltransaction1.commit

Grazie mille comunque
Ciao!!
Titolo: Re:inserisco record ma poi non lo trovo
Inserito da: xinyiman - Aprile 11, 2012, 08:15:47 am
Stavo per provarlo ma poi ho letto che hai risolto. Perfetto!  ;)