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

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Aproveitando...

Hoje sim, emiti as duas primeiras notas, com XML gerado totalmente pelo MySQL.

Até agora era parcial, hoje foi total.

Esse fuso horário foi um dos problemas, que eu me esqueci dele.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Código: Selecionar todos

SELECT 
   CPNOME,
   ze_ContabilSaldoExercicio( IDCTCONTA, '2021-12-31', '2021-12-31' ) AS SDANT,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-01-01','2022-01-31') AS DEB01,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-01-01','2022-01-31') AS CRE01,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-01-31','2021-12-31' ) AS ACU01,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-01-31', '2021-12-31' ) AS EXE01,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-02-01','2022-02-28') AS DEB02,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-02-01','2022-02-28') AS CRE02,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-02-28','2021-12-31' ) AS ACU02,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-02-28', '2021-12-31' ) AS EXE02,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-03-01','2022-03-31') AS DEB03,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-03-01','2022-03-31') AS CRE03,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-03-31','2021-12-31' ) AS ACU03,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-03-31', '2021-12-31' ) AS EXE03,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-04-01','2022-04-30') AS DEB04,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-04-01','2022-04-30') AS CRE04,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-04-30','2021-12-31' ) AS ACU04,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-04-30', '2021-12-31' ) AS EXE04,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-05-01','2022-05-31') AS DEB05,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-05-01','2022-05-31') AS CRE05,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-05-31','2021-12-31' ) AS ACU05,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-05-31', '2021-12-31' ) AS EXE05,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-06-01','2022-06-30') AS DEB06,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-06-01','2022-06-30') AS CRE06,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-06-30','2021-12-31' ) AS ACU06,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-06-30', '2021-12-31' ) AS EXE06,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-07-01','2022-07-31') AS DEB07,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-07-01','2022-07-31') AS CRE07,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-07-31','2021-12-31' ) AS ACU07,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-07-31', '2021-12-31' ) AS EXE07,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-08-01','2022-08-31') AS DEB08,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-08-01','2022-08-31') AS CRE08,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-08-31','2021-12-31' ) AS ACU08,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-08-31', '2021-12-31' ) AS EXE08,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-09-01','2022-09-30') AS DEB09,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-09-01','2022-09-30') AS CRE09,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-09-30','2021-12-31' ) AS ACU09,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-09-30', '2021-12-31' ) AS EXE09,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-10-01','2022-10-31') AS DEB10,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-10-01','2022-10-31') AS CRE10,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-10-31','2021-12-31' ) AS ACU10,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-10-31', '2021-12-31' ) AS EXE10,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-11-01','2022-11-30') AS DEB11,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-11-01','2022-11-30') AS CRE11,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-11-30','2021-12-31' ) AS ACU11,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-11-30', '2021-12-31' ) AS EXE11,
   ze_ContabilSaldoDebito( IDCTCONTA, '2022-12-01','2022-12-31') AS DEB12,
   ze_ContabilSaldoCredito( IDCTCONTA, '2022-12-01','2022-12-31') AS CRE12,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-12-31','2021-12-31' ) AS ACU12,
   ze_ContabilSaldoExercicio( IDCTCONTA,'2022-12-31', '2021-12-31' ) AS EXE12
FROM JPCTCONTA 
WHERE IDCTCONTA = 5
Modifiquei radical a contabilidade.
O MySQL faz tudo.
balancete, balanço patrimonial, demonstração de resultado, vém tudo pronto.
Esse acima é pra consulta de saldos mensais.
Sei lá se compensa pegar um de cada vez....
Retorna tudo em menos de 1 segundo.
No HeidiSQL mostra 0.016 segundos
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Código: Selecionar todos

/*
PCONTSALDO - CONSULTA AOS VALORES DO PLANO DE CONTAS
1991.04 - José Quintas
*/

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

PROCEDURE pContSaldo

   LOCAL nIdCtConta := 0, nCont, nAnoAtual, GetList := {}, cnSQL := ADOLocal(), dInicial, dFinal
   LOCAL nFechaMes, nFechamento, dFechamento, dFechaExe

   @  2, 2 SAY "Ano. . . .:"
   @  4, 2 SAY "Conta. . .:"

   @  6, 2  SAY "--mes--"
   @  6, 10 SAY " " + Padc( "Débitos", 21, "-" )
   @  6, 32 SAY " " + Padc( "Créditos", 21, "-" )
   @  6, 54 SAY " " + Padc( "Saldo Exercício", 21, "-" )
   @  6, 76 SAY " " + Padc( "Saldo Período", 21, "-" )

   @  7, 2  SAY "DEZ/"
   @  9, 2  SAY "JAN/"
   @ 11, 2  SAY "FEV/"
   @ 13, 2  SAY "MAR/"
   @ 15, 2  SAY "ABR/"
   @ 17, 2  SAY "MAI/"
   @ 19, 2  SAY "JUN/"
   @ 21, 2  SAY "JUL/"
   @ 23, 2  SAY "AGO/"
   @ 25, 2  SAY "SET/"
   @ 27, 2  SAY "OUT/"
   @ 29, 2  SAY "NOV/"
   @ 31, 2  SAY "DEZ/"

   nAnoAtual := 0

   DO WHILE .T.
      Mensagem( "F9 pesquisa, ESC sai" )
      @ 2, 13 GET nAnoAtual  PICTURE "9999" VALID nAnoAtual > 2000
      @ 4, 13 GET nIdCtConta PICTURE "999999" VALID JPCTCONTAClass():New():Valida( @nIdCtConta )
      READ
      Mensagem()
      IF LastKey() == K_ESC
         EXIT
      ENDIF
      Altd()
      WITH OBJECT cnSQL
         :Execute( "SELECT EMFECHA FROM JPEMPRESA WHERE IDEMPRESA=1" )
         nFechamento := :Number( "EMFECHA" )
         :CloseRecordset()
         dFechaExe := Stod( StrZero( nAnoAtual - 1, 4 ) + "1231" )
         :cSQL := "SELECT CPNOME," + ;
            "ze_ContabilSaldoExercicio( IDCTCONTA, " + DateSQL( dFechaExe ) + ", " + DateSQL( dFechaExe ) + " ) AS SDANT," + hb_Eol()
         FOR nCont = 1 TO 12
            dInicial    := Stod( StrZero( nAnoAtual, 4 ) + StrZero( nCont, 2 ) + "01" )
            dFinal      := Last_Day( dInicial )
            nFechaMes   := Int( ( nCont - 1 ) / nFechamento )
            IF nFechaMes == 0
               dFechamento := Stod( StrZero( nAnoAtual - 1, 4 ) + "1231" )
            ELSE
               dFechamento := Last_Day( Stod( StrZero( nAnoAtual, 4 ) + StrZero( nCont, 2 ) + "01" ) )
            ENDIF
            :cSQL += "ze_ContabilSaldoDebito( IDCTCONTA, " + DateSQL( dInicial ) + "," + DateSQL( dFinal ) + ") AS DEB" + StrZero( nCont, 2 ) + "," + ;
                     "ze_ContabilSaldoCredito( IDCTCONTA, " + DateSQL( dInicial ) + "," + DateSQL( dFinal ) + ") AS CRE" + StrZero( nCont, 2 ) + "," + ;
                     "ze_ContabilSaldoExercicio( IDCTCONTA," + DateSQL( dFinal ) + "," + DateSQL( dFechaExe ) + " ) AS ACU" + StrZero( nCont, 2 ) + "," + ;
                     "ze_ContabilSaldoExercicio( IDCTCONTA," + DateSQL( dFinal ) + ", " + DateSQL( dFechamento ) + " ) AS EXE" + StrZero( nCont, 2 ) + ;
                     iif( nCont == 12, "", "," ) + hb_Eol()
         NEXT
         :cSQL += " FROM JPCTCONTA" + ;
            " WHERE IDCTCONTA = " + NumberSQL( nIdCtConta )
         :Execute()
         @ 7,  6 SAY StrZero( nAnoAtual - 1, 4 )
         @ 7, 52 SAY :Number( "SDANT" ) PICTURE PicVal(14,2)
         @ 7, 74 SAY :Number( "SDANT" ) PICTURE PicVal(14,2)
         FOR nCont = 1 TO 12
            @ nCont * 2 + 7, 0 SAY ""
            @ Row(), 6  SAY StrZero( nAnoAtual, 4 )
            @ Row(), 10 SAY :Number( "DEB" + StrZero( nCont, 2 ) ) PICTURE PicVal(14,2)
            @ Row(), 32 SAY :Number( "CRE" + StrZero( nCont, 2 ) ) PICTURE PicVal(14,2)
            @ Row(), 52 SAY :Number( "ACU" + StrZero( nCont, 2 ) ) PICTURE PicVal(14,2)
            @ Row(), 74 SAY :Number( "EXE" + StrZero( nCont, 2 ) ) PICTURE PicVal(14,2)
         NEXT
      ENDWITH
   ENDDO
   CLOSE DATABASES

   RETURN
Fonte da consulta.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Atualizando aqui.
Seguindo os avanços, executando STORED PROCEDUREs, e pegando retorno de STORED FUNCTIONs

Código: Selecionar todos

      :ExecuteProcedure( "ze_ContabilBalancete", dInicial, dFinal, iif( nOpcResultado == 1, 0, 12 ), nOpcGrau, iif( nOpcResultado == 3, 1, 0 ) )

Código: Selecionar todos

   nIdPedido := cnSQL:ReturnFunction( "ze_PedidoDuplica", nIdPedido, Date(), LogInfo() )

Código: Selecionar todos

   cnSQL:ExecuteProcedureNoReturn( "ze_PedidoCalculo", nIdPedido )
Detalhe nesse último: TODOS os cálculos do pedido no MySQL e não no Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Meu modo de trabalho

Mensagem por Mario Mesquita »

Bom dia a todos.

Quintas, então aquela função naquele Select enorme não está no programa e sim numa Stored Procedure do BD?

Poderoso mesmo...

Saudações,
Mario.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Mario Mesquita escreveu:Quintas, então aquela função naquele Select enorme não está no programa e sim numa Stored Procedure do BD?
Poderoso mesmo...
Tenho de tudo um pouco.

No caso do balancete contábil, tem rotina que cria tudo no MySQL e trás pronto em uma tabela.

Minha geração de XML de nota fiscal está toda no MySQL.
São várias rotinas, uma chamando a outra.
O aplicativo apenas pede o XML de uma nota, e vém pronto.

E é muito rápido isso tudo, de um modo geral, menos de 1 segundo tá tudo pronto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

telaped.png
Uia
Agora com "dialog" dá pra brincar um pouco mais.

Ainda falta ajustar os controles, referente a cores e tamanho de fonte.
No harbour 3.4 funcionava melhor.
Como nunca usei, nem me preocupei com os detalhes.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

tamanho.png
Sei lá....
De ontem pra hoje o EXE reduziu 8 MB.
E comparando com 23/02/2023 reduziu 245 MB

Nem perguntem, só olhei de curiosidade.
backupd\ é backup, tá faltando atualizar o backup kkkk
wwwjpa\arquivos, é o último que fiz upload pra internet, assim que fizer upload passa a ser o atual.
Foi só coincidência ter os 3 por aqui ainda.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

tamanho.png
tamanho.png (6.37 KiB) Exibido 126398 vezes
Sei lá pra que... reduziu um pouco mais.
Só retirando lixo.
Sped fiscal por exemplo, nunca usei, pra que manter no aplicativo...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Tava revendo aqui.
Por coincidência, está complementando DOIS ANOS que passei a gerar XML de NFE no próprio MySQL.
E por coincidência hoje dividi um pouco mais, pra não ficar muito grande.

Apenas uma parte:

Código: Selecionar todos

CREATE FUNCTION ze_XmlNfeProduto( nIdItPed INT(11), nNumItem INT(11) )
RETURNS TEXT CHARSET latin1

PRODUTO: BEGIN

   DECLARE cXml TEXT;
   DECLARE nIdProduto, nSomenteIcms INT(11);
   DECLARE nQtde DECIMAL(16,4);
   DECLARE nValFre, nValSeg, nValDes, nValOut, nImpVal DECIMAL(16,2);
   DECLARE nPreNot DECIMAL(16,5);
   DECLARE cNome VARCHAR(60);
   DECLARE cPedCom, cUnid, cGtin, cGtinTri, cNcm, cCest, cPedCli, cCfop VARCHAR(20);

   SET cXml := '';

   SELECT IPPRODUTO, IPQTDE, IPPRENOT, IPVALFRE, IPVALSEG, IPVALDES, IPVALOUT + IPVALEXT, IPCFOP, ze_SoNumeros( IPPEDCOM ), IPIMPVAL,
      IENOME, IEUNID, IEGTIN, IEGTINTRI, IENCM, IECEST,
      PDPEDCLI
      FROM JPITPED
      LEFT JOIN JPPEDIDO ON IDPEDIDO = IPPEDIDO
      LEFT JOIN JPNOTFIS ON NFPEDIDO = IDPEDIDO
      LEFT JOIN JPITEM ON IDPRODUTO = IPPRODUTO
      WHERE IDITPED = nIdItPed
   INTO nIdProduto, nQtde, nPreNot, nValFre, nValSeg, nValDes, nValOut, cCfop, cPedCom, nImpVal,
      cNome, cUnid, cGtin, cGtinTri, cNcm, cCest, cPedCli;

   SET nSomenteIcms := IF( cCfop = '1.604' OR INSTR( cNome, ' DE ICMS' ) != 0, 1, 0 );

   SET cXml := CONCAT( cXml,
      '<det nItem="', nNumItem, '">',
      '<prod>',
      ze_XmlTag( 'cProd', LPAD( nIdProduto, 6, '0' ) ),
      ze_XmlTag( 'cEAN', ze_XmlNfeGtin( cGtin ) ),
      ze_XmlTag( 'xProd', cNome ),
      ze_XmlTag( 'NCM', cNcm ),
      IF( LENGTH( cCest ) = 0, '', ze_XmlTag( 'CEST', cCest ) ),
      ze_XmlTag( 'CFOP', ze_SoNumeros( cCFOP ) ),
      ze_XmlTag( 'uCom', LEFT( CONCAT( cUnid, '.' ), 6 ) ),
      ze_XmlTag( 'qCom', nQtde ),
      ze_XmlTag( 'vUnCom', IF( nSomenteIcms = 1, 0.00, nPreNot ) ),
      ze_XmlTag( 'vProd', IF( nSomenteIcms = 1, 0.00, ROUND( nQtde * nPreNot, 2 ) ) ),
      ze_XmlTag( 'cEANTrib', ze_XmlNfeGtin( cGtinTri ) ),
      ze_XmlTag( 'uTrib', LEFT( CONCAT( cUnid, '.' ), 6 ) ),
      ze_XmlTag( 'qTrib', nQtde ),
      ze_XmlTag( 'vUnTrib', IF( nSomenteIcms = 1, 0.00, nPreNot ) ),
      IF( nValFre = 0, '', ze_XmlTag( 'vFrete', nValFre ) ),
      IF( nValSeg = 0, '', ze_XmlTag( 'vSeg', nValSeg ) ),
      IF( nValDes = 0, '', ze_XmlTag( 'vDesc', nValDes ) ),
      IF( nValOut = 0, '', ze_XmlTag( 'vOutro', nValOut ) ),
      ze_XmlTag( 'indTot', '1' ) );

PRODUTOIMPORTACAO: BEGIN

   SET cXml := CONCAT( cXml, '' );

END PRODUTOIMPORTACAO;

   SET cXml := CONCAT( cXml,
      IF( LENGTH( cPedCli ) = 0, '', ze_XmlTag( 'xPed', cPedCli ) ),
      IF( LENGTH( cPedCom ) = 0, '', ze_XmlTag( 'nItemPed', cPedCom ) ),
      IF( 1 = 1, '', ze_XmlTag( 'cBenef', '' ) ) );

   SET cXml := CONCAT( cXml, ze_xmlnfeprodutoveiculo( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlnfeprodutomedicamento( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlnfeprodutoarmamento( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlNfeprodutocombustivel( nIdItPed ) );

   SET cXml := CONCAT( cXml, '</prod>' );

   SET cXml := CONCAT( cXml, '<imposto>', IF( nImpVal = 0, '', ze_XmlTag( 'vTotTrib', nImpVal ) ) );

   SET cXml := CONCAT( cXml, ze_xmlnfeprodutoicms( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlnfeprodutoipi( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlnfeprodutoii( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlnfeprodutopis( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_xmlnfeprodutocofins( nIdItPed ) );
   SET cXml := CONCAT( cXml, ze_XmlNfeProdutoISS( nIdItPed ) );

   SET cXml := CONCAT( cXml, '</imposto>', '</det>' );

   RETURN cXml;

END PRODUTO;
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Código: Selecionar todos

FUNCTION LoadBoletoSetup( oBolSetup, nIdPortador )

   LOCAL cnSQL := ADOLocal()

   WITH OBJECT cnSQL
      :Execute( "SELECT * FROM JPTABFINPOR WHERE IDFINPOR=" + NumberSQL( nIdPortador ) + ;
         " UNION ALL SELECT * FROM JPTABFINPOR WHERE FINPORBANCO=" + NumberSQL( nIdPortador ) )
      oBolSetup:nBanco      := :Number( "FINPORBANCO" )
      oBolSetup:nJuros      := :Number( "FINPORJUROS" )
      oBolSetup:nAgencia    := :Number( "FINPORAGENCIA" )
      oBolSetup:nConta      := :Number( "FINPORCONTA" )
      oBolSetup:nCarteira   := :Number( "FINPORCARTEIRA" )
      oBolSetup:nMulta      := :Number( "FINPORMULTA" )
      oBolSetup:nBancario   := :Number( "FINPORBANCARIO" )
      oBolSetup:nRemessa    := :Number( "FINPORREMESSA" ) + 1
      oBolSetup:nEspecie    := :Number( "FINPORNESPECIE" )
      oBolSetup:cBolEspecie := :String( "FINPORCESPECIE", 2 )
      nIdPortador           := :Number( "IDFINPOR" )
      :CloseRecordset()
   ENDWITH
   IF nIdPortador == 0
      oBolSetup:nBanco    := 341
      oBolSetup:nBancario := Val( LeCnf( "BOLETO NOSSO" ) )
      oBolSetup:nJuros    := Val( LeCnf( "BOLETO JUROS" ) )
      oBolSetup:nAgencia  := Val( LeCnf( "BOLETO AGENCIA" ) )
      oBolSetup:nConta    := Val( LeCNf( "BOLETO CONTA" ) )
      oBolSetup:nCarteira := Val( LeCnf( "BOLETO CARTEIRA" ) )
      oBolSetup:nCarteira := iif( oBolSetup:nCarteira == 0, 109, oBolSetup:nCarteira )
      oBolSetup:nRemessa  := 1
   ENDIF
   oBolSetup:nBancario += 1

   RETURN nIdPortador
Primeiro a configuração ficava no geral, LeCnf() e GravaCnf().
Depois foi pelo banco.
E agora é pelo portador.

Código: Selecionar todos

      :Execute( "SELECT * FROM JPTABFINPOR WHERE IDFINPOR=" + NumberSQL( nIdPortador ) + ;
         " UNION ALL SELECT * FROM JPTABFINPOR WHERE FINPORBANCO=" + NumberSQL( nIdPortador ) )
Esse select pega portador ou banco, mas prioridade por portador.
Se não encontrar por aí, vai no geral.

Isso resolve questão de cliente que não fez atualização.
Após atualização de todos os clientes, sei lá quando, é remover tudo alternativo.
Assim não tem pressa, não tem correria, não tem esquecimento, é só deixar acontecer.

Pra que deixar pra acertar manual, se dá pra fazer automático ?
É assim que vamos eliminando trabalho extra.
Eliminar trabalho extra significa mais tempo pra melhorar outras coisas.

Não precisa de recursos avançados, conhecimentos avançados, ou inteligência artificial.
É só usar a cabeça.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Pequena grande alteração....
Ainda em fase de testes.

Código: Selecionar todos

CREATE CLASS frmGuiClass
...
METHOD CreateModal( cTitle ) CLASS frmGuiClass

   hb_Default( @cTitle, "" )
   CTitle := AppEmpresaApelido() + " (" + AppUserName() + " ) " + cTitle
   ::oCrt := CrtModal( 0, 0, MaxRow() + 1, MaxCol() + 1, cTitle, 2 )

   RETURN Nil
Expandindo o uso de DIALOG MODAL na GTWVG.
Só pra reduzir fonte:

Código: Selecionar todos

STATIC FUNCTION RotinaPreco( cnSQLGeral, dDatRef )

   LOCAL nKey := LastKey()

   DO CASE
   CASE nkey == K_F4 // filiais
      //wSave()
      //Atail( AppForms() ):GuiHide()
      pPreComb_Filiais( cnSQLGeral )
      //wRestore()
      //Atail( AppForms() ):GuiShow()
      cnSQLGeral:ReQuery()
      RETURN 0
   CASE nkey == K_ENTER
      //wSave()
      //Atail( AppForms() ):GuiHide()
      pPreComb_Preco( ;
         dDatRef, ;
         cnSQLGeral:Number( "IDPRECO" ), ;
         cnSQLGeral:Number( "PCCADASTRO" ), ;
         cnSQLGeral:Number( "PCPRODUTO" ), ;
         cnSQLGeral:Number( "PCFORPAG" ), ;
         cnSQLGeral:Number( "PCURGENTE" ) )
      //wRestore()
      //Atail( AppForms() ):GuiShow()
      cnSQLGeral:ReQuery()
   ENDCASE

   RETURN 0
A dialog modal é ruim em qualquer lib.....
Pelo menos em multithread prende só a janela anterior.
E na GTWVG, muito melhor do que em qualquer LIB, dá pra clicar na janela bloqueada pra voltar o foco à janela modal.
Nas outras LIBs tem que tirar aplicativos da frente pra poder clicar.
Pois é... duas coisas ruins em outras LIBs.
tela.png
A primeira janela é o menu.
A segunda janela é tabela de preços mostrando clientes.
A terceira janela é MODAL, o detalhamento das "filiais" da tabela selecionada, acionada pelo posicionamento e clique no button.
A quarta janela é MODAL, a opção de cadastros que podem ser adicionados à lista, acionada pelo clique no button.

Se clicar na primeira, ok, tá liberada, volta pra ela.
Se clicar em qualquer outra, volta pra quarta que é modal com relação às outras.

Então... criando dialog pra sub-opção, não preciso save/restore screen, e nem ficar tratando a parte gráfica.
Fica igual qualquer dialog de qualquer lib.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

novafase.png
E começou a nova fase do aplicativo.
Mesmos fontes, mesma multithread, mesmo ADO, mesma classe ADO....
Mas começam os browses FIVEWIN.
Tem HWGUI também no aplicativo, mas uma GUI já dá trabalho suficiente.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

E tem gente que não compila um fontezinho....

PATH do harbour e compilador C.
É fácil, mas tem gente que não sabe fazer.
Isto normalmente seria o suficiente.

Código: Selecionar todos

PATH=d:\harbour\bin;d:\harbour\comp\mingw32\bin
Mas tem as LIBs, e os defaults.
Só colocar em harbour\bin\hbmk.hbc
Acho que ninguém usa isso, nem as LIBs.

Código: Selecionar todos

mt=yes
gui=yes
strip=yes
fullstatic=yes
PRGFLAGS=-m -n -w3 -es2 -ge1 -DMT_EXPERIMENTAL -DHB_NO_GTGUI=YES
libpaths=d:/fontes/integra/libjpa
libpaths=d:/fontes/integra/boletoclass
libpaths=d:/fontes/integra/sefazclass
libpaths=d:/github/rmchartclass
libpaths=d:/github/wvgtest
libpaths=d:/github/hwgui
libpaths=d:/github/oohg
libpaths=d:/github/hmge
libpaths=d:/github/hmg3
libpaths=d:/github/fivewin
#harbour 3.4 only
#autohbcs=fivewin.ch:fivewin.hbc
#autohbcs=hwgui.ch:hwgui.hbc
#autohbcs=oohg.ch:oohg.hbc
#autohbcs=gtwvg.ch:gtwvg.hbc
Pronto pra qualquer lib.

Mas aqui não termina por aí....
Estou usando fivewin de forma não convencional.
Parece que só dois usuários usam mingw com fivewin, eu e mais um.

Aí vém o \github\fivewin\fivewin.hbc

Código: Selecionar todos

incpaths=include

libpaths=lib
{mingw}libs=dummy
{mingw}libs=fivehg
{mingw}libs=fivehgc

{mingw}libs=user32 winspool kernel32 comctl32 comdlg32 gdi32 gdiplus ole32
{mingw}libs=oleaut32 psapi oledlg mfcuia32 msimg32 win32k stdc++ version
{mingw}libs=uuid winmm vfw32 wsock32
{mingw}libs=uxtheme

libs=hbwin.hbc
libs=xhb.hbc
libs=hbct.hbc
libs=hbmzip.hbc
libs=hbziparc.hbc
Aqui ainda não parou por aí. Tem a dummy.lib (dummy.a) indicada aí na lista
Isso é pra remover o que não me interessa do fivewin, e deixar o EXE menor.
Tamanho do EXE no momento pra mim é importante.
Também é pra adicionar funções ao fivewin que acusa falta ao usar mingw.
Ela é gerada a partir deste fonte

Código: Selecionar todos

FUNCTION GDIP_Zoom(); RETURN Nil
FUNCTION GDIP_Crop(); RETURN Nil
FUNCTION GDIP_Rotate(); RETURN Nil
FUNCTION GDIP_RingGrad(); RETURN Nil

FUNCTION ADODefault(); RETURN Nil
FUNCTION Tscintilla(); RETURN Nil
FUNCTION fw_DateToSql(); RETURN Nil
FUNCTION fwAdoStruct(); RETURN Nil
FUNCTION RsGetRows(); RETURN Nil
FUNCTION AdoNull(); RETURN Nil
FUNCTION Fw_RdbmsName(); RETURN Nil
FUNCTION fwAdoFieldStruct(); RETURN Nil
FUNCTION fw_ShowAdoError(); RETURN Nil
FUNCTION fw_OpenAdoConnection(); RETURN Nil
FUNCTION fw_OpenRecordset(); RETURN Nil
FUNCTION fw_ValToSql(); RETURN Nil
FUNCTION fw_AdoFieldUpdateAble(); RETURN Nil
FUNCTION fwAdoMemoSizeThreShold(); RETURN Nil
FUNCTION FieldTypeAdoToDbf(); RETURN Nil
FUNCTION TRichedit5(); RETURN Nil
FUNCTION MnuColors(); RETURN Nil
FUNCTION RPreview(); RETURN Nil
FUNCTION TRichedit(); RETURN Nil

FUNCTION WordPDF(); RETURN Nil
FUNCTION fwSavePreviewToPdf(); RETURN Nil
FUNCTION fw_I2PDF(); RETURN Nil
FUNCTION fwpg_Structure(); RETURN Nil
FUNCTION fwpg_Skipper(); RETURN Nil
FUNCTION fwpg_xbrSeek(); RETURN Nil
FUNCTION fwpg_FieldGet(); RETURN Nil
FUNCTION fwpg_xbrSaveData(); RETURN Nil
FUNCTION fwpg_QuerySetOrder(); RETURN Nil
FUNCTION fwpg_Execute(); RETURN Nil
FUNCTION fwpg_GoToKeyVal(); RETURN Nil
Tá bom até aqui ?
Mas ainda não acabou.

Agora é no projeto
Funções do fivewin modificadas.

Código: Selecionar todos

d:\github\dlgauto\source\lib_fivewin.prg
d:\github\fivewin\source\classes\xbrowse.prg
d:\github\fivewin\source\function\checkres.prg
Achou que acabou ?
Ainda não.

Acusa duplicidade de funções.
Deixo opcional isto, pra lembrar quais estão duplicadas, e ver se não apareceu nenhuma nova duplicada
Fica igual BLINKER, aceita coisa repetida.

Código: Selecionar todos

SET HB_USER_LDFLAGS=-Wl,--allow-multiple-definition -s -static
E o projeto completo, ficou assim:

Código: Selecionar todos

*.prg
libjpa/prg/*.prg
#d:\github\fivewin\source\winapi\instance.c
#PostQuitMessage(0) on errorsys
jpa.rc
topnfe/*.prg

-ojpa

#force harbour debug
-lforcedebug

## force libjpa
-Llibjpa
libjpa.hbc
-llibjpa

-DDLGAUTO_AS_LIB
-DDLGAUTO_AS_SQL
-Id:\github\dlgauto\source

d:\github\dlgauto\source\frm*.prg
d:\github\dlgauto\source\test.prg
d:\github\dlgauto\source\test_loadsetup.prg

d:\github\dlgauto\source\lib_hwgui.prg
hwgui.hbc

d:\github\dlgauto\source\lib_fivewin.prg
d:\github\fivewin\source\classes\xbrowse.prg
d:\github\fivewin\source\function\checkres.prg
fivewin.hbc

#d:\github\dlgauto\source\lib_hmge.prg
#hmge.hbc

#d:\github\dlgauto\source\lib_hmg3.prg
#hmg3.hbc

#d:\github\dlgauto\source\lib_oohg.prg
#oohg.hbc
Tem também o debug do harbour, adicionado a força, eliminando qualquer outro debug

Tem também minha errorsys entrando a força, eliminando qualquer outra.

Tem também minha hb_gtsys entrando a força, eliminando qualquer outra.

Complicado ? Porque ?

Eu só digito C <ENTER> pra compilar... o que tem de complicado nisso ?

Eu faço o que EU QUERO, e não o que as LIBs querem.
NÃO É TESTE, É REAL.
Já está rodando assim nos clientes.

Minha classe ADO, minha classe sefazclass, emails, ftp, webservice, zip, WVG, FIVEWIN, HWGUI, tudo junto no mesmo EXE.
O harbour que eu quiser, com o compilador mingw da versão que eu quiser.

Sei lá... pra mim qualquer programador deveria conseguir fazer a mesma coisa.
Aliás, esse sempre foi o diferencial de programadores Clipper: se o Clipper não fazia, dávamos um jeito de conseguir fazer.
Depois que virou harbour/xharbour.... sei lá... parece que a maioria desaprendeu...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Meu modo de trabalho

Mensagem por JoséQuintas »

Situação atual em vídeo



https://www.youtube.com/watch?v=B0GZRwtNPJA

Dá pra ver os browses em fivewin.

De quebra, dlgauto em fivewin, e dlgauto em hwgui.

Tá tudo no aplicativo.

Legal né.
Livre pra usar qualquer coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder