Clipper On Line • Ver Tópico - Meu modo de trabalho

Meu modo de trabalho

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Meu modo de trabalho

Mensagempor JoséQuintas » 12 Jul 2020 22:29


03/03/2020  02:33         1.254.539 jpcidade.dbf
09/07/2020  19:02         1.376.894 jpitem.DBF
09/07/2020  19:00        11.028.454 jpcadastro.DBF
09/07/2020  21:18        16.377.672 jpbancario.dbf
              20 arquivo(s)     31.322.316 bytes


Tô eliminando tudo, daqui a pouco só vai sobrar o contábil.
Esse vou remodelar antes de passar pra MySQL.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 13 Jul 2020 17:41

Não pensei que ia dar tanto trabalho ficar apagando fonte.

09/07/2020  21:18           502.533 jppreco.DBF
03/03/2020  02:33         1.254.539 jpcidade.dbf
09/07/2020  19:02         1.376.894 jpitem.DBF
09/07/2020  21:18        16.377.672 jpbancario.dbf
              19 arquivo(s)     20.294.143 bytes


Menos outro.

O que fui deixando pra depois.... pois é... em breve não tem depois....
A primeira vista, esse bancário vai dar trabalho, porque ainda não sei como vou fazer certas coisas em SQL.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 13 Jul 2020 21:40

O fonte de agora é daqueles....

fonte Harbour, pra gerar VBScript pra Html, e mais o ADO.... rs

Isso junta PRG, HTML, VBScript, ADO, tudo no mesmo fonte.... aff

E isso, só pra não apagar o fonte fora de uso.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 14 Jul 2020 17:22

Tem coisa no SQL que pode ser considerada chata ou não, depende do ponto de vista.

Com o DBF posicionado, bastava verificar isto:
" DE ICMS " $ jpitem->ieDescri

mas com SQL:
STATIC FUNCTION IsComplementoICMS( nIdNotFis )

   LOCAL lSim := .F.
   LOCAL cnSQL := ADOClass():New( AppConexao() )
   
   WITH OBJECT cnSQL
      :cSQL := "SELECT COUNT(*) AS QTD" + ;
         " FROM JPNOTFIS" + ;
         " LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPNOTFIS.NFPEDIDO" + ;
         " LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
         " WHERE JPNOTFIS.IDNOTFIS = " + NumberSQL( nIdNotFis ) + ;
         " AND JPITEM.IEDESCRI LIKE '% DE ICMS %'"
      :Execute()
      lSim := :Number( "QTD" ) != 0
      :CloseRecordset()
   ENDWITH
   
   RETURN lSim


Olhando como pessimista: muito fonte pra uma coisa que era simples
Olhando como otimista: nenhum arquivo aberto, apenas está perguntando pro servidor.

Comando complicado? só lembrar do dBase

- faz o relacionamento entre os arquivos, ao invés de SET RELATION é JOIN
- dá o filtro, ao invés de FOR xxxx é WHERE xxxx
- A diferença no SQL é que tudo vém, não apenas o registro atual de JPNOTFIS, vém todos os produtos relacionados

O comando relaciona nota fiscal com pedidos, pedidos com produtos de pedido, produto de pedido com o cadastro de produtos.
A intenção aqui é trabalhar com a descrição de todos os produtos que estão na nota/pedido
O SELECT vai considerar todos os produtos do pedido que gerou a nota fiscal (de cada nota, se fossem várias).
O filtro vai considerar apenas descrição contendo " DE ICMS " na descrição e somente da nota fiscal indicada.
O retorno é a variável QTD que contém a quantidade de registros.
É um comando grande pra só retornar um número, mas tem muita tabela envolvida.
Se o número for diferente de zero, quer dizer que encontrou.

Não importa o tamanho do comando, é rápido, e pela rede só passa esse número do resultado, o que não ocupa tempo de rede ou de terminal.

Apesar de posicionado, em DBF ser prático, se fosse fazer inteiro em DBF, teria USE/SELECT/SEEK/DO WHILE/etc,
Desse jeito, não precisa estar aberto, não tem erro de usar índice errado, índice corrompido, etc. etc., sempre funciona.
Como eu disse, dá pra olhar pelo lado otimista e pessimista.
Prefiro pelo lado otimista, de que sempre funciona, é rápido, e não precisa se preocupar com índices, arquivos abertos, etc.

Estou usando isso na geração de XML da nota fiscal, na parte de cobrança.
Também poderia pegar essa informação durante a geração do bloco produtos, o que eliminaria essa rotina desse bloco.
Ou poderia ter a nota inteira numa variável, numa classe guardando o conteúdo da nota... seria válido também.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 16 Jul 2020 16:17

Agora mudei este, de reajuste de preços.

      Mensagem( "Aguarde, aplicando reajuste" )
      SELECT jppreco
      GOTO TOP
      DO WHILE ! Eof()
         IF Val( jppreco->pcProduto ) != nIdProduto
            SKIP
            LOOP
         ENDIF
         IF Val( jppreco->pcStatus ) != 1
            SKIP
            LOOP
         ENDIF
         IF jppreco->pcReajuste != mpcReajuste
            SKIP
            LOOP
         ENDIF
         RecLock()
         IF mTipoReajuste == "P"
            REPLACE ;
               jppreco->pcValor  WITH jppreco->pcValor + ( jppreco->pcValor * mPercent / 100 ), ;
               jppreco->pcInfAlt WITH LogInfo()
         ELSE
            REPLACE ;
               jppreco->pcValor  WITH jppreco->pcValor + mPercent, ;
               jppreco->pcInfAlt WITH LogInfo()
         ENDIF
         RecUnlock()
         WITH OBJECT cnSQL
            :QueryCreate()
            :QueryAdd( "PHCADASTRO",  jppreco->pcCadastro )
            :QueryAdd( "PHPRODUTO",   jppreco->pcProduto )
            :QueryAdd( "PHFORPAG", jppreco->pcForPag )
            :QueryAdd( "PHVALOR",  jppreco->pcValor )
            :QueryAdd( "PHOBS",    "REAJ." + iif( mTipoReajuste == "P", "PERCENTUAL", "VALOR" ) + " " + iif( mPercent > 0, "+", "" ) + Ltrim( Str( mPercent ) ) )
            :QueryAdd( "PHDATA",   mData )
            :QueryAdd( "PHHORA",   iif( mData == Date(), Time(), "" ) )
            :QueryAdd( "PHINFINC", jppreco->pcInfAlt )
            :QueryExecuteInsert( "JPPREHIS" )
         ENDWITH
         SELECT jppreco
         SKIP
      ENDDO
      MsgExclamation( "Fim do reajuste!" )
   ENDDO


mudei pra isto:

      Mensagem( "Aguarde, aplicando reajuste" )
      WITH OBJECT cnSQL
         nMultiplica := iif( cTipoReajuste == "P", ( 100 + nPercent ) / 100, 1 )
         nSoma       := iif( cTipoReajuste == "P", 0, nPercent )
         cLogInfo    := LogInfo()
         cTime       := Time()
         :cSQL := "UPDATE JPPRECO" + ;
            " SET PCVALOR = PCVALOR * " + NumberSQL( nMultiplica ) + " + " + NumberSQL( nSoma ) + "," + ;
            " PCINFALT = " + StringSQL( cLogInfo ) + ;
            " WHERE PCPRODUTO = " + NumberSQL( nIdProduto ) + " AND PCSTATUS = 1" + ;
            " AND PCREAJUSTE = " + StringSQL( mpcReajuste )
         :ExecuteCmd()
         :cSQL := "INSERT INTO JPPREHIS" + ;
            " ( PHCADASTRO, PHPRODUTO, PHFORPAG, PHVALOR, PHREAJUSTE, PHOBS, PHDATA, PHHORA, PHINFINC )" + ;
            " SELECT PCCADASTRO, PCPRODUTO, PCFORPAG, PCVALOR, PCREAJUSTE, " + ;
               StringSQL( "REAJ." + iif( cTipoReajuste == "P", "PERCENTUAL", "VALOR" ) + " " + ;
                  iif( nPercent > 0, "+", "" ) + NumberSQL( nPercent ) ) + " AS OBS," + ;
               DateSQL( mData ) + " AS DATA, " + StringSQL( cTime ) + " AS HORA, " + StringSQL( cLogInfo ) + " AS INFINC FROM JPPRECO" + ;
               " WHERE PCINFALT = " + StringSQL( cLogInfo )
         :ExecuteCmd()
      ENDWITH
      MsgExclamation( "Fim do reajuste!" )
   ENDDO


Só sei que finalmente não deu erro, mas não sei se deu certo.
É que a parte de consulta deu erro porque ainda precisa do DBF kkkk
Só vou saber se deu certo depois.

Decidi acabar com o jppreco.dbf de vez, porque usa em poucos fontes.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 16 Jul 2020 16:21

Comentario do fonte anterior:

O reajuste pode ser por percentual ou valor.
No fonte anterior eu fazia calculo separado: ou vezes o percentual ou soma o valor.

No SQL usei uma forma simples de aplicar os dois de uma vez, VALOR * percentual + soma

Se NÃO é por percentual, é deixar percentual 1, multiplicando por 1 não altera o valor
Se NÃO é por soma, é deixar valor 0, se somar 0 não altera valor.
Uma mesma fórmula atendendo os dois casos de uma vez.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 16 Jul 2020 16:25

Lembrei de uma coisa:

O que acontece se o cálculo tiver mais decimais do que a tabela?

Na dúvida, pra evitar erro, coloquei ROUND() na fórmula.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 16 Jul 2020 16:35

E mais outra:

Depois.... vou alterar esse histórico.

Coisa simples: PRA QUE vincular produto + cadastro + forma de pagamento no histórico.... se agora o preco tem uma ID única?
Pois é.... 3 campos de vínculo, só porque eu não tinha criado uma identificação no DBF.
Agora que tem chave no arquivo de preços, o histórico só precisa dessa chave, e não mais de 3 campos.

Mas vou alterar isso depois, é perigoso mexer agora durante migração, agora que já comecei desse jeito.

Com MySQL, vai ser só fazer o relacionamento e atualizar, então fica pra uma versão futura, com calma.

Agora é terminar desse jeito, só falta um fonte.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 17 Jul 2020 14:35

30/12/2019  21:50               163 cthisto.dbf
30/12/2019  21:52               291 jprefcta.dbf
30/12/2019  21:50               355 ctlotes.dbf
30/12/2019  21:50               387 ctlanca.dbf
30/12/2019  21:50               483 jpcontabil.dbf
03/03/2020  02:44             2.799 jpfiscal.DBF
30/12/2019  21:50             5.335 jpempresa.dbf
13/07/2020  17:13             5.923 jpnumero.dbf
30/12/2019  21:50             6.691 ctplano.dbf
30/12/2019  21:52             7.416 jpuf.dbf
09/07/2020  21:18             8.123 jpbaccusto.DBF
13/07/2020  17:13             9.997 jpconfi.dbf
10/07/2020  14:32           119.029 jptabel.dbf
30/12/2019  21:50           301.112 jpdolar.dbf
06/07/2020  11:25           314.624 jpsenha.dbf
03/03/2020  02:33         1.254.539 jpcidade.dbf
13/07/2020  15:30        16.385.892 jpbancario.dbf
              17 arquivo(s)     18.423.159 bytes


E os DBFs estão reduzindo....
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Jul 2020 11:01

Este é um daqueles complicados.
É um tbrowse, que por si só já é uma exceção.

/*
PBANCOCOMPARAMES - COMPARATIVO MES A MES
1994.01 José Quintas
*/

#include "inkey.ch"
#include "josequintas.ch"

MEMVAR m_MostraDol, m_MostraTot, m_Ano, m_Mes, m_CodResumo, m_Tabela, nQtdCols

PROCEDURE pBancoComparaMes

   LOCAL m_Texto, m_TmpMes, m_TmpAno, oBrowse, nKey, mTop, mLeft, mBottom, mRight, ColPos
   LOCAL m_TmpMov, nMCol, nMRow, oTBrowse

   IF ! AbreArquivos( "jpempresa", "jptabel", "jpconfi", "jpbaccusto", "jpbancario" )
      RETURN
   ENDIF
   SELECT jpbancario
   OrdSetFocus( "bancario2" )
   SELECT jpbaccusto
   OrdSetFocus( "jpbaccusto2" )
   GOTO TOP
   m_Tabela := PegaContas( .T. )
   IF Len( m_Tabela ) == 2 // So contas de totais
      MsgWarning( "Não há dados p/ comparativo!" )
      RETURN
   ENDIF

   m_CodResumo           := 1
   m_Ano                 := Year( Date() )
   m_Mes                 := Month( Date() )
   m_mostratot           := .F.
   m_mostradol           := .F.
   mTop                  := 4
   mLeft                 := 0
   mBottom               := MaxRow() - 5
   mRight                := MaxCol() - 2

   oBrowse               := TBrowseDb( mTop, mLeft, mBottom, mRight )
   oBrowse:SkipBlock     := { | m_Regs | SkipBrow2( m_Regs ) }
   oBrowse:GoTopBlock    := { || TopBrow2() }
   oBrowse:GoBottomBlock := { || botbrow2() }
   oBrowse:HeadSep       := Chr(196)
   oBrowse:ColSep        := Chr(179)
   oBrowse:FootSep       := Chr(196)
   oBrowse:FrameColor    := SetColorTbrowseFrame()
   ColPos                := 2
   nQtdCols              := 5

   oTBrowse := { ;
      { "", { || FldBrow2( -1 ) } }, ;
      { "", { || FldBrow2( 0  ) } }, ;
      { "", { || FldBrow2( 1  ) } }, ;
      { "", { || FldBrow2( 2  ) } }, ;
      { "", { || FldBrow2( 3  ) } }, ;
      { "", { || FldBrow2( 4  ) } } }
   ToBrowse( oTBrowse, oBrowse )

   TitBrow2()

   oBrowse:right()

   DO WHILE ! oBrowse:Stable
      oBrowse:Stabilize()
   ENDDO
   DO WHILE .T.
      Mensagem( "SETAS, T Totais, ENTER Lançamentos, R Desp/Rec, ESC Sai" )
      nKey := 0
      DO WHILE nKey == 0 .AND. ! oBrowse:Stable
         oBrowse:Stabilize()
         nKey := Inkey()
      ENDDO

      IF oBrowse:stable()
         oBrowse:RefreshCurrent()
         DO WHILE ! oBrowse:Stabilize()
         ENDDO
         nKey = Inkey( INKEY_IDLE, HB_INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
         IF nKey == 0
            KEYBOARD Chr( K_ESC )
            LOOP
         ENDIF
      ENDIF
      nMRow := MROW()
      NMCol := MCOL()

      DO CASE
      CASE SetKey( nKey ) != NIL
         eval( SetKey( nKey ), procname(), procline(), readvar() )
      CASE nKey > 999
         DO CASE
         CASE mBrzMove( oBrowse, nMRow, nMCol, mTop + 1, mLeft + 1, mBottom - 1, mRight - 1 ) // Move cursor
         CASE mBrzClick( oBrowse, nMRow, nMCol ) // click no TBrowse atual
            //KEYBOARD Chr( K_ENTER )
         ENDCASE

      CASE nKey == K_ESC       ; EXIT

      CASE nKey == K_DOWN      ; oBrowse:Down()

      CASE nKey == K_UP        ; oBrowse:Up()

      CASE nKey == K_CTRL_DOWN ; oBrowse:PageDown()

      CASE nKey == K_CTRL_UP   ; oBrowse:PageUp()

      CASE nKey == K_LEFT
         IF ColPos == 2
            m_Ano := iif( m_Mes == 12, m_Ano + 1, m_Ano )
            m_Mes := iif( m_Mes == 12, 1, m_Mes + 1 )
            TitBrow2()
            oBrowse:Invalidate()
            oBrowse:RefreshAll()
         ELSEIF ColPos > 1
            oBrowse:left()
            ColPos--
         ENDIF

      CASE nKey == K_RIGHT
         IF ColPos == ( nQtdCols + 1 )
            m_Ano = iif( m_Mes == 1, m_Ano - 1, m_Ano )
            m_Mes = iif( m_Mes == 1, 12, m_Mes - 1 )
            TitBrow2()
            oBrowse:Invalidate()
            oBrowse:RefreshAll()
         ELSE
            oBrowse:right()
            ColPos++
         ENDIF

      CASE nKey == Asc( "R" ) .OR. nKey == Asc( "r" )
         IF Len( m_Tabela[ m_CodResumo ] ) == 10
            SELECT jpbaccusto
            SEEK m_Tabela[ m_CodResumo ]
            DO WHILE jpbaccusto->cuGrupo == m_Tabela[ m_CodResumo ] .AND. ! Eof()
               RecLock()
               REPLACE jpbaccusto->cuMostra WITH iif( jpbaccusto->cuMostra == "S", "N", "S" )
               RecUnlock()
               SKIP
            ENDDO
            m_Tabela := PegaContas()
            oBrowse:Invalidate()
            oBrowse:RefreshAll()
         ENDIF

      CASE nKey == K_ENTER
         DO WHILE ! oBrowse:stabilize()
            GrafProc()
         ENDDO
         m_TmpMes := m_Mes - iif( ColPos > 1, ColPos - 2, 0 )
         m_TmpAno := m_Ano - iif( m_TmpMes < 1, 1, 0 )
         m_TmpMes := m_TmpMes + iif( m_TmpMes < 1, 12, 0 )
         WSave()
         Mensagem( "Aguarde, pesquisando movimentação..." )
         Cls()
         @ 2, 0 SAY "Desp/Rec:" + Trim( Left( m_Tabela[ m_CodResumo ], 10 ) ) + iif( Len( m_Tabela[ m_CodResumo ] ) == 10, "", ;
            ", Resumo:" + Trim( Right( m_Tabela[ m_CodResumo ], 10 ) ) ) + ", mes:" + StrZero( m_TmpMes, 2 ) + "/" + StrZero( m_TmpAno, 4 )
         @ 3, 0 SAY "BANCO EMISS __________HISTORICO__________ ___VALOR (NA DATA)__"
         m_tmpmov := {}
         SELECT jpbaccusto
         SEEK Left( m_Tabela[ m_CodResumo ], 10 )
         DO WHILE jpbaccusto->cuGrupo == Left( m_Tabela[ m_CodResumo ], 10 ) .AND. ! Eof()
            GrafProc()
            IF jpbaccusto->cuResumo != Right( m_Tabela[ m_CodResumo ], 10 ) .AND. Len( m_Tabela[ m_CodResumo ] ) > 10
               SKIP
               LOOP
            ENDIF
            SELECT jpbancario
            SEEK jpbaccusto->bcResumo + StrZero( m_TmpAno, 4 ) + StrZero( m_TmpMes, 2 )
            DO WHILE jpbancario->baResumo = jpbaccusto->cuCCusto .AND. Year( jpbancario->baDatEmi ) == m_TmpAno .AND. Month( jpbancario->baDatEmi ) == m_TmpMes .AND. ! Eof()
               GrafProc()
               m_Texto  = iif( jpbancario->baDatBan = Stod( "29991231" ), Space(5), Left( Dtoc( jpbancario->baDatBan ), 5 ) )
               m_Texto += Chr(179) + Left( Dtoc( jpbancario->baDatEmi ), 5 )
               m_Texto += Chr(179) + Left( jpbancario->baHist, 26 )
               m_Texto += Chr(179)
               m_Texto += Transform( jpbancario->bavalor, PicVal(14,2) )
               m_Texto += "<" + Chr(179)
               m_Texto += Space(14)
               m_Texto += " "
               AAdd( m_tmpmov, m_Texto )
               SKIP
            ENDDO
            SELECT jpbaccusto
            SKIP
         ENDDO
         IF Len( m_tmpmov ) > 0
            Mensagem( "Movimente com as setas, ENTER ou ESC sai" )
            achoice( 4, 0, 21, 79, m_tmpmov )
         ENDIF
         WRestore()

      CASE nKey == K_HOME
         oBrowse:GoTop()

      CASE nKey == K_END
         oBrowse:GoBottom()

      CASE Chr( nKey ) $ "Tt"
         m_mostratot = ( ! m_mostratot )
         TitBrow2()
         oBrowse:Invalidate()
         oBrowse:RefreshAll()

      CASE Chr( nKey ) $ "Dd"
         m_mostradol = ( ! m_mostradol )
         TitBrow2()
         oBrowse:Invalidate()
         oBrowse:RefreshAll()

      ENDCASE
   ENDDO

   RETURN

STATIC FUNCTION TopBrow2()

   m_CodResumo := 1

   RETURN .T.

STATIC FUNCTION botbrow2()

   m_CodResumo := Len( m_Tabela )

   RETURN .T.

STATIC FUNCTION SkipBrow2( nSkip )

   LOCAL nSkipped := 0

   IF nSkip == 0
   ELSEIF nSkip > 0 .AND. m_CodResumo < Len( m_Tabela )
      DO WHILE nSkipped < nSkip .AND. m_CodResumo < Len( m_Tabela )
         GrafProc()
         m_CodResumo++
         nSkipped++
      ENDDO
   ELSEIF nSkip < 0
      DO WHILE nSkipped > nSkip .AND. m_CodResumo > 1
         GrafProc()
         m_CodResumo--
         nSkipped--
      ENDDO
   ENDIF

   RETURN nSkipped

STATIC FUNCTION FldBrow2( nCont )

   LOCAL m_Retorno, m_TmpMes, m_TmpAno, m_Select

   m_TmpAno := iif( m_Mes - nCont <= 0, m_Ano - 1, m_Ano )
   m_TmpMes := iif( m_Mes - nCont <= 0, m_Mes - nCont + 12, m_Mes - nCont )
   m_Select := select()
   DO CASE
   CASE nCont == -1
      IF Len( m_Tabela[ m_CodResumo ] ) == 10
         m_Retorno := "->" + Left( m_Tabela[ m_CodResumo ], 10 )
      ELSE
         m_Retorno := "  " + Right( m_Tabela[ m_CodResumo ], 10 )
      ENDIF
   CASE ( m_Tabela[ m_CodResumo ] == ">ENTRADAS" .OR. m_Tabela[ m_CodResumo] == ">SAIDAS" ) .AND. ! m_MostraTot
      m_Retorno := ""
   CASE m_Tabela[ m_CodResumo ] = ">ENTRADAS"
      m_Retorno := Transform( SomaEntradas( m_TmpAno, m_TmpMes ), PicVal(14,2) )
   CASE m_Tabela[ m_CodResumo ] = ">SAIDAS"
      m_Retorno := Transform( SomaSaidas( m_TmpAno, m_TmpMes ), PicVal(14,2) )
   CASE Len(m_Tabela[ m_CodResumo ]) == 10
      m_Retorno := Transform( SomaGrupo( m_Tabela[ m_CodResumo ], m_TmpAno, m_TmpMes ), PicVal(14,2) )
   OTHERWISE
      m_Retorno := Transform( SomaResumo( Right( m_Tabela[ m_CodResumo ], 10 ), m_TmpAno, m_TmpMes ), PicVal(14,2) )
   ENDCASE
   SELECT ( m_Select )

   RETURN m_Retorno

STATIC FUNCTION TitBrow2()

   LOCAL nCont

   @ 2, 0 SAY Padc( "VALORES EM MOEDA VIGENTE", MaxCol() )
   @ 3, 1 SAY "Item"
   FOR nCont = 0 TO ( nQtdCols - 1 )
      @ 3, 16 + nCont * 20 SAY Padc( Space(3) + iif( m_Mes - nCont <= 0, ;
         StrZero( m_Mes - nCont + 12, 2 ) + "/" + StrZero( m_Ano - 1, 4 ), ;
         StrZero( m_Mes - nCont, 2 ) + "/" + StrZero( m_Ano, 4 ) ), 20 )
   NEXT

   RETURN .T.

STATIC FUNCTION SomaEntradas( m_Ano, m_Mes )

   LOCAL nTotal := 0, cResumo, nTotalTmp, nSelect := Select(), nRecNo

   SELECT jpbancario
   nRecNo := RecNo()
   GOTO TOP
   DO WHILE ! Eof()
      GrafProc()
      cResumo   := jpbancario->baResumo
      nTotalTmp := 0
      SEEK cResumo + StrZero( m_Ano, 4 ) + StrZero( m_Mes, 2 )
      DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == m_Ano .AND. Month( jpbancario->baDatEmi ) == m_Mes .AND. ! Eof()
         GrafProc()
         IF jpbancario->baResumo == Pad( "APLIC", 10 ) .OR. jpbancario->baResumo == Pad( "NENHUM", 10 )
            EXIT
         ENDIF
         nTotalTmp += jpbancario->baValor
         SKIP
      ENDDO
      IF nTotalTmp > 0
         nTotal += nTotalTmp
      ENDIF
      SEEK cResumo + "XXXX" SOFTSEEK
   ENDDO
   GOTO nRecNo
   SELECT ( nSelect )

   RETURN nTotal

STATIC FUNCTION SomaSaidas( nAno, nMes )

   LOCAL nTotal := 0, cResumo, nTotalTmp, nSelect := Select(), nRecNo

   SELECT jpbancario
   nRecNo := RecNo()
   GOTO TOP
   DO WHILE ! Eof()
      GrafProc()
      cResumo := jpbancario->baResumo
      nTotalTmp := 0
      SEEK cResumo + StrZero( nAno, 4 ) + StrZero( nMes, 2 )
      DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == nAno .AND. Month( jpbancario->baDatEmi ) == nMes .AND. ! Eof()
         GrafProc()
         IF jpbancario->baResumo == Pad( "APLIC", 10 ) .OR. jpbancario->baResumo == Pad( "NENHUM", 10 )
            EXIT
         ENDIF
         nTotalTmp += jpbancario->baValor
         SKIP
      ENDDO
      IF nTotalTmp < 0
         nTotal += nTotalTmp
      ENDIF
      SEEK cResumo + "XXXX" SOFTSEEK
   ENDDO
   GOTO nRecNo
   SELECT ( nSelect )

   RETURN nTotal

STATIC FUNCTION SomaGrupo( cGrupo, nAno, nMes )

   LOCAL nTotal := 0, nSelect := Select()

   SELECT jpbaccusto
   SEEK cGrupo
   DO WHILE jpbaccusto->cuGrupo == cGrupo .AND. ! Eof()
      GrafProc()
      nTotal += SomaResumo( jpbaccusto->cuCCusto, nAno, nMes )
      SKIP
   ENDDO
   SELECT ( nSelect )

   RETURN nTotal

STATIC FUNCTION SomaResumo( cResumo, nAno, nMes )

   LOCAL nTotal := 0, nSelect := Select()

   SELECT jpbancario
   SEEK cResumo + StrZero( nAno, 4 ) + StrZero( nMes, 2 )
   DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == nAno .AND. Month( jpbancario->baDatEmi ) == nMes .AND. ! Eof()
      GrafProc()
      nTotal += jpbancario->baValor
      SKIP
   ENDDO
   SELECT ( nSelect )

   RETURN nTotal

STATIC FUNCTION PegaContas( lPrimeiraVez )

   LOCAL mLista := {}, m_Grupo

   hb_Default( @lPrimeiraVez, .F. )
   GOTO TOP
   DO WHILE ! Eof()
      GrafProc()
      AAdd( mLista, jpbaccusto->cuGrupo )
      m_Grupo = jpbaccusto->cuGrupo
      DO WHILE jpbaccusto->cuGrupo == m_Grupo .AND. ! Eof()
         GrafProc()
         IF lPrimeiraVez .AND. jpbaccusto->cuMostra == "S"
            RecLock()
            REPLACE jpbaccusto->cuMostra WITH  "N"
            RecUnlock()
         ENDIF
         IF jpbaccusto->cuMostra=="S"
            AAdd( mLista, jpbaccusto->cuGrupo + jpbaccusto->cuCCusto )
         ENDIF
         SKIP
      ENDDO
   ENDDO
   AAdd( mLista, ">ENTRADAS" )
   AAdd( mLista, ">SAIDAS" )

   RETURN mLista


o tbrowse é feito encima de grupos de centro de custo e centros de custo, com/sem total geral.
Cada coluna se refere a um mês, sendo que a navegação na horizontal entre meses é infinita.
Está sendo usado um DBF pro browse, e as colunas são calculadas.

À primeira vista, seria trazer pronto do SQL, mas pra isso teria que limitar os meses das colunas.
Isso poderia ser resolvido se, ao ultrapassar a coluna, refizesse o comando SQL pra trazer todo browse.
Mesmo assim, teria o browse vertical das linhas, que pode variar.

Acho que a saída vai ser fazer um browse em array, ou em um recordset ADO, e as colunas continuarem sendo calculadas.

Numa primeira alteração, posso eliminar apenas o uso do arquivo de movimentação.
Esse arquivo representa 16MB dos 18MB que faltam pra converter.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Jul 2020 11:56

Fazer por etapa, primeiro alguns cálculos.
Este pra começar

STATIC FUNCTION SomaResumo( cResumo, nAno, nMes )

   LOCAL nTotal := 0, nSelect := Select()

   SELECT jpbancario
   SEEK cResumo + StrZero( nAno, 4 ) + StrZero( nMes, 2 )
   DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == nAno .AND. Month( jpbancario->baDatEmi ) == nMes .AND. ! Eof()
      GrafProc()
      nTotal += jpbancario->baValor
      SKIP
   ENDDO
   SELECT ( nSelect )

   RETURN nTotal
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Jul 2020 12:42

Lembram que comentei que a programação tende a seguir o "jeito humano"?
Então, por isso o comando SQL as vezes parece mais "humano" que o DBF, ou pelo menos mais claro.

STATIC FUNCTION SomaResumo( cResumo, nAno, nMes )

   LOCAL nTotal
   LOCAL cnSQL := ADOClass():New( AppConexao() )
   
   WITH OBJECT cnSQL
      :cSQL := "SELECT SUM( BAVALOR ) AS SOMA" + ;
         " FROM JPBANCARIO" + ;
         " WHERE BARESUMO = " + StringSQL( cResumo ) + ;
         " AND YEAR( BADATEMI ) = " + NumberSQL( nAno ) + ;
         " AND MONTH( BADATEMI ) = " + NumberSQL( nMes )
      :Execute()
      nTotal := :Number( "SOMA" )
      :CloseRecordset()
   ENDWITH   

   RETURN nTotal


Some o valor, de um c.custo específico e de mes/ano específicos.

STATIC FUNCTION SomaGrupo( cGrupo, nAno, nMes )

   LOCAL nTotal := 0, nSelect := Select()

   SELECT jpbaccusto
   SEEK cGrupo
   DO WHILE jpbaccusto->cuGrupo == cGrupo .AND. ! Eof()
      GrafProc()
      nTotal += SomaResumo( jpbaccusto->cuCCusto, nAno, nMes )
      SKIP
   ENDDO
   SELECT ( nSelect )

   RETURN nTotal


Esse é um grupo de centro de custo, que soma os centros de custo dele.
Faz uso da rotina anterior, mas acho que no SQL é melhor somar de uma vez, e não ficar fazendo somas menores.
No DBF faz sentido porque permite fazer uso da chave de pesquisa.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Jul 2020 12:57

Ficou igual o anterior, mas relacionado com a tabela de centro de custo, e indicando total por grupo.

STATIC FUNCTION SomaGrupo( cGrupo, nAno, nMes )

   LOCAL nTotal := 0
   
   WITH OBJECT cnSQL
      :cSQL := "SELECT SUM( BAVALOR ) AS SOMA" + ;
         " FROM JPBANCARIO" + ;
         " LEFT JOIN JPBACCUSTO ON JPBACCUSTO.CCUSTO = JPBANCARIO.BARESUMO" + ;
         " WHERE YEAR( BADATEMI ) = " + NumberSQL( nAno ) + ;
         " AND MONTH( BADATEMI ) = " + NumberSQL( nMes ) + ;
         " AND JPBACCUSTO.CUGRUPO = " + StringSQL( cGrupo )
      :Execute()
      nTotal := :Number( "SOMA" )
      :CloseRecordset()
   ENDWITH


Eu deveria já ter renomeado BARESUMO pra BACCUSTO, mas ficou pra depois.
Começou assim, vai assim até terminar.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Jul 2020 12:59

Complemento: eu ia usar CC ou BC pro c.custo bancario, iniciais dos campos, mas vi que tava errando muito ao digitar CCCCUSTO por exemplo, muito C junto.
Acabei usando C.U.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Jul 2020 13:37

No final, a gente encontra destas coisas: duas rotinas iguais, a diferença é que uma soma positivos e a outra soma negativos:


STATIC FUNCTION SomaEntradas( m_Ano, m_Mes )

   LOCAL nTotal := 0, cResumo, nTotalTmp, nSelect := Select(), nRecNo

   SELECT jpbancario
   nRecNo := RecNo()
   GOTO TOP
   DO WHILE ! Eof()
      GrafProc()
      cResumo   := jpbancario->baResumo
      nTotalTmp := 0
      SEEK cResumo + StrZero( m_Ano, 4 ) + StrZero( m_Mes, 2 )
      DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == m_Ano .AND. Month( jpbancario->baDatEmi ) == m_Mes .AND. ! Eof()
         GrafProc()
         IF jpbancario->baResumo == Pad( "APLIC", 10 ) .OR. jpbancario->baResumo == Pad( "NENHUM", 10 )
            EXIT
         ENDIF
         nTotalTmp += jpbancario->baValor
         SKIP
      ENDDO
      IF nTotalTmp > 0
         nTotal += nTotalTmp
      ENDIF
      SEEK cResumo + "XXXX" SOFTSEEK
   ENDDO
   GOTO nRecNo
   SELECT ( nSelect )

   RETURN nTotal

STATIC FUNCTION SomaSaidas( nAno, nMes )

   LOCAL nTotal := 0, cResumo, nTotalTmp, nSelect := Select(), nRecNo

   SELECT jpbancario
   nRecNo := RecNo()
   GOTO TOP
   DO WHILE ! Eof()
      GrafProc()
      cResumo := jpbancario->baResumo
      nTotalTmp := 0
      SEEK cResumo + StrZero( nAno, 4 ) + StrZero( nMes, 2 )
      DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == nAno .AND. Month( jpbancario->baDatEmi ) == nMes .AND. ! Eof()
         GrafProc()
         IF jpbancario->baResumo == Pad( "APLIC", 10 ) .OR. jpbancario->baResumo == Pad( "NENHUM", 10 )
            EXIT
         ENDIF
         nTotalTmp += jpbancario->baValor
         SKIP
      ENDDO
      IF nTotalTmp < 0
         nTotal += nTotalTmp
      ENDIF
      SEEK cResumo + "XXXX" SOFTSEEK
   ENDDO
   GOTO nRecNo
   SELECT ( nSelect )

   RETURN nTotal


Melhor até transformar em uma só, antes de converter.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14276
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Semrush [Bot] e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro