Contar registros antigo count do clipper

Forum sobre SQL.

Moderador: Moderadores

alexlucc
Usuário Nível 1
Usuário Nível 1
Mensagens: 49
Registrado em: 13 Nov 2016 19:19
Localização: Nova Iguaçu /rj

Contar registros antigo count do clipper

Mensagem 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.
Anexos
Tabela item de venda.png
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Contar registros antigo count do clipper

Mensagem 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
//--------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Contar registros antigo count do clipper

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

Contar registros antigo count do clipper

Mensagem 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;
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Contar registros antigo count do clipper

Mensagem 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.
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/
Responder