Geraldo (gbsilva) Posted June 27, 2015 Report Share Posted June 27, 2015 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, Ronaldbuch 1 Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted June 28, 2015 Author Report Share Posted June 28, 2015 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.) endifO 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 alFuncoCad[8]:oFont := oFont Agradeço a todos, mas se alguém tiver alguma idéia sugestóes serão bem vindas. Sds, Quote Link to comment Share on other sites More sharing options...
sambomb Posted June 29, 2015 Report Share Posted June 29, 2015 Fica a dica que objetos podem ser considerados como matrizes, então é possível fazer algo assim:oObjeto := TObjeto():New()? oObjeto[2] Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted June 29, 2015 Author Report Share Posted June 29, 2015 Obrigado pela dica estudarei. Sds, Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.