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 Vlademiro » 20 Jul 2020 23:36

Já trabalhei com MySQL há uns 15 anos. Era um sistema que ficava na web recebendo dados de rastreadores que eram alugados. Cada rastreador mandava dados para o banco a cada minuto. Quando o carro parava o rastreador mandava a cada 30 minutos. Em uma semana o banco MySql tinha 40 milhões de registros. Como a estrutura de servidor e disco era modesta, a gente migrava o resumo para um outro banco a cada mês. MySQL é um ótimo banco, vc não deveria ter receio das views. Kkkkk
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 671
Data de registro: 11 Jul 2005 02:46
Curtiu: 14 vezes
Mens.Curtidas: 50 vezes

Meu modo de trabalho

Mensagempor Vlademiro » 20 Jul 2020 23:38

E olha que meu ex chefe, já de saudosa memória, era meio doido. O primeiro servidor era um windows xp . Só depois descobrimos que o xp recusava conexões TCP depois de um certo limite. A gente tava botando a culpa no MySQL mas era windows. Depois disso ele colocou um windows server.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 671
Data de registro: 11 Jul 2005 02:46
Curtiu: 14 vezes
Mens.Curtidas: 50 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Jul 2020 00:11

Vlademiro escreveu:Só depois descobrimos que o xp recusava conexões TCP depois de um certo limite


Antes do XP não havia limites. No XP há o limite de "half-open connections" de apenas 8.
Acima disso, começa a ser criada uma fila, que pode até travar tudo se ficar longa.
São conexões em andamento, abrindo e/ou fechando.
Segundo a Microsoft foi pra segurança, pra controlar melhor conexões porque usam sobrecarga pra invasão.

Já vi que conforme o VIEW, ele faz um SELECT COMPLETO, e não parcial, então também precisa tomar cuidado com ele.

Confundi, não é o VIEW que fica diferente no backup, é a STORED PROCEDURE.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Jul 2020 21:58

maiores DBFs ainda existentes, no cliente referência:

06/07/2020  11:25           314.624 jpsenha.dbf
03/03/2020  02:33         1.254.539 jpcidade.dbf
21/07/2020  16:07        16.368.631 jpbancario.dbf
              16 arquivo(s)     18.397.775 bytes


o bancário representa quase que o total dos DBFs.
E o último único fonte que precisa do DBF, ainda em andamento.

/*
PBANCOLANCA - MOVIMENTACAO BANCARIA
1989.09 José Quintas

2018.05.21 Opção de excluir tudo de uma conta
*/

#include "tbrowse.ch"
#include "inkey.ch"

MEMVAR m_Prog
MEMVAR m_Filtro, dDataInicial
MEMVAR m_Alterou
MEMVAR mbaConta, m_Aplic, m_Confirma

PROCEDURE pBancoLanca

   LOCAL GetList := {}, oTbrowse, cTempFile, oElement
   LOCAL oFrm := frmGuiClass():New()
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   IF ! AbreArquivos( "jpempresa", "jptabel", "jpconfi", "jpbancario" )
      RETURN
   ENDIF
   SELECT jpbancario

   dDataInicial := Date() - 20
   @ 12, 3 SAY "Data inicial: " GET dDataInicial
   Mensagem( "Digite data inicial a visualizar, ESC sai" )
   READ
   Mensagem()

   IF LastKey() == K_ESC
      CLOSE DATABASES
      RETURN
   ENDIF
   oFrm:cOptions := "IAE"
   oFrm:lNavigate := .F.
   AAdd( oFrm:acMenuOptions, "<F>Filtro" )
   AAdd( oFrm:acMenuOptions, "<Ctrl-L>Pesquisa" )
   AAdd( oFrm:acMenuOptions, "<R>Recalc." )
   AAdd( oFrm:acMenuOptions, "<S>SomaL" )
   AAdd( oFrm:acMenuOptions, "<P>Aplic" )
   AAdd( oFrm:acMenuOptions, "<C>Conta" )
   AAdd( oFrm:acMenuOptions, "<N>N.Conta" )
   AAdd( oFrm:acMenuOptions, "<F4>Exc.Conta" )
   AAdd( oFrm:acMenuOptions, "<T>T.Conta" )
   oFrm:FormBegin()

   IF IsMaquinaJPA()
      WITH OBJECT cnSQL
         :cSQL := "SELECT BACONTA, BAAPLIC, BADATBAN, BADATEMI, BAHIST, BAVALOR," + ;
            " IDBANCARIO, BASALDO, BARESUMO, BAIMPSLD, IF( BAVALOR < 0, 2, 1 ) AS ORDEM" + ;
            " FROM JPBANCARIO" + ;
            " WHERE BADATBAN >= CAST( " + DateSQL( dDataInicial - 1 ) + " AS DATE )" + ;
            " OR BAVALOR = 0" + ;
            " ORDER BY BACONTA, BAAPLIC, BADATBAN, BADATEMI, ORDEM, IDBANCARIO"
         oTBrowse := { ;
            { "BANCO",     { || iif( :Number( "BAVALOR" ) == 0, Space(8), ;
            iif( :Date( "BADATBAN" ) == Stod( "29991231" ), Space(8), :Date( "BADATBAN" ) ) ) } }, ;
            { "EMISSAO",   { || iif( :Number( "BAVALOR" ) == 0, Space(8), :Date( "BADATEMI" ) ) } }, ;
            { "CCUSTO",    { || iif( :Number( "BAVALOR" ) == 0, Space(10), :String( "BARESUMO", 10 ) ) } }, ;
            { "HISTORICO", { || iif( :Number( "BAVALOR" ) == 0, ;
                                Padc( :String( "BACONTA" ) + iif( :String( "BAAPLIC" ) == "S", "(Aplicacao)", "" ), 45 ), ;
                                :String( "BAHIST", 45 ) ) } }, ;
            { "ENTRADA",   { || iif( :Number( "BAVALOR" ) > 0, Transform( Abs( :Number( "BAVALOR" ) ), PicVal(14,2) ), ;
                                Space( Len( Transform( 0, PicVal(14,2) ) ) ) ) } }, ;
            { "SAIDA",     { || iif( :Number( "BAVALOR" ) < 0, Transform( Abs( :Number( "BAVALOR" ) ), PicVal(14,2) ), ;
                                Space( Len( Transform( 0, PicVal(14,2) ) ) ) ) } }, ;
            { "SALDO",     { || iif( :String( "BAIMPSLD" ) == "S", ;
                                Transform( :Number( "BASALDO" ), PicVal(14,2) ), ;
                                Space( Len( Transform( 0, PicVal(14,2) ) ) ) ) } } }
         FOR EACH oElement IN oTbrowse
            AAdd( oElement, { || iif( :Number( "BAVALOR" ) == 0, { 5, 2 }, { 1, 2 } ) } )
         NEXT
         :Execute()
         BrowseADORC( 7, 0, MaxRow() - 3, MaxCol(), cnSQL, oTBrowse, "BACONTA,BARESUMO,BAHIST", { || "" }, { || EditLanc( cnSQL ) } )
         KEYBOARD ""
      ENDWITH
   ENDIF

   SELECT jpbancario
   cTempFile := MyTempFile( "CDX" )
   INDEX ON jpbancario->baConta + jpbancario->baAplic + Dtos( jpbancario->baDatBan ) + Dtos( jpbancario->baDatEmi ) + ;
      iif( jpbancario->baValor > 0, "1", "2" ) + StrZero( jpbancario->( RecNo() ), 6 ) TAG TEMP TO ( cTempFile ) ;
      FOR Dtos( jpbancario->baDatBan ) >= Dtos( dDataInicial ) .OR. ( jpbancario->baValor == 0 )
   SET INDEX TO ( PathAndFile( "jpbancario" ) ), ( cTempFile )
   OrdSetFocus( "temp" )

   m_Filtro := {}
   SET FILTER TO Filtro()
   SEEK jpbancario->baConta + jpbancario->baAplic + Dtos( Date() ) SOFTSEEK
   SKIP -1

   oTBrowse := { ;
      { "BANCO",     { || iif( jpbancario->baValor == 0, Space(8), ;
                          iif( jpbancario->baDatBan == Stod( "29991231" ), Space(8), ;
                          Dtoc( jpbancario->baDatBan ) ) ) } }, ;
      { "EMISSÃO",   { || iif( jpbancario->baValor == 0, Space(8), ;
                          iif( jpbancario->baDatEmi == Stod( "29991231" ), Space(8), ;
                          Dtoc( jpbancario->baDatEmi ) ) ) } }, ;
      { "CCUSTO",    { || iif( jpbancario->baValor == 0, Space( Len( jpbancario->baResumo ) ), ;
                          jpbancario->baResumo ) } }, ;
      { "HISTÓRICO", { || iif( jpbancario->baValor == 0, Padc( jpbancario->baConta + iif( jpbancario->baAplic == "S", "(Aplicação)", "" ), Len( jpbancario->bahist ) ), ;
                          jpbancario->baHist ) } }, ;
      { "ENTRADA",   { || iif( jpbancario->baValor > 0, Transform( Abs( jpbancario->baValor ), PicVal(14,2) ), ;
                          Space( Len( Transform( 0, PicVal(14,2) ) ) ) ) } }, ;
      { "SAÍDA",     { || iif( jpbancario->baValor < 0, Transform( Abs( jpbancario->baValor ), PicVal(14,2) ), ;
                          Space( Len( Transform( 0, PicVal(14,2) ) ) ) ) } }, ;
      { "SALDO",     { || iif( jpbancario->baImpSld == "S", Transform( jpbancario->baSaldo, PicVal(14,2) ), ;
                          Space( Len( Transform( jpbancario->baSaldo, PicVal(14,2) ) ) ) ) } } }
   FOR EACH oElement IN oTbrowse
      AAdd( oElement, { || iif( jpbancario->baValor == 0, { 5, 2 }, { 1, 2 } ) } )
   NEXT
   DO WHILE .T.
      Cls()
      Mensagem( "I Inclui, A Altera, E Exclui, C-L Pesquisa, P Aplicação, C Contas, " + ;
         "N Nova_conta, F Filtro,  R Recálculo, T Troca_conta, S Soma_Lançtos, " + ;
         "D Desliga_Recálculo, F4 Exclui_Conta, ESC sai" )
      KEYBOARD Chr( 205 )
      Inkey(0)
      BrowseDbfRC( 7, 0, MaxRow() - 3, MaxCol(), oTBrowse, { | b, k, cnSQL | DigBancoLanca( b, k, cnSQL ) } )
      Mensagem()
      IF LastKey() == K_ESC
         EXIT
      ENDIF
   ENDDO
   CLOSE DATABASES
   oFrm:FormEnd()
   fErase( cTempFile )

   RETURN

FUNCTION EditLanc( b, k, cnSQL )

   (b)
   (k)
   (cnSQL)

   RETURN TBR_CONTINUE

FUNCTION DigBancoLanca( ... ) // NAO STATIC usada em pBancoConsolida

   LOCAL nRecNo, m_Aplic, mbaConta

   IF LastKey() == K_ESC
      RETURN 0
   ENDIF
   m_Alterou = .F.
   DO CASE
   CASE Chr( LastKey() ) $ "Ss" .AND. m_Prog == "PBANCOLANCA"
      SomaFiltro()

   CASE Chr( LastKey() ) $ "Tt" .AND. m_Prog == "PBANCOLANCA"
      TrocaConta()

   CASE Chr( LastKey() ) $ "Rr"
      nRecNo := RecNo()
      BARecalcula()
      GOTO ( nRecNo )

   CASE Chr( LastKey() ) $ "Nn" .AND. m_Prog == "PBANCOLANCA"
      NovaConta()

   CASE Chr( LastKey() ) $ "Pp" .AND. m_Prog == "PBANCOLANCA"
      mbaConta = jpbancario->baConta
      m_Aplic = iif( jpbancario->baAplic == "S", "N", "S" )
      ve_Conta( mbaConta, m_Aplic )

   CASE Chr( LastKey() ) $ "Ff"
      DO DigFiltro

   CASE Chr( LastKey() ) $ "Cc" .AND. m_Prog == "PBANCOLANCA"
      DO DigConta

   CASE LastKey() == K_CTRL_L .AND. m_Prog == "PBANCOLANCA"
      pBancoLancaLocaliza()
      RETURN TBR_EXIT

   CASE Chr( LastKey() ) == "2"
      KEYBOARD Chr( K_DOWN )
      RETURN TBR_CONTINUE

   CASE Chr( LastKey() ) == "8"
      KEYBOARD Chr( K_UP )
      RETURN TBR_CONTINUE

   CASE LastKey() == K_HOME .OR. Chr( LastKey() ) == "7"
      KEYBOARD Chr( K_CTRL_PGUP )
      RETURN TBR_CONTINUE

   CASE LastKey() == K_CTRL_PGDN .OR. Chr( LastKey() ) == "1"
      KEYBOARD Chr( K_CTRL_PGDN )
      RETURN TBR_CONTINUE

   CASE LastKey() == K_INS .OR. Chr( LastKey() ) == "0" .OR. Chr( LastKey() ) $ "Ii"
      cadlanc( "INCLUSAO" )
      RETURN TBR_CONTINUE

   CASE LastKey() == K_DEL .OR. Chr( LastKey() ) == "." .OR. Chr( LastKey() ) $ "Ee"
      cadlanc( "EXCLUSAO" )
      RETURN TBR_CONTINUE

   CASE LastKey() == K_ENTER .OR. Chr( LastKey() ) $ "Aa"
      IF jpbancario->baValor != 0
         nRecNo := RecNo()
         cadlanc( "ALTERACAO" )
         IF nRecNo != RecNo() .OR. m_Alterou .OR. ! Filtro()
            RETURN TBR_EXIT
         ENDIF
      ENDIF
      RETURN TBR_CONTINUE

   CASE LastKey() == K_F4
      ExcluiConta()
      RETURN TBR_EXIT

   ENDCASE

   RETURN TBR_CONTINUE

STATIC PROCEDURE TrocaConta

   LOCAL GetList := {}, mbaConta, nRecNo, mbaContaOld
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   mbaConta    := jpbancario->baConta
   mbaContaOld := mbaConta
   WOpen( 5, 5, 9, 75, "Troca para Conta" )
   nRecNo := RecNo()
   @ 7, 15 SAY "Conta..:" GET mbaConta PICTURE "@!" VALID ValidBancarioConta( @mbaConta )
   Mensagem( "Digite Conta, F9 pesquisa, ESC Sai" )
   READ
   Mensagem()
   GOTO ( nRecNo )
   IF jpbancario->baConta != mbaConta .AND. LastKey() != K_ESC
      IF MsgYesNo( "Confirme transferência para esta Conta?" )
         WITH OBJECT cnSQL
            :QueryCreate()
            :QueryAdd( "BACONTA", mbaConta )
            jpbancario->( :DBFQueryExecuteUpdate( "JPBANCARIO" ) )
            :QueryExecuteUpdate( "JPBANCARIO", "IDBANCARIO = " + NumberSQL( jpbancario->idBancario ) )
         ENDWITH
         nRecNo := RecNo()
         BARecalcula( mbaConta )
         BARecalcula( mbaContaOld )
         GOTO ( nRecNo )
      ENDIF
   ENDIF
   WClose()

   RETURN

STATIC FUNCTION Filtro()

   LOCAL oElement, mReturn

   mReturn := .T.
   IF jpbancario->baValor != 0
      FOR EACH oElement IN m_Filtro
         DO CASE
         CASE oElement $ jpbancario->baResumo
         CASE oElement $ jpbancario->baHist
         CASE oElement $ Dtoc( jpbancario->baDatEmi )
         CASE oElement $ Dtoc( jpbancario->baDatBan )
         CASE oElement $ jpbancario->baConta
         CASE Val( oElement ) != 0 .AND. Val( oElement ) == Abs( jpbancario->baValor )
         OTHERWISE
            mReturn := .F.
            EXIT
         ENDCASE
      NEXT
      IF Type( "dDataInicial" ) == "D"
         IF Dtos( dDataInicial ) > Dtos( jpbancario->baDatBan )
            mReturn := .F.
         ENDIF
      ENDIF
   ENDIF
   GrafProc()

   RETURN mReturn

STATIC FUNCTION ExcluiConta()

   LOCAL cConta := jpbancario->baConta, cConfirma := "NAO", GetList := {}, cOrdSetFocus

   Mensagem( "Confirme se vai excluir tudo sobre a conta " + cConta + " digitando SIM" )
   @ Row(), Col() + 2 GET cConfirma PICTURE "@!A"
   READ
   IF LastKey() == K_ESC .OR. cConfirma != "SIM"
      RETURN NIL
   ENDIF
   SELECT jpbancario
   cOrdSetFocus := OrdSetFocus()
   OrdSetFocus( "bancario1" )
   DO WHILE .T.
      SEEK cConta
      IF Eof()
         EXIT
      ENDIF
      RecLock()
      DELETE
      RecUnlock()
   ENDDO
   OrdSetFocus( cOrdSetFocus )

   RETURN NIL

STATIC FUNCTION NovaConta()

   LOCAL cTxt := Space(15), GetList := {}, nIdBancario
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   Mensagem( "Digite nova Conta, ESC Sai" )
   @ Row(), Col() + 2 GET cTxt PICTURE "@!"
   READ
   Mensagem()
   IF LastKey() != K_ESC
      WITH OBJECT cnSQL
         :QueryCreate()
         :QueryAdd( "BACONTA", cTxt )
         :QueryAdd( "BAAPLIC", "N" )
         nIdBancario := :QueryExecuteInsert( "JPBANCARIO" )
         :QueryAdd( "IDBANCARIO", StrZero( nIdBancario, 6 ) )
         jpbancario->( :DBFQueryExecuteInsert( "JPBANCARIO" ) )
      ENDWITH
   ENDIF

   RETURN NIL

STATIC FUNCTION ve_Conta

   LOCAL m_RecNo, nIdBancario
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   PARAMETERS mbaConta, m_Aplic, m_Confirma

   IF pcount() < 3
      PRIVATE m_Confirma

      m_Confirma := .T.
   ENDIF
   m_RecNo := RecNo()
   SEEK mbaConta + m_Aplic
   IF Eof()
      IF m_Confirma
         IF ! MsgYesNo( "Conta e/ou Aplicação não cadastrada! Cadastra?" )
            GOTO m_RecNo
            RETURN .F.
         ENDIF
      ENDIF
      WITH OBJECT cnSQL
         :QueryCreate()
         :QueryAdd( "BACONTA", mbaConta )
         :QueryAdd( "BAAPLIC", m_Aplic )
         nIdBancario := :QueryExecuteInsert( "JPBANCARIO" )
         :QueryAdd( "IDBANCARIO", StrZero( nIdBancario, 6 ) )
         jpbancario->( :DBFQueryExecuteInsert( "JPBANCARIO" ) )
         :QueryCreate()
         :QueryAdd( "BACONTA", mbaConta )
         :QueryAdd( "BAAPLIC", m_Aplic )
         :QueryAdd( "BADATBAN", Stod( "29991231" ) )
         :QueryAdd( "BADATEMI", Stod( "29991231" ) )
         :QueryAdd( "BAVALOR", 0 )
         nIdBancario := :QueryExecuteInsert( "JPBANCARIO" )
         :QueryAdd( "IDBANCARIO", StrZero( nIdBancario, 6 ) )
         jpbancario->( :DBFQueryExecuteInsert( "JPBANCARIO" ) )
      ENDWITH
   ELSE
      SEEK mbaConta + m_Aplic
      SEEK mbaConta + m_Aplic + Dtos( Date() ) SOFTSEEK
      SKIP -1
   ENDIF

   RETURN .T.

STATIC FUNCTION CadLanc( m_Tipo )

   LOCAL GetList := {}, m_MinDtBco, m_Aplic, mbaConta, m_Lin, m_DtEmi, m_DtBco, m_VlEnt
   LOCAL m_VlSai, m_Hist, m_Resumo, nRecNo
   LOCAL nIdBancario
   LOCAL cnSQL := ADOClass():new( AppConexao() )

   SET CURSOR ON
   WSave()
   m_Alterou    := .F.
   m_Lin        := Row()
   m_MinDtBco   := Stod( "29991231" )
   mbaConta     := jpbancario->baConta
   m_Aplic      := jpbancario->baAplic
   dDataInicial := iif( Type( "dDataInicial" ) != "D", Date() - 60, dDataInicial )
   DO CASE
   CASE m_Tipo == "EXCLUSAO"
      IF MsgYesNo( "Confirma exclusão?" )
         GravaOcorrencia( ,,"Exclusao BANCARIO de " + Dtoc( jpbancario->baDatEmi ) + ", " + Dtoc( jpbancario->baDatBan ) )
         m_DtEmi := jpbancario->baDatEmi
         m_DtBco := jpbancario->baDatBan
         jpbancario->( RecDelete() )
         SEEK mbaConta + m_Aplic + Dtos( m_DtBco ) + Dtos( m_DtEmi ) SOFTSEEK
         SKIP -1
         IF mbaConta != jpbancario->baConta .OR. m_Aplic != jpbancario->baAplic
            SEEK mbaConta + m_Aplic SOFTSEEK
         ENDIF
         m_Alterou  := .T.
      ENDIF
   CASE m_Tipo $ "ALTERACAO,INCLUSAO"
      DO WHILE .T.
         IF m_Tipo == "ALTERACAO"
            m_DtBco   := iif( jpbancario->baDatBan == Stod( "29991231" ), Ctod( "" ), jpbancario->baDatBan )
            m_DtEmi   := jpbancario->baDatEmi
            m_Resumo  := jpbancario->baResumo
            m_Hist    := jpbancario->baHist
            m_VlEnt   := iif( jpbancario->baValor < 0, 0, jpbancario->baValor  )
            m_VlSai   := iif( jpbancario->baValor > 0, 0, -jpbancario->baValor )
         ELSE
            Scroll( 5, 0, m_Lin, maxcol(), 1 )
            m_DtBco   := Ctod("")
            m_DtEmi   := Ctod("")
            m_Resumo  := EmptyValue( jpbancario->baResumo )
            m_Hist    := EmptyValue( jpbancario->baHist)
            m_VlEnt   := 0
            m_VlSai   := 0
         ENDIF
         wOpen( 10, 5, 20, 100, m_Tipo )
         @ 12, 12 SAY "Data do Banco"
         @ 12, 50 SAY "Data de Emissão"
         @ 13, 12 GET m_DtBco VALID OkData( @m_DtBco, dDataInicial )
         @ 13, 50 GET m_DtEmi VALID OkData( @m_DtEmi, dDataInicial )
         @ 15, 12 SAY "Resumo"
         @ 15, 30 SAY "Histórico"
         @ 16, 12 GET m_Resumo PICTURE "@K!" VALID ValidBancarioCCusto( @m_Resumo )
         @ 16, 30 GET m_Hist PICTURE "@K!" VALID ! Empty( m_Hist )
         @ 18, 12 SAY "Entrada"
         @ 18, 50 SAY "Saída"
         @ 19, 12 GET m_VlEnt PICTURE PicVal(14,2) VALID m_VlEnt >= 0 .AND. ReturnTrue( m_VlSai := iif( m_VlEnt != 0, 0, m_VlSai ) )
         @ 19, 50 GET m_VlSai PICTURE PicVal(14,2) VALID m_VlSai >= 0 WHEN m_VlEnt == 0
         Mensagem( "Digite campos, F9 Pesquisa, ESC abandona" )
         READ
         wClose()
         IF LastKey() == K_ESC
            EXIT
         ELSE
            WITH OBJECT cnSQL
               m_DtBco = iif( Empty( m_DtBco ), Stod( "29991231" ), m_DtBco )
               IF m_Tipo == "INCLUSAO"
                  IF m_Aplic != "S" .AND. m_Resumo = "APLIC"
                     ve_Conta( mbaConta, "S", .F. )
                     :QueryCreate()
                     :QueryAdd( "BACONTA", mbaConta )
                     :QueryAdd( "BAAPLIC", "S" )
                     :QueryAdd( "BADATBAN", m_DtBco )
                     :QueryAdd( "BADATEMI", m_DtEmi )
                     :QueryAdd( "BARESUMO", m_Resumo )
                     :QueryAdd( "BAHIST", m_Hist )
                     :QueryAdd( "BAVALOR", m_VlSai - m_VlEnt )
                     :QueryAdd( "BAINFINC", LogInfo() )
                     nIdBancario := :QueryExecuteInsert( "JPBANCARIO" )
                     :QueryAdd( "IDBANCARIO", StrZero( nIdBancario, 6 ) )
                     jpbancario->( :DBFQueryExecuteInsert( "JPBANCARIO" ) )
                     nRecNo := RecNo()
                     BARecalcula( mbaConta )
                     GOTO ( nRecNo )
                  ENDIF
                  :QueryCreate()
                  :QueryAdd( "BACONTA", mbaConta )
                  :QueryAdd( "BAAPLIC", m_Aplic )
                  :QueryAdd( "BADATBAN", m_DtBco )
                  nIdBancario := :QueryExecuteInsert( "JPBANCARIO" )
                  :QueryAdd( "IDBANCARIO", StrZero( nIdBancario, 6 ) )
                  jpbancario->( :DBFQueryExecuteInsert( "JPBANCARIO" ) )
                  m_Alterou  := .T.
                  m_MinDtBco := iif( m_MinDtBco < m_DtBco, m_MinDtBco, m_DtBco )
               ELSE
                  m_MinDtBco := iif( m_MinDtBco < jpbancario->baDatBan, m_MinDtBco, jpbancario->baDatBan )
               ENDIF
               :QueryCreate()
               IF jpbancario->baDatBan!= m_DtBco
                  :QueryAdd( "BADATBAN", m_DtBco )
                  m_MinDtBco = iif( m_MinDtBco < jpbancario->baDatBan, m_MinDtBco, jpbancario->baDatBan )
                  m_Alterou  := .T.
               ENDIF
               IF jpbancario->baDatEmi != m_DtEmi
                  :QueryAdd( "BADATEMI", m_DtEmi )
                  m_Alterou := .T.
               ENDIF
               IF jpbancario->baResumo != m_Resumo
                  :QueryAdd( "BARESUMO", m_Resumo )
                  m_Alterou := .T.
               ENDIF
               IF jpbancario->baHist != m_Hist
                  :QueryAdd( "BAHIST", m_Hist )
                  m_Alterou := .T.
               ENDIF
               IF jpbancario->baValor != ( m_VlEnt - m_VlSai )
                  :QueryAdd( "BAVALOR", m_VlEnt - m_VlSai )
                  m_Alterou := .T.
               ENDIF
               IF m_Alterou
                  :QueryAdd( "BAINFALT", LogInfo() )
                  jpbancario->( :DBFQueryExecuteUpdate( "JPBANCARIO" ) )
                  :QueryExecuteUpdate( "JPBANCARIO", "IDBANCARIO = " + NumberSQL( jpbancario->idBancario ) )
               ENDIF
            ENDWITH
         ENDIF
         IF m_Tipo == "ALTERACAO"
            EXIT
         ELSEIF LastKey() == 23
            KEYBOARD Chr( 205 )
            Inkey(0)
         ENDIF
      ENDDO
      IF LastKey() == K_ESC
         KEYBOARD Chr( 205 )
         Inkey(0)
      ENDIF
   ENDCASE
   IF m_Alterou
      nRecNo := RecNo()
      BARecalcula( jpbancario->baConta )
      GOTO nRecNo
      IF jpbancario->( Deleted() )
         jpbancario->( dbSkip( -1 ) )
      ENDIF
   ENDIF
   IF LastKey() == K_ESC
      KEYBOARD Chr(215)
      Inkey(0)
   ENDIF
   WRestore()

   RETURN .T.

STATIC FUNCTION DigFiltro()

   LOCAL oElement, m_Texto, m_Posi, GetList := {}

   m_Texto := ""
   FOR EACH oElement IN m_Filtro
      m_Texto += oElement + " "
   NEXT
   m_Texto = Pad( m_Texto, 200 )
   Scroll( 10, 0, 14, MaxCol(), 0 )
   @ 10, 0 to 14, MaxCol()
   @ 12, 1 to 12, MaxCol()-1
   @ 11, 1 SAY "Trechos de texto para filtro na apresentação dos dados"
   @ 13, 1 GET m_Texto PICTURE "@K!S75"
   READ
   IF LastKey() != K_ESC
      m_Filtro := {}
      m_Texto = Trim( m_Texto )
      DO WHILE Len( m_Texto ) != 0
         m_posi := At(" ",m_Texto+" ")
         AAdd( m_Filtro, Trim( Substr( m_Texto, 1, m_posi ) ) )
         m_Texto := lTrim( Substr( m_Texto, m_posi ) )
      ENDDO
      IF ! Filtro()
         GOTO TOP
      ENDIF
   ENDIF

   RETURN NIL

STATIC FUNCTION SomaFiltro()

   LOCAL m_RecNo := RecNo(), m_SomaEnt := 0, m_SomaSai := 0

   IF ! MsgYesNo( "Confirma a soma dos valores?" )
      RETURN NIL
   ENDIF
   GOTO TOP
   DO WHILE ! Eof()
      grafproc()
      IF ! Filtro()
         SKIP
         LOOP
      ENDIF
      IF jpbancario->baValor > 0
         m_SomaEnt += jpbancario->baValor
      ELSE
         m_SomaSai += jpbancario->baValor
      ENDIF
      SKIP
   ENDDO
   GOTO m_RecNo
   MsgExclamation( "Entradas:" + LTrim( Transform( m_SomaEnt, PicVal(14,2) ) ) + " Saídas:" + LTrim( Transform( m_SomaSai, PicVal(14,2) ) ) + ;
      " Dif:" + LTrim( Transform( m_SomaEnt + m_SomaSai, PicVal(14,2) ) ) )

   RETURN NIL

STATIC FUNCTION DigConta()

   LOCAL mbaConta := jpbancario->baConta, m_RecNo := RecNo(), m_NumConta := 1, m_NomeCta := {}, nCont

   GOTO TOP
   DO WHILE ! Eof()
      AAdd( m_NomeCta, jpbancario->baConta )
      SEEK jpbancario->baConta + "ZZZ" SOFTSEEK
   ENDDO
   IF Len( m_NomeCta ) == 0
      GOTO m_RecNo
   ELSE
      m_NumConta := hb_AScan( m_NomeCta, mbaConta )
      FOR nCont = 1 TO Len( m_NomeCta )
         m_NomeCta[ nCont ] := " " + Chr( 64 + nCont ) + " - " + m_NomeCta[ nCont ]
      NEXT
      WAchoice( 8, 9, m_NomeCta, @m_NumConta, "POSICIONAMENTO DE CONTA" )
      mbaConta = Substr( m_NomeCta[ m_NumConta ], 6 )
      SEEK mbaConta + "N" + Dtos( Date() ) SOFTSEEK
      SKIP -1
   ENDIF

   RETURN NIL

STATIC FUNCTION pBancoLancaLocaliza()

   LOCAL nCont, GetList := {}, m_RecNo := RecNo(), m_Struct, m_Sai

   THREAD STATIC m_Texto := " "

   wOpen( 5, 5, 10, MaxCol() - 1, "Texto a localizar" )
   m_Texto := Pad( m_Texto, 50 )
   // WSave( maxrow()-1, 0, maxrow(), maxcol() )
   // Mensagem( "Digite texto para localização afrente, ESC sai" )
   SET CURSOR ON
   @ 7, 7 GET m_Texto PICTURE "@K!"
   READ
   SET CURSOR OFF
   wClose()
   Mensagem()
   IF LastKey() != K_ESC
      Mensagem( "Aguarde... localizando texto afrente... ESC interrompe" )
      m_Texto = Trim(m_Texto)
      IF ! Eof()
         SKIP
      ENDIF
      m_Struct := dbStruct()
      m_Sai    := .F.
      DO WHILE ! m_Sai .AND. ! Eof()
         grafproc()
         FOR nCont = 1 TO fcount()
            m_Sai = ( Inkey() == K_ESC )
            DO CASE
            CASE m_Sai
            CASE m_Struct[ nCont, 2 ] == "N" ; m_Sai = ( m_Texto $ Str( FieldGet( nCont ) ) )
            CASE m_Struct[ nCont, 2 ] == "D" ; m_Sai = ( m_Texto $ Dtoc( FieldGet( nCont ) ) )
            CASE m_Struct[ nCont, 2 ] $ "CM" ; m_Sai = ( m_Texto $ Upper( FieldGet( nCont ) ) )
            OTHERWISE                        ; m_Sai = ( m_Texto $ Transform( FieldGet( nCont ), "" ) )
            ENDCASE
            IF m_Sai
               EXIT
            ENDIF
         NEXT
         IF m_Sai
            EXIT
         ENDIF
         SKIP
      ENDDO
      IF Eof()
         MsgWarning( "Nada foi localizado afrente!" )
         GOTO m_RecNo
      ELSE
         SKIP -1 // Porque retorna no registro seguinte
      ENDIF
   ENDIF
   KEYBOARD Chr( 205 )
   Inkey(0)

   RETURN NIL

FUNCTION BARecalcula( mbaConta ) // , dDataInicial, m_RecGeral )

   LOCAL aContaList := {}, oConta, nInicio, nFinal
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   Mensagem( "Recalculando" )
   nInicio := hb_MilliSeconds()
   WITH OBJECT cnSQL
      :cSQL := "SELECT DISTINCT BACONTA, BAAPLIC" + ;
         " FROM JPBANCARIO" + ;
         iif( mbaConta == NIL, "", " WHERE BACONTA = " + StringSQL( mbaConta ) )
      :Execute()
      DO WHILE ! :Eof()
         AAdd( aContaList, { :String( "BACONTA" ), :String( "BAAPLIC" ) } )
         :MoveNext()
      ENDDO
      FOR EACH oConta IN aContaList
         :ExecuteCmd( "SET @SOMA = 0" )
         :ExecuteCmd( "UPDATE JPBANCARIO" + ;
            " INNER JOIN" + ;
               "( SELECT IDBANCARIO, BADATBAN, BADATEMI, BAVALOR," + ;
               " BASALDO, IF( BAVALOR < 0, 2, 1 ) AS ORDEM, @SOMA := @SOMA + BAVALOR AS SALDO" + ;
               " FROM JPBANCARIO" + ;
               " WHERE BACONTA = " + StringSQL( oConta[ 1 ] ) + ;
               " AND BAAPLIC = " + StringSQL( oConta[2 ] ) + ;
               " ORDER BY BACONTA, BAAPLIC, BADATBAN, BADATEMI, ORDEM, IDBANCARIO ) AS A" + ;
               " ON JPBANCARIO.IDBANCARIO = A.IDBANCARIO" + ;
            " SET JPBANCARIO.BASALDO = A.SALDO" + ;
            " WHERE JPBANCARIO.BACONTA = " + StringSQL( oConta[ 1 ] ) + " AND JPBANCARIO.BASALDO <> A.SALDO" )
      NEXT
      :ExecuteCmd( "SET @SOMA = NULL" )
      :ExecuteCmd( "SET @CONTA = NULL" )
      :ExecuteCmd( "SET @APLIC = NULL" )
      :ExecuteCmd( "SET @DATBAN = NULL" )
      :ExecuteCmd( "SET @DATEMI = NULL" )
      :ExecuteCmd( "UPDATE JPBANCARIO" + ;
         " INNER JOIN" + ;
            "( SELECT BACONTA, BAAPLIC, IDBANCARIO, BADATBAN, BADATEMI, BAVALOR, BAIMPSLD," + ;
            " IF( BAVALOR < 0, 2, 1 ) AS ORDEM, @C = BACONTA AS CONTA, @D = BAAPLIC AS APLIC," + ;
            " @E = BADATBAN AS DATBAN, @F = BADATEMI AS DATEMI," + ;
            " IF( BACONTA <> @CONTA OR BAAPLIC <> @APLIC OR BADATBAN <> @DATBAN OR " + ;
            " ( BADATEMI = '2999-12-31' AND BADATEMI <> @DATEMI ), 'N', 'S' ) AS IMPSLD" + ;
            " FROM JPBANCARIO" + ;
            iif( mbaConta == NIL, "", " WHERE BACONTA = " + StringSQL( mbaConta ) ) + ;
            " ORDER BY BACONTA DESC, BAAPLIC DESC, BADATBAN DESC, BADATEMI DESC, ORDEM DESC, " + ;
            " IDBANCARIO DESC ) AS A" + ;
            " ON JPBANCARIO.IDBANCARIO = A.IDBANCARIO" + ;
         " SET JPBANCARIO.BAIMPSLD = A.IMPSLD" + ;
         " WHERE JPBANCARIO.BAIMPSLD <> A.IMPSLD" + ;
         iif( mbaConta == NIL, "", " AND BACONTA = " + StringSQL( mbaConta ) ) )
      :ExecuteCmd( "SET @CONTA = NULL" )
      :ExecuteCmd( "SET @APLIC = NULL" )
      :ExecuteCmd( "SET @DATBAN = NULL" )
      :ExecuteCmd( "SET @DATEMI = NULL" )
      :CloseRecordset()
   ENDWITH
   nFinal := hb_MilliSeconds()
   MsgExclamation( Str( nFinal - nInicio ) )

   RETURN .T.

STATIC FUNCTION OkData( dData, dDataInicial )

   IF Empty( dData ) .OR. dData > dDataInicial
      RETURN .T.
   ENDIF

   RETURN MsgYesNo( "Data menor que limite! Aceita?" )

FUNCTION ValidBancarioConta( cConta )

   LOCAL lOk := .T.

   IF ! Encontra( cConta, "jpbancario" )
      MsgWarning( "Conta bancária não cadastrada no movimento atual" )
      lOk := .F.
   ENDIF

   RETURN lOk


É um fonte diferente de todos os outros.
No momento, representa quase o total dos DBFs, em tamanho.

Terminado esse fonte, reduz de 18MB pra 2MB em DBF !!!!
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Jul 2020 22:07

A tela pra curiosidade

bancario.png


bancario2.png


Em ADO continua igual, sem novidade.
As duas estão no fonte, 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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Jul 2020 22:29

Na imagem deu pra ver que isto aqui não funcionou como eu pensava.

      :ExecuteCmd( "SET @SOMA = NULL" )
      :ExecuteCmd( "SET @CONTA = NULL" )
      :ExecuteCmd( "SET @APLIC = NULL" )
      :ExecuteCmd( "SET @DATBAN = NULL" )
      :ExecuteCmd( "SET @DATEMI = NULL" )
      :ExecuteCmd( "UPDATE JPBANCARIO" + ;
         " INNER JOIN" + ;
            "( SELECT BACONTA, BAAPLIC, IDBANCARIO, BADATBAN, BADATEMI, BAVALOR, BAIMPSLD," + ;
            " IF( BAVALOR < 0, 2, 1 ) AS ORDEM, @C = BACONTA AS CONTA, @D = BAAPLIC AS APLIC," + ;
            " @E = BADATBAN AS DATBAN, @F = BADATEMI AS DATEMI," + ;
            " IF( BACONTA <> @CONTA OR BAAPLIC <> @APLIC OR BADATBAN <> @DATBAN OR " + ;
            " ( BADATEMI = '2999-12-31' AND BADATEMI <> @DATEMI ), 'N', 'S' ) AS IMPSLD" + ;
            " FROM JPBANCARIO" + ;
            iif( mbaConta == NIL, "", " WHERE BACONTA = " + StringSQL( mbaConta ) ) + ;
            " ORDER BY BACONTA DESC, BAAPLIC DESC, BADATBAN DESC, BADATEMI DESC, ORDEM DESC, " + ;
            " IDBANCARIO DESC ) AS A" + ;
            " ON JPBANCARIO.IDBANCARIO = A.IDBANCARIO" + ;
         " SET JPBANCARIO.BAIMPSLD = A.IMPSLD" + ;
         " WHERE JPBANCARIO.BAIMPSLD <> A.IMPSLD" + ;
         iif( mbaConta == NIL, "", " AND BACONTA = " + StringSQL( mbaConta ) ) )
      :ExecuteCmd( "SET @CONTA = NULL" )
      :ExecuteCmd( "SET @APLIC = NULL" )
      :ExecuteCmd( "SET @DATBAN = NULL" )
      :ExecuteCmd( "SET @DATEMI = NULL" )
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 23 Jul 2020 02:16

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
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
              15 arquivo(s)      2.029.144 bytes


UIA !!!!!
Reduziu pra 2MB em DBF
Sendo que desses 2MB, o jpcidade já está no MySQL.... o que reduz pra menos de 1MB !!!

Só que agora são os módulos fiscal e contábil....
O fiscal praticamente fora de uso, mas estou convertendo.
O contábil.... agora só instalando MySQL/MariaDB nos clientes que só usam o contábil.

Tá chegando ao fim.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 23 Jul 2020 15:47

festa.png


Uia a coincidência
Meu aplicativo entrou em ritmo de festa !!!

Coincidiu, não foi por causa do MySQL....
É que perto do meu aniversário ele faz isso kkkkk
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 25 Jul 2020 21:21

Uma alteração simples de hoje, que é interessante pra quem ainda usa DBF.
É só uma tela mostrando quantos lançamentos de entrada/saída tem no livro fiscal, através de um browse.

Antes, em DBF

PROCEDURE pFiscTotais

   LOCAL mTmpFile, mStruOk, mTipLan, mMesLan, mTotal, mAnoLan

   IF ! AbreArquivos( "jpfiscal" )
      RETURN
   ENDIF
   SELECT jpfiscal

   IF ! MsgYesNo( "Faz somatória do LFiscal para resumo?" )
      RETURN
   ENDIF

   Mensagem( "Aguarde, somando..." )
   mTmpFile := TempFileArray(2)

   mStruOk := { { "MES", "C", 7, 0 }, { "ENTRADAS", "N", 10, 0 }, { "SAIDAS", "N", 10, 0 } }
   fErase( mTmpFile[ 1 ] )
   SELECT 0
   dbCreate( mTmpFile[ 1 ], mStruOk )
   USE ( mTmpFile[ 1] ) alias temp
   INDEX ON temp->Mes TO ( mTmpFile[ 2 ] )
   SELECT jpfiscal
   OrdSetFocus( "jpfiscal3" )
   GOTO TOP
   DO WHILE ! Eof()
      GrafProc()
      mTipLan := jpfiscal->lfTipLan
      mMesLan := Month( jpfiscal->lfDatLan )
      mAnoLan := Year( jpfiscal->lfDatLan )
      mTotal  := 0
      DO WHILE mMesLan == Month( jpfiscal->lfDatLan ) .AND. mAnoLan == Year( jpfiscal->lfDatLan ) .AND. ;
            mTipLan == jpfiscal->lfTipLan .AND. ! Eof()
         mTotal += 1
         SKIP
      ENDDO
      SELECT temp
      SEEK StrZero( mAnoLan, 4 ) + "/" + StrZero( mMesLan, 2 )
      IF Eof()
         RecAppend()
         REPLACE temp->Mes WITH StrZero( mAnoLan, 4 ) + "/" + StrZero( mMesLan, 2 )
         RecUnlock()
      ENDIF
      RecLock()
      IF mTipLan == "1"
         REPLACE temp->Saidas WITH  temp->Saidas + mTotal
      ELSE
         REPLACE temp->Entradas WITH  temp->Entradas + mTotal
      ENDIF
      RecUnlock()
      SELECT jpfiscal
   ENDDO
   SELECT temp
   GOTO TOP
   BrowseDBF( { { "MES   ENTRADAS   SAÍDAS", { || temp->Mes + " " + Str( temp->Entradas, 10 ) + " " + Str( temp->Saidas, 10 ) } } } )
   SELECT ( Select( "temp" ) )
   CLOSE DATABASES
   fErase( mTmpFile[ 1 ] )
   fErase( mTmpFile[ 2 ] )

   RETURN


Depois, em MySQL/ADO

PROCEDURE pFiscTotais

   LOCAL oTBrowse
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   IF ! MsgYesNo( "Faz somatória do LFiscal para resumo?" )
      RETURN
   ENDIF

   Mensagem( "Aguarde, somando..." )

   WITH OBJECT cnSQL
      :cSQL := "SELECT CONCAT_WS( '-', LPAD( YEAR( LFDATLAN ), 4, '0' ), LPAD( MONTH( LFDATLAN ), 2, '0' ) ) AS ANOMES, " + ;
         " SUM( IF( LFTIPLAN = 1, 1, 0 ) ) AS SAIDAS," + ;
         " SUM( IF( LFTIPLAN = 2, 1, 0 ) ) AS ENTRADAS" + ;
         " FROM JPFISCAL" + ;
         " GROUP BY CONCAT_WS( '-', LPAD( YEAR( LFDATLAN ), 4, '0' ), LPAD( MONTH( LFDATLAN ), 2, '0' ) )" + ;
         " ORDER BY ANOMES DESC"
      :Execute()
      oTBrowse := { ;
         { "ANO/MES", { || :String( "ANOMES", 7 ) } }, ;
         { "ENTRADAS", { || Transform( :Number( "ENTRADAS" ), PicVal(14,2) ) } }, ;
         { "SAIDAS",   { || Transform( :Number( "SAIDAS" ),   PicVal(14,2) ) } } }
      BrowseADO( cnSQL, oTBrowse, "ANOMES", { || "" } )
      KEYBOARD ""
      :CloseRecordset()
   ENDWITH

   RETURN


Pra quem já usa, isso é simples, estão carecas de saber....
Pra quem usa DBF... a diferença é grande: o aplicativo pede pro servidor, e o servidor entrega tudo pronto.

O legal não é somente o que se vê, é também o que não se vê:

- A rotina em DBF... é pra DBF... e DBF significa Clipper, Harbour, e produtos xbase
- A rotina SQL... é pra SQL... significa qualquer linguagem de programação, inclusive Harbour

Entendeu?
Tá achando vantagem que o aplicativo vai ficar atualizado?
Pois é... o programador também vai, vai estar preparado pra qualquer coisa atual.

E usar Harbour porque gosta, e não porque tá preso a xbase.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Jul 2020 00:21

Outro mais interessante ainda, que precisou precaução

Totais por dia ou por mês do fiscal

STATIC FUNCTION imprime()

   LOCAL oPDF, nKey, m_ClaIcmVl, m_ClaIcmIs, m_ClaIcmOu, m_TotVlCon, m_TotIcmBa, m_TotIcmIs, m_TotIcmOu, m_TotIpiIs, m_TotIpiOu, m_ClaVlCon
   LOCAL m_ClaIcmBa, m_ClaIpiBa, m_ClaIpiIs, m_ClaIpiOu, m_TotIpiVl, m_TotIcmVl, m_TotIpiBa, m_ClaIpiVl, m_Data

   oPDF := PDFClass():New()
   oPDF:SetType( nOpcPrinterType )
   oPDF:Begin()
   nKey = 0
   oPDF:acHeader := {"","",""}
   oPDF:acHeader[ 1 ] = "RESUMO DA MOVIMENTACAO, POR DATA"
   IF nOpcData == 1
      oPDF:acHeader[ 2 ] = " "
   ELSE
      oPDF:acHeader[ 2 ] = "Periodo: " + Dtoc( m_datai ) + " a " + Dtoc( m_dataf ) + iif( nOpcGrf == 1, "", " " + acTxtGrf[ nOpcGrf ] )
   ENDIF
   oPDF:acHeader[ 3 ] = Space(10) + "--DATA--  ---VALOR CONTABIL--  --BASE DE CALCULO--  -IMPOSTO DEB/CRED.-  --ISENTOS/N.TRIBUT-  -------OUTROS------"

   STORE 0 to m_totvlcon, m_toticmba, m_toticmvl, ;
      m_toticmis, m_toticmou
   STORE 0 to m_totipiba, m_totipivl, m_totipiis, m_totipiou

   SELECT jpfiscal
   OrdSetFocus( "jpfiscal3" )
   SEEK "2" SOFTSEEK
   oPDF:PageHeader()
   oPDF:DrawText( oPDF:nRow, 0, "ENTRADAS:" )
   oPDF:nRow += 2
   DO WHILE nKey != K_ESC .AND. ! Eof()
      GrafProc()
      nKey = Inkey()
      IF jpfiscal->lfDatLan > m_dataf .AND. nOpcData == 2
         SKIP
         LOOP
      ENDIF
      IF jpfiscal->lfDatLan < m_datai .AND. nOpcData == 2
         SKIP
         LOOP
      ENDIF
      m_data := Substr( Dtoc( jpfiscal->lfDatLan ),iif( nOpcTotais == 1, 1, 4 ) )
      STORE 0 to m_clavlcon, m_claicmba, m_claicmvl, ;
         m_claicmis, m_claicmou
      STORE 0 to m_claipiba, m_claipivl, m_claipiis, m_claipiou
      DO WHILE nKey != K_ESC .AND. jpfiscal->lfTipLan=="2" .AND. ! Eof()
         IF Substr( Dtoc( jpfiscal->lfDatLan ),iif( nOpcTotais == 1, 1, 4 ) ) != m_Data
            EXIT
         ENDIF
         nKey = Inkey()
         GrafProc()
         IF jpfiscal->lfDatLan > m_dataf .AND. nOpcData == 2
            SKIP
            LOOP
         ENDIF
         IF jpfiscal->lfDatLan < m_datai .AND. nOpcData == 2
            SKIP
            LOOP
         ENDIF
         m_clavlcon = Round( m_clavlcon + jpfiscal->lfValCon, 2 )
         IF jpfiscal->lfIcmVal != 0
            m_claicmba = Round( m_claicmba + jpfiscal->lfIcmBas, 2 )
            m_claicmvl = Round( m_claicmvl + jpfiscal->lfIcmVal, 2 )
         ENDIF
         IF jpfiscal->lfValCon - jpfiscal->lfIcmBas - jpfiscal->lfIcmOut > 0
            m_claicmis = Round( m_claicmis + ( jpfiscal->lfValCon - jpfiscal->lfIcmBas - jpfiscal->lfIcmOut ), 2 )
         ENDIF
         IF jpfiscal->lfIcmOut != 0
            m_claicmou = Round( m_claicmou + jpfiscal->lfIcmOut, 2 )
         ENDIF
         IF jpfiscal->lfIpiVal != 0
            m_claipiba = Round( m_claipiba + jpfiscal->lfIpiBas, 2 )
            m_claipivl = Round( m_claipivl + jpfiscal->lfIpiVal, 2 )
         ENDIF
         IF jpfiscal->lfValCon - jpfiscal->lfIpiBas - jpfiscal->lfIpiOut - jpfiscal->lfIpiVal > 0
            m_claipiis = Round( m_claipiis + ( jpfiscal->lfValCon - jpfiscal->lfIpiBas - jpfiscal->lfIpiOut - jpfiscal->lfIpiVal ), 2 )
         ENDIF
         IF jpfiscal->lfIpiOut != 0
            m_claipiou = Round( m_claipiou + jpfiscal->lfIpiOut, 2 )
         ENDIF
         SKIP
      ENDDO
      IF m_clavlcon != 0
         oPDF:MaxRowTest()
         oPDF:DrawText( oPDF:nRow,  10, m_Data )
         oPDF:DrawText( oPDF:nRow,  20, m_clavlcon, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  40, m_claicmba, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  60, m_claicmvl, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  80, m_claicmis, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow, 100, m_claicmou, PicVal(14,2) )
         m_totvlcon = Round( m_totvlcon + m_clavlcon, 2 )
         m_toticmba = Round( m_toticmba + m_claicmba, 2 )
         m_toticmvl = Round( m_toticmvl + m_claicmvl, 2 )
         m_toticmis = Round( m_toticmis + m_claicmis, 2 )
         m_toticmou = Round( m_toticmou + m_claicmou, 2 )
         m_totipiba = Round( m_totipiba + m_claipiba, 2 )
         m_totipivl = Round( m_totipivl + m_claipivl, 2 )
         m_totipiis = Round( m_totipiis + m_claipiis, 2 )
         m_totipiou = Round( m_totipiou + m_claipiou, 2 )
         oPDF:nRow     += 1
      ENDIF
   ENDDO
   oPDF:MaxRowTest()
   oPDF:DrawLine( oPDF:nRow,  0, oPDF:nRow, oPDF:MaxCol() )
   oPDF:nRow += 1
   oPDF:MaxRowTest()
   oPDF:DrawText( oPDF:nRow,   0, "*** ICMS ***" )
   oPDF:DrawText( oPDF:nRow,  20, m_totvlcon, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow,  40, m_toticmba, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow,  60, m_toticmvl, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow,  80, m_toticmis, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow, 100, m_toticmou, PicVal(14,2) )
   oPDF:DrawLine( oPDF:nRow + 1, 0, oPDF:nRow + 1, oPDF:MaxCol() )
   oPDF:nRow += 3
   oPDF:MaxRowTest()
   oPDF:DrawText( oPDF:nRow, 0, "SAIDAS:" )
   oPDF:nRow += 2
   oPDF:MaxRowTest()

   STORE 0 to m_totvlcon, m_toticmba, m_toticmvl, ;
      m_toticmis, m_toticmou
   STORE 0 to m_totipiba, m_totipivl, m_totipiis, m_totipiou

   SELECT jpfiscal
   OrdSetFocus("jpfiscal3")
   SEEK "1" SOFTSEEK
   DO WHILE nKey != K_ESC .AND. jpfiscal->lfTipLan=="1" .AND. ! Eof()
      nKey = Inkey()
      GrafProc()
      IF jpfiscal->lfDatLan > m_dataf .AND. nOpcData == 2
         SKIP
         LOOP
      ENDIF
      IF jpfiscal->lfDatLan < m_datai .AND. nOpcData == 2
         SKIP
         LOOP
      ENDIF
      m_data := Substr( Dtoc( jpfiscal->lfDatLan ), iif( nOpcTotais == 1, 1, 4 ) )
      STORE 0 to m_clavlcon, m_claicmba, m_claicmvl, m_claicmis, m_claicmou, m_claipiba, m_claipivl, m_claipiis, m_claipiou

      DO WHILE nKey != K_ESC .AND. jpfiscal->lfTipLan=="1" .AND. ! Eof()
         IF Substr(Dtoc(jpfiscal->lfDatLan),iif(nOpcTotais==1,1,4)) != m_Data
            EXIT
         ENDIF
         nKey = Inkey()
         GrafProc()
         IF jpfiscal->lfDatLan > m_dataf .AND. nOpcData == 2
            SKIP
            LOOP
         ENDIF
         IF jpfiscal->lfDatLan < m_datai .AND. nOpcData == 2
            SKIP
            LOOP
         ENDIF
         IF ( nOpcGrf == 2 .AND. jpfiscal->lfGRF != "S" ) .OR. ( nOpcGrf == 3 .AND. jpfiscal->lfGRF == "S" )
            SKIP
            LOOP
         ENDIF
         m_clavlcon = Round( m_clavlcon + jpfiscal->lfValCon, 2 )
         IF jpfiscal->lfIcmBas != 0
            m_claicmba = Round( m_claicmba + jpfiscal->lfIcmBas, 2 )
         ENDIF
         IF jpfiscal->lfIcmVal != 0
            m_claicmvl = Round( m_claicmvl + jpfiscal->lfIcmVal, 2 )
         ENDIF
         IF jpfiscal->lfValCon - jpfiscal->lfIcmBas - jpfiscal->lfIcmOut > 0
            m_claicmis = Round( m_claicmis + ( jpfiscal->lfValCon - jpfiscal->lfIcmBas - jpfiscal->lfIcmOut ), 2 )
         ENDIF
         IF jpfiscal->lfIcmOut != 0
            m_claicmou = Round( m_claicmou + jpfiscal->lfIcmOut, 2 )
         ENDIF
         IF jpfiscal->lfIpiVal != 0
            m_claipiba = Round( m_claipiba + jpfiscal->lfIpiBas, 2 )
            m_claipivl = Round( m_claipivl + jpfiscal->lfIpiVal, 2 )
         ENDIF
         IF jpfiscal->lfValCon - jpfiscal->lfIpiBas - jpfiscal->lfIpiOut - jpfiscal->lfIpiVal > 0
            m_claipiis = Round( m_claipiis + ( jpfiscal->lfValCon - jpfiscal->lfIpiBas - jpfiscal->lfIpiOut - jpfiscal->lfIpiVal ), 2 )
         ENDIF
         IF jpfiscal->lfIpiOut != 0
            m_claipiou = Round( m_claipiou + jpfiscal->lfIpiOut, 2 )
         ENDIF
         SKIP
      ENDDO
      IF m_clavlcon != 0
         oPDF:MaxRowTest()
         oPDF:DrawText( oPDF:nRow,  10, m_data )
         oPDF:DrawText( oPDF:nRow,  20, m_clavlcon, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  40, m_claicmba, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  60, m_claicmvl, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  80, m_claicmis, PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow, 100, m_claicmou, PicVal(14,2) )
         m_totvlcon = Round( m_totvlcon + m_clavlcon, 2 )
         m_toticmba = Round( m_toticmba + m_claicmba, 2 )
         m_toticmvl = Round( m_toticmvl + m_claicmvl, 2 )
         m_toticmis = Round( m_toticmis + m_claicmis, 2 )
         m_toticmou = Round( m_toticmou + m_claicmou, 2 )
         m_totipiba = Round( m_totipiba + m_claipiba, 2 )
         m_totipivl = Round( m_totipivl + m_claipivl, 2 )
         m_totipiis = Round( m_totipiis + m_claipiis, 2 )
         m_totipiou = Round( m_totipiou + m_claipiou, 2 )
         oPDF:nRow     += 1
      ENDIF
   ENDDO
   oPDF:MaxRowTest()
   oPDF:DrawLine( oPDF:nRow,  0, oPDF:nRow, oPDF:MaxCol() )
   oPDF:nRow += 1
   oPDF:MaxRowTest()
   oPDF:DrawText( oPDF:nRow,   0, "*** ICMS ***" )
   oPDF:DrawText( oPDF:nRow,  20, m_totvlcon, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow,  40, m_toticmba, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow,  60, m_toticmvl, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow,  80, m_toticmis, PicVal(14,2) )
   oPDF:DrawText( oPDF:nRow, 100, m_toticmou, PicVal(14,2) )
   oPDF:End()

   RETURN .T.


STATIC FUNCTION imprime()

   LOCAL oPDF, nKey, m_TotVlCon, m_TotIcmBa, m_TotIcmIs, m_TotIcmOu, m_TotIpiIs, m_TotIpiOu
   LOCAL m_TotIpiVl, m_TotIcmVl, m_TotIpiBa, cSQLGroup
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   oPDF := PDFClass():New()
   oPDF:SetType( nOpcPrinterType )
   oPDF:Begin()
   nKey = 0
   oPDF:acHeader := {"","",""}
   oPDF:acHeader[ 1 ] = "RESUMO DA MOVIMENTACAO, POR DATA"
   IF nOpcData == 1
      oPDF:acHeader[ 2 ] = " "
   ELSE
      oPDF:acHeader[ 2 ] = "Periodo: " + Dtoc( dDataInicial ) + " a " + Dtoc( dDataFinal ) + iif( nOpcGrf == 1, "", " " + acTxtGrf[ nOpcGrf ] )
   ENDIF
   oPDF:acHeader[ 3 ] = Space(10) + "--DATA--  ---VALOR CONTABIL--  --BASE DE CALCULO--  -IMPOSTO DEB/CRED.-  --ISENTOS/N.TRIBUT-  -------OUTROS------"
   oPDF:PageHeader()
   oPDF:DrawText( oPDF:nRow, 0, "ENTRADAS:" )
   oPDF:nRow += 2

   WITH OBJECT cnSQL
      cSQLGroup := "LPAD( YEAR( LFDATLAN ), 4, '0' ), LPAD( MONTH( LFDATLAN ), 2, '0' )"
      IF nOpcTotais == 1
         cSQLGroup += ", LPAD( Day( LFDATLAN ), 2, '0' )"
      ENDIF
      cSQLGroup := "CONCAT_WS( '-', " + cSQLGroup + " )"
      :cSQL := "SELECT LFTIPLAN, " + cSQLGroup + " AS DATA, " + ;
         " SUM( LFVALCON ) AS VALCON, SUM( IF( LFICMVAL = 0, 0, LFICMBAS ) ) AS ICMBAS," + ;
         " SUM( LFICMVAL ) AS ICMVAL, SUM( LFICMOUT ) AS ICMOUT," + ;
         " SUM( IF( LFVALCON - LFICMBAS - LFICMOUT > 0, LFVALCON - LFICMBAS - LFICMOUT, 0 ) ) AS ICMISE," + ;
         " SUM( LFIPIVAL ) AS IPIVAL, SUM( IF( LFIPIVAL > 0, LFIPIBAS, 0 ) ) AS IPIBAS," + ;
         " SUM( IF( LFVALCON - LFIPIBAS - LFIPIOUT - LFIPIVAL > 0, LFVALCON - LFIPIBAS - LFIPIOUT - LFIPIVAL, 0 ) ) AS IPIISE," + ;
         " SUM( LFIPIOUT ) AS IPIOUT" + ;
         " FROM JPFISCAL" + ;
         " WHERE LFTIPLAN IN ( '1', '2' )"
      IF nOpcData == 2
         :cSQL += " AND LFDATLAN BETWEEN CAST( " + DateSQL( dDataInicial ) + " AS DATE )" + ;
            " AND CAST( " + DateSQL( dDataFinal ) + " AS DATE )"
      ENDIF
      IF nOpcGrf <> 1
         :cSQL += " AND LFGRF " + iif( nOpcGrf == 2, "=", "<>" ) + " 'S'"
      ENDIF
      :cSQL += " GROUP BY LFTIPLAN, " + cSQLGroup + ;
         " HAVING VALCON > 0" + ;
         " ORDER BY LFTIPLAN DESC, DATA"
      :Execute()

      STORE 0 to m_totvlcon, m_toticmba, m_toticmvl, m_toticmis, m_toticmou
      STORE 0 to m_totipiba, m_totipivl, m_totipiis, m_totipiou

      DO WHILE :String( "LFTIPLAN", 1 ) == "2" .AND. nKey != K_ESC .AND. ! :Eof()
         GrafProc()
         nKey := Inkey()
         oPDF:MaxRowTest()
         oPDF:DrawText( oPDF:nRow,  10, :String( "DATA" ) )
         oPDF:DrawText( oPDF:nRow,  20, :Number( "VALCON" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  40, :Number( "ICMBAS" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  60, :Number( "ICMVAL" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  80, :Number( "ICMISE" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow, 100, :Number( "ICMOUT" ), PicVal(14,2) )
         m_totvlcon += :Number( "VALCON" )
         m_toticmba += :Number( "ICMBAS" )
         m_toticmvl += :Number( "ICMVAL" )
         m_toticmis += :Number( "ICMISE" )
         m_toticmou += :Number( "ICMOUT" )
         m_totipiba += :Number( "ICMBAS" )
         m_totipivl += :Number( "IPIVAL" )
         m_totipiis += :Number( "IPIISE" )
         m_totipiou += :Number( "IPIOUT" )
         oPDF:nRow     += 1
         :MoveNext()
      ENDDO
      oPDF:MaxRowTest()
      oPDF:DrawLine( oPDF:nRow,  0, oPDF:nRow, oPDF:MaxCol() )
      oPDF:nRow += 1
      oPDF:MaxRowTest()
      oPDF:DrawText( oPDF:nRow,   0, "*** ICMS ***" )
      oPDF:DrawText( oPDF:nRow,  20, m_totvlcon, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow,  40, m_toticmba, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow,  60, m_toticmvl, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow,  80, m_toticmis, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow, 100, m_toticmou, PicVal(14,2) )
      oPDF:DrawLine( oPDF:nRow + 1, 0, oPDF:nRow + 1, oPDF:MaxCol() )
      oPDF:nRow += 3
      oPDF:MaxRowTest()
      oPDF:DrawText( oPDF:nRow, 0, "SAIDAS:" )
      oPDF:nRow += 2
      oPDF:MaxRowTest()

      STORE 0 to m_totvlcon, m_toticmba, m_toticmvl, m_toticmis, m_toticmou
      STORE 0 to m_totipiba, m_totipivl, m_totipiis, m_totipiou

      DO WHILE :String( "LFTIPLAN", 1 ) == "1" .AND. nKey != K_ESC .AND. ! :Eof()
         nKey := Inkey()
         GrafProc()
         oPDF:MaxRowTest()
         oPDF:DrawText( oPDF:nRow,  10, :String( "DATA" ) )
         oPDF:DrawText( oPDF:nRow,  20, :Number( "VALCON" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  40, :Number( "ICMBAS" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  60, :Number( "ICMVAL" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow,  80, :Number( "ICMISE" ), PicVal(14,2) )
         oPDF:DrawText( oPDF:nRow, 100, :Number( "ICMOUT" ), PicVal(14,2) )
         m_totvlcon += :Number( "VALCON" )
         m_toticmba += :Number( "ICMBAS" )
         m_toticmvl += :Number( "ICMVAL" )
         m_toticmis += :Number( "ICMISE" )
         m_toticmou += :Number( "ICMOUT" )
         m_totipiba += :Number( "IPIBAS" )
         m_totipivl += :Number( "IPIVAL" )
         m_totipiis += :Number( "IPIISE" )
         m_totipiou += :Number( "IPIOUT" )
         oPDF:nRow     += 1
         :MoveNext()
      ENDDO
      oPDF:MaxRowTest()
      oPDF:DrawLine( oPDF:nRow,  0, oPDF:nRow, oPDF:MaxCol() )
      oPDF:nRow += 1
      oPDF:MaxRowTest()
      oPDF:DrawText( oPDF:nRow,   0, "*** ICMS ***" )
      oPDF:DrawText( oPDF:nRow,  20, m_totvlcon, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow,  40, m_toticmba, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow,  60, m_toticmvl, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow,  80, m_toticmis, PicVal(14,2) )
      oPDF:DrawText( oPDF:nRow, 100, m_toticmou, PicVal(14,2) )
      :CloseRecordset()
   ENDWITH
   oPDF:End()

   RETURN .T.


Agora é uma soma só, e a precaução ficou por conta disto:
" WHERE LFTIPLAN IN ( '1', '2' )"

Porque?
Porque se tiver um '0' não imprimiria nada, porque não entraria em nenhum dos dois do while.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Jul 2020 18:31

Tava olhando esse fiscal, e tem um valor que é sempre calculado.
Foi bom no tempo do DBF, pra economizar espaço, mas é chato pra colocar nos fontes/comandos.
Vou criar o campo, pra facilitar.

Vi que o MySQL tem a opção de um campo calculado, que pode ou não ser armazenado na tabela.
Achei legal a opção mas... acho que isso pode quebrar meu backup, porque o valor vai no backup, e no retorno provavelmente vai dar erro.
Na dúvida, e como SÓ EU uso livros fiscais, vai na base de campo na tabela mesmo, sem cálculo automático.

Tá na reta final de conversão... correr o risco de atrapalhar a conversão agora só por causa disso não compensa.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Jul 2020 23:42

Mexendo em muito fonte.
Mas é interessante que, pelo nome dos fontes, dá pra saber em que módulos ando mexendo.

Pasta de d:\cdrom\FONTES\INTEGRA

10/02/2020  10:26             1.473 pcontreddisp.prg
10/02/2020  10:26             1.589 pcontredrenum.prg
10/02/2020  10:26             4.449 pconthistorico.prg
10/02/2020  10:26             3.012 pediimpplaref.prg
10/02/2020  10:26             5.811 pfiscrel0020.prg
10/02/2020  10:26             1.828 ptesteconsultadfe.prg
10/02/2020  10:26             3.558 psetupempresa.prg
10/02/2020  10:26             9.561 ze_pdfbolbradescoclass.prg
10/02/2020  10:26             5.384 ze_ftp.prg
10/02/2020  10:26               240 ze_seguro.prg
10/02/2020  10:26            48.987 ze_pdfboletoclass.prg
10/02/2020  10:26             1.653 ptesqueryc.prg
10/02/2020  10:26               792 pdfestatus.prg
12/02/2020  18:42             2.866 ze_novaversao.prg
14/02/2020  11:19               621 psetupcapicom.prg
19/03/2020  11:43             6.353 ze_webservice.prg
19/03/2020  20:06             2.863 ze_resource.prg
22/03/2020  13:14            17.515 ze_updatedefault.prg
06/05/2020  01:12             2.275 pconttotais.prg
06/05/2020  10:38             5.262 pcontrel0385.prg
17/05/2020  18:13             5.644 pcontlancpad.prg
17/05/2020  18:41             4.409 pcontimpsped.prg
17/05/2020  18:55             7.293 pjpempresa.prg
19/05/2020  11:00             7.775 pcontsetup.prg
03/06/2020  13:25             4.981 ptesdadabe.prg
04/06/2020  13:03             4.566 ze_excel1.prg
04/06/2020  13:03             6.659 ze_excel2.prg
04/06/2020  13:03             6.069 ze_updateexeup.prg
04/06/2020  13:10            11.954 ze_logerr.prg
07/06/2020  16:53             6.359 pcontlancalote.prg
10/06/2020  07:50             9.963 pretitau.prg
10/06/2020  07:50             6.760 pprecombustivel.prg
10/06/2020  07:52             4.215 psitejpa.prg
10/06/2020  07:53             6.862 ptestregiao.prg
10/06/2020  07:54             3.460 ze_helpprint.prg
10/06/2020  07:54             4.606 ze_spedxmllist.prg
10/06/2020  07:54            15.642 ze_SpedXmlMDFE.prg
10/06/2020  07:55             5.797 pjpagenda.prg
10/06/2020  07:55             5.079 pestototarmazem.prg
10/06/2020  07:55             2.334 pediimpanpcnae.prg
10/06/2020  08:05             2.114 ptescep.prg
10/06/2020  08:05             4.181 pnotagerarps.prg
10/06/2020  08:05             8.878 pjptransp.prg
10/06/2020  08:05             4.811 pjpmotori.prg
10/06/2020  08:05             4.617 pjpnfbase.prg
10/06/2020  08:05             4.627 pjpibpt.prg
10/06/2020  08:05             5.872 pjpdecreto.prg
10/06/2020  08:05             3.580 pfiscblocok.prg
10/06/2020  08:05             1.857 pestovalest.prg
10/06/2020  08:05             1.715 pestoentfor.prg
10/06/2020  08:05             1.582 pedixls.prg
10/06/2020  08:05             2.924 pediimpibgecnae.prg
10/06/2020  08:05             2.308 pedixml2.prg
10/06/2020  08:05             2.680 pediimpanploc.prg
10/06/2020  08:05             2.494 pediimpanpage.prg
10/06/2020  08:05             2.661 pediimpanpati.prg
10/06/2020  08:05             2.970 pedi0260.prg
10/06/2020  08:05             4.561 pcontimpexcel.prg
10/06/2020  08:05             7.424 ljptransp.prg
10/06/2020  08:05             3.255 ljpforpag.prg
10/06/2020  08:06             2.794 pediimpanpins.prg
10/06/2020  08:06             1.727 pdfemanif.prg
17/06/2020  10:55             6.463 ptesjson.prg
18/06/2020  17:21             7.053 pjppedidofatura.prg
19/06/2020  12:45            15.541 pjppedidocupom.prg
19/06/2020  12:45             4.213 pjppedidonfe.prg
23/06/2020  15:18             6.708 ze_enviaemail.prg
24/06/2020  17:19            44.621 pdfeserver.prg
27/06/2020  17:58             5.202 ze_SpedCadastroClass.prg
28/06/2020  06:31               697 pdfenaoenc.prg
28/06/2020  20:59            18.347 pjppedidocte.prg
29/06/2020  07:41            31.833 pdfesalva.prg
01/07/2020  19:10             1.240 ptesbase.prg
02/07/2020  09:05             5.854 pfiscrel0070.prg
02/07/2020  09:05             6.688 pfiscrel0010.prg
02/07/2020  09:05            14.113 ljpestoquec.prg
02/07/2020  09:09            17.214 pfiscrel0130.prg
05/07/2020  09:10             8.665 ljpitem.prg
07/07/2020  10:32            26.352 ze_updatee.prg
07/07/2020  10:32            19.656 ze_updatec.prg
07/07/2020  10:32            19.315 ze_updateb.prg
07/07/2020  10:32             2.004 ze_updatea.prg
08/07/2020  21:07             9.587 pcontrel0330.prg
08/07/2020  21:08             4.266 pcontrel0370.prg
08/07/2020  21:08             4.502 pcontrel0470.prg
08/07/2020  21:08            10.303 pcontrel0550.prg
08/07/2020  21:12            12.824 pcontrel0520.prg
08/07/2020  21:15             6.127 pcontsintetica.prg
08/07/2020  21:21            10.260 pcontrel0250.prg
08/07/2020  21:21            11.513 pcontrel0300.prg
08/07/2020  21:21            10.414 pcontrel0320.prg
08/07/2020  21:23             2.639 pcontemitidos.prg
08/07/2020  21:24             7.024 pcontfecha.prg
08/07/2020  21:24             3.361 pcontimpplano.prg
08/07/2020  21:24             9.433 pcontrecalculo.prg
08/07/2020  21:24            10.155 pcontrel0270.prg
08/07/2020  21:24            10.592 pcontrel0310.prg
08/07/2020  21:24             7.926 pcontrel0340.prg
08/07/2020  21:25             4.779 pcontsaldo.prg
08/07/2020  21:25               522 pcont_lucro.prg
09/07/2020  11:46             3.203 pcontnumdia.prg
09/07/2020  13:35             8.390 pcontrel0360.prg
09/07/2020  13:56             8.631 pcontrel0390.prg
09/07/2020  14:57            19.263 pcontrel0380.prg
09/07/2020  14:57            10.912 pcontrel0530.prg
09/07/2020  14:58            18.258 pcontrel0210.prg
09/07/2020  14:58             8.744 pcontrel0010.prg
09/07/2020  15:14            24.039 ze_updateg.prg
12/07/2020  23:39             3.175 pbancorelsaldo.prg
12/07/2020  23:39             6.526 pbancorelextrato.prg
13/07/2020  17:04             5.148 pnotaservico.prg
13/07/2020  17:04             3.561 pnotaxls.prg
13/07/2020  17:09             3.494 pbol0050.prg
13/07/2020  17:09             8.866 pbol0040.prg
13/07/2020  17:09            13.261 pbol0020.prg
13/07/2020  17:09             7.593 ljpimposto.prg
13/07/2020  17:09            19.968 ljpcadastro.prg
13/07/2020  17:10             1.221 pdfegerapdf.prg
13/07/2020  17:10             2.818 pdfeemail.prg
13/07/2020  17:10             2.583 pdfecteinut.prg
13/07/2020  17:10             3.019 pdfectecancel.prg
13/07/2020  17:11             4.456 pfinanrelmaifor.prg
13/07/2020  17:11             4.852 pfinanrelmaicli.prg
13/07/2020  17:11             7.741 pfinanrelfluxo.prg
13/07/2020  17:11             1.759 pedi0270.prg
13/07/2020  17:11             6.555 pdfezipxml.prg
13/07/2020  17:11             2.694 pdfenfeinut.prg
13/07/2020  17:15            14.254 pfiscsaidas.prg
13/07/2020  17:15            15.088 pfiscentradas.prg
13/07/2020  17:15             8.007 pfisccorrecao.prg
13/07/2020  17:15            34.254 pfinanrelreceber.prg
14/07/2020  00:44            22.720 pjpforpag.prg
14/07/2020  13:08            24.975 lbalger.prg
14/07/2020  22:19            60.359 ze_SpedXmlNFE.prg
15/07/2020  11:05            23.568 ze_update2020.prg
16/07/2020  15:34             1.937 pprecancel.prg
16/07/2020  18:20            22.033 ze_updatef.prg
16/07/2020  18:32            25.600 ze_updated.prg
17/07/2020  00:16             6.036 ze_prot.prg
17/07/2020  14:05            32.443 pdfeimporta.prg
17/07/2020  14:05            11.524 ljpfisica.prg
17/07/2020  14:05            19.431 ljpestoqueb.prg
17/07/2020  14:05            28.749 ljpestoquea.prg
17/07/2020  14:06            11.802 pestorelanalise.prg
17/07/2020  14:06             2.147 pestoitemxls.prg
17/07/2020  14:10             2.454 pnotageranfe.prg
17/07/2020  14:10            11.947 pnotaficcliven.prg
17/07/2020  14:10            18.108 pnotaconsprod.prg
17/07/2020  14:10             7.529 pjpvendedor.prg
17/07/2020  14:10             8.948 pjpveiculo.prg
17/07/2020  14:10            70.792 pjppedido.prg
17/07/2020  14:10             5.888 pjpfisicab.prg
17/07/2020  14:10             5.328 pjpfisicaa.prg
17/07/2020  14:10             5.302 pjpcomissao.prg
17/07/2020  14:10            36.621 pjpcadastro.prg
17/07/2020  14:10             6.104 pfiscrel0140.prg
17/07/2020  14:10             8.922 pfiscnotas.prg
17/07/2020  14:13             3.133 ppretabcombreaj.prg
17/07/2020  14:13             8.448 pprereltabmulti.prg
17/07/2020  14:13            10.721 pprereltabcomb.prg
17/07/2020  14:13            10.649 pprehtmltabpre.prg
17/07/2020  14:13             4.251 pnotavervendas.prg
17/07/2020  14:13            14.080 pnotaromaneio.prg
17/07/2020  14:13             5.206 pnotarelvendcli.prg
17/07/2020  14:13            31.155 pnotarelnotas.prg
17/07/2020  14:13             4.648 pnotarelcompcli.prg
17/07/2020  14:13             5.249 pnotarelclivend.prg
17/07/2020  14:13             3.401 pnotaproximas.prg
17/07/2020  14:13             7.373 pprevalperc.prg
17/07/2020  14:16            10.473 pedi0010.prg
17/07/2020  14:16             4.881 pestorecalculo.prg
17/07/2020  14:16            16.049 pjpestoque.prg
17/07/2020  17:16             7.651 ze_updateexedown.prg
19/07/2020  18:25             1.453 pbancoconsolida.prg
20/07/2020  10:51            21.494 ppretabcomb.prg
20/07/2020  16:40            27.435 ljppedido.prg
21/07/2020  19:36            28.337 pnotaplanilha.prg
21/07/2020  19:44             9.840 pnotarelmapa.prg
21/07/2020  19:44            11.633 pnotarelcompmes.prg
21/07/2020  19:44            28.292 pjppedidonota.prg
22/07/2020  14:51            21.005 pjpnotfis.prg
22/07/2020  14:51            25.233 pjpmdfcab.prg
22/07/2020  18:55            20.828 pfinanrelpagar.prg
22/07/2020  18:55            34.443 pfinanedreceber.prg
22/07/2020  18:55            27.430 pfinanedpagar.prg
22/07/2020  18:55            11.167 pfinanbaixaport.prg
22/07/2020  18:55             7.592 pediexpclarcon.prg
22/07/2020  18:55             4.108 pedi0190.prg
22/07/2020  18:55             6.712 pedi0150.prg
22/07/2020  18:55             3.437 pcont_valid.prg
22/07/2020  18:55             6.368 pcontrel0230.prg
22/07/2020  18:55            41.114 pcontlancainclui.prg
22/07/2020  18:55            15.811 pcontlancaedit.prg
22/07/2020  18:55            23.229 pcontfcont.prg
22/07/2020  18:55               504 pcontctaadm.prg
22/07/2020  18:55            14.394 pcontcontas.prg
22/07/2020  18:55            12.588 pbol0030.prg
22/07/2020  18:55             2.024 pauxpisenq.prg
22/07/2020  18:55             1.279 pauxpiscst.prg
22/07/2020  18:55             2.668 pauxorimer.prg
22/07/2020  18:55             1.311 pauxmodfis.prg
22/07/2020  18:55             1.409 pauxipienq.prg
22/07/2020  18:55             1.727 pauxipicst.prg
22/07/2020  18:55             1.770 pauxicmcst.prg
22/07/2020  18:55             4.382 pauxcnae.prg
22/07/2020  18:55             1.319 pauxcarcor.prg
22/07/2020  18:55             4.819 ljplicmov.prg
22/07/2020  18:57             4.091 ppretabela.prg
22/07/2020  18:57             9.436 pprereltabgeral.prg
22/07/2020  18:57            85.082 pjppedidosub.prg
22/07/2020  18:57            14.540 pjplicmov.prg
22/07/2020  18:57            27.534 pjpitem.prg
22/07/2020  18:57            26.149 pjpimposto.prg
22/07/2020  18:57            27.782 pjpanpmov.prg
22/07/2020  18:57            58.105 pfiscsped.prg
23/07/2020  01:15             2.621 pbancografresumo.prg
23/07/2020  01:15             4.130 pbancograficomes.prg
23/07/2020  01:15             6.000 pbancogera.prg
23/07/2020  01:15            11.653 pbancocomparames.prg
23/07/2020  01:15             4.160 pbancoccusto.prg
23/07/2020  01:17             8.155 pbancorelccusto.prg
23/07/2020  01:18             9.277 ze_update.prg
23/07/2020  05:02            12.892 pbancolanca.prg
24/07/2020  15:36             4.883 pcont_func.prg
24/07/2020  17:36            56.221 pcontsped.prg
25/07/2020  02:51             5.635 pcontfiscal.prg
25/07/2020  15:08             1.143 pfisctotais.prg
26/07/2020  03:38            39.191 pfiscsintegra.prg
26/07/2020  16:52            28.664 ze_updateh.prg
26/07/2020  22:14             6.121 pfiscrel0120.prg
26/07/2020  22:14            12.455 pfiscrel0090.prg
26/07/2020  22:14             9.841 pfiscrel0060.prg
26/07/2020  22:21             8.353 pfiscrel0110.prg
26/07/2020  22:21            21.403 pfiscrel0030.prg
26/07/2020  22:25            11.886 pfiscrel0100.prg
26/07/2020  22:25            10.571 pfiscrel0080.prg
26/07/2020  22:25             7.784 pfiscrel0050.prg
26/07/2020  22:28            21.806 pfiscrel0040.prg
             238 arquivo(s)      2.629.844 bytes


O anterior foi o bancário, e o atual é o fiscal, com passagem rápida pelo sped contábil.
Também dá pra ver que, eventualmente desvio do módulo sendo alterado.
E que, dependendo da alteração, faço em vários fontes de uma vez.
No fiscal andei alterando nomes de campos e variáveis em vários módulos, pra ficar "mais padrão", por isso quase tudo com a mesma data/hora.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 29 Jul 2020 05:03

10/03/2020 20:34 6.750.512 jpa2020.exe
28/06/2020 06:31 6.544.816 jpa.exe
02/07/2020 07:30 6.544.816 JPA.EXE
05/07/2020 09:48 6.536.192 jpa.exe
29/07/2020 04:53 6.449.152 jpa.exe

Eba !!!!!!

Finalizado fiscal.

Agora sim, só falta o contábil e relacionados, pra liquidar de vez com DBF.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 29 Jul 2020 17:31

Na falta de um lugar apropriado....
Uma alteração no contábil, sei lá se vale a pena, mas fiz, pra ficar mais flexível.

STATIC FUNCTION OkGrupo( mplGrupo )

   LOCAL lReturn := .T.

   @ Row(), 35 SAY Pad( iif( mplGrupo == "A", "Ativo", iif( mplGrupo == "P", "Passivo", iif( mplGrupo == "R", "Result.", "" ) ) ), 20 )
   IF ! mplGrupo $ "APR"
      MsgWarning( "Grupo tem que ser (A)tivo, (P)assivo ou (R)esultado!" )
      lReturn := .F.
   ENDIF

   RETURN lReturn


STATIC FUNCTION OkGrupo( mplGrupo )

   LOCAL lReturn := .T., nPos
   LOCAL aGrupoList := { "A:Ativo", "P:Passivo", "R:Resultado" } // "L:Patr.Liq", "C:Compensacao", "O:Outras" }

   nPos := hb_AScan( aGrupoList, { | e | mplGrupo == Left( e, 1 ) } )
   @ Row(), 35 SAY Pad( iif( nPos == 0, "", Substr( aGrupoList[ nPos ], 3 ), 20 )
   IF nPos == 0
      cList := ""
      FOR EACH oElement IN aGrupoList
         cList += oElement + iif( oElement:__EnumIsLast, "", ", " )
      NEXT
      MsgWarning( "Opções disponíveis:" +  cList )
      lReturn := .F.
   ENDIF

   RETURN lReturn


Ficou interessante, talvez dê pra aproveitar a rotina pra muito mais coisas.
A validação é no primeiro caractere, e em caso de erro mostra a lista.

Se criar rotina separada pra isso, dá pra usar pra analítica/sintética, masculino/feminino, sim/não, pessoa física/jurídica, etc. etc. etc.
Ou até exibir um menu com as opções automaticamente.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 30 Jul 2020 19:02

Então.... só reforçando aqui:

Meu módulo contábil é o único que está usando DBF.
O módulo contábil e relacionados.

TODO restante já está somente em MySQL.

Durante esse tempo todo, fui alterando de DBF pra MySQL, e os clientes foram atualizando.

Usei o método mais demorado, já que converti usando ADO, o que obriga a reescrever fontes.
Primeiro fiz a gravação dupla, DBF + MySQL ao mesmo tempo, alterando toda parte que fazia gravação em DBF, pra gravar também no MySQL.
Depois alterei para o MySQL ser o principal, usar o campo incremental do MySQL pra fornecer códigos, e gravar igual no DBF.
Depois comecei a alterar todas as leituras, pra serem feitas usando somente MySQL.
E assim que não havia leitura no DBF, apagava o DBF.

Comecei pra valer em dezembro/2019, após ter acesso ao browse usando ADO.
Foram praticamente 7 meses, aprendendo mais SQL conforme ia colocando em prática.

Antes disso, ia fazendo alguma coisa, passei o de imobiliária parcial pra MySQL usando DBFs temporários, por ser de uso em uma única empresa, pra ter mais controle sobre o que acontecia, antes de adotar MySQL geral.
Até vou precisar ajustar melhor, pra ficar compatível com o que tenho usado agora pra MySQL, sem DBFs temporários.

Meu EXE é um só pra TODOS os clientes, significa que TUDO em TODOS os clientes foi pra MySQL.
A exceção é o programa da imobiliária, e os aplicativos em Linux/Flagship
E falta agora a contabilidade e relacionados, que são bem mais simples do que o restante.

Estou muito contente com o resultado.
Tudo correu até mais tranquilo do que eu esperava.
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: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Fernando queiroz, jelias, mauricioportela, Semrush [Bot] e 5 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