Consulta mais rápida

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Consulta mais rápida

Mensagem por Eros »

Porque voce nao faz essas consultas e relatorios utilizando-se de matriz ?

Assim, so acessa o disco uma vez, nao tem processamento em disco, e nao precisa de arquivo temporario.

Processou a matriz, visualizou, imprimiu, acabou o problema, visto que o processamento via matriz e muito mais rapido que o acesso a disco.

Faz a leitura dos dados, joga numa matriz, e da matriz vc pode brincar com os dados do jeito que precisar...

Ou sera que voce vai querer consultar mais de 4096 OS de cada vendedor por dia ???
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Consulta mais rápida

Mensagem por billy1943 »

Oi, Ricardo

Aproveitando a "deixadinha" do Eros, realmente, o uso de matrizes agiliza enormemente sua situação.

Uma passada pelo arquivo de OS´s e estando matriz gerada, a impressão sai no ato.

Compensa fazer arquivos temporários quando várias funções serão satisfeitas depois, desde que o arquivo principal ainda não tenha sido modificado.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Consulta mais rápida

Mensagem por Eros »

Matrizes, quase sempre so traz beneficios.. nao precisa gravar nada em disco.. nao precisa criar indices, nao incha o HD com arquivos temporarios. As transações e calculos sao feitos na memoria, muito mais rapido e eficiente...

E voce pode criar uma browse, jogando o resultado da matriz na tela, para visualização, e imprimir a partir dai..

Ricardo, Nos fontes que te mandei do sistema de contabilidade no inicio desse ano, há varias operações, relatorios, que usam esse artificio.. Basta voce abrir os fontes, ler, visualizar.. é facil e eficiente..

Já que voce quer velocidade para seus usuarios.. lembre-se que uma matriz é limitada a 4096 linhas..(elementos).

Mas em 4095 linhas, da pra voce tratar bastante informação do que voce precisa para atender seu cliente..
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Consulta mais rápida

Mensagem por Ricardo Sales Ribeiro »

Boa tarde!

Gostaria muito de aprender a trabalhar com Matriz, infelizmente não tenho conhecimento suficiente para tal, meus
sistemas são simples, nunca usei matriz, não sei nem por onde começar.

Meu sistema de ordens de serviços, trabalha somente com duas tabelas, ou dbf´s, cadastro de Técnicos e cadastro de Ordens de Serviços.

Esse arquivo de Ordens de Serviços, tem hoje 5.000 registros com os seguintes campos:
NroOds,C,08
DatEmi,D,08
CodEqu,C,03
NomEqu,C,45
Status,C,01

Há, tenho 100 equipes, técnicos.

Como funciona: Todo dia cada técnico, recebe em media 8 a 10 os´s para instalação. Depois que o operador, digita, ele
manda imprimir, uma boleta com o que foi digitado, mais os status ´P´ de dias anteriores, que não foram finalizadas.
Isso acontece com cinco operadores ao mesmo tempo, digitando e imprimindo comandas.
Na digitação, não tem problema, estar rápido, mas quando vai imprimir, demora um pouco, porque eu entro com código do técnico e a data do dia, a rotina vai no banco e cria um arquivo temporário, aí depois mando imprimir.
Então estar demorando na hora de gerar, são cinco operadores, e o arquivo é grande.
Como posso fazer isso com matriz para melhorar? Cada operador que entrar no sistema, eu gero uma matriz com o total de todos os registros? Os cinco operadores vão gerar cinco matrizes? Ou numa única vez, ao iniciar o sistema no dia ele vai gerar uma matriz? Na digitação diária, depois de gerar a matriz, vai alimentar além do banco, esta matriz também?

Gostaria de entender e aprender usar matriz.

Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Consulta mais rápida

Mensagem por Eros »

Ricardo,


Matriz é um campo de memoria processada, que voce cria no seu sistema.. para utilizaçao de calculos rapidos.

Para criar uma matriz é assim:

Nome da matriz : { }

O nome deve ter no maximo 8 caracteres...

Para utilização é simples...

Veja o exemplo abaixo, no caso para adicionar dados uma matriz..


AADD - Adiciona dados
ADel - Deleta dados da matriz.
ASort - Organiza os dados na matriz, conforme o interesse


Exemplo de organizar dados na matriz :

Código: Selecionar todos

aSort( Matriz ,,, { |x,y| x <= y } )
asort( Fun2,,, { |x,y| Left( x , 5 )  <= Left( y , 5 ) } )
aSort( Mtz ,,, { |x,y| Str(x[1],3,0)+Str(x[2],3,0) <= Str(y[1],3,0)+Str(y[2],3,0) } )

asort( MtzRel ,,, { |x,y| Ctod(x[2]) <= Ctod(y[2]) } )  - Organizando por data crescente..
Dadas as condiçoes.. veja um exemplo simplorio de como é facil trabalhar com matrizes....

Código: Selecionar todos

If Str( New, 1 ) $ "1/2/3"

         If AbreVarios( { 98 , 121 }, xLoja + oMesBase ) .and.  AbreVarios( { 18 , 19 , 135 , 136 }, oMesBase )

            COD_CLI := Left( vCOD_CLI , 5 )

            NR->( DbReset( , 1 ) )

            Do While NR->( ! Eof() )

               If Range( vDT1 , vDT2 , NR->DT_EMISSAO ) .and.  Left( vCOD_CLI , 5 ) == NR->COD_CLI

                  xLiq := Round( NR->( VLR_MERC - DESCONTO ) , 2 )

                  NR->([b] AAdd[/b]( Brw , { "NF"                        ,;
                                      NUM_DOC                     ,;
                                      DT_EMISSAO                  ,;
                 If( VLR_MERC > VLR_TOTAL , VLR_MERC , VLR_TOTAL ),;
                                      0                           ,;
                                      DESCONTO                    ,;
                                      xLiq                        ,;
                                      ShowCont( 3 , COD_VEND )    ,;
                                      ShowCont( 9 , COD_NATOP )   ,;
                                      NUM_DOC                  } ) )

          Ni->( DbReset( , 1 ) )

            If Ni->( USeek( NR->( SERIE + NUM_DOC ) ,, 1 ) )

              Do While Ni->( NR->( SERIE + NUM_DOC ) == SERIE + NUM_DOC .and. ! Eof() )

                        Ni->([b] AAdd[/b]( Tmp , { NUM_DOC                                                       ,;
                                            " "                                                           +;
                                            ShowCont(8,COD_PROD,"Left( Mod11y()+[ - ]+DESCRICAO,38)" , 1 )+;
                                            " ³ "                                                         +;
                                            Ni->(Tran( QUANT , m_26 ) )                                   +;
                                            " ³ "                                                         +;
                                            Tran( PC_UNIT , m_6 )                                         +;
                                            " ³ "                                                         +;
                                            Tran( QUANT * PC_UNIT , m_6 )                              } ) )

                          Ni->( DbSkip() )

                       End

                    End

                 End
Para imprimir, gera-se o cabeçalho do relatorio normalmente.. para imprimir os dados, utilizamos um FOR na matriz.

For z := 1 To Len(Matriz)

Isso significa que havera um loop tantas vezes quantas for o tamanho da matriz.. e a cada linha, sera impresso o conteudo da linha da matriz..

Nao tera acesso a disco, por isso, é muito rapido o esquema..
Editado pela última vez por Toledo em 14 Jul 2014 18:29, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Consulta mais rápida

Mensagem por Eros »

Posso tentar te ajudar..mas nao imagino qual o seu nivel de conhecimento de matrizes..

Mas nao é dificil.. quando vc entender o raciocinio do mecanismo, fica muito moleza..

Acredito que explicando os passos, voce consegue.. ou seguindo exemplos como o que te mandei.. tenho exemplificações mais complexas, que posso te passar..

Qualquer coisa, me liga..

Erones/Goiania
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Consulta mais rápida

Mensagem por Eros »

Então estar demorando na hora de gerar, são cinco operadores, e o arquivo é grande.
Como posso fazer isso com matriz para melhorar? Cada operador que entrar no sistema, eu gero uma matriz com o total de todos os registros? Os cinco operadores vão gerar cinco matrizes? Ou numa única vez, ao iniciar o sistema no dia ele vai gerar uma matriz? Na digitação diária, depois de gerar a matriz, vai alimentar além do banco, esta matriz também?


Ricardo

1o problema - pelo que entendi voce fez um arquivo so das OS.. poderia ter feito uma arquivo de cabeçalho e outro da normalizaçao dos dados.. duas tabelas ficaria mais rapido que uma so.

- Voce so criara a matriz na hora de gerar o relatorio.. Uma unica matriz, resolve tudo.. nao precisa criar uma matriz para cada operador.. a matriz é criada na memoria do micro que estiver usando o sistema, logo, voce pode ter 100 micros usando o sistema, cada micro tera sua matriz para utilizaçao, mas no fonte, voce so criará uma.

A matriz nao vai alimentar o banco de dados.. a matriz SERA alimentada pelos dados do seu banco de dados.. ela servira para agilizar o procedimento de relatorios, consultas, por exemplo.

Embora a matriz possa ser usada na operaçao inversa.. mas vamos usar somente como saida dos dados...

Leia o exemplo que te mandei acima, de com alimentar uma matriz, lendo o arquivo.. alimentou a matriz com os dados que voce quer, pronto.. pode liberar os arquivos para nao pesar a rede, nao pesar o sistema, e trabalhar com os dados na matriz..

Como anotei acima, voce podera organizar os dados na matriz, sem criar indices.. sem gravar nada.. e pode mandar imprimir no video ou impressora muito facil.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Consulta mais rápida

Mensagem por Jairo Maia »

Olá Ricardo,
Ricardo Sales Ribeiro escreveu:em função do gande numero de registros estar demorando para gerar a impressão
Esta demora está na criação de um arquivo temporário que você está criando com Copy To, conforme código já postado na página anterior.

Acho que verificando aquele código, e se você puder postar sua função de impressão, vai ficar muito mais fácil resolver seu problema imediato, e acho que até mesmo você poderá começar a entender como funciona Matrizes.

Na minha opinião acho que está até razoavelmente facil agora, já que você implementou as modificações sugeridas pelo Professor Billy, no tocante a melhorar essa velocidade. Mas precisamos saber quais campos colocar numa matriz, e como envia-los a rotina de impressão, bem como possíves pequenas alterações nela.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Consulta mais rápida

Mensagem por billy1943 »

Como o Ricardo alega não "manjar" muito de matrizes (elas são excelentes dentro do Clipper), anexo um exemplo de como gerar uma matriz unidimensional
com elementos formados por uma "string" concatenando os campos necessários.
Para sua impressão basta enviar essa string para o device adequado.

Mais simples, acho impossível.

Código: Selecionar todos

FUNCTION pesqordens
local matri := {}
local nordem := 1
private codtecn := space(3)
private dataos  := ctod("//")
@ 2,07 say "Informe tecnico: "
@ 2,23 get codtecn pict "999"
@ 3,07 say "Informe a data: " 
@ 3,23 get dataos valid ! empty(dataos)  
read

if lastkey() == 27
   return
endif

select ordens
set order to 2 // por tecnico
go top
set softseek on
seek codtech
set softseek off

// nesta decisao o sistema somente entrara no Do While se:
// a) nao der EOF()
// b) o codigo do tecnico escolhido for igual ao do arquivo
// c) a data escolhida for igual a informada
    
if ! eof() .and. codigo_tecn == codtech .and. datemi == dataos

   do while ! eof() .and. nordem <= 4096

      // sera gerada uma matriz unidimensional com os campos do arquivo
      // sendo concatenados, um apos o outro, limitados pela largura da
      // linha 
      // notar a contagem de elementos da matriz pelo numero de ordem
      // que caso ultrapasse 4096 para de acrescer elementos na matriz
  
      aadd( matri,( nrods + " " + codequ + " " + nomequ ))
      dbskip()
      nordem ++
 
   enddo
 
    if len(matri) > 0 // testar se a matriz esta com dados
       rotina_impressao(matri)   //enviar a matriz como parametro
       return  
    endif

endif

return // nao achou nada

PROCEDURE rotina_impressao(matriz)
// proceder como se fosse imprimir um arquivo sequencial qualquer
local tamanho := len(matriz)
local num := 0
local contagem := 1
...
cabecalho() // cabecalho do relatorio com o set printer adequado

for num := 1 to tamanho

    @ prow()+1,pcol()+1 say matriz[num] // imprime cada elemento da matriz
    contagem ++

    if contagem > 60
       eject
       cabecalho()
       contagem := 1
    endif

next

// fecho do relatorio ....
return 
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Consulta mais rápida

Mensagem por Eros »

Caro Billy,

Eu não imagino o nível de conhecimento do amigo Ricardo.. tentei explicar a ele, sobre como trabalhar com matrizes...

Foi uma das primeiras coisas que aprendi a trabalhar. É notável que já encontrei e ainda encontramos por ai, programadores delphi e java que não sabem o que é matriz. Achei incrível.. gente que saiu da faculdade e não ouviu falar sobre como trabalhar com matriz em programação. Parece que os caras de hoje, só conhecem sql e nada mais.

Por isso, acho que o amigo Ricardo tem tempo e condições de aprender. E aprendendo, poderá facilitar muito o trabalho dele e dar mais qualidade e agilidade as aplicações dele.

Sabe, eu a forma de trabalhar com matriz tão fácil, tão simples, que nem sei como ensinar... é simplesmente muito fácil e eficiente.. Mas, estou disposto a oferecer todo apoio para que o colega possa aprender.
Responder