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.