aula
26/04/2004
0
alguem poderia colcar um codigo aqui OO mostrando como a Qt espera que a gente programe?
flw
Rfpsatin
Posts
14/05/2004
Marcelo.c
Além do DataModule, qual seriam os problemas encontrados ?
15/05/2004
Rfpsatin
Numa aplicacao delphi normal, uma vez que vc deixe o seu datamodule no auto-create vc ja tem um objecto da classe datamodule criado e vc pode se referir a ele onde q quando quiser (desde que vc nao dee um free neste objeto). Isso eh conseguido de cara pois na definicao da sua classe do datamudule existe uma variavel que ja esta sendo definida do tipo TDatamodule e com isso tenho um objeto (p.ex Datamodule1) que eh do tipo TDatamodule que por sua vez tem os objetos de conexao com o banco e posso usar onde quiser, basta que onde quer que eu esteja me referencie a ele. Tipo, se eu criar um componente quallquer de operacao com o banco, uma query p.ex, basta assossiar a este datamodule para conexao.
Bem, com o Kylix pelo jeito as coisas saum um pouco mais chatas, se eu deixo ele funcionar da mesma forma como no delphi (como descrevi acima) ele athe funciona contudo ele nao ta controlando transacao. Ele funcioina na 1a. vez contudo da segunda em diante ele comeca a dar problema. Tipo assi,m, se eu clico no bota na 1a vez ele controla, da segunda em diante isso nao ocorre. Coloquei um SQLMonitor para analisar como estao indo os dados, obtive que na primeira vez ele manda o BEGIN (qdo starto a transacao) e o COMMIT OU ROLLBACK quando encerro. Da segunda em diate isso nao vai, vai apenas o BEGIN. Ta muito confuso, ta muito doido, soh sei que esta tudo aparentemente correto contudo nao esta controlando transacao.
QQ dica, manda ae.
abraco.
Ricardo
15/05/2004
Rfpsatin
vc mencionou o datamodule, ha algum bug conhecido com relacao a ele por isso vc sitou de cara ou eu falei algo sobre os problemas que estou tendo com ele noutra mensagem?
abraco.
Ricardo
18/05/2004
Rfpsatin
19/05/2004
Marcelo.c
28/05/2004
Rfpsatin
O que ocorre eh o seguinte.
1)Abro uma transacao.
2)dou um insert nela
3)dou um select nela (para ver se o dado foi inserido e defato ele me retorna o valor)
4)dou um delete nela(e ele mata o dado).
Este eh um programa de teste q fiz para ver o seguinte.
Pelo que percebi se dentro de uma procedure eu chamo inicio de transacao e faco inserts e select´s tudo ocorre bem, contudo, se chamo outras funcoes que tentem dar selectes nele ele simplesmente nao encontra.
O que me parece estar ocorrendo eh o seguinte.
>Abro uma transacao
>dou um insert dentro da transacao(blz, tudo esta bem, so EU posso ver este dado pois ainda nao dei commit)
> abaixo dou um select(acho blz, pois estou dentro da minha transacao e eu posso ver o que escrevo)
> chamo uma funcao que tenta fazer um select(nao acha, ao que parece ele age como se estivesse FORA da transacao e consequentemente nao consegue VER o dado que inseri)
Isso eh muito estranho, na faz sentido pois tudo esta dentro do mesmo bloco.
vou postar aqui o fonte deste exemplo. Fiz esse exemplo pois algo parecido esta ocorrendo num programa maior e preciso resolver urgente.
Por favor, qualquer ajuda eh bem-vinda.
PS. estou usando DBX.
----------------------------- fonte ---------------------
unit Unit1;
interface
uses
SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
QDialogs, QStdCtrls, DBXpress, DB, SqlExpr;
type
TForm1 = class(TForm)
ConDatabase: TSQLConnection;
ConFabio: TSQLConnection;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function mostra(codigo:integer):string;
function mostra2(codigo:integer):string;
end;
var
Form1: TForm1;
implementation
{$R *.xfm}
procedure TForm1.Button1Click(Sender: TObject);
var falha:boolean;
qry:TSqldataset;
apagados:integer;
TD1: TTransactionDesc;
begin
TD1.TransactionID := 0;
TD1.GlobalID:=0;
TD1.IsolationLevel := xilREADCOMMITTED;
try
ConDatabase.StartTransaction(TD1);
try
try
qry:=TSQLDataSet.Create(self);
qry.SQLConnection:=ConDatabase;
qry.CommandType:=ctQuery;
qry.CommandText:=´insert into tab1 values (1,´ + QuotedStr(´hehe´) + ´)´;
qry.ExecSQL();
except on e:Exception do
begin
showmessage(´ocorreu o seguinte erro: ´ + e.message);
end;
end;
finally
FreeAndNil(qry);
end;
try
try
qry:=TSQLDataSet.Create(self);
qry.SQLConnection:=ConDatabase;
qry.CommandType:=ctQuery;
qry.CommandText:=´select codigo from tab1 where codigo=:codigo´;
qry.ParamByName(´codigo´).AsInteger:=1;
qry.Open;
showmessage(´na origem, achei >´ + qry.Fields[0].asstring);
self.mostra(qry.Fields[0].AsInteger);
except on e:Exception do
begin
showmessage(´ocorreu o seguinte erro: ´ + e.message);
end;
end;
finally
FreeAndNil(qry);
end;
try
try
qry:=TSQLDataSet.Create(self);
qry.SQLConnection:=ConDatabase;
qry.CommandType:=ctQuery;
qry.CommandText:=´delete from tab1 where codigo=:codigo´;
qry.ParamByName(´codigo´).AsInteger:=1;
apagados:=qry.ExecSQL();
showmessage(inttostr(apagados));
except on e:Exception do
begin
showmessage(´ocorreu o seguinte erro: ´ + e.message);
end;
end;
finally
FreeAndNil(qry);
end;
ConDatabase.Commit(TD1)
except on e:Exception do
begin
showmessage(´ocorreu o seguinte erro: ´ + e.message);
ConDatabase.Rollback(TD1);
end;
end;
end;
function TForm1.mostra(codigo: integer): string;
var
qry:TSqldataset;
begin
try
try
qry:=TSQLDataSet.Create(self);
qry.SQLConnection:=ConDatabase;
qry.CommandType:=ctQuery;
qry.CommandText:=´select codigo from tab1 where codigo=:codigo´;
qry.ParamByName(´codigo´).AsInteger:=codigo;
qry.Open;
showmessage(´mostra>´ + qry.Fields[0].asstring);
result:=((self.mostra2(qry.Fields[0].asInteger)));
except on e:Exception do
begin
showmessage(´ocorreu o seguinte erro: ´ + e.message);
end;
end;
finally
FreeAndNil(qry);
end;
end;
function TForm1.mostra2(codigo: integer): string;
var
qry:TSqldataset;
begin
try
try
qry:=TSQLDataSet.Create(self);
qry.SQLConnection:=ConDatabase;
qry.CommandType:=ctQuery;
qry.CommandText:=´select codigo from tab1 where codigo=:codigo´;
qry.ParamByName(´codigo´).AsInteger:=codigo;
qry.Open;
showmessage(´mostra2>´ + qry.Fields[0].asstring);
result:=(qry.Fields[0].asstring);
except on e:Exception do
begin
showmessage(´ocorreu o seguinte erro: ´ + e.message);
end;
end;
finally
FreeAndNil(qry);
end;
end;
end.
28/05/2004
Marcelo.c
Comigo aconteceu algo semelhante, mas com IBX. Atualizei a versão e acabou o problema.
28/05/2004
Rfpsatin
provavel. Como atualizo o DBX?
01/06/2004
Marcelo.c
03/06/2004
Rfpsatin
DBX eh da borland ou de terceiros?
acheoi um site q tem algo para ele + nao eh free.
Clique aqui para fazer login e interagir na Comunidade :)