Criar Array de Objetos

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
gralak
Usuário Nível 3
Usuário Nível 3
Mensagens: 233
Registrado em: 21 Mar 2007 13:28
Localização: Cianorte/PR

Criar Array de Objetos

Mensagem 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é+++
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Criar Array de Objetos

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
gralak
Usuário Nível 3
Usuário Nível 3
Mensagens: 233
Registrado em: 21 Mar 2007 13:28
Localização: Cianorte/PR

Re: Criar Array de Objetos

Mensagem por gralak »

Então mas como eu faria pra armazer esses dados na classe e recupera-los, posteriormente de uma só vez ??
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Criar Array de Objetos

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Re: Criar Array de Objetos

Mensagem por sambomb »

Código: Selecionar todos

DATA aItens AS ARRAY INIT {}

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

Rca Sistemas - Itaocara - RJ
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Re: Criar Array de Objetos

Mensagem 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
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
gralak
Usuário Nível 3
Usuário Nível 3
Mensagens: 233
Registrado em: 21 Mar 2007 13:28
Localização: Cianorte/PR

Re: Criar Array de Objetos

Mensagem por gralak »

Ok Companheiro valeu mesmo... Vou implementar a idéia até+++
clrod
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 17 Nov 2009 13:42
Localização: São Paulo - SP

Re: Criar Array de Objetos

Mensagem 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+
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Criar Array de Objetos

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder