Página 1 de 1

Criar Array de Objetos

Enviado: 15 Out 2010 11:38
por gralak
Iai galera blz
recentemente me deparei com uma duvida que preciso da ajuda de vcs

Comecei fazer a criação de Classes e acontece o seguinte.
Exemplo: Tenho duas tabelas VENDA E ITENS
para pegar a VENDA que é somente uma linha ta traquilo
mas e ai quando tenho que pegar os itens que são varias linhas?


Eu estive pesando em algo com

MATRIZ[1]:nomeProduto ?????

Bom existe algo assim ou algo que eu possa fazer para agilizar essa situação
tendo que fazer o loop somente na Classe ...

vlw galera até+++

Re: Criar Array de Objetos

Enviado: 15 Out 2010 12:11
por alxsts
Olá!

Posso sugerir que você crie um método que recupere os itens de uma venda (através do código da nota, por exemplo) e armazene internamente na classe. Crie outro(s) métodos que percorram estes itens e os devolva.

Re: Criar Array de Objetos

Enviado: 15 Out 2010 15:14
por gralak
Então mas como eu faria pra armazer esses dados na classe e recupera-los, posteriormente de uma só vez ??

Re: Criar Array de Objetos

Enviado: 15 Out 2010 15:18
por alxsts
Olá!

Crie uma variável exportavel interna da classe, do tipo array ou hash onde o método que lê os itens da nota possa armazená-los. Depois, em outro método, você poderia recuperar esta variável de instância e exportar para o programa que instanciou a classe.

Re: Criar Array de Objetos

Enviado: 18 Out 2010 09:59
por sambomb

Código: Selecionar todos

DATA aItens AS ARRAY INIT {}

Method AddItem( aInfoItem ) CLASS TVENDA
   aAdd(::aItens,aInfoItem)
Return Len(::aItens)

Re: Criar Array de Objetos

Enviado: 18 Out 2010 10:03
por sambomb
Para importar e exportar poderia usar arquivo INI

Poderia usar arquivo INI e zipar ele com uma senha e mudar o nome do arquivo final:
C:\SuaPasta\000001.venda
[Geral]
NumeroDaVenda=000001
NumerosDeItens=X (2 no exemplo)
[Itens]
Codigo001=123456
Preco001=10.00
Descricao001=PRODUTO DE TESTE
Codigo002=000001
Preco002=125.00
Descricao002=PRODUTO DE R$125.00

Re: Criar Array de Objetos

Enviado: 18 Out 2010 10:15
por gralak
Ok Companheiro valeu mesmo... Vou implementar a idéia até+++

Re: Criar Array de Objetos

Enviado: 18 Out 2010 19:19
por clrod
Olá

O Harbour tem como serializar e salvar em arquivo diretmente. É uma extensão do antigo formato .mem, porém mais poderoso. Estou tentando achar onde tem informação sobre ele mas tá difícil.

T+

Re: Criar Array de Objetos

Enviado: 19 Out 2010 09:34
por rochinha
Amiguinhos,

No caso de arquivos .MEM ao utilizar o salvamento de variaveis nele ele irá levar todas as variaveis ativas na memoria, no seu caso para facilitar, crie as variaveis com referencia direta a tabela manipulada, ex:

Código: Selecionar todos

...
CLIENTES_NOME := "ROCHINHA"
CLIENTES_FONE := "(011)3534-3099"
...
Use o comando SAVE TO clientes ALL LIKE CLIENTES_*

Para auxiliar na sua empreitada analise o trecho abaixo:

Código: Selecionar todos

#include "hbclass.ch"  // cabeçalho para uso de classe 

CLASS Tnfwh
   DATA   cTitle
   DATA   aTables
   DATA   aFields

   METHOD New( cTitle, aTables ) CONSTRUCTOR

   METHOD AddReg() 
   METHOD recuperarPorCodigo( cCod ) 
   METHOD incluir() 
ENDCLASS

METHOD New( cTitle, aTables ) CLASS Tnfwh
   ::cTitle  := Tnfwh
   ::aTables := aTables
   ::aFields := {}
return nil

METHOD AddReg() CLASS Tnfwh
   LOCAL field_cnt := fcount()
   LOCAL counter := 0
   private field_name
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = lower(field(counter))
       ::aFields
       public &field_name
   next
RETURN Self

METHOD recuperarPorCodigo( cCod ) CLASS TCliente 
   local lRet 
   use clientes shared new 
   index on codigo to i_cod 
   seek cCod 
   if found() 
      ::codigo := allTrim( clientes->codigo ) 
      ::nome  := allTrim( clientes->nome ) 
      lRet := .t.       
   else 
      lRet := .f. 
   endif 
   close clientes 
return lRet

METHOD incluir() CLASS TCliente 
   local cNovoCod 
   use clientes shared new 
   dbGoBottom() 
   cNovoCod = strZero( val(clientes->codigo)+1, 5  ) 
   if ( alltrim( ::nome ) == "" ) 
      alert( "Campo NOME não pode ser vazio no método de inclusão!" ) 
      close clientes 
      return .f. 
   endif 
   dbAppend() 
   clientes->codigo := cNovoCod 
   ::codigo := cNovoCod 
   clientes->nome   := upper( ::nome ) 
   dbCommit() 
   close clientes 
return .t.

FUNCTION InitVars()
   local field_cnt := fcount(), counter := 0
   private field_name
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = lower(field(counter))
       public &field_name
   next
   return(.t.)

FUNCTION initObjs
   local field_cnt := fcount(), counter := 0
   private field_name, retorno := {}
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = "o" + lower(field(counter))
       field_reto = AADD( retorno, "o" + lower(field(counter)) )
       public &field_name
   next
   return retorno

FUNCTION RefreshObjs
   local field_cnt := fcount(), counter := 0
   private field_name, retorno := {}
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = "o"+alltrim(lower(field(counter)))+":Refresh()"
       eval( {|| &field_name })
   next
   return retorno

FUNCTION EqualVars
   local field_cnt := fcount(), counter := 0
   private field_name, retorno := {}
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = LOWER(FIELD(counter))
       M->&field_name := _FIELD->&field_name
   next
   return retorno

FUNCTION ReplaceVars
   local field_cnt := fcount(), counter := 0
   private field_name, retorno := {}
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = LOWER(FIELD(counter))
       _FIELD->&field_name := m->&field_name
   next
   return retorno

FUNCTION ReleaseVars
   local field_cnt := fcount(), counter := 0
   private field_name, retorno := {}
   field_cnt = fcount()
   for counter = 1 to field_cnt
       field_name = LOWER(FIELD(counter))
       RELEASE m->&field_name
   next
   return retorno
Este é um código puramente academico e não foi testado.