Página 1 de 1

Imprimir recebimento de leite dentro de um calendário

Enviado: 27 Mar 2008 20:00
por rubens
Pessoal to fazendo o sistema para um laticinio, e no final do mes tem que imprimir o extrato de fornecimento de leite por dia dentro de um calendario.

O DBF contem os seguintes campos
CODIGO - C - 6 - CODIGO DO PRODUTOR
LITROS - N - 12,1 - NUMEROS DE LITROS POR LANCAMENTO
DATA - D - 8 - DATA DO LANCAMENTO.

Preciso preenher o calendario abaixo com a qtde litros por fornecedor no dia.

|Dia Qtde | Dia Qtde| Dia Qtde| Dia Qtde|
|01 1.239,0| 02 | 03 | 04 |
|05 | 06 | 07 | 08 |
|09 1.239,0| 10 | 11 | 12 |
e vai ate o dia 31


Não estou conseguindo, fazer isso... O que tá pegando é que os lancamentos no dbf nao sao feitos todos os dias senao criava uma matriz e blz.. mas o dia que falhar não dá pra criar um for x = 1 to 31.. tem mes que nao tem dia 31 e o produtor tb nao entrega o leite todos os dias...

Alguem já montou isso.. sabe como fazer para preencher esse relatorio...

Obrigado
Rubens

Enviado: 27 Mar 2008 20:14
por Maligno
Até pode criar uma matriz pra isso sim. No dia em que não houver qualquer quantidade, simplesmente preencha o elemento com zero. Ao imprimir, você pode tanto imprimir com zero, quanto ignorar esse dia. Com relação ao número de dias do mês, também. Inicialmente, inicia em 1 e vai até 31. É só fazer um teste pra limitar o trabalho da malha de acordo com a quantidade de dias do mês.

Enviado: 27 Mar 2008 20:22
por rubens
Certo... mas vou usar como parametro para preencher esta matriz... o que.. o for x ou os dados selecionados no dbf

não tou conseguindo visualisar... tem como passar algo pratico... como um exemplo ??/

Rubens

Enviado: 27 Mar 2008 20:39
por Maligno
A idéia é resolver o problema em três etapas.

1) Inicialização da matriz.
Crie uma matriz com 31 elementos, um para cada dia. Cada elemento será uma matriz com o número do dia, seqüencialmente numerados, e a quantidade. A quantidade virá, claro, do DBF. No DBF você não terá os 31 dias. Faltarão alguns dias no intervalo e, provavelmente, no final, já que nem todos os meses têm 31 dias. Então, ao numerar o dia, você já inicializa a quantidade com zero.

2) Carga dos dados.
Encontrado o cliente em questão e com o mês selecionado, para cada registro encontrado, você procura pelo dia na matriz e salva a quantidade encontrada no registro. Claro que, havendo mais de uma entrega no mês, você soma com o que houver na matriz.

3) Impressão.
Na malha FOR/NEXT de impressão, sua contagem irá até o último dia do mês em questão, e não 31. Dentro da malha, supondo que você não queira imprimir os dias com quantidade zero, é só fazer um teste simples. Se a quantidade for zero, force o salto da malha para o topo (LOOP).

Claro que você não precisa necessariamente utilizar uma matriz. Só usei-a pra tornar a solução mais fácil. Pode-se também fazer isso diretamente com os dados do DBF. Só que os controles ficam mais chatos.

Enviado: 27 Mar 2008 21:46
por rubens
Eh... realmente pensei em fazer usando diretamente o dados do dbf, já que se usar a matriz o servico sera dobrado... bom.. vou mexer o bolo aqui para ver o que vira.. e quando tiver algo concreto posto o resultado aqui..

Obrigado

Enviado: 28 Mar 2008 05:22
por Maligno
Não chega a ser um trabalho tão grande assim. Aliás, em vista da facilidade que traz, é um trabalho até pequeno. Os controles ficam mais fáceis. :)

Enviado: 28 Mar 2008 11:33
por gvc

Código: Selecionar todos

xdata := ctod('01/01/2008')
xmes := month(xdata)
m_qtd := {}
while month(xdata) = xmes
   aadd(m_qtd, {xdata, 0})
   xdata++
end

use recebido index receb01 // é o arquivo das quantidades recebidas
dbseek(dtos(xdata, .T.))
while !eof() .and. month(data_rec) = xmes
   xpos := ascan(m_qtd, data_rec)
   if xpos > 0
      m_qtd[xpos, 2] += qtd_rec // campo quantidade recebida de leite
   end
   dbskip()
end

for i := 1 to len(m_qtd)
   ? m_qtd[i, 1], m_qtd[i, 2]
next
É uma base para vc fazer o que deseja.
Espero ter ajudado. Boa sorte.

Enviado: 29 Mar 2008 06:31
por rubens
Olá..

realmente quebrei a cabeça para usar uma matriz com dua dimensoes.. mas não, então resolvi usar uma matriz simples... preenchida com 31 posições zeradas.. daí foi só pesquisar no dbf o dia e acrescentar o valor desse dia usando a posição na matriz.. Problema resolvido..

aDIA := {}
FOR X = 1 TO 31
AADD(aDIA,0.0)
NEXT

WHILE !EOF()
nDIA := DAY( MLT->DATA )
aDIA[nDIA] += MLT->LITROS
DBSKIP()
ENDDO

Obrigado pessoal pela ajuda

Enviado: 29 Mar 2008 09:25
por Pablo César
Dependendo da situação, eu também uso MATRIZ com elementos concatenados. Isto é, as vezes decido guardar duas informações num mesmo elemento. Claro que as suas posições SEMPRE são fixas. Isto me facilita na hora de pesquisa. Funciona muito bem, principalmente na utilização do ACHOICE que apenas permite MATRIZ UNIDIMENSIONAL. Outra forma de não fazer matriz bidimensional, seria a criação de duas matrizes com a mesma quantidade de elementos. Mas a dificuldade acresce quanto precisamos sortear ou ordenar as matrizes. Daí que concateno cada elemento da matriz e processo depois desdobrando-o.

Enviado: 29 Mar 2008 09:41
por Maligno
rubens escreveu:realmente quebrei a cabeça para usar uma matriz com dua dimensoes.. mas não, então resolvi usar uma matriz simples...
E eu achando que falando de duas dimensões estava facilitando pro seu lado. :)))
Se bem que, pensando como leigo nessa área, não seria ideal também incluir o valor da entrega? Imagino que leite não tem preço fixo, dia a dia, no mês todo. Se for realmente assim, o ideal seria realmente incluir mais um elemento na matriz para o preço, para que sejam impressos os valores parciais dia-a-dia e o total do mês.

Sistema Laticinio

Enviado: 29 Mar 2008 14:07
por toya
Rubens... tenho Sistema de Laticinio, conforme e-mail enviado...

Enviado: 31 Mar 2008 09:55
por gvc
[Rubens]
Qual foi sua dificuldade de usar matriz multidimensional?

Usar o dia foi uma boa saida.
O que não pode acontecer é vc precisar fazer isso com mais de um mes.
Se vc tiver que processar do dia 15 de um mes até o dia 14 do outro, o esquema já não funciona mais.

Enviado: 04 Abr 2008 22:37
por rubens
Alguem sabe me dizer porque nao recebo emails do andamento dos meu proprios topicos... nao recebi um e-mail sequer deste topico...
e a caixa notificar-me quando for respondida está marcada.. enao tenho nenhum bloqueador de spam é direto no hotmail.