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 » 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 04 Ago 2020 15:19

Erro de hoje:

whatsapp.png


Problema:

erro.png


Coloquei pra salvar a soma de valor de ST, ao invés de base de ST.

Problemas desse tipo.... aí tanto faz se é DBF, SQL... errou salva errado kkkk

Como solução rápida, no cliente usei o HeidiSQL, fiz o select com relacionamento e alterei o conteúdo manualmente.
E já alterei o aplicativo, agora faz certo.

Tava errado no pedido e na nota fiscal, já que o total da nota vém do pedido.

Nota:
Já estava em uso há alguns dias em outros clientes.
Esse não atualizava desde MAIO deste ano.
Foi a primeira nota com substituição tributária, desde a mudança desse fonte pra SQL.

Ou seja: ele estava com DBF antes do almoço, passou pra MySQL depois do almoço, e deu esse erro, porque tava errado mesmo, nenhum outro problema.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 04 Ago 2020 15:37

Aproveitando:

Então....

Eu atualizo estruturas automático, tanto DBF quanto MySQL.
Salvar dados de DBF pra MySQL, também automático.
O aplicativo tem atualização automática, é uma opção no menu.

Lembram? fonte fácil, atualização fácil, conversão fácil, tudo fácil.
Isso torna a correção de erros fácil e rápida.

Seria muuuito diferente, se eu tivesse que ir no cliente, pesquisar o problema, levar fontes, utilitários, etc.

Tem que pensar em todo conjunto, tudo que puder facilitar pra gente, melhor.
Cometo erros igual todo mundo, mas essas coisas facilitam fazer manutenção, e por isso tudo foi rápido/fácil.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 07 Ago 2020 14:59

Chegou a hora.
Fiz uma cópia do aplicativo como jpa202008.exe como precaução.
Começar a limpar isto agora:

19/06/2020  17:41             7.666 ze_update.prg
26/06/2020  10:37            22.801 ze_update2020.prg
31/03/2020  18:20             2.004 ze_updatea.prg
28/05/2020  01:29            19.315 ze_updateb.prg
28/05/2020  01:34            19.656 ze_updatec.prg
08/06/2020  22:12            25.138 ze_updated.prg
22/03/2020  13:14            17.515 ze_updatedefault.prg
19/06/2020  17:41            26.352 ze_updatee.prg
10/06/2020  07:54             7.647 ze_updateexedown.prg
04/06/2020  13:03             6.069 ze_updateexeup.prg
14/05/2020  14:23            21.976 ze_updatef.prg
19/06/2020  12:35            23.814 ze_updateg.prg
20/05/2020  03:43            20.502 ze_updateh.prg
              13 arquivo(s)        220.455 bytes


Tem criação/atualização de estrutura de DBF e de MySQL.
E transferência de DBF pra MySQL.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 07 Ago 2020 15:18

Achei que ia reduzir mais.

07/08/2020  14:22             9.328 ze_update.prg
07/08/2020  15:06            14.480 ze_update2020.prg
01/08/2020  06:36             2.071 ze_updatea.prg
07/08/2020  14:49            17.200 ze_updateb.prg
07/08/2020  15:00            15.497 ze_updatec.prg
07/08/2020  14:55            18.460 ze_updated.prg
30/07/2020  04:09            15.340 ze_updatedefault.prg
07/08/2020  15:03            15.372 ze_updatee.prg
17/07/2020  17:16             7.651 ze_updateexedown.prg
04/06/2020  13:03             6.069 ze_updateexeup.prg
07/08/2020  14:30            13.279 ze_updatef.prg
07/08/2020  14:46            16.967 ze_updateg.prg
07/08/2020  15:05            23.646 ze_updateh.prg
              13 arquivo(s)        175.360 bytes


Exceto por esta rotina, o aplicativo não sabe mais sobre muitos DBFs que já existiram.

STATIC FUNCTION UpdateDeleteOld()

   LOCAL cFile, nIdade, aList := { ;
      "ba_auto", ;
      "ba_grup", ;
      "ba_movi", ;
      "jpbaauto", ;
      "jpbaccusto", ;
      "jpbagrup", ;
      "jpanpage", ;
      "jpanpati", ;
      "jpanpins", ;
      "jpanploc", ;
      "jpbamovi", ;
      "jpanpope", ;
      "jpanppro", ;
      "jpbancario", ;
      "jpbarra", ;
      "jpcadastro", ;
      "jpcarcor", ;
      "jpclista", ;
      "jpcep", ;
      "jpcfop", ;
      "jpcomissao", ;
      "jpcotaca", ;
      "jpcotcli", ;
      "jpcotfor", ;
      "jpcotpro", ;
      "jpcte", ;
      "jpdecret", ;
      "jpdocrel", ;
      "jpedicfg", ;
      "jpestoque", ;
      "jpfinan", ;
      "jpfiscal", ;
      "jpfisica", ;
      "jpforpag", ;
      "jpibpt",   ;
      "jpimposto", ;
      "jpitem", ;
      "jpitped", ;
      "jplicmov", ;
      "jplogsi", ;
      "jpmdfcab", ;
      "jpmdfdet", ;
      "jpmotori", ;
      "jpnfbase", ;
      "jpnfeger", ;
      "jpnfexml", ;
      "jpnotaca", ;
      "jpnotfis", ;
      "jpordbar", ;
      "jpordres", ;
      "jpordser", ;
      "jppedido", ;
      "jppreco", ;
      "jpprehis", ;
      "jppretab", ;
      "jpromcab", ;
      "jpromdet", ;
      "jptexto", ;
      "jptransa", ;
      "jptransp", ;
      "jpveiculo", ;
      "jpvendedor", ;
      "jpvvdem", ;
      "jpvvfin", ;
      "nfbase", ;
      "rastrea" }

   SayScroll( "Verificando velhos/desativados" )

   nIdade := iif( IsMaquinaJPA(), -1, 15 )
   FOR EACH cFile IN aList
      DeleteOldFiles( cFile + ".dbf", nIdade )
      DeleteOldFiles( cFile + ".cdx", nIdade )
   NEXT

   RETURN NIL


Na minha máquina apaga na hora, já nos clientes espera 15 dias após o último uso.
NÃO é rotina nova, então é possível que já tenha apagado na maioria dos clientes.

Pois é...
Rotinas automáticas de atualizar DBF, transferir pra MySQL, etc.
Tudo relacionado a DBF vai acabar sumindo....

NÃO... não terminei ainda.... continua faltando o contábil e relacionados.
Pra esses... nem tem nada de nota fiscal, estoque, etc. pra converter de DBF, é só apagar mesmo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 07 Ago 2020 15:49

JoséQuintas escreveu:NÃO... não terminei ainda.... continua faltando o contábil e relacionados.
Pra esses... nem tem nada de nota fiscal, estoque, etc. pra converter de DBF, é só apagar mesmo.


Pra QUEM USA só contábil, o resto não é usado.
Lembrando que é tudo um único EXE, então o contábil não pode ficar de fora.
TUDO que tenho está num único EXE, tudo é atualizado ao mesmo tempo, seja dbf ou sql, então... no final nenhum fica de fora.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor Vlademiro » 08 Ago 2020 02:51

Seus aplicativos estão independentes de banco de dados devido ao ADO, mas vc está usando muita função nativa do MySQL, o que vai te deixar dependente dele. Uma coisa boa que vc poderia fazer é catalogar em algum local quais as funções nativas do MySQL que vc está usando para , se houver necessidade, criar essas funções em outro banco. Bancos como Sqlserver, Oracle e PostgreSQL tem o comando Create function. As vezes a função existe com nome diferente. Talvez compense só criar uma com o mesmo nome em vez de ficar mechendo no seu código e colocando IFs para cada banco.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 08 Ago 2020 23:45

Ainda é cedo pra pensar nisso.
Teria que começar a mexer em outro, pra ver quais seriam as diferenças.

Um lado bom é que uso minha classe, então existe a possibilidade de colocar diferenças pra ela tratar.

Por exemplo, entre Excel e MySQL

METHOD TableList() CLASS ADOClass

   LOCAL acTableList := {}, Rs

   IF ".XLS" $ Upper( ::cn:ConnectionString )
      rs := ::cn:openSchema(20) // adSchemaTables
      DO WHILE ! Rs:Eof()
         IF ! "Print_Are" $ rs:Fields( "Table_Name" ):Value .AND. ;
               ! "FilterDatabase" $ rs:Fields( "Table_Name" ):Value
            AAdd( acTableList, "[" + rs:Fields( "Table_Name" ):Value + "]" )
         ENDIF
         rs:MoveNext()
      ENDDO
      rs:Close()
   ELSE
      ::cSQL := "SELECT DISTINCT table_name AS TABELA FROM information_schema.TABLES WHERE table_schema=" + StringSQL( Lower( AppEmpresaApelido() ) )
      ::Execute()
      DO WHILE ! ::Eof()
         AAdd( acTableList, ::Value( "TABELA" ) )
         ::MoveNext()
      ENDDO
      ::CloseRecordset()
   ENDIF

   RETURN acTableList
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 17 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