Tabela interna de 2 níveis ?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Tabela interna de 2 níveis ?

Mensagem por lugab »

Amigos, bom dia.

Não sei como criar uma tabela de 2 níveis na memória do programa e preciso aprender.

A Tabela de um único nível é tão fácil, que eu já aprendi

criação:

Código: Selecionar todos

Declare Tabela[n] 
Inicialização:

Código: Selecionar todos

For i=1 to N
    tabela[i]=0
next i  
Preenchimento:

Código: Selecionar todos

tabela[i]=conteudo 
impressão:

Código: Selecionar todos

? lin,col say tabela[i] pict "999"
Gostaria q algum dos amigos aqui do fórum me mostrassem como criar, inicializar, preencher e imprimir os dados em/de uma tabela de 2 níveis , do tipo: Tabela [a,b]


Grato
Gabriel
lugab
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tabela interna de 2 níveis ?

Mensagem por alxsts »

Olá!

Veja se te ajuda: Arrays (Matriz / Vetor). Veja também no NG as funções ASort(), AFill(), ADel(), AIns().

Mas por favor, não use mais DECLARE se você programa em Clipper 5.xx. É obsoleto demais...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabela interna de 2 níveis ?

Mensagem por Pablo César »

Gabriel, aqui no fórum tem vários exemplos sobre arrays, vetores ou matriz como queira chamar. Veja estes tópicos:

https://pctoledo.org/forum/viewto ... zes#p24010
https://pctoledo.org/forum/viewto ... t=matrizes
https://pctoledo.org/forum/viewto ... 874#p40874
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Tabela interna de 2 níveis ?

Mensagem por lugab »

Amigos, obrigado pela pronta-ajuda.

Alexandre,

o meu AVG IS bloqueou o link q vc postou, como vírus, de forma q eu nem pude conferir o seu conteúdo.

Eu agora uso o xharbour e não imagino como criar uma tabela sem usar o comando declare(), pq eu não estudei para programar. Apenas aprendi em cima de uns programas antigos assim escritos pelo antigo programador.

Aprendi a programar (pouco) olhando os citados programas e o máximo que consegui até agora, sem nenhum estudo, foi compilar o citado sisteminha em xharbour.

Alexandre, em um dos links do Pablo (abaixo) tem um exemplo postado pelo EOLO assim:

Código: Selecionar todos

declare mat[2,5,6]    //-> matriz com 2 planos, 5 linhas, 6 colunas 

mat[2.3.1]="p2l3c1"   //-> atribui "p2l3c1" na coluna 1 da linha 3 do plano 2 


Pablo,

Eu vi todos os links e não sei bem se entendi correto, mas conclui que a solução seria assim:

Esse é um exemplo da disposição dos dados ( matrícula, provento e valor)

Mat Provento Valor
001 01Salario 1.000,00
001 02H.extra 100,00
001 03FAltas -56,00
001 04Ferias 50,00
001 10Vale buzu 13,00

002 01Salario 2.000,00
002 02h.extra 50,00
--- ----------- ------

213 01Salario 1.000,00

Código: Selecionar todos

Criação:
declare Matriz [ 213, 10 ]

Inicializalão
For i=1 to 213
     For j=1 to 10
           Matriz [i,j]=0
     next j
Next i
 
Acho até que se eu ler a matriz do mesmo jeito da inicialização, nem precisarei sorteá-la antes

Então, am igos, será que estou no caminho certo ?

Se sim, esse meu código pode ser modernizado ?
lugab
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabela interna de 2 níveis ?

Mensagem por Pablo César »

lugab escreveu:Alexandre,

o meu AVG IS bloqueou o link q vc postou, como vírus, de forma q eu nem pude conferir o seu conteúdo.
Antecipei-me em responder em lugar do Alexandre para disponibilizar o conteúdo daquela página em formato pdf.
Arrays.pdf
(105.06 KiB) Baixado 275 vezes
Veja se esclarece melhor tais instruções do link que o Alexandre passou.
Esse é um exemplo da disposição dos dados ( matrícula, provento e valor)

Mat Provento Valor
001 01Salario 1.000,00
001 02H.extra 100,00
001 03FAltas -56,00
001 04Ferias 50,00
001 10Vale buzu 13,00

002 01Salario 2.000,00
002 02h.extra 50,00
Gabriel, o que o Alexandre referia-se é que não há necessidade de utilizar o Declare já com os tamanhos predeterminados. Veja como você poderia fazer:

Se você tem necessidade de exibir 3 colunas, então você faz uma matriz tridimensional (3 colunas) com N quantidade de linhas (que seriam a quantidade de registros). Mas pelo que vi na descrição do Provento contém um código + uma descrição, então seriam 4 colunas e não 3. De todas formas passo a exemplificar:

aMatriz:={}
AADD(aMatriz,{"001","01Salario","1.000,00"})
ou AADD(aMatriz,{1,1,"Salario",1000.00}) (primeiro registro)
AADD(aMatriz,{"001","02H.extra","100,00"}) ou AADD(aMatriz,{1,2,"H.extra",100.00}) (segundo registro)
e assim por diante...

Também pode "aninhar" o seu vetor utilizando outro vetor, assim:
aMatriz:={}
aTemp:={}
AADD(aTemp,"001")
AADD(aTemp,"01Salario")
AADD(aTemp,"1.000,00")
AADD(aMatriz,aTemp)
// E agora aninhar aMatriz com o vetor temporário

Se a sua segunda coluna possui um código que procura numa tabela, talvez não precise armazenar a descrição.

Para varrer a sua matriz, você pode fazer assim:

Código: Selecionar todos

nTam:=Len(aMatriz) // vai trazer a quantidade em número de linhas (qtd de registros)
nQtCol:=Len(aMatriz[1]) // vai trazer o número de colunas (se for uma tabela com qtde de coluna fixas)

For i=1 To nTam
    For u=1 To nQtCol
        ? aMatriz[i,u]
    Next
Next
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Tabela interna de 2 níveis ?

Mensagem por lugab »

Sim, Pablo, valeu a força. Entendi as "modernizadas" q vc implementou..

E o PDF q o Alexandre postou é show de bola mesmo. Explica tudinho.

Esse PDF bem q podia frequentar a sessão de downloads, de tão prestativo que é.

Muito obrigado a vcs 2

Gabriel
lugab
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tabela interna de 2 níveis ?

Mensagem por alxsts »

Olá!
Pablo César escreveu:Antecipei-me em responder em lugar do Alexandre para disponibilizar o conteúdo daquela página em formato pdf.
Obrigado Pablo. Fez bem. Os links apresentados naquela página já não funcionam mais. Creio que, em breve, nem essa página estará disponível.

A sentença DECLARE faz a mesma coisa que a PRIVATE. Declara variáveis privadas. No manual do Clipper 5.2, já era considerada obsoleta e seu uso era desencorajado. Em linhas gerais, as boas práticas de programação xBase (incluindo Harbour e xHarbour) recomendam o uso de variáveis dos tipos LOCAL e STATIC ao invés de PUBLIC e PRIVATE. Acostume-se com isso.

Já que você está se interessando pelo assunto arrays, estude um pouco sobre hashes ( Hash() ), um novo tipo de variável presente em Harbour e xHarbour. É muito legal. É um par composto por uma chave e um valor (como se fosse um dicionário), ordenado pela chave. Parece um dbf indexado, com velocidade de pesquisa muito rápida. Nesse campo valor do hash você pode armazenar qualquer coisa, incluido arrays.
[]´s
Alexandre Santos (AlxSts)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Tabela interna de 2 níveis ?

Mensagem por lugab »

Valeu por me apresentar o Hash(), Alexandre..

Todo mundo quer sistemas rápidos e essa é uma ótima dica:
Parece um dbf indexado, com velocidade de pesquisa muito rápida. Nesse campo valor do hash você pode armazenar qualquer coisa, incluido arrays.
lugab
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabela interna de 2 níveis ?

Mensagem por Pablo César »

lugab escreveu:Valeu por me apresentar o Hash(), Alexandre..
É realmente, nunca usei. Mas vivendo e aprendendo...
Se interessar ver um exemplo em Harbour, aqui tem um muito bom

Gabriel, favor notar que adicionei na minha mensagem anterior, um exemplo em cor azul, aninhando um vetor com outro temporário.

Se ainda houverem dúvidas, poste aqui o seu código que ajudaremos.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tabela interna de 2 níveis ?

Mensagem por JoséQuintas »

Talvez facilite....
conhece o array normal:

Código: Selecionar todos

declare x[10]
For nCont = 1 to 10
   ? x[ nCont ]
Next
cada elemento desses é uma variável, que pode ser array também:

Código: Selecionar todos

declare x[10][10]
For nCont = 1 to 10
   for nCont2 = 1 to 10
     // x[ nCont ] é o array que já conhecia, que é um elemento do array
      ? x[ nCont ] [ nCont2 ] // esse elemento virou outro array
   next
next
é opcional usar x[ 1, 2 ] ou x[ 1 ][ 2 ]
da segunda forma talvez facilite entender que cada elemento do array virou outro array.

x é o array geral
x[1] é o primeiro elemento do array x
x[1][1] é o primeiro elemento do array que está em x[1]


Usando um exemplo acima, temos funcionários, esse poderia ser o array principal.
declare funcionarios[3]
cada funcionário, teria nome, telefone - 2 elementos
criar e listar:

Código: Selecionar todos

declare funcionarios[3][2]

funcionarios[1][1] = "nome:primeiro"
funcionarios[1][2] = "telef:3333333"

funcionarios[2][1] = "nome:segundo"
funcionarios[2][2] = "telef:4444444"

FOR nCont = 1 TO Len( funcionarios ) // vai fazer pra cada funcionario
   FOR nCont2 = 1 TO Len( funcionarios[ nCont ] ) // cada elemento é um funcionário, então vai pegar todos os dados de cada funcionário
       ? funcionarios[ nCont ][ nCont2 ]
   NEXT
NEXT
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Tabela interna de 2 níveis ?

Mensagem por lugab »

Obrigado, Quintas.

Sim, sua postagem facilitou muito pra mim....

Gabriel
lugab
Responder