Jump to content
Fivewin Brasil

Igualar atributos de uma classe através de uma array


Geraldo (gbsilva)

Recommended Posts

Pessoal estou precisando criar um método numa classe para igualar dinamicamente atributos de uma classe a valores de uma array:

Imagine que tenho uma array com os seguintes valores e posições:

//-> esses valores eu obtenho de uma tabela e carrego na array, aqui é só um exemplo

aQyr := {10,"Aqui um texto",34,"Outro texto"}

No método eu passaria em primeiro o nome do meu atributo e a posição na array a qual seria atribuida a ele

:: Obter( { {::codigo,aQry[1,1]},;
{::texto1,aQry[1,2]},;
{::valor,aQry[1,3]},;
{::texto2,aQry[1,4]} } )

e depois ao chamar os atributos retornaria isso ::codigo seria 10, ::texto1 seria "Aqui é um texto" etc.

Em outra situação carregaria minha array aQry com outros valores e depois chamaria como acima, ou seja, seja um método genérico para várias ocasiões.

aQyr := {3,"Geraldo","Silva"}

No método eu passaria em primeiro o nome do meu atributo e a posição na array a qual seria atribuida a ele

:: Obter( { {::id,aQry[1,1]},;
{::nome,aQry[1,2]},;
{::sobrenome,aQry[1,3]} } )

ao chamar esses novos atributods deveria retornar ::id seria 3 ::nome seria "Geraldo" e ::sobrenome seria "Silva"

Tentei fazer assim, mas não deu certo, o valor é passado corretamente, mas não consigo recuperá-lo pelo atributo.

METHOD Obter(uValues) CLASS TGbSoftware
local i
for i = 1 to Len(uValues)
uValues[1] := uValues[2]

//-> aqui eu queria que o nome do atributo passado fosse igualado a posição 2 do array, isso até é feito, mas não consigo

recuperá-lo como disse acima

next

return(.t.)

Gostaria que após chamar o método ao fazer um teste assim, por exemplo:

? ::nome me retornasse o "Geraldo"

Será que existe um meio de se fazer isso

Agradeço atencipadamente.

Sds,

Link to comment
Share on other sites

Pessoal achei uma solução parcial, mas gostaria de explicar o motivo pelo qual estava tentando fazer esse método. Alguns dos meus fontes uso para complilar com a Sqllib ou TDolphin, então estou tentando otimizá-los, pois em determinados pontos tenho que escrever muitas linhas.

Estou postando aqui um modo que fiz com meu pouco conhecimento para economizar um pouco e padronizar os fontes.

Exemplo real:

1) Atualmente faço assim:

//-> (I) faço o SELECT
cQry := "SELECT ...."
//-> (II) depois faço assim
#ifdef rdd_sqllib //-> se for sqllib assim
aQry := SqlArray(cQry)
nQry := Len(aQry)
#else //-> se for tDolphin uso assim
oQry := oServer:Query(cQry)
nQry := oQry:Lastrec()
#endif
if nQry = 0
GbMsg("Nenhum funcionário localizado!",,2)
return(.f.)
endif
//-> (III) o resultado vai para um array também dependendo da RDD
#ifdef rdd_sqllib
for i = 1 to nQry
aAdd(::aFuncionarios,{aQry[i,1],;
Padr(aQry[i,2],50),;
Padr(aQry[i,3],30),;
aQry[i,4],;
aQry[i,5],;
aQry[i,6],;
Padr(aQry[i,7],10),;
Padr(aQry[i,8],10),;
Padr(aQry[i,9],100),;
Padr(aQry[i,10],10),;
aQry[i,11],;
Padr(aQry[i,12],80),;
Padr(aQry[i,13],30),;
aQry[i,14],;
Padr(aQry[i,15],8),;
Padr(aQry[i,16],11),;
Padr(aQry[i,17],12),;
Gbdataf(aQry[i,18]),;
aQry[i,19],;
aQry[i,20],;
aQry[i,21],;
Padr(aQry[i,22],10),;
Padr(aQry[i,23],20),;
aQry[i,24],;
aQry[i,25],;
aQry[i,26] } )
next
#else
While !oQry:Eof()
aAdd(::aFuncionarios,{oQry:FieldGet(1),;
oQry:FieldGet(2),;
oQry:FieldGet(3),;
oQry:FieldGet(4),;
oQry:FieldGet(5),;
oQry:FieldGet(6),;
oQry:FieldGet(7),;
oQry:FieldGet(8),;
oQry:FieldGet(9),;
oQry:FieldGet(10),;
oQry:FieldGet(11),;
oQry:FieldGet(12),;
oQry:FieldGet(13),;
oQry:FieldGet(14),;
oQry:FieldGet(15),;
oQry:FieldGet(16),;
oQry:FieldGet(17),;
oQry:FieldGet(18),;
oQry:FieldGet(19),;
oQry:FieldGet(20),;
oQry:FieldGet(21),;
oQry:FieldGet(22),;
oQry:FieldGet(23),;
oQry:FieldGet(24),;
oQry:FieldGet(25),;
oQry:FieldGet(26) } )
oQry:Skip()
End
oQry:End()
#endif

2) Aqui as melhorias
**************************************************************************
//-> Criei dois métodos para substituir todo esse código acima apenas assim:

//-> (II) executa o select sem especificar #ifdef que esta no método ::ExecuteQry(cQry)

if !::ExecuteQry(cQry)
GbMsg("Nenhum funcionário localizado!",,2)
endif

/* (III) Esse é o melhor, ou seja, adiciono a mesma array com apenas uma chamada ao método ::gbLoad(aArray)
e economizo um monte de linhas
*/
if !::gbLoad(::aFuncionarios)
return(.f.)
endif


O outro método que estou tentando fazer é porque quando uso Sqllib um determinado campo texto, por exemplo nome de tamanho 80 quando uso SqlArray ele retorna o tamanho sem os espações, ou seja, 20, 30 mas nunca o tamanho real do campo na tabela, por isso tenho de usar o Padr(vetor[i,1],80).
A TDolphin ao contrário retorna o tamanho real do campo, como não achei uma solução melhor vou usar Padr() em todos, pois a idéia inicial era usar só para Sqllib, mas acho que dará certo indepedente da RDD.

O método gbLoad() tem outras funções, por exemplo, carregar dados na DbCombo, apenas incluindo mais duas arrays na chamada e alguns outros parâmetros e usar como abaixo, pois com a TDolphin não funciona a DbCombo com alias (pelo menos foi o que me disse o Daniel há um tempo atras).

REDEFINE DBCOMBO oCad[8] VAR oFunc:registro ID 101 OF oDlg ;
ITEMS aFunc LIST alFunc
oCad[8]:oFont := oFont

Agradeço a todos, mas se alguém tiver alguma idéia sugestóes serão bem vindas.

Sds,

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...