Página 1 de 1

Contar registros antigo count do clipper

Enviado: 19 Out 2022 18:41
por alexlucc
Boa tarde Pessoal

To precisando contar os registros agrupando pelo campo "codpro" da tabela em questão e guardar em uma variável para gravar em banco posteriomente e estou enfrentando dificuldades.

Gostaria de um exemplo com poderia fazer usando o count ou outra forma de fazer no clipper, pois em sql eu já sei como fazer.

Contar registros antigo count do clipper

Enviado: 20 Out 2022 17:12
por alxsts
Olá!

Veja se atende tua necessidade:

Código: Selecionar todos

// Alexandre Santos - 20/10/2022
#include "inkey.ch"

PROCEDURE Main()

   LOCAL p, aProd, cProd, aList := {}, Getlist := {}
   
   Cls

   If ! hb_FileExists( "SE225.DBF" )
      If ! DbCreate( "SE225.DBF", { { "codpro", "C", 5, 0 } }, NIL, .T., "tbProd", NIL, NIL, NIL )
         Alert( "Falha ao criar arquivo teste" )
         Return
      Else
         For Each p In { "00005", "00005", "04798", "04154", "00005", "00011", "00005", "00007", "00005", "00007", "04798" }
            tbProd->( DbAppend() )
            tbProd->codpro := p
         Next
      Endif
   Else
      If ! DbUseArea( .T., NIL, "SE225.DBF", "tbProd", .T. )
         Alert( "Falha ao abrir arquivo teste" )
         Return
      Endif
   Endif

   cProd := "     "

   @ 10,10 Say "Digite um codigo de produto ou ENTER para contar todos:" Get cProd Pict "99999"
   Read

   If LastKey() == K_ESC
      RETURN
   Endif

   tbProd->( DbGoTop() )

   aProd := ContarProd( cProd )

   If Empty( aProd )
      Alert( "Nenhum produto encontrado" )
   Else
      If Len( aProd ) > 1
         ASort( aProd,,, { |x,y| x[1] <= y[1] } )
      Endif

      For Each p in aProd
         AAdd( aList, PadC( p[1], 10 ) + Transform( p[2], "99999" ) )
      Next
      AChoice( 12, 10, 20, 30, aList )
   Endif

   tbProd->( DbCloseArea() )

   Cls

RETURN
//--------------------------------------------------

FUNCTION ContarProd( cProd )

   LOCAL aRet := {}, bFilter, nPos

   If Empty( cProd )
      bFilter := { || .T. }
   Else
      bFilter := { || tbProd->codpro == cProd }
   Endif

   While tbProd->( ! Eof() )
      If Eval( bFilter )
         If ( nPos := AScan( aRet, { |x| x[1] == tbProd->codpro } ) ) == 0
            AAdd( aRet, { tbProd->codpro, 1 } )
         Else
            aRet[ nPos, 2 ] += 1
         Endif
      Endif
      tbProd->( DbSkip() )
   Enddo
   
RETURN aRet
//--------------------------------------------------

Contar registros antigo count do clipper

Enviado: 24 Out 2022 11:36
por JoséQuintas
Apenas comentário:

No caso do DBF, todo processamento é no próprio programa, e não na base de dados, como é o caso do SQL.
Lógico, tem como fazer acesso a DBF usando comandos SQL, mas isso não faz parte do Harbour padrão.

O que está querendo poderia ser feito usando TOTAL ON ...., o que criaria um outro DBF com os totais.
Sinceramente nunca usei, vai precisar procurar detalhes se quiser usar.

Nem sempre o "automático" é o mais rápido, e acabamos acostumando a não usar certas coisas automáticas.
Não é o caso do SQL, onde o gerenciador do SQL otimiza tudo ao máximo pra ganhar velocidade.

Contar registros antigo count do clipper

Enviado: 24 Out 2022 20:09
por alxsts
Olá!
JoséQuintas escreveu:O que está querendo poderia ser feito usando TOTAL ON ...., o que criaria um outro DBF com os totais.
Nada a ver... você consegue fazer isto? Se, ao invés de TOTAL ON tivesse escrito COUNT TO, faria mais sentido e resolveria o problema para um código específico de produto...

Claro que não dá para comparar DBF com SQL mas, se compararmos as funcionalidades de alguns comandos DBF com comandos SQL que utilizam funções agregadas, podemos dizer que:
- TOTAL ON... equivale a SELECT SUM(...)...
- AVERAGE ... TO equivale a SELECT AVG(...)...
- COUNT TO... equivale a SELECT COUNT(...)...
alexlucc escreveu:To precisando contar os registros agrupando pelo campo "codpro" da tabela em questão e guardar em uma variável para gravar em banco posteriomente e estou enfrentando dificuldades.
O que o colega precisa é o equivalente em DBF para um SELECT COUNT(...)...,GROUP BY... o que não existe em DBF.

O exemplo que postei equivale a

Código: Selecionar todos

SELECT codpro, COUNT(*) FROM product_details GROUP BY codpro;

Contar registros antigo count do clipper

Enviado: 25 Out 2022 11:17
por JoséQuintas
Ok, TOTAL ON não tem pra quantidade de registros, a não ser que exista um campo com o valor 1.