Sim, concordo contigo. O codigo SQL que tu colocastes esta na posicao correta. O que eu nao gosto é de depender de codigo SQL para meu programa funcionar. A minha ideia é que o programa funcione normalmente apenas com a camada de regras de negocio, e a persistencia tenha a funcao apenas "complementar" ao programa. Sds, Francisco
On 11/21/05, Romario (Listas) <[EMAIL PROTECTED]> wrote: > > O que você chama de camada superior??? > > O código SQL que coloquei está na *terceira* camada, ou seja, na camada > de acesso à dados. Existe outro local mais correto que esse? > > Sds, > > Romario > > > > > Francisco Trindade escreveu: > > Nao sei, nao gosto de colocar codigo SQL na camada superior, acho que > pode > > complicar demais as coisas. > > Uma opcao para a relacao 1 para 1 que eu pensei agora seriam classes > > "amigas" colocadas no mesmo arquivo. Isso acabaria com o problema da > relacao > > circular (mas tem o problema de colocar duas classes no mesmo arquivo). > > E quanto a 1 para N, eu vejo uma grande vantagem na bidirecionalidade, > pode > > poupar buscas imensas, em certos casos. > > Sds. > > Francisco > > > > On 11/21/05, rbr_vix_es <[EMAIL PROTECTED]> wrote: > > > >>Você não está sendo chato e Orientação a Objetos é algo que gosto > >>muito de discutir. Gostaria que outros participassem, mas... > >> > >>Vamos lá!!! > >> > >>Ainda não tive como testar, mas continuo achando que o typecast não > >>é necessário porque você já criou um objeto do mesmo tipo para > >>receber o objeto recuperado na lista. > >> > >>Vejamos o problema da incubadora. Ao meu entender seria algo assim: > >> > >>Type > >>TEspecie = (tpPeixe, tpAnfibio, tpReptil, tpAve); > >> > >> > >>Type > >>TAnimal = Class(TObject) > >>Private > >>FCodigo : Integer; > >>FNome : String; > >>FEspecie: TEspecie; > >>Protected > >>Public > >>Property Codigo : Integer Read FCodigo; > >>Property Nome : String Read FNome Write FNome > >>Property Especie: TEspecie Read FEspecie Write FEspecie; > >> > >>Function Listar(oEspecie: TEspecie): TList; > >>End; > >> > >> > >>Type > >>TOvo = Class(TObject) > >>Private > >>FCodigo: Integer; > >>FAnimal: TAnimal; > >>... > >>Protected > >>Public > >>Property Codigo : Integer Read FCodigo; > >>Property Animal : TAnimal Read FAnimal Write FAnimal; > >>End; > >> > >> > >>Type > >>TIncubadora = Class(TObject) > >>Private > >>FCodigo : Integer; > >>FCapacidade : Integer; > >>FPrateleiras : Smallint; > >>FTemperatura : Float; > >>Protected > >>Public > >>Property Codigo : Integer Read FCodigo; > >>Property Capacidade : Integer Read FCapacidade Write > >>FCapacidade; > >>Property Prateleiras: Smallint Read FPrateleiras Write > >>FPrateleiras; > >>Property Temperatura: Float Read FTemperatura Write > >>FTemperatura; > >> > >>Class Function ListaOvos: TList; > >>End; > >> > >>Se para você é importante saber em que local o Ovo está sem ter que > >>perguntar e percorrer a emcubadora, monte um novo objeto para te > >>auxiliar nessa tarefa, mas não acho que você deve criar uma > >>referência da emcubadora no ovo. > >> > >>Ex.: > >> > >>Type > >>TEstocagem = Class(TObject) > >>Private > >>FOvo : TOvo; > >>FEmcubadora : TEmcubadora; > >>FPrateleira : Smallint; > >>FPosicao : Smallint; > >>Protected > >>Public > >>Property Ovo : TOvo Read FOvo Write FOvo; > >>Property Emcubadora: TEmcubadora Read FEmcubadora Write > >>FEmcubadora; > >>Property Prateleira: Smallint Read FPrateleira Write > >>FPrateleira; > >>Property Posicao : Smallint Read FPosicao Write FPosicao; > >> > >>Function Buscar(oOvo: TOvo): Boolean; Overload; > >>End; > >> > >> > >>O exemplo que você informou de um relacionamento 1 para 1 na verdade > >>é um relacionamento 1 para N, porque um ovo só pode vir de uma > >>avestruz, mas um avestruz pode pôr vários ovos. Estou certo? > >> > >>Vamos colocar um relacionamento de 1 para 1 como sendo o de Pessoa e > >>CNH (Carteira Nacional de Habilitação). Digamos que a Classe Pessoa > >>terá um objeto do tipo TCNH junto aos seus atributos. Vejamos o > >>exemplo: > >> > >>Type > >>TPessoa = Class(TObject) > >>Private > >>FCodigo: Integer; > >>FNome : String; > >>FCNH : TCNH; > >>Protected > >>Public > >>Property Codigo : Integer Read FCodigo; > >>Property Nome : String Read FNome Write FNome; > >>Property CNH : TCNH Read FCNH Write FCNH; > >>End; > >> > >> > >>Type > >>TCNH = Class(TObject) > >>Private > >>FCodigo : Integer; > >>FNumero : String; > >>FRegistro : String > >>FCategoria : String; > >>FDataExame : TDateTime; > >>FExpedicao : TDateTime; > >>FValidade : TDateTime; > >>FObservacao: String; > >>Protected > >>Public > >>Property Codigo : Integer Read FCodigo; > >>Property Numero : String Read FNumero Write FNumero; > >>Property Registro : String Read FRegistro Write FRegistro; > >>Property Categoria : String Read FCategoria Write FCategoria; > >>Property DataExame : TDateTime Read FDataExame Write FDataExame; > >>Property Expedicao : TDateTime Read FExpedicao Write FExpedicao; > >>Property Validade : TDateTime Read FValidade Write FValidade; > >>Property Observacao: String Read FObservacao Write > >>FObservacao; > >> > >>Function Buscar(iCodigo: Integer): Boolean; Overload; > >>Function Buscar(sNumero: String): Boolean; Overload; > >>Function Buscar(dtValidade: TDateTime): Boolean; Overload; > >>End; > >> > >>No exemplo acima sabemos que o objeto Pessoa conhece sua CNH através > >>da instância do objeto que ele possui, mas se precisarmos conhecer > >>uma Pessoa através de uma CNH o problema fica mais difícil. A > >>solução que vejo no momento seria: > >> > >>No seu DataModule: > >> > >>Function TdmPessoa.Buscar(iCodigo: Integer, oPessoa: TPessoa): > >>Boolean; > >>Begin > >> > >>With cdsPessoa Do > >>Begin > >>Try > >>Close; > >>CommandText := 'Select * From Pessoa P ' + > >>'Join CNH C On (P.Codigo = C.CodPessoa) ' + > >>'Where P.Codigo = ' + IntTostr(iCodigo); > >>Open; > >> > >>If RecordCount > 0 Then > >>Begin > >>Result := True; > >>Pessoa.Nome := FieldByName('Nome').AsString; > >>... > >>Pessoa.oCNH.Buscar(iCodigo); > >>End; > >>Except > >>on E: Exception do > >>ShowMessage(E.Message); > >>End; > >>End; > >>End; > >> > >> > >>Ufa!!! Acho que exemplifiquei bastante dessa vez. Vai dar até para > >>escrever um livro. :-D > >> > >>Obs.: Como estou codificando direto no corpo do e-mail, pode ser que > >>aja alguns erros. :-( > >> > >>Sds, > >> > >>Romario > > > > > > _______________________________________________________ > Yahoo! Acesso Grátis: Internet rápida e grátis. > Instale o discador agora! > http://br.acesso.yahoo.com/ > > > > -- > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> > > > > > > *Yahoo! Grupos, um serviço oferecido por:* PUBLICIDADE > > <http://br.rd.yahoo.com/SIG=12fhlhppv/M=365837.7000707.7924794.2369893/D=brclubs/S=2137111264:HM/Y=BR/EXP=1132635080/A=2950750/R=2/id=noscript/SIG=10tift5qr/*http://br.movies.yahoo.com/> > ------------------------------ > *Links do Yahoo! Grupos* > > - Para visitar o site do seu grupo na web, acesse: > http://br.groups.yahoo.com/group/delphi-br/ > - Para sair deste grupo, envie um e-mail para: > [EMAIL PROTECTED]<[EMAIL PROTECTED]> > - O uso que você faz do Yahoo! Grupos está sujeito aos Termos do > Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>. > > -- -- Francisco Trindade [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> <*> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages <*> Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html