ReadThis no modo HardCoded

9 views
Skip to first unread message

edregis

unread,
Jun 3, 2009, 11:21:31 AM6/3/09
to tiOPF.br
Achei que tinha resolvido esse problema, mas na verdade não está me
retornando o objeto preenchido.
Quando chamo o MeuObjeto.ReadThis, ele até passa melo método na minha
unit HardCoded, atribui os valores corretamente às propriedades do
objeto, mas quando vou usar o objeto instanciado, essas propriedades
estao em branco.

No meu BOM tenho a classe TFuncionario = class(TtiObject), e declarei
o método ReadThis da seguinte maneira:

TFuncionario = class(TtiObject)
private
...
protected
...
public
...
procedure ReadThis; override;
published
...
end;

implementation
...
procedure TFuncionario.ReadThis;
begin
inherited;
end;

Obs: Já tirei o override e o inherited, mas não rolou.

E na minha unit HardCoded, o meu Visitor ReadThis está assim:

TVisFuncionario_ReadThis = class(TVisOwnedQrySelect)
protected
function AcceptVisitor: boolean; override;
procedure Init; override;
procedure SetupParams; override;
procedure MapRowToObject; override;
end;

procedure RegisterVisitorsFuncionario;

implementation
...
procedure RegisterVisitorsFuncionario;
begin
// Note: Registration order is important
GTIOPFManager.RegReadVisitor(TVisFuncionario_Read);
GTIOPFManager.RegReadThisVisitor(TVisFuncionario_ReadThis);

GTIOPFManager.RegSaveVisitor(TVisFuncionario_Create);
GTIOPFManager.RegSaveVisitor(TVisFuncionario_Update);
GTIOPFManager.RegSaveVisitor(TVisFuncionario_Delete);
end;

function TVisFuncionario_ReadThis.AcceptVisitor: boolean;
begin
Result:= (Visited is TFuncionario);
end;

procedure TVisFuncionario_ReadThis.Init;
begin
Query.SQL.Text :=
'select ' +
' OID as OID' +
' ,NM_FUNCIONARIO as NM_FUNCIONARIO ' +
' ,VL_SALARIO as VL_SALARIO ' +
' ,NR_TELEFONE as NR_TELEFONE ' +
' ,DS_EMAIL as DS_EMAIL ' +
' ,FUNCIONARIO_FOTO as FUNCIONARIO_FOTO ' +
'from ' +
'Funcionario ' +
'where OID = :OID' ;
end;

procedure TVisFuncionario_ReadThis.MapRowToObject;
var
lFuncionario: TFuncionario;
stream: TMemoryStream;
Begin
lFuncionario := Visited as TFuncionario;
begin
lFuncionario := TFuncionario.Create;
lFuncionario.OID.AssignFromTIQuery('OID',Query);
lFuncionario.FuncionarioNome := Query.FieldAsString
['NM_FUNCIONARIO'];
lFuncionario.FuncionarioSalario := Query.FieldAsFloat
['VL_SALARIO'];
lFuncionario.FuncionarioTelefone := Query.FieldAsString
['NR_TELEFONE'];
lFuncionario.FuncionarioEmail := Query.FieldAsString['DS_EMAIL'];
stream := TMemoryStream.Create;
try
try
Query.AssignFieldAsStream('FUNCIONARIO_FOTO', stream);
stream.Position := 0;
stream.SaveToStream(lFuncionario.FuncionarioFoto as
TMemoryStream);
except
on E:Exception do
ShowMessage('Erro ao ler imagem do banco de dados' + #10 +
e.message);
end;
lFuncionario.ObjectState := posClean ;
finally
stream.Free;
end;
end;
end;

procedure TVisFuncionario_ReadThis.SetupParams;
begin
Query.ParamAsString['OID']:= Visited.OID.AsString;
end;

Ele está passando pelo MapRowToObject, está atribuindo corretamente os
valores nas propriedades, mas na hora de retornar isso para o objeto
instanciado, aparece tudo em braco.

O que será que pode ser?

Obrigado,

Edelson.

Diogo Augusto Pereira

unread,
Jun 3, 2009, 7:28:06 PM6/3/09
to tiop...@googlegroups.com
Edelson,

Seu problema está no método MapRowToObject. Tu está instanciando a classe TFuncionario novamente: lFuncionario := TFuncionario.Create;

Nessa linha: lFuncionario := Visited as TFuncionario;
tu já está atribuindo o objeto visitado à variável lFuncionario e é com esse objeto que tu deve trabalhar. Não precisa instanciar de novo porque o tiOPF vai usar o objeto Visited e não a nova instância que está sendo criada.

Diogo Augusto Pereira


2009/6/3 edregis <edr...@gmail.com>

edregis

unread,
Jun 4, 2009, 8:50:03 AM6/4/09
to tiOPF.br
Grande Diogo!

Obrigado, era isso mesmo!

Abraço,

Edelson.


On 3 jun, 20:28, Diogo Augusto Pereira <diogoa...@gmail.com> wrote:
> Edelson,
>
> Seu problema está no método MapRowToObject. Tu está instanciando a classe
> TFuncionario novamente: lFuncionario := TFuncionario.Create;
>
> Nessa linha: lFuncionario := Visited as TFuncionario;
> tu já está atribuindo o objeto visitado à variável lFuncionario e é com esse
> objeto que tu deve trabalhar. Não precisa instanciar de novo porque o tiOPF
> vai usar o objeto Visited e não a nova instância que está sendo criada.
>
> Diogo Augusto Pereira
>
> 2009/6/3 edregis <edre...@gmail.com>
Reply all
Reply to author
Forward
0 new messages