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 » 21 Jun 2020 05:46

falta.png


Bela mudança.
Apesar de tudo, NÃO faz sentido precisar do cadastro de clientes e de produtos em DBF.
Mas.... aí também entra uma parte que comentei: o FISCAL, contendo muita coisa relativamente fora de uso, ainda precisa deles.

Pensando bem... talvez compense criar temporários locais, só pra manter alguns funcionando até decidir o que fazer....
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 27 Jun 2020 11:11

Pra completar o cerco sobre nota fiscal/estoque/financeiro/notas/etc. falta eliminar produtos e cadastros
Não parece, mas esses menores podem dar mais trabalho do que os grandes.

cadastros.png


produtos.png


Vou pesquisando aonde falta, e escolhendo aonde mexer primeiro.
Fazer o que....
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 30 Jun 2020 15:10

Situação anterior: linhas com jpcadastro-> 230 e linhas com jpitem-> 191
Situação de hoje: linhas com jpcadastro-> 166 e linhas com jpitem -> 172

Não estou seguindo uma ordem específica, nem me limitando a esses dois DBFs.
Apenas dou uma olhada aonde tem, e se vou querer mexer em algum fonte.
Hoje, por exemplo, alterei o livro fiscal de entradas/saídas totalmente pra MySQL, eliminando dele o uso do jpcadastro.dbf, jpfiscal.dbf e algum outro.
Apesar do livro fiscal estar praticamente fora de uso, decidi manter.

E assim vai indo, um pouquinho por vez....
Acho que até o final do ano acaba tudo.
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 03 Jul 2020 15:12

Uma alteração interessante de agora:

   WITH OBJECT cnSQL
      :ExecuteCmd( "DELETE FROM JPNOTFIS WHERE NFFILIAL = " + NumberSQL( nIdFilial ) + " AND NFNOTFIS = " + NumberSQL( nNumNotFis ) )
      :cSQL := "SELECT JPPEDIDO.*" + ;
         " FROM JPPEDIDO" + ;
         " WHERE IDPEDIDO = " + NumberSQL( nIdPedido )
      :Execute()
      ...
      IF ! "SEMFIN" $ ReacaoJPTRANSA( :Number( "PDTRANSA" ) )
         FOR nCont := 1 TO Len( oParcelas )
            :QueryCreate()
...
            :QueryAdd( "FIPORTADOR", StrZero( nIdPortador, 6 ) )
            Encontra( StrZero( :Number( "PDCADASTRO" ), 6 ), "jpcadastro", "numlan" ) // Posiciona cliente
            :QueryAdd( "FIVENDEDOR", StrZero( iif( :Number( "PDVENDEDOR" ) == 0, Val( jpcadastro->cdVendedor ), :Number( "PDVENDEDOR" ) ), 6 ) )
            :QueryExecuteInsert( "JPFINAN" )
         NEXT
      ENDIF
      :CloseRecordset()
   ENDWITH


O detalhe é no final: pode gravar o vendedor do cliente, mas depende do dbf aberto e posicionado

Solução simples:
Se no MySQL está tudo disponível... e está usando um comando SQL.... só pegar pelo comando SQL.
      :cSQL := "SELECT JPPEDIDO.*, JPCADASTRO.CDVENDEDOR" + ;
         " FROM JPPEDIDO" + ;
         " LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
         " WHERE IDPEDIDO = " + NumberSQL( nIdPedido )
...
            :QueryAdd( "FIVENDEDOR", StrZero( iif( :Number( "PDVENDEDOR" ) == 0, :Number( "CDVENDEDOR" ), :Number( "PDVENDEDOR" ) ), 6 ) )
            :QueryExecuteInsert( "JPFINAN" )


Pronto, não precisa mais do DBF pra isso.
Quando alterei antes não percebi isso, mas agora está resolvido.
Conforme vou alterando, as coisas vão ficando mais "visíveis".
E assim vou eliminando a leitura de jpcadastro.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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 03 Jul 2020 15:49

Mas nem todas são simples assim, cheguei numa geração de arquivo Sintegra.
Este está quase totalmente em DBF.
Estou eliminando só cadastro, mas.... posso eliminar TODOS os DBFs deste fonte de uma vez.

É nessas horas que tenho 3 opções:

- deixar pra depois, afinal ninguém mais usa isso
- alterar só o uso do cadastro pra MySQL
- alterar tudo de uma vez pra MySQL
- deixar pra decidir depois, e ver as outras alterações primeiro

Mas é um bom exemplo do que comento sempre: tudo depende dos fontes e de nós
Por mais que se crie um roteiro de trabalho, vamos alterando o roteiro conforme o que vamos encontrando pela frente nos fontes.
E também conforme vamos nos sentindo confortáveis em mexer.

No começo da minha migração, eu alteraria só a parte de cadastro, que é o foco atual, mas agora, tô mais pra alterar o fonte inteiro de uma vez.
Todos os arquivos envolvidos estão em gravação dupla DBF+MySQL, então isso é possível.
Só tentar confirmar primeiro, se realmente é o que parece...
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor Itamar M. Lins Jr. » 03 Jul 2020 17:33

Ola!
deixar pra depois, afinal ninguém mais usa isso

Eu também pensei só que é obrigatório ainda!
Tem até uma postagem lá no forum de Legislação...

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4350
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 150 vezes
Mens.Curtidas: 244 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 03 Jul 2020 18:35

Vixe...
Ainda bem que optei por deixar, e já está totalmente em MySQL !!!!!
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

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

Meu modo de trabalho

Mensagempor Itamar M. Lins Jr. » 03 Jul 2020 18:58

Ola!
Sintegra em 2020!
http://www.pctoledo.com.br/forum/viewtopic.php?f=20&t=24033

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4350
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 150 vezes
Mens.Curtidas: 244 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 03 Jul 2020 21:11

Faltam só dois fontes, pra acabar com o jpcadastro.dbf.
Mas... como eu disse... deixei os mais complicados para o final.
Não sei qual dos dois é pior.... kkkkk

Além de já usar comando SQL, ainda tem dois temporários até chegar no relatório, que tem opções diferentes.
Quem mandou fazer assim.... kkkkk

Mas entra o que falei: deixando os mais difíceis pro final, "talvez" com o conhecimento adquirido com os outros, este fique mais fácil.
A tela do computador chega a ficar pequena pra entender as "tranqueiras" do fonte.

STATIC FUNCTION Imprime()

   LOCAL nCont, mTmpFile, oPDF, aTransacaoList, cTexto, nKey, cTxt, oFile
   LOCAL nNumTransa, mRelCliente, mRelVendedor, mRelItem, mRelRaiz, mCampos
   LOCAL mComissao, mCabeca, mChaves, mRaizCnpj, mStruOk
   LOCAL nTotMargem := Array(5), nTotComissao := Array(5 ), nTotCusto := Array(5), nTotVenda := Array(5)
   LOCAL nTotQtde := Array(5), nTotEmbalagem := Array(5), cTotChave := Array(5), nTotRecNo := Array(5)
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   mTmpFile := { MyTempFile( "dbf" ), MyTempFile( "cdx" ), MyTempFile( "dbf" ), MyTempFile( "cdx" ) }

   FOR nCont = 1 TO 4
      fErase( mTmpFile[ nCont ] )
   NEXT

   mStruOk := { ;
      { "CHAVE1",     "C", 50, 0 }, ;
      { "CHAVE2",     "C", 50, 0 }, ;
      { "CHAVE3",     "C", 50, 0 }, ;
      { "CHAVE4",     "C", 50, 0 }, ;
      { "PDCADASTRO", "C", 6, 0 }, ;
      { "CDCNPJ",     "C", 10, 0 }, ;
      { "PDVENDEDOR", "C", 6, 0 }, ;
      { "IPPRODUTO",  "C", 6, 0 }, ;
      { "DESCITEM",   "C", 30, 0 }, ;
      { "PDTRANSA",   "C", 6, 0 }, ;
      { "NF",         "C", 9, 0 }, ;
      { "OBS",        "C", 50, 0 }, ;
      { "DATEMI",     "D", 8, 0 }, ;
      { "IPQTDE",     "N", 14, 0 }, ;
      { "QTDEMB",     "N", 14, 0 }, ;
      { "IPVALCUS",   "N", 15, 2 }, ;
      { "IPVALNOT",   "N", 15, 2 }, ;
      { "MARGEM",     "N", 15, 2 }, ;
      { "PMARGEM",    "N", 8, 3 }, ;
      { "VALCOM",     "N", 15, 2 }, ;
      { "PERCOM",     "N", 4, 1 }, ;
      { "NIVEL",      "C", 1, 0 } } // usado para totalizar

   dbCreate( mTmpFile[ 1 ], mStruOk )
   dbCreate( mTmpFile[ 3 ], mStruOk )

   SELECT 0
   USE ( mTmpFile[ 3 ] ) ALIAS temp2
   SELECT 0
   USE ( mTmpFile[ 1 ] ) ALIAS Temp

   WITH OBJECT cnSQL
      :cSQL := "SELECT IDPEDIDO, PDCADASTRO, PDVENDEDOR, PDTRANSA," + ;
         " PDPEDCLI," + ;
         " IF( JPNOTFIS.NFNOTFIS IS NULL, JPPEDIDO.PDDATEMI, JPNOTFIS.NFDATEMI ) AS DATEMI," + ;
         " IF( JPNOTFIS.NFNOTFIS IS NULL, JPPEDIDO.PDPEDCLI, JPNOTFIS.NFNOTFIS ) AS NOTFIS," + ;
         " JPTRANSA.TRDESCRI AS TRANOME, JPTRANSA.TRREACAO AS REACAO," + ;
         " JPNOTFIS.NFNOTFIS AS NOTFIS," + ;
         " JPITPED.IPPRODUTO, JPITPED.IPQTDE, JPITPED.IPVALCUS, JPITPED.IPVALNOT," + ;
         " JPITEM.IEPRODEP, JPITEM.IEQTDCOM," + ;
         " JPCADASTRO.CDCNPJ" + ;
         " FROM JPPEDIDO" + ;
         " LEFT JOIN JPNOTFIS ON JPNOTFIS.NFPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA" + ;
         " LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
         " LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
         " WHERE PDCONF = 'S'" + ;
         " AND PDTRANSA IN (" + ;
            " SELECT IDTRANSA FROM JPTRANSA AS LISTAA WHERE "
      IF nOpcCompraVenda == 1
         :cSQL += " TRREACAO LIKE '%VENDA%'"
      ELSEIF nOpcCompraVenda == 2
         :cSQL += " TRREACAO LIKE '%COMPRA%'"
      ELSE
         :cSQL += " ( TRREACAO LIKE '%COMPRA%' OR TRREACAO LIKE '%VENDA%' )"
      ENDIF
      IF nOpcDevol == 2
         :cSQL += " AND TRREACAO LIKE '%DEV%'"
      ENDIF
      :cSQL += " )"
      IF nOpcVendedor == 2
         :cSQL += " AND PDVENDEDOR = " + NumberSQL( mIdVendedor )
      ENDIF
      IF nOpcCadastro == 2
         :cSQL += " AND PDCADASTRO IN (" + ;
            " SELECT IDCADASTRO FROM JPCADASTRO AS LISTA WHERE LEFT( CDCNPJ, 11 ) = " + ;
            " ( SELECT LEFT( CDCNPJ, 11 ) FROM JPCADASTRO AS ESCOLHIDO WHERE IDCADASTRO = " + NumberSQL( nIdCadastro ) + " ) )"
      ENDIF
      IF nOpcProduto == 2
         :cSQL += " AND JPITEM.IDPRODUTO = " + NumberSQL( nIdProduto )
      ENDIF
      IF nOpcProDep == 2
         :cSQL += " AND JPITEM.IEPRODEP = " + NumberSQL( nIdProDep )
      ENDIF
      :cSQL += " AND ( JPNOTFIS.NFNOTFIS IS NOT NULL OR NOT" + ;
         " JPPEDIDO.PDTRANSA IN ( SELECT IDTRANSA FROM JPTRANSA AS LISTAB WHERE TRREACAO LIKE '%N+%' OR TRREACAO LIKE '%N-%' ) )" + ;
         " AND IF( JPNOTFIS.NFNOTFIS IS NULL, PDDATEMI, NFDATEMI ) BETWEEN CAST( " + DateSQL( dDataInicial ) + " AS DATE )" + ;
               " AND CAST( " + DateSQL( dDataFinal ) + " AS DATE )"
      :Execute()
      DO WHILE ! :Eof()
         GrafProc()
         Inkey()
         Encontra( StrZero( :Number( "PDCADASTRO" ), 6 ), "jpcadastro", "numlan" )
         Encontra( StrZero( :Number( "IPPRODUTO" ), 6 ), "jpitem", "item" )
         SELECT temp
         RecAppend()
         REPLACE ;
            temp->pdCadastro WITH StrZero( :Number( "PDCADASTRO" ), 6 ), ;
            temp->pdVendedor WITH StrZero( :Number( "PDVENDEDOR" ), 6 ), ;
            temp->ipProduto  WITH StrZero( :Number( "IPPRODUTO" ), 6 ), ;
            temp->cdCnpj     WITH :String( "CDCNPJ", 10 ), ;
            temp->pdTransa   WITH StrZero( :Number( "PDTRANSA" ), 6 ), ;
            temp->ipQtde     WITH :Number( "IPQTDE" ), ;
            temp->QtdEmb     WITH :Number( "IPQTDE" ) * Max( 1, :Number( "IEQTDCOM" ) ), ;
            temp->ipValCus   WITH :Number( "IPVALCUS" ), ;
            temp->ipValNot   WITH :Number( "IPVALNOT" ), ;
            temp->Obs        WITH :String( "TRANOME" ), ;
            temp->NF         WITH StrZero( :Number( "NOTFIS" ), 9 ), ;
            temp->DatEmi     WITH :Date( "DATEMI" ), ;
            temp->Margem     WITH :Number( "IPVALNOT" ) - :Number( "IPVALCUS" )
         IF "DEV" $ :String( "REACAO" )
            REPLACE ;
               temp->ipQtde   WITH -temp->ipQtde, ;
               temp->QtdEmb   WITH -temp->QtdEmb, ;
               temp->ipValCus WITH -temp->ipValCus, ;
               temp->ipValNot WITH -temp->ipValNot
         ENDIF
         IF temp->ipValNot <> 0 // Evita "estouro"
            mMargem := Max( Min( ( temp->ipValNot - temp->ipValCus ) / temp->ipValNot * 100, 999 ), -99.9 )
            REPLACE temp->PMargem WITH mMargem
         ELSE
            mMargem := 0
         ENDIF
         IF ADORecCount( "JPCOMISSAO", "CMVENDEDOR = " + NumberSQL( :Number( "PDVENDEDOR" ) ) + " AND CMPRODEP = " + NumberSQL( :Number( "IEPRODEP" ) ) ) != 0
            mComissao := ADOField( "CMVALOR", "N", "JPCOMISSAO", "CMVENDEDOR = " + NumberSQL( :Number( "PDVENDEDOR" ) ) + " AND CMPRODEP = " + NumberSQL( :Number( "IEPRODEP" ) ) )
         ELSE
            mComissao := ADOField( "VDCOMISSAO", "N", "JPVENDEDOR", "IDVENDEDOR = " + NumberSQL( :Number( "PDVENDEDOR" ) ) )
         ENDIF
         REPLACE ;
            temp->ValCom WITH temp->ipValNot * mComissao / 100, ;
            temp->PerCom WITH mComissao
         RecUnlock()
         :MoveNext()
      ENDDO
   ENDWITH

   mCabeca := { "VENDEDOR", "ITEM", "CNPJ", "CLIENTE" }

   DO CASE
   CASE nOpcOrdem == 1 ; mChaves := { 1, 2, 3, 4 }
   CASE nOpcOrdem == 2 ; mChaves := { 2, 1, 3, 4 }
   CASE nOpcOrdem == 3 ; mChaves := { 3, 4, 2, 1 }
   CASE nOpcOrdem == 4 ; mChaves := { 1, 3, 4, 2 }
   CASE nOpcOrdem == 5 ; mChaves := { 2, 3, 4, 1 }
   CASE nOpcOrdem == 6 ; mChaves := { 3, 4, 1, 2 }
   ENDCASE

   SELECT temp
   INDEX ON temp->cdCnpj + Str( 1000000 - RecNo(), 7 ) TO ( mTmpFile[ 2 ] )
   GOTO TOP
   aTransacaoList := {}
   DO WHILE ! Eof()
      mRaizCnpj := temp->cdCnpj
      Encontra( temp->pdCadastro, "jpcadastro", "numlan" ) // pra pegar desc cnpj
      mRelRaiz := iif( Eof(), "*RAIZ CNPJ* " + temp->cdCnpj, Pad( jpcadastro->cdNome, 40 ) + temp->cdCnpj )
      DO WHILE temp->cdCnpj == mRaizCnpj .AND. ! Eof()
         Encontra( temp->pdCadastro, "jpcadastro", "numlan" )
         mRelCliente := iif( Empty( jpcadastro->cdNome ), "*CLIENTE* " + temp->pdCadastro, Pad( jpcadastro->cdNome, 40 ) + temp->pdCadastro )
         mRelVendedor := Pad( ADOField( "VDDESCRI", "C", "JPVENDEDOR", "IDVENDEDOR=" + NumberSQL( temp->pdVendedor ) ), 40 ) + temp->pdVendedor
         Encontra(temp->ipProduto,"jpitem","item")
         mRelItem := iif( Empty( jpitem->ieDescri ), "*ITEM* " + temp->ipProduto, Pad( jpitem->ieDescri, 40 ) + temp->ipProduto )
         mCampos := { mRelVendedor, mRelItem, mRelRaiz, mRelCliente }
         nNumTransa := 0
         FOR nCont = 1 TO Len( aTransacaoList )
            IF aTransacaoList[ nCont, 1 ] == temp->pdTransa
               nNumTransa := nCont
               EXIT
            ENDIF
         NEXT
         IF nNumTransa == 0
            AAdd( aTransacaoList, { temp->pdTransa, 0 } )
            nNumTransa := Len( aTransacaoList )
         ENDIF
         aTransacaoList[ nNumTransa, 2 ] += temp->ipValNot
         RecLock()
         REPLACE ;
            temp->Chave1 WITH mCampos[ mChaves[ 1 ] ], ;
            temp->Chave2 WITH mCampos[ mChaves[ 2 ] ], ;
            temp->Chave3 WITH mCampos[ mChaves[ 3 ] ], ;
            temp->Chave4 WITH mCampos[ mChaves[ 4 ] ]
         RecUnlock()
         SKIP
      ENDDO
   ENDDO
   SET INDEX TO

   SELECT Temp
   INDEX ON temp->Chave1 + temp->Chave2 + temp->Chave3 + temp->Chave4 TO ( mTmpFile[ 4 ] )
   GOTO TOP
   STORE 0 To nTotQtde[ 1 ], nTotCusto[ 1 ], nTotVenda[ 1 ], nTotMargem[ 1 ], nTotComissao[ 1 ], nTotEmbalagem[ 1 ]
   SELECT temp2
   RecAppend()
   RecUnlock()
   SELECT temp
   GOTO TOP
   DO WHILE ! Eof()
      Inkey()
      STORE 0 To nTotQtde[ 2 ], nTotCusto[ 2 ], nTotVenda[ 2 ], nTotMargem[ 2 ], nTotComissao[ 2 ], nTotEmbalagem[ 2 ]
      cTotChave[ 2 ] := temp->Chave1
      SELECT Temp2
      RecAppend()
      REPLACE ;
         temp2->Chave1 WITH cTotChave[ 2 ], ;
         temp2->Nivel  WITH "1"
      RecUnlock()
      nTotRecNo[ 2 ] := RecNo()
      SELECT Temp
      DO WHILE ! Eof()
         Inkey()
         IF cTotChave[ 2 ] != temp->Chave1
            EXIT
         ENDIF
         STORE 0 To nTotQtde[ 3 ], nTotCusto[ 3 ], nTotVenda[ 3 ], nTotMargem[ 3 ], nTotComissao[ 3 ], nTotEmbalagem[ 3 ]
         cTotChave[ 3 ] := temp->Chave2
         SELECT temp2
         RecAppend()
         REPLACE ;
            temp2->Chave1 WITH cTotChave[ 2 ], ;
            temp2->Chave2 WITH cTotChave[ 3 ], ;
            temp2->Nivel  WITH  "2"
         RecUnlock()
         nTotRecNo[ 3 ] := RecNo()
         SELECT temp
         DO WHILE ! Eof()
            Inkey()
            IF cTotChave[ 2 ] != temp->Chave1
               EXIT
            ENDIF
            IF cTotChave[ 3 ] != temp->Chave2
               EXIT
            ENDIF
            STORE 0 TO nTotQtde[ 4 ], nTotCusto[ 4 ], nTotVenda[ 4 ], nTotMargem[ 4 ], nTotComissao[ 4 ], nTotEmbalagem[ 4 ]
            cTotChave[ 4 ] := temp->Chave3
            SELECT temp2
            RecAppend()
            REPLACE ;
               temp2->Chave1 WITH cTotChave[ 2 ], ;
               temp2->Chave2 WITH cTotChave[ 3 ], ;
               temp2->Chave3 WITH cTotChave[ 4 ], ;
               temp2->Nivel  WITH  "3"
            RecUnlock()
            nTotRecNo[ 4 ] := RecNo()
            SELECT temp
            DO WHILE ! Eof()
               Inkey()
               IF cTotChave[ 2 ] != temp->Chave1
                  EXIT
               ENDIF
               IF cTotChave[ 3 ] != temp->Chave2
                  EXIT
               ENDIF
               IF cTotChave[ 4 ] != temp->Chave3
                  EXIT
               ENDIF
               STORE 0 To nTotQtde[ 5 ], nTotCusto[ 5 ], nTotVenda[ 5 ], nTotMargem[ 5 ], nTotComissao[ 5 ], nTotEmbalagem[ 5 ]
               cTotChave[ 5 ] := temp->Chave4
               SELECT temp2
               RecAppend()
               REPLACE ;
                  temp2->Chave1 WITH cTotChave[ 2 ], ;
                  temp2->Chave2 WITH cTotChave[ 3 ], ;
                  temp2->Chave3 WITH cTotChave[ 4 ], ;
                  temp2->Chave4 WITH cTotChave[ 5 ], ;
                  temp2->Nivel  WITH "4"
               RecUnlock()
               nTotRecNo[ 5 ] := RecNo()
               SELECT temp
               DO WHILE ! Eof()
                  Inkey()
                  IF cTotChave[ 2 ] != temp->Chave1
                     EXIT
                  ENDIF
                  IF cTotChave[ 3 ] != temp->Chave2
                     EXIT
                  ENDIF
                  IF cTotChave[ 4 ] != temp->Chave3
                     EXIT
                  ENDIF
                  IF cTotChave[ 5 ] != temp->Chave4
                     EXIT
                  ENDIF
                  SELECT temp2
                  RecAppend()
                  FOR nCont = 1 TO FCount()
                     FieldPut( nCont, temp->( FieldGet( nCont ) ) )
                  NEXT
                  REPLACE temp2->Nivel WITH  "5"
                  SELECT temp
                  nTotQtde[ 5 ]      += temp->ipQtde
                  nTotEmbalagem[ 5 ] += temp->QtdEmb
                  nTotCusto[ 5 ]     += temp->ipValCus
                  nTotVenda[ 5 ]     += temp->ipValNot
                  nTotMargem[ 5 ]    += temp->Margem
                  nTotComissao[ 5 ]  += temp->ValCom
                  SKIP
               ENDDO
               SELECT temp2
               GOTO ( nTotRecNo[ 5 ] )
               RecLock()
               REPLACE ;
                  temp2->ipQtde   WITH nTotQtde[ 5 ], ;
                  temp2->QtdEmb   WITH nTotEmbalagem[ 5 ], ;
                  temp2->ipValCus WITH nTotCusto[ 5 ], ;
                  temp2->ipValNot WITH nTotVenda[ 5 ], ;
                  temp2->Margem   WITH nTotMargem[ 5 ], ;
                  temp2->ValCom   WITH nTotComissao[ 5 ], ;
                  temp2->PMargem  WITH Max( Min( ( nTotVenda[ 5 ] - nTotCusto[ 5 ] ) / nTotVenda[ 5 ] * 100, 999 ), -99.9 )
               RecUnlock()
               SELECT temp
               nTotQtde[ 4 ]      += nTotQtde[ 5 ]
               nTotEmbalagem[ 4 ] += nTotEmbalagem[ 5 ]
               nTotCusto[ 4 ]     += nTotCusto[ 5 ]
               nTotVenda[ 4 ]     += nTotVenda[ 5 ]
               nTotMargem[ 4 ]    += nTotMargem[ 5 ]
               nTotComissao[ 4 ]  += nTotComissao[ 5 ]
            ENDDO
            SELECT temp2
            GOTO ( nTotRecNo[ 4 ] )
            RecLock()
            REPLACE ;
               temp2->ipQtde   WITH nTotQtde[ 4 ], ;
               temp2->QtdEmb   WIth nTotEmbalagem[ 4 ], ;
               temp2->ipValCus WITH nTotCusto[ 4 ], ;
               temp2->ipValNot WITH nTotVenda[ 4 ], ;
               temp2->Margem   WITH nTotMargem[ 4 ], ;
               temp2->ValCom   WITH nTotComissao[ 4 ], ;
               temp2->PMargem  WITH Max( Min( ( nTotVenda[ 4 ] - nTotCusto[ 4 ] ) / nTotVenda[ 4 ] * 100, 999 ), -99.9 )
            RecUnlock()
            SELECT temp
            nTotQtde[ 3 ]      += nTotQtde[ 4 ]
            nTotEmbalagem[ 3 ] += nTotEmbalagem[ 4 ]
            nTotCusto[ 3 ]     += nTotCusto[ 4 ]
            nTotVenda[ 3 ]     += nTotVenda[ 4 ]
            nTotMargem[ 3 ]    += nTotMargem[ 4 ]
            nTotComissao[ 3 ]  += nTotComissao[ 4 ]
         ENDDO
         SELECT temp2
         GOTO ( nTotRecNo[ 3 ] )
         RecLock()
         REPLACE ;
            temp2->ipQtde   WITH nTotQtde[ 3 ], ;
            temp2->QtdEmb   WITH nTotEmbalagem[ 3 ], ;
            temp2->ipValCus WITH nTotCusto[ 3 ], ;
            temp2->ipValNot WITH nTotVenda[ 3 ], ;
            temp2->Margem   WITH nTotMargem[ 3 ], ;
            temp2->ValCom   WITH nTotComissao[ 3 ], ;
            temp2->PMargem  WITH Max( Min( ( nTotVenda[ 3 ] - nTotCusto[ 3 ] ) / nTotVenda[ 3 ] * 100, 999 ), -99.9 )
         RecUnlock()
         SELECT temp
         nTotQtde[ 2 ]      += nTotQtde[ 3 ]
         nTotEmbalagem[ 2 ] += nTotEmbalagem[ 3 ]
         nTotCusto[ 2 ]     += nTotCusto[ 3 ]
         nTotVenda[ 2 ]     += nTotVenda[ 3 ]
         nTotMargem[ 2 ]    += nTotMargem[ 3 ]
         nTotComissao[ 2 ]  += nTotComissao[ 3 ]
      ENDDO
      SELECT temp2
      GOTO ( nTotRecNo[ 2 ] )
      RecLock()
      REPLACE ;
         temp2->ipQtde   WITH nTotQtde[ 2 ], ;
         temp2->QtdEmb   WITH nTotEmbalagem[ 2 ], ;
         temp2->ipValCus WITH nTotCusto[ 2 ], ;
         temp2->ipValNot WITH nTotVenda[ 2 ], ;
         temp2->Margem   WITH nTotMargem[ 2 ], ;
         temp2->ValCom   WITH nTotComissao[ 2 ], ;
         temp2->PMargem  WITH Max( Min( ( nTotVenda[ 2 ] - nTotCusto[ 2 ] ) / nTotVenda[ 2 ] * 100, 999 ), -99.9 )
      RecUnlock()
      SELECT temp
      nTotQtde[ 1 ]      += nTotQtde[ 2 ]
      nTotEmbalagem[ 1 ] += nTotEmbalagem[ 2 ]
      nTotCusto[ 1 ]     += nTotCusto[ 2 ]
      nTotVenda[ 1 ]     += nTotVenda[ 2 ]
      nTotMargem[ 1 ]    += nTotMargem[ 2 ]
      nTotComissao[ 1 ]  += nTotComissao[ 2 ]
   ENDDO
   SELECT temp2
   GOTO TOP
   RecLock()
   REPLACE ;
      temp2->ipQtde   WITH nTotQtde[ 1 ], ;
      temp2->QtdEmb   WITH nTotEmbalagem[ 1 ], ;
      temp2->ipValCus WITH nTotCusto[ 1 ], ;
      temp2->ipValNot WITH nTotVenda[ 1 ], ;
      temp2->Margem   WITH nTotMargem[ 1 ], ;
      temp2->ValCom   WITH nTotComissao[ 1 ], ;
      temp2->PMargem  WITH Max( Min( ( nTotVenda[ 1 ] - nTotCusto[ 1 ] ) / nTotVenda[ 1 ] * 100, 999 ), -99.9 )
   RecUnlock()
   SELECT temp
   USE

   oPDF := PDFClass():New()
   oPDF:SetType( nOpcPrinterType )
   oPDF:Begin()
   nKey := 0
   oPDF:acHeader := { "COMPRAS/VENDAS NO PERIODO" }
   cTexto := "Periodo:" + iif( nOpcData == 1, "Tudo", Dtoc( dDataInicial ) + " a " + Dtoc( dDataFinal ) )
   cTexto += " Tipo:" + acTxtCompraVenda[ nOpcCompraVenda ]
   cTexto += " " + acTxtDetalhe[ nOpcDetalhe ]
   cTexto += " Depto:" + iif( nOpcProDep == 1, "Todos", NumberSQL( nIdProDep ) + "-" + Trim( AUXPRODEPClass():Descricao( nIdProDep ) ) )
   Encontra( StrZero( nIdProduto, 6 ), "jpitem", "item" )
   cTexto += " Produto:" + iif( nOpcProduto==1, "Todos", NumberSQL( nIdProduto ) + "-" + Trim( jpitem->ieDescri ) )
   cTexto += " Vendedor:" + iif( nOpcVendedor == 1, "Todos", NumberSQL( mIdVendedor ) + "-" + ADOField( "VDDESCRI", "C", "JPVENDEDOR", "IDVENDEDOR=" + NumberSQL( mIdVendedor ) ) )
   AAdd( oPDF:acHeader, cTexto )
   cTexto := Pad( mCabeca[ mChaves[ 1 ] ] + "/" + mCabeca[ mChaves[ 2 ] ] + "/" + mCabeca[ mChaves[ 3 ] ], 50 ) + ;
      " ----QTD---- --QTD.NF.-- " + Iif( nOpcCusto == 2, "---VL.CUSTO--- ", "" ) + ;
      "---VL.PEDIDO-- " + Iif( nOpcCusto == 2, "---VL.MARGEM-- %MARGEM ", "" ) + "    COMISSAO/%"
   AAdd( oPDF:acHeader, cTexto )
   oPDF:PageHeader()
   STORE Chr(205) TO cTotChave[ 2 ], cTotChave[ 3 ], cTotChave[ 4 ]
   SELECT temp2
   GOTO TOP
   SKIP // Primeiro registro total
   DO WHILE nKey != K_ESC .AND. ! Eof()
      GrafProc()
      nKey := Inkey()
      IF temp2->Nivel > Str( nOpcDetalhe, 1 )
         SKIP
         LOOP
      ENDIF
      oPDF:MaxRowTest()
      cTxt := ""
      IF temp2->Nivel == "1" // cTotChave[ 2 ] != temp2->Chave1
         oPDF:nRow += 1
         oPDF:MaxRowTest()
         cTxt := Pad( temp2->Chave1, 40 )
         cTotChave[ 2 ] := temp2->Chave1
         cTotChave[ 3 ] := Chr(205)
         cTotChave[ 4 ] := Chr(205)
         cTotChave[ 5 ] := Chr(205)
      ELSEIF temp2->Nivel == "2" // cTotChave[ 3 ] != temp2->Chave2 .AND. nOpcDetalhe > 1
         oPDF:MaxRowTest()
         cTotChave[ 3 ] := Pad( temp2->Chave2, 40 )
         cTxt := Space(2) + temp2->Chave2
         cTotChave[ 4 ] := Chr(205)
         cTotChave[ 5 ] := Chr(205)
      ELSEIF temp2->Nivel == "3" // cTotChave[ 4 ] != temp2->Chave3 .AND. nOpcDetalhe > 2
         cTotChave[ 4 ] := temp2->Chave3
         oPDF:MaxRowTest()
         cTxt := Space(4) + Pad( temp2->Chave3, 40 )
         cTotChave[ 5 ] := Chr(205)
      ELSEIF temp2->Nivel == "4" // cTotChave[ 5 ] != temp2->Chave4 .AND. nOpcDetalhe > 3
         cTotChave[ 5 ] := temp2->Chave4
         oPDF:MaxRowTest()
         cTxt := Space(6) + Pad( temp2->Chave4, 40 )
      ELSEIF temp2->Nivel == "5"
         cTxt := Space(22) + temp2->Nf + " " + Dtoc( temp2->DatEmi )
      ENDIF
      cTxt := Pad( cTxt, 50 )
      cTxt += " " + Transform( temp2->QtdEmb, PicVal(9) )
      cTxt += " " + Transform( temp2->ipQtde, PicVal(9) )
      IF nOpcCusto == 2
         cTxt += " " + Transform( temp2->ipValCus, PicVal(11,2) )
      ENDIF
      cTxt += " " + Transform( temp2->ipValNot, PicVal(11,2) )
      IF temp2->Nivel < "3"
         oPDF:DrawZebrado(2)
      ELSE
         oPDF:DrawZebrado(1)
      ENDIF
      IF nOpcCusto == 2
         cTxt += " " + Transform( temp2->Margem, PicVal(11,2) )
         cTxt += " " + Transform( temp2->PMargem, "@E 999.9" )
      ENDIF
      IF nOpcComComissao == 2
         cTxt += " " + Transform( temp2->ValCom, PicVal( 8, 2 ) )
         cTxt += " " + "(" + Transform( temp2->PerCom, "@Z 999.999" ) + ")"
      ENDIF
      oPDF:DrawText( oPDF:nRow, 0, cTxt )
      IF nOpcDetalhe == 5 .AND. ! Empty( temp2->Obs )
         oPDF:nRow += 1
         cTxt := " " + temp2->Obs
         cTxt := Padl( cTxt, oPDF:MaxCol() )
         oPDF:DrawText( oPDF:nRow, 0, cTxt )
      ELSE
      ENDIF
      oPDF:nRow += 1
      SKIP
   ENDDO
   GOTO TOP
   oPDF:nRow += 2
   oPDF:MaxRowTest()
   cTxt := Pad( "***TOTAIS***", 50 )
   cTxt += " " + Transform( temp2->QtdEmb, PicVal(9) )
   cTxt += " " + Transform( temp2->ipQtde, PicVal(9) )
   IF nOpcCusto == 2
      cTxt += " " + Transform( temp2->ipValCus, PicVal(11,2) )
   ENDIF
   cTxt += " " + Transform( temp2->ipValNot, PicVal(11,2) )
   IF nOpcCusto == 2
      cTxt += " " + Transform( temp2->Margem, PicVal(11,2) )
      cTxt += " " + Transform( temp2->PMargem, "@E 999.9" )
   ENDIF
   cTxt += " " + Transform( temp2->ValCom, PicVal(8,2) )
   oPDF:DrawText( oPDF:nRow, 0, cTxt )
   IF nOpcAnalise == 2
      oPDF:nRow += 2
      oPDF:MaxRowTest()
      FOR nCont = 1 TO Len( aTransacaoList )
         oPDF:MaxRowTest()
         cTxt := aTransacaoList[ nCont, 1 ]
         cTxt += " " + Transform( aTransacaoList[ nCont, 2 ], PicVal( 14, 2 ) )
         cTxt += " " + DescricaoJPTRANSA( aTransacaoList[ nCont, 1 ] )
         oPDF:DrawText( oPDF:nRow, 0, cTxt )
         oPDF:nRow += 1
      NEXT
   ENDIF
   SELECT temp2
   USE
   FOR EACH oFile IN mTmpFile
      fErase( oFile )
   NEXT
   oPDF:End()

   RETURN NIL


Até seria mais fácil gravando o que precisa no temporário.... mas sabe como é... tentar eliminar fonte Harbour.
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 03 Jul 2020 21:15

Nessas horas eu vou rodeando primeiro....
Por exemplo aqui:

         nNumTransa := 0
         FOR nCont = 1 TO Len( aTransacaoList )
            IF aTransacaoList[ nCont, 1 ] == temp->pdTransa
               nNumTransa := nCont
               EXIT
            ENDIF
         NEXT
         IF nNumTransa == 0
            AAdd( aTransacaoList, { temp->pdTransa, 0 } )
            nNumTransa := Len( aTransacaoList )
         ENDIF


O primeiro FOR/NEXT pode ser eliminado com o uso de hb_AScan().
Já reduz um pouquinho o fonte.....

         nNumTransa := hb_ASCan( aTransacaoList, { | e | e[ 1 ] == temp->pdTransa } )
         IF nNumTransa == 0
            AAdd( aTransacaoList, { temp->pdTransa, 0 } )
            nNumTransa := Len( aTransacaoList )
         ENDIF


Menos fonte pra resolver....
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 03 Jul 2020 23:26

Por enquanto, a idéia é tentar eliminar o primeiro temporário.
Para isso, procurei passar o máximo possível para o comando SQL, assim vém pronto.

      :Execute()
      DO WHILE ! :Eof()
         GrafProc()
         Inkey()
         Encontra( StrZero( :Number( "PDCADASTRO" ), 6 ), "jpcadastro", "numlan" )
         Encontra( StrZero( :Number( "IPPRODUTO" ), 6 ), "jpitem", "item" )
         SELECT temp
         RecAppend()
         REPLACE ;
            temp->pdCadastro WITH StrZero( :Number( "PDCADASTRO" ), 6 ), ;
            temp->pdVendedor WITH StrZero( :Number( "PDVENDEDOR" ), 6 ), ;
            temp->ipProduto  WITH StrZero( :Number( "IPPRODUTO" ), 6 ), ;
            temp->cdCnpj     WITH :String( "CDCNPJ", 10 ), ;
            temp->pdTransa   WITH StrZero( :Number( "PDTRANSA" ), 6 ), ;
            temp->ipQtde     WITH :Number( "FATOR" ) * :Number( "IPQTDE" ), ;
            temp->QtdEmb     WITH :Number( "FATOR" ) * :Number( "IPQTDE" ) * Max( 1, :Number( "IEQTDCOM" ) ), ;
            temp->ipValCus   WITH :Number( "FATOR" ) * :Number( "IPVALCUS" ), ;
            temp->ipValNot   WITH :Number( "FATOR" ) * :Number( "IPVALNOT" ), ;
            temp->Obs        WITH :String( "TRANOME" ), ;
            temp->NF         WITH StrZero( :Number( "NOTFIS" ), 9 ), ;
            temp->DatEmi     WITH :Date( "DATEMI" ), ;
            temp->Margem     WITH :Number( "IPVALNOT" ) - :Number( "IPVALCUS" )
            temp->ValCom     WITH :Number( "FATOR" ) * temp->ipValNot * :Number( "COMISSAO" ) / 100, ;
            temp->PerCom     WITH :Number( "COMISSAO" )
         IF temp->ipValNot <> 0 // Evita "estouro"
            mMargem := Max( Min( ( Abs( temp->ipValNot ) - Abs( temp->ipValCus ) ) / Abs( temp->ipValNot ) * 100, 999 ), -99.9 )
            REPLACE temp->PMargem WITH mMargem
         ELSE
            mMargem := 0
         ENDIF
         RecUnlock()
         :MoveNext()
      ENDDO
      :CloseRecordset()
   ENDWITH


O que sobrou é resultado de cálculo, então, talvez pelo menos seja eliminado um temporário.
Não vejo a hora de terminar tudo, mas... melhor um pouco de cada vez.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

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

Meu modo de trabalho

Mensagempor JoséQuintas » 04 Jul 2020 05:17

Foi o que deu: ainda resta um temporário pra eliminar, mas pelo menos ficou mais rápido e um pouco menor.

STATIC FUNCTION Imprime()

   LOCAL nCont, mTmpFile, oPDF, aTransacaoList, cTexto, nKey, cTxt, oFile
   LOCAL nNumTransa, mStruOk
   LOCAL nTotMargem := Array(5), nTotComissao := Array(5 ), nTotCusto := Array(5), nTotVenda := Array(5)
   LOCAL nTotQtde := Array(5), nTotEmbalagem := Array(5), cTotChave := Array(4), nTotRecNo := Array(5)
   LOCAL aChaveList
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   mTmpFile := { MyTempFile( "dbf" ), MyTempFile( "cdx" ), MyTempFile( "dbf" ), MyTempFile( "cdx" ) }

   FOR nCont = 1 TO 4
      fErase( mTmpFile[ nCont ] )
   NEXT
   DO CASE
   CASE nOpcOrdem == 1; aChaveList := { "VENDEDOR", "PRODUTO", "GRUPOCLIENTE", "CLIENTE" }
   CASE nOpcOrdem == 2; aChaveList := { "PRODUTO", "VENDEDOR", "GRUPOCLIENTE", "CLIENTE" }
   CASE nOpcOrdem == 3; aChaveList := { "GRUPOCLIENTE", "CLIENTE", "PRODUTO", "VENDEDOR" }
   CASE nOpcOrdem == 4; aChaveList := { "VENDEDOR", "GRUPOCLIENTE", "CLIENTE", "PRODUTO" }
   CASE nOpcOrdem == 5; aChaveList := { "PRODUTO", "GRUPOCLIENTE", "CLIENTE", "VENDEDOR" }
   CASE nOpcOrdem == 6; aChaveList := { "GRUPOCLIENTE", "CLIENTE", "VENDEDOR", "PRODUTO" }
   ENDCASE

   mStruOk := { ;
      { "CHAVE1",     "C", 50, 0 }, ;
      { "CHAVE2",     "C", 50, 0 }, ;
      { "CHAVE3",     "C", 50, 0 }, ;
      { "CHAVE4",     "C", 50, 0 }, ;
      { "PDCADASTRO", "C", 6, 0 }, ;
      { "CDCNPJ",     "C", 10, 0 }, ;
      { "PDVENDEDOR", "C", 6, 0 }, ;
      { "IPPRODUTO",  "C", 6, 0 }, ;
      { "DESCITEM",   "C", 30, 0 }, ;
      { "PDTRANSA",   "C", 6, 0 }, ;
      { "NF",         "C", 9, 0 }, ;
      { "OBS",        "C", 50, 0 }, ;
      { "DATEMI",     "D", 8, 0 }, ;
      { "IPQTDE",     "N", 14, 0 }, ;
      { "QTDEMB",     "N", 14, 0 }, ;
      { "IPVALCUS",   "N", 15, 2 }, ;
      { "IPVALNOT",   "N", 15, 2 }, ;
      { "MARGEM",     "N", 15, 2 }, ;
      { "PMARGEM",    "N", 8, 3 }, ;
      { "VALCOM",     "N", 15, 2 }, ;
      { "PERCOM",     "N", 4, 1 }, ;
      { "NIVEL",      "C", 1, 0 } } // usado para totalizar

   dbCreate( mTmpFile[ 1 ], mStruOk )

   SELECT 0
   USE ( mTmpFile[ 1 ] ) ALIAS temp2

   WITH OBJECT cnSQL
      :cSQL := "SELECT IDPEDIDO, PDCADASTRO, PDVENDEDOR, PDTRANSA," + ;
         " PDPEDCLI," + ;
         " IF( JPNOTFIS.NFNOTFIS IS NULL, JPPEDIDO.PDDATEMI, JPNOTFIS.NFDATEMI ) AS DATEMI," + ;
         " IF( JPNOTFIS.NFNOTFIS IS NULL, JPPEDIDO.PDPEDCLI, JPNOTFIS.NFNOTFIS ) AS NOTFIS," + ;
         " JPTRANSA.TRDESCRI AS TRANOME, JPTRANSA.TRREACAO AS REACAO," + ;
         " JPNOTFIS.NFNOTFIS AS NOTFIS," + ;
         " JPITPED.IPPRODUTO," + ;
         " JPITPED.IPQTDE," + ;
         " JPITPED.IPVALCUS, JPITPED.IPVALNOT," + ;
         " JPITEM.IEPRODEP," + ;
         " CONCAT( RPAD( JPVENDEDOR.VDDESCRI, 40, ' ' ), LPAD( PDVENDEDOR, 6, ' ' ) ) AS VENDEDOR," + ;
         " CONCAT( RPAD( JPITEM.IEDESCRI, 40, ' ' ), LPAD( IPPRODUTO, 6, ' ' ) ) AS PRODUTO," + ;
         " CONCAT( RPAD( PRECNPJ.CNPJNOME, 40, ' ' ), LPAD( JPCADASTRO.CDCNPJ, 10, ' ' ) ) AS GRUPOCLIENTE," + ;
         " CONCAT( RPAD( JPCADASTRO.CDNOME, 40, ' ' ), LPAD( PDCADASTRO, 10, ' ' ) ) AS CLIENTE," + ;
         " IF( JPITEM.IEQTDCOM = 0, 1, JPITEM.IEQTDCOM ) * JPITPED.IPQTDE AS QTDEMBALAGEM," + ;
         " JPITPED.IPVALNOT - JPITPED.IPVALCUS AS VMARGEM," + ;
         " IF( JPITPED.IPVALNOT = 0, 0, ( JPITPED.IPVALNOT - JPITPED.IPVALCUS ) / JPITPED.IPVALNOT * 100 ) AS PMARGEM," + ;
         " RPAD( JPCADASTRO.CDCNPJ, 10, ' ' ) AS CNPJRAIZ," + ;
         " IF( JPTRANSA.TRREACAO LIKE '%DEV%', -1, 1 ) AS FATOR," + ;
         " IF( JPCOMISSAO.CMVALOR IS NOT NULL, JPCOMISSAO.CMVALOR, IF( JPVENDEDOR.VDCOMISSAO IS NULL, 0, JPVENDEDOR.VDCOMISSAO ) ) AS PCOMISSAO," + ;
         " IF( JPCOMISSAO.CMVALOR IS NOT NULL, JPCOMISSAO.CMVALOR, IF( JPVENDEDOR.VDCOMISSAO IS NULL, 0, JPVENDEDOR.VDCOMISSAO ) ) * JPITPED.IPVALNOT / 100 AS VCOMISSAO" + ;
         " FROM JPPEDIDO" + ;
         " LEFT JOIN JPNOTFIS ON JPNOTFIS.NFPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA" + ;
         " LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
         " LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
         " LEFT JOIN JPCOMISSAO ON JPCOMISSAO.CMVENDEDOR = PDVENDEDOR AND CMPRODEP = JPITEM.IEPRODEP" + ;
         " LEFT JOIN JPVENDEDOR ON JPVENDEDOR.IDVENDEDOR = JPPEDIDO.PDVENDEDOR" + ;
         " LEFT JOIN (" + ;
         " SELECT RPAD( CDCNPJ, 10, ' ' ) AS CNPJPREFIXO, CDNOME AS CNPJNOME FROM JPCADASTRO GROUP BY RPAD( CDCNPJ, 10, ' ' ) ) AS PRECNPJ" + ;
         " ON RPAD( JPCADASTRO.CDCNPJ, 10, ' ' ) = PRECNPJ.CNPJPREFIXO" + ;
         " WHERE PDCONF = 'S'" + ;
         " AND PDTRANSA IN (" + ;
         " SELECT IDTRANSA FROM JPTRANSA AS LISTAA WHERE "
      IF nOpcCompraVenda == 1
         :cSQL += " TRREACAO LIKE '%VENDA%'"
      ELSEIF nOpcCompraVenda == 2
         :cSQL += " TRREACAO LIKE '%COMPRA%'"
      ELSE
         :cSQL += " ( TRREACAO LIKE '%COMPRA%' OR TRREACAO LIKE '%VENDA%' )"
      ENDIF
      IF nOpcDevol == 2
         :cSQL += " AND TRREACAO LIKE '%DEV%'"
      ENDIF
      :cSQL += " )"
      IF nOpcVendedor == 2
         :cSQL += " AND PDVENDEDOR = " + NumberSQL( mIdVendedor )
      ENDIF
      IF nOpcCadastro == 2
         :cSQL += " AND PDCADASTRO IN (" + ;
            " SELECT IDCADASTRO FROM JPCADASTRO AS LISTA WHERE LEFT( CDCNPJ, 10 ) = " + ;
            " ( SELECT LEFT( CDCNPJ, 10 ) FROM JPCADASTRO AS ESCOLHIDO WHERE IDCADASTRO = " + NumberSQL( nIdCadastro ) + " ) )"
      ENDIF
      IF nOpcProduto == 2
         :cSQL += " AND JPITEM.IDPRODUTO = " + NumberSQL( nIdProduto )
      ENDIF
      IF nOpcProDep == 2
         :cSQL += " AND JPITEM.IEPRODEP = " + NumberSQL( nIdProDep )
      ENDIF
      :cSQL += " AND ( JPNOTFIS.NFNOTFIS IS NOT NULL OR NOT" + ;
         " JPPEDIDO.PDTRANSA IN ( SELECT IDTRANSA FROM JPTRANSA AS LISTAB WHERE TRREACAO LIKE '%N+%' OR TRREACAO LIKE '%N-%' ) )" + ;
         " AND IF( JPNOTFIS.NFNOTFIS IS NULL, PDDATEMI, NFDATEMI ) BETWEEN CAST( " + DateSQL( dDataInicial ) + " AS DATE )" + ;
         " AND CAST( " + DateSQL( dDataFinal ) + " AS DATE )"
      :cSQL += " ORDER BY " + aChaveList[ 1 ] + ", " + aChaveList[ 2 ] + ", " + aChaveList[ 3 ] + ", " + aChaveList[ 4 ]
      :Execute()
      STORE 0 To nTotQtde[ 1 ], nTotCusto[ 1 ], nTotVenda[ 1 ], nTotMargem[ 1 ], nTotComissao[ 1 ], nTotEmbalagem[ 1 ]
      RecAppend()
      RecUnlock()
      aTransacaoList := {}
      DO WHILE ! :Eof()
         Inkey()
         STORE 0 To nTotQtde[ 2 ], nTotCusto[ 2 ], nTotVenda[ 2 ], nTotMargem[ 2 ], nTotComissao[ 2 ], nTotEmbalagem[ 2 ]
         cTotChave[ 1 ] := :String( aChaveList[ 1 ] )
         RecAppend()
         REPLACE ;
            temp2->Chave1 WITH cTotChave[ 1 ], ;
            temp2->Nivel  WITH "1"
         RecUnlock()
         nTotRecNo[ 2 ] := RecNo()
         DO WHILE ! :Eof()
            Inkey()
            IF cTotChave[ 1 ] != :String( aChaveList[ 1 ] )
               EXIT
            ENDIF
            STORE 0 To nTotQtde[ 3 ], nTotCusto[ 3 ], nTotVenda[ 3 ], nTotMargem[ 3 ], nTotComissao[ 3 ], nTotEmbalagem[ 3 ]
            cTotChave[ 2 ] := :String( aChaveList[ 2 ] )
            RecAppend()
            REPLACE ;
               temp2->Chave1 WITH cTotChave[ 1 ], ;
               temp2->Chave2 WITH cTotChave[ 2 ], ;
               temp2->Nivel  WITH  "2"
            RecUnlock()
            nTotRecNo[ 3 ] := RecNo()
            DO WHILE ! :Eof()
               Inkey()
               IF cTotChave[ 1 ] != :String( aChaveList[ 1 ] )
                  EXIT
               ENDIF
               IF cTotChave[ 2 ] != :String( aChaveList[ 2 ] )
                  EXIT
               ENDIF
               STORE 0 TO nTotQtde[ 4 ], nTotCusto[ 4 ], nTotVenda[ 4 ], nTotMargem[ 4 ], nTotComissao[ 4 ], nTotEmbalagem[ 4 ]
               cTotChave[ 3 ] := :String( aChaveList[ 3 ] )
               RecAppend()
               REPLACE ;
                  temp2->Chave1 WITH cTotChave[ 1 ], ;
                  temp2->Chave2 WITH cTotChave[ 2 ], ;
                  temp2->Chave3 WITH cTotChave[ 3 ], ;
                  temp2->Nivel  WITH  "3"
               RecUnlock()
               nTotRecNo[ 4 ] := RecNo()
               DO WHILE ! :Eof()
                  Inkey()
                  IF cTotChave[ 1 ] != :String( aChaveList[ 1 ] )
                     EXIT
                  ENDIF
                  IF cTotChave[ 2 ] != :String( aChaveList[ 2 ] )
                     EXIT
                  ENDIF
                  IF cTotChave[ 3 ] != :String( aChaveList[ 3 ] )
                     EXIT
                  ENDIF
                  STORE 0 To nTotQtde[ 5 ], nTotCusto[ 5 ], nTotVenda[ 5 ], nTotMargem[ 5 ], nTotComissao[ 5 ], nTotEmbalagem[ 5 ]
                  cTotChave[ 4 ] := :String( aChaveList[ 4 ] )
                  RecAppend()
                  REPLACE ;
                     temp2->Chave1 WITH cTotChave[ 1 ], ;
                     temp2->Chave2 WITH cTotChave[ 2 ], ;
                     temp2->Chave3 WITH cTotChave[ 3 ], ;
                     temp2->Chave4 WITH cTotChave[ 4 ], ;
                     temp2->Nivel  WITH "4"
                  RecUnlock()
                  nTotRecNo[ 5 ] := RecNo()
                  DO WHILE ! :Eof()
                     Inkey()
                     IF cTotChave[ 1 ] != :String( aChaveList[ 1 ] )
                        EXIT
                     ENDIF
                     IF cTotChave[ 2 ] != :String( aChaveList[ 2 ] )
                        EXIT
                     ENDIF
                     IF cTotChave[ 3 ] != :String( aChaveList[ 3 ] )
                        EXIT
                     ENDIF
                     IF cTotChave[ 4 ] != :String( aChaveList[ 4 ] )
                        EXIT
                     ENDIF
                     nNumTransa   := hb_ASCan( aTransacaoList, { | e | e[ 1 ] == :Number( "PDTRANSA" ) } )
                     IF nNumTransa == 0
                        AAdd( aTransacaoList, { :Number( "PDTRANSA" ), 0 } )
                        nNumTransa := Len( aTransacaoList )
                     ENDIF
                     aTransacaoList[ nNumTransa, 2 ] += :Number( "IPVALNOT" )
                     RecAppend()
                     REPLACE ;
                        temp2->Chave1     WITH :String( aChaveList[ 1 ] ), ;
                        temp2->Chave2     WITH :String( aChaveList[ 2 ] ), ;
                        temp2->Chave3     WITH :String( aChaveList[ 3 ] ), ;
                        temp2->Chave4     WITH :String( aChaveList[ 4 ] ), ;
                        temp2->pdCadastro WITH StrZero( :Number( "PDCADASTRO" ), 6 ), ;
                        temp2->cdCnpj     WITH :String( "CNPJRAIZ" ), ;
                        temp2->pdVendedor WITH StrZero( :Number( "PDVENDEDOR" ), 6 ), ;
                        temp2->ipProduto  WITH StrZero( :Number( "IPPRODUTO" ), 6 ), ;
                        temp2->DescItem   WITH :String( "PRODUTO" ), ;
                        temp2->pdTransa   WITH StrZero( :Number( "PDTRANSA" ), 6 ), ;
                        temp2->NF         WITH StrZero( :Number( "NOTFIS" ), 9 ), ;
                        temp2->DatEmi     WITH :Date( "DATEMI" ), ;
                        temp2->ipQtde     WITH :Number( "FATOR" ) * :Number( "IPQTDE" ), ;
                        temp2->QtdEmb     WITH :Number( "FATOR" ) * :Number( "QTDEMBALAGEM" ), ;
                        temp2->ipValCus   WITH :Number( "FATOR" ) * :Number( "IPVALCUS" ), ;
                        temp2->ipValNot   WITH :Number( "FATOR" ) * :Number( "IPVALNOT" ), ;
                        temp2->Margem     WITH :Number( "FATOR" ) * :Number( "VMARGEM" ), ;
                        temp2->PMargem    WITH :Number( "PMARGEM" ), ;
                        temp2->ValCom     WITH :Number( "FATOR" ) * :Number( "VCOMISSAO" ), ;
                        temp2->PerCom     WITH :Number( "PCOMISSAO" ), ;
                        temp2->Nivel      WITH "5"
                     nTotQtde[ 5 ]      += :Number( "FATOR" ) * :Number( "IPQTDE" )
                     nTotEmbalagem[ 5 ] += :Number( "FATOR" ) * :Number( "QTDEMBALAGEM" )
                     nTotCusto[ 5 ]     += :Number( "FATOR" ) * :Number( "IPVALCUS" )
                     nTotVenda[ 5 ]     += :Number( "FATOR" ) * :Number( "IPVALNOT" )
                     nTotMargem[ 5 ]    += :Number( "FATOR" ) * :Number( "VMARGEM" )
                     nTotComissao[ 5 ]  += :Number( "FATOR" ) * :Number( "VCOMISSAO" )
                     :MoveNext()
                  ENDDO
                  GOTO ( nTotRecNo[ 5 ] )
                  RecLock()
                  REPLACE ;
                     temp2->ipQtde   WITH nTotQtde[ 5 ], ;
                     temp2->QtdEmb   WITH nTotEmbalagem[ 5 ], ;
                     temp2->ipValCus WITH nTotCusto[ 5 ], ;
                     temp2->ipValNot WITH nTotVenda[ 5 ], ;
                     temp2->Margem   WITH nTotMargem[ 5 ], ;
                     temp2->ValCom   WITH nTotComissao[ 5 ], ;
                     temp2->PMargem  WITH Max( Min( ( nTotVenda[ 5 ] - nTotCusto[ 5 ] ) / nTotVenda[ 5 ] * 100, 999 ), -99.9 )
                  RecUnlock()
                  nTotQtde[ 4 ]      += nTotQtde[ 5 ]
                  nTotEmbalagem[ 4 ] += nTotEmbalagem[ 5 ]
                  nTotCusto[ 4 ]     += nTotCusto[ 5 ]
                  nTotVenda[ 4 ]     += nTotVenda[ 5 ]
                  nTotMargem[ 4 ]    += nTotMargem[ 5 ]
                  nTotComissao[ 4 ]  += nTotComissao[ 5 ]
               ENDDO
               GOTO ( nTotRecNo[ 4 ] )
               RecLock()
               REPLACE ;
                  temp2->ipQtde   WITH nTotQtde[ 4 ], ;
                  temp2->QtdEmb   WIth nTotEmbalagem[ 4 ], ;
                  temp2->ipValCus WITH nTotCusto[ 4 ], ;
                  temp2->ipValNot WITH nTotVenda[ 4 ], ;
                  temp2->Margem   WITH nTotMargem[ 4 ], ;
                  temp2->ValCom   WITH nTotComissao[ 4 ], ;
                  temp2->PMargem  WITH Max( Min( ( nTotVenda[ 4 ] - nTotCusto[ 4 ] ) / nTotVenda[ 4 ] * 100, 999 ), -99.9 )
               RecUnlock()
               nTotQtde[ 3 ]      += nTotQtde[ 4 ]
               nTotEmbalagem[ 3 ] += nTotEmbalagem[ 4 ]
               nTotCusto[ 3 ]     += nTotCusto[ 4 ]
               nTotVenda[ 3 ]     += nTotVenda[ 4 ]
               nTotMargem[ 3 ]    += nTotMargem[ 4 ]
               nTotComissao[ 3 ]  += nTotComissao[ 4 ]
            ENDDO
            GOTO ( nTotRecNo[ 3 ] )
            RecLock()
            REPLACE ;
               temp2->ipQtde   WITH nTotQtde[ 3 ], ;
               temp2->QtdEmb   WITH nTotEmbalagem[ 3 ], ;
               temp2->ipValCus WITH nTotCusto[ 3 ], ;
               temp2->ipValNot WITH nTotVenda[ 3 ], ;
               temp2->Margem   WITH nTotMargem[ 3 ], ;
               temp2->ValCom   WITH nTotComissao[ 3 ], ;
               temp2->PMargem  WITH Max( Min( ( nTotVenda[ 3 ] - nTotCusto[ 3 ] ) / nTotVenda[ 3 ] * 100, 999 ), -99.9 )
            RecUnlock()
            nTotQtde[ 2 ]      += nTotQtde[ 3 ]
            nTotEmbalagem[ 2 ] += nTotEmbalagem[ 3 ]
            nTotCusto[ 2 ]     += nTotCusto[ 3 ]
            nTotVenda[ 2 ]     += nTotVenda[ 3 ]
            nTotMargem[ 2 ]    += nTotMargem[ 3 ]
            nTotComissao[ 2 ]  += nTotComissao[ 3 ]
         ENDDO
         GOTO ( nTotRecNo[ 2 ] )
         RecLock()
         REPLACE ;
            temp2->ipQtde   WITH nTotQtde[ 2 ], ;
            temp2->QtdEmb   WITH nTotEmbalagem[ 2 ], ;
            temp2->ipValCus WITH nTotCusto[ 2 ], ;
            temp2->ipValNot WITH nTotVenda[ 2 ], ;
            temp2->Margem   WITH nTotMargem[ 2 ], ;
            temp2->ValCom   WITH nTotComissao[ 2 ], ;
            temp2->PMargem  WITH Max( Min( ( nTotVenda[ 2 ] - nTotCusto[ 2 ] ) / nTotVenda[ 2 ] * 100, 999 ), -99.9 )
         RecUnlock()
         nTotQtde[ 1 ]      += nTotQtde[ 2 ]
         nTotEmbalagem[ 1 ] += nTotEmbalagem[ 2 ]
         nTotCusto[ 1 ]     += nTotCusto[ 2 ]
         nTotVenda[ 1 ]     += nTotVenda[ 2 ]
         nTotMargem[ 1 ]    += nTotMargem[ 2 ]
         nTotComissao[ 1 ]  += nTotComissao[ 2 ]
      ENDDO
      GOTO TOP
      RecLock()
      REPLACE ;
         temp2->ipQtde   WITH nTotQtde[ 1 ], ;
         temp2->QtdEmb   WITH nTotEmbalagem[ 1 ], ;
         temp2->ipValCus WITH nTotCusto[ 1 ], ;
         temp2->ipValNot WITH nTotVenda[ 1 ], ;
         temp2->Margem   WITH nTotMargem[ 1 ], ;
         temp2->ValCom   WITH nTotComissao[ 1 ], ;
         temp2->PMargem  WITH Max( Min( ( nTotVenda[ 1 ] - nTotCusto[ 1 ] ) / nTotVenda[ 1 ] * 100, 999 ), -99.9 )
      RecUnlock()
      :CloseRecordset()
   ENDWITH

   oPDF := PDFClass():New()
   oPDF:SetType( nOpcPrinterType )
   oPDF:Begin()
   nKey := 0
   oPDF:acHeader := { "COMPRAS/VENDAS NO PERIODO" }
   cTexto := "Periodo:" + iif( nOpcData == 1, "Tudo", Dtoc( dDataInicial ) + " a " + Dtoc( dDataFinal ) )
   cTexto += " Tipo:" + acTxtCompraVenda[ nOpcCompraVenda ]
   cTexto += " " + acTxtDetalhe[ nOpcDetalhe ]
   cTexto += " Depto:" + iif( nOpcProDep == 1, "Todos", NumberSQL( nIdProDep ) + "-" + Trim( AUXPRODEPClass():Descricao( nIdProDep ) ) )
   Encontra( StrZero( nIdProduto, 6 ), "jpitem", "item" )
   cTexto += " Produto:" + iif( nOpcProduto==1, "Todos", NumberSQL( nIdProduto ) + "-" + Trim( jpitem->ieDescri ) )
   cTexto += " Vendedor:" + iif( nOpcVendedor == 1, "Todos", NumberSQL( mIdVendedor ) + "-" + ADOField( "VDDESCRI", "C", "JPVENDEDOR", "IDVENDEDOR=" + NumberSQL( mIdVendedor ) ) )
   AAdd( oPDF:acHeader, cTexto )
   cTexto := Pad( aChaveList[ 1 ] + "/" + aChaveList[ 2 ] + "/" + aChaveList[ 3 ], 50 ) + ;
      " ----QTD---- --QTD.NF.-- " + Iif( nOpcCusto == 2, "---VL.CUSTO--- ", "" ) + ;
      "---VL.PEDIDO-- " + Iif( nOpcCusto == 2, "---VL.MARGEM-- %MARGEM ", "" ) + "    COMISSAO/%"
   AAdd( oPDF:acHeader, cTexto )
   oPDF:PageHeader()
   STORE Chr(205) TO cTotChave[ 1 ], cTotChave[ 2 ], cTotChave[ 3 ]
   GOTO TOP
   SKIP // Primeiro registro total
   DO WHILE nKey != K_ESC .AND. ! Eof()
      GrafProc()
      nKey := Inkey()
      IF temp2->Nivel > Str( nOpcDetalhe, 1 )
         SKIP
         LOOP
      ENDIF
      oPDF:MaxRowTest()
      cTxt := ""
      IF temp2->Nivel == "1" // cTotChave[ 1 ] != temp2->Chave1
         oPDF:nRow += 1
         oPDF:MaxRowTest()
         cTxt := Pad( temp2->Chave1, 40 )
         cTotChave[ 1 ] := temp2->Chave1
         cTotChave[ 2 ] := Chr(205)
         cTotChave[ 3 ] := Chr(205)
         cTotChave[ 4 ] := Chr(205)
      ELSEIF temp2->Nivel == "2" // cTotChave[ 2 ] != temp2->Chave2 .AND. nOpcDetalhe > 1
         oPDF:MaxRowTest()
         cTotChave[ 2 ] := Pad( temp2->Chave2, 40 )
         cTxt := Space(2) + temp2->Chave2
         cTotChave[ 3 ] := Chr(205)
         cTotChave[ 4 ] := Chr(205)
      ELSEIF temp2->Nivel == "3" // cTotChave[ 3 ] != temp2->Chave3 .AND. nOpcDetalhe > 2
         cTotChave[ 3 ] := temp2->Chave3
         oPDF:MaxRowTest()
         cTxt := Space(4) + Pad( temp2->Chave3, 40 )
         cTotChave[ 4 ] := Chr(205)
      ELSEIF temp2->Nivel == "4" // cTotChave[ 4 ] != temp2->Chave4 .AND. nOpcDetalhe > 3
         cTotChave[ 4 ] := temp2->Chave4
         oPDF:MaxRowTest()
         cTxt := Space(6) + Pad( temp2->Chave4, 40 )
      ELSEIF temp2->Nivel == "5"
         cTxt := Space(22) + temp2->Nf + " " + Dtoc( temp2->DatEmi )
      ENDIF
      cTxt := Pad( cTxt, 50 )
      cTxt += " " + Transform( temp2->QtdEmb, PicVal(9) )
      cTxt += " " + Transform( temp2->ipQtde, PicVal(9) )
      IF nOpcCusto == 2
         cTxt += " " + Transform( temp2->ipValCus, PicVal(11,2) )
      ENDIF
      cTxt += " " + Transform( temp2->ipValNot, PicVal(11,2) )
      IF temp2->Nivel < "3"
         oPDF:DrawZebrado(2)
      ELSE
         oPDF:DrawZebrado(1)
      ENDIF
      IF nOpcCusto == 2
         cTxt += " " + Transform( temp2->Margem, PicVal(11,2) )
         cTxt += " " + Transform( temp2->PMargem, "@E 999.9" )
      ENDIF
      IF nOpcComComissao == 2
         cTxt += " " + Transform( temp2->ValCom, PicVal( 8, 2 ) )
         cTxt += " " + "(" + Transform( temp2->PerCom, "@Z 999.999" ) + ")"
      ENDIF
      oPDF:DrawText( oPDF:nRow, 0, cTxt )
      IF nOpcDetalhe == 5 .AND. ! Empty( temp2->Obs )
         oPDF:nRow += 1
         cTxt := " " + temp2->Obs
         cTxt := Padl( cTxt, oPDF:MaxCol() )
         oPDF:DrawText( oPDF:nRow, 0, cTxt )
      ELSE
      ENDIF
      oPDF:nRow += 1
      SKIP
   ENDDO
   GOTO TOP
   oPDF:nRow += 2
   oPDF:MaxRowTest()
   cTxt := Pad( "***TOTAIS***", 50 )
   cTxt += " " + Transform( temp2->QtdEmb, PicVal(9) )
   cTxt += " " + Transform( temp2->ipQtde, PicVal(9) )
   IF nOpcCusto == 2
      cTxt += " " + Transform( temp2->ipValCus, PicVal(11,2) )
   ENDIF
   cTxt += " " + Transform( temp2->ipValNot, PicVal(11,2) )
   IF nOpcCusto == 2
      cTxt += " " + Transform( temp2->Margem, PicVal(11,2) )
      cTxt += " " + Transform( temp2->PMargem, "@E 999.9" )
   ENDIF
   cTxt += " " + Transform( temp2->ValCom, PicVal(8,2) )
   oPDF:DrawText( oPDF:nRow, 0, cTxt )
   IF nOpcAnalise == 2
      oPDF:nRow += 2
      oPDF:MaxRowTest()
      FOR nCont = 1 TO Len( aTransacaoList )
         oPDF:MaxRowTest()
         cTxt := Str( aTransacaoList[ nCont, 1 ], 6 )
         cTxt += " " + Transform( aTransacaoList[ nCont, 2 ], PicVal( 14, 2 ) )
         cTxt += " " + DescricaoJPTRANSA( aTransacaoList[ nCont, 1 ] )
         oPDF:DrawText( oPDF:nRow, 0, cTxt )
         oPDF:nRow += 1
      NEXT
   ENDIF
   SELECT temp2
   USE
   FOR EACH oFile IN mTmpFile
      fErase( oFile )
   NEXT
   oPDF:End()

   RETURN NIL
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 04 Jul 2020 12:06

Pois é...
Com isso só falta um fonte, mas.... é relacionado a um DBF que ainda só está em DBF.
Agora avaliar se faço uma alteração quebra-galho, ou se já começo a eliminação de mais outro DBF.

O quebra-galho pode ser interessante, porque esse é o último fonte dependente de jpcadastro.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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 04 Jul 2020 12:34

Pois é... complicou mais.... talvez....

Esse último fonte é da listagem de tabela de preços diferenciados.
Essa tabela está em DBF.
E ela tem um histórico relacionado, já em MySQL.

A chave é cliente + produto + prazo, inclusive no histórico.
Ficaria mais interessante definir uma ID pra isso, e já vincular essa ID também no histórico, além de ser chave pra MySQL.
Pensar mais... agora trata-se de migrar outro DBF pra MySQL, e alterar uma base MySQL já existente.
A alteração desse vínculo fica até mais fácil em MySQL, porque poderia atualizar o ID do histórico fazendo apenas um relacionamento entre os dois.

É assim:

no preço é cliente + produto + prazo
no histórico é cliente + produto + prazo + data

Colocando um ID no preço, o histórico seria ID + data, bem mais simplificado, só por definir uma ID.

É... talvez melhor ficar no quebra-galho 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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 05 Jul 2020 09:53

Aqui é apenas comentário.

28/06/2020 06:31 6.544.816 jpa.exe
05/07/2020 09:48 6.536.192 jpa.exe

Mesmo entrando novas rotinas de conversão/atualização, o EXE está um pouco menor.
É apenas comentário, porque isso nem importa.

Com certeza, quando apagar tudo que é conversão/atualização, vai ficar menor mesmo.
Mas nem espero grandes mudanças de tamanho, porque a maior parte se refere a ícones/resources.

Curiosidade de anteriores, incluindo versão CLIPPER e console puro.

16/09/2002 14:31 1.012.864 JPA2002.EXE
08/09/2006 20:32 1.030.208 JPA2004.EXE
27/03/2011 16:24 1.323.392 jpa2010.exe
16/04/2013 20:29 2.149.888 jpa2013.exe
14/04/2015 10:08 1.666.048 JPA2015.EXE
14/02/2018 19:51 2.419.000 jpa2018.exe
10/03/2020 20:34 6.750.512 jpa2020.exe
02/07/2020 07:30 6.544.816 JPA.EXE
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: 13818
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 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 4 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