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 » 14 Set 2021 02:33

jpa.png
jpa.png (9.78 KiB) Visualizado 1273 vezes


Sobre o EXE.
Como já comentei por aqui, deve ficar sempre em torno de 2.2MB.
Se reduzir (quando remover conversões) vai ser pouco.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Set 2021 11:00

Durante os testes, reparei muitos arquivos sendo salvos em backup, referente a um dos clientes.
São estes arquivos:
14/04/2015  16:56             1.000 OB000095.TXT
23/07/2015  11:49             1.000 OB000096.TXT
30/07/2015  15:57             1.000 OB000098.TXT
02/07/2021  15:20               500 OB000100.TXT
19/12/2018  10:34               500 OB000102.TXT
12/07/2016  15:47             1.000 OB000103.TXT
06/07/2020  16:19               500 OB000105.TXT
24/02/2017  13:01               500 OB000106.TXT
10/06/2021  14:08               500 OB000108.TXT
16/11/2017  14:42             1.000 OB000111.TXT
02/08/2021  13:06               500 OB000114.TXT
05/02/2019  13:36               500 OB000117.TXT
25/08/2020  15:24               500 OB000121.TXT
10/06/2019  12:41             1.000 OB000123.TXT
26/11/2019  12:00               500 OB000125.TXT
10/06/2021  16:58               500 OB000126.TXT
25/03/2021  16:59               500 OB000127.TXT
24/03/2020  13:46             1.000 OB000128.TXT
16/07/2020  14:03               500 OB000129.TXT
17/07/2020  15:54             1.000 OB000130.TXT
15/12/2020  13:22             1.000 OB000131.TXT
04/01/2021  15:53             1.000 OB000132.TXT
18/02/2021  14:32               500 OB000133.TXT
20/05/2021  13:14               500 OB000134.TXT
28/07/2011  15:49               607 P0560.MEM
07/12/2012  14:03                74 P0600.MEM
10/11/2015  10:33             7.924 PNOT0200.TXT
16/09/2021  00:18    <DIR>          TEMP
16/09/2021  00:18    <DIR>          XML
             103 arquivo(s)     48.179.895 bytes


É um caso específico, onde tem observações fixas para clientes, e uso arquivo em disco OB*.TXT.
Já acrescentei esta rotina no aplicativo:
STATIC FUNCTION Update0919()

   LOCAL aFile, aList, nIdCadastro, cFile, cTexto
   LOCAL cnSQL := ADOLocal()

   IF Len( Directory( "ob*.txt" ) ) == 0
      RETURN Nil
   ENDIF
   aList := Directory( "ob*.txt" )
   FOR EACH aFile IN aList
      cFile := aFile[ F_NAME ]
      cFile := Substr( cFile, 1, At( ".", cFile ) - 1 )
      nIdCadastro := Val( Substr( cFile, 4 ) )
      cTexto := MemoRead( aFile[ F_NAME ] )
      IF nIdCadastro != 0 .AND. ! Empty( cTexto )
         cnSQL:ExecuteCmd( "INSERT INTO JPTABINFADI ( INFADICADASTRO, INFADITEXTO ) VALUES ( " + ;
            NumberSQL( nIdCadastro ) + ", " + StringSQL( cTexto ) )
         fErase( aFile[ F_NAME ] )
      ENDIF
   NEXT

   RETURN Nil


Estou transferindo o que era em disco, pra uma tabela MySQL.
Para o aplicativo será simples, um SELECT pra buscar se existe algo gravado, e um INSERT/UPDATE pra salvar.
Trocentos arquivos a menos no disco !!!!
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Set 2021 11:02

-2147217900 [MySQL][ODBC 5.3(a) Driver][mysqld-5.5.5-10.6.3-MariaDB]You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1


Esqueci de fechar os parêntesis.... rs
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Set 2021 11:13

infadic.png


Pronto, eliminados trocentos arquivos da pasta.
Tinha esquecido desse caso "diferente".
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Set 2021 11:45

      IF mUsaObsAnterior
         IF ! Empty( mInfAdic )
            WITH OBJECT cnSQL
               IF ADORecCount( "JPTABINFADI", "INFADICADASTRO=" + NumberSQL( nIdCadastro ) ) == 0
                  :ExecuteCmd( "INSERT INTO JPTABINFADI ( INFADICADASTRO, INFADITEXTO ) VALUES" + ;
                     "( " + NumberSQL( nIdCadastro ) + ", " + StringSQL( mInfAdic ) + " )" )
               ELSE
                  :ExecuteCmd( "UPDATE JPTABINFADI SET INFADITEXTO=" + StringSQL( mInfAdic ) + ;
                     " WHERE INFADICADASTRO=" + NumberSQL( nIdCadastro ) )
               ENDIF
            ENDWITH
         ENDIF
      ENDIF


Pra quem ainda fica imaginando e ainda não entendeu....
Aonde vou salvar? em JPTABINFADI.
Se não tem cadastrado, envio comando incluir
INSERT INTO JPTABINFADI ( INFADICADASTRO, INFADITEXTO ) VALUES ( 999, "xxxx" )

Se já tem cadastrado, é só atualizar.
UPDATE JPTABINFADI SET INFADITEXTO="xxxx" WHERE INFADICADASTRO=999


O aplicativo não precisa USE, SELECT, SET INDEX, SET ORDER, RLOCK, NADA, porque ele não mexe no arquivo, quem mexe é o servidor.
E o servidor recebeu toda informação detalhada que precisava sobre aonde gravar.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Set 2021 15:57

Pra quem não percebeu, o arquivo de senhas, reponsável por todo acesso, seja DBF ou MYSQL, estava em DBF até a semana passada.
Em vários clientes ainda está, enquanto eles não atualizarem o aplicativo.

30/07/2021  23:58               579 jpcontabil.DBF
30/07/2021  23:58             6.723 jpctconta.DBF
30/07/2021  23:58               323 jpctlotes.DBF
07/09/2020  22:56             5.335 jpempresa.dbf


Agora restam esses.

Provavelmente elimine ainda o JPCTLOTES.DBF, que tem uso simples.
O JPEMPRE.DBF está disponível o tempo todo. Ao alterar pra MySQL... vai precisar muita alteração.
Os outros dois, foi o que sobrou de toda contabilidade, precisa alterar todo aplicativo de contabilidade, praticamente reescrever muita coisa.

Talvez elimine o JPCTLOTES primeiro, por ser mais simples e pouco uso.
Depois, o JPEMPRE.DBF, pra eliminar a necessidade de DBF - os da contabilidade podem ficar vazios aonde não usa, sem problema.

Lembrando:

Além desse aplicativo geral, tem o da imobiliária que usa muito DBF ainda, e talvez uns 30 usuários.
Preciso passar lá pra reindexar, porque tá ficando lento por ter muita coisa excluída.
De um modo geral, foi o primeiro lugar aonde usei MySQL, mas só transferi arquivos com mais de 1 milhão de registros.
Tem muito ainda a transferir para MySQL.... não tem a ver com o outro aplicativo geral.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 20 Set 2021 13:01

contabilidadesql.png


um único arquivo com um único registro.
Tudo isso de fonte alterado.
E tudo isso se refere a menos de um dia de trabalho.
E ainda não terminei....

Acabei criando funções pra variáveis estáticas de maior uso, pra ficar disponível no aplicativo inteiro.
AppAnoBase() e AppFechamento().

As demais, pegar conforme o uso, e ainda ajustando.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 20 Set 2021 13:05

Ah...
Cheguei a derrubar o aplicativo....
Levou um tempinho pra descobrir, mas....

Pego informações do arquivo de configuração pra criar a conexão SQL.
Acontece, que num determinado fonte, coloquei pra criar a conexão ANTES de configurar.
Resultado: conexão errada, e aplicativo não entrava mais...

Agora ok novamente.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 20 Set 2021 15:06

Até que não ficou tão grande assim...

   WITH OBJECT cnSQL
      :ExecuteCmd( "UPDATE JPEMPRESA" + ;
        " JOIN JPEMPRESA AS A ON JPEMPRESA.IDEMPRESA=A.IDEMPRESA" + ;
        " SET JPEMPRESA.EMRELEMI=" + StringSQL( cRelEmi ) + ", " + ;
         " JPEMPRESA.EMANOBASE = A.EMANOBASE + 1," + ;
         " JPEMPRESA.EMLOTE=" + StringSQL( "01" + Right( Str( AppAnoBase() + 1, 4 ), 2 ) + "00001" ) + "," + ;
         " JPEMPRESA.EMDIARIO1=A.EMDIARIO2, JPEMPRESA.EMDIARIO2=A.EMDIARIO3," + ;
         " JPEMPRESA.EMDIARIO3=A.EMDIARIO4, JPEMPRESA.EMDIARIO4=A.EMDIARIO5," + ;
         " JPEMPRESA.EMDIARIO6=A.EMDIARIO7,JPEMPRESA.EMDIARIO8='' WHERE JPEMPRESA.IDEMPRESA=1" )
   SELECT jpempresa
   RecLock()
   REPLACE ;
      jpempresa->emRelEmi  WITH cRelEmi, ;
      jpempresa->emAnoBase WITH  jpempresa->emAnoBase + 1, ;
      jpempresa->emLote    WITH "01" + Right( Str( jpempresa->emAnoBase, 4 ), 2 ) + "00001", ;
      jpempresa->emDiario1 WITH jpempresa->emDiario2, ;
      jpempresa->emDiario2 WITH jpempresa->emDiario3, ;
      jpempresa->emDiario3 WITH jpempresa->emDiario4, ;
      jpempresa->emDiario4 WITH jpempresa->emDiario5, ;
      jpempresa->emDiario5 WITH jpempresa->emDiario6, ;
      jpempresa->emDiario6 WITH jpempresa->emDiario7, ;
      jpempresa->emDiario7 WITH jpempresa->emDiario8, ;
      jpempresa->emDiario8 WITH ""
   RecUnlock()


Fiquei na dúvida sobre atualizar 1 com 2, 2 com 3, 3 com 4, etc... e preferi fazer um JOIN.
Não muda muita coisa, REPLACE A WITH B por A=B...
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 20 Set 2021 19:46

sql.png


Só como exemplo, de que nem sempre o que parece é....

Eu acessava o arquivo JPEMPRESA só pra pegar o CNPJ, no fonte Harbour, e pra passar pra stored procedure.
Agora que JPEMPRESA foi pra SQL, a stored procedure pega a informação diretamente da tabela.
Acabei eliminando o acesso pelo fonte.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

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

Meu modo de trabalho

Mensagempor JoséQuintas » 20 Set 2021 20:31

Ficou interessante porque....

Numa alteração rápida, eu posso usar aquela função cnSQL:ReturnSelect( "EMCNPJ FROM JPEMPRESA WHERE IDEMPRESA=1" )
E depois, conforme for movendo outras tabelas, junta isso com outros SELECTs mais amplos.
Um tapa-buraco básico, até a solução definitiva.
Isso porque tem horas que precisa uma solução rápida, mesmo que quebra-galho.

E esse jpempresa tá dando todo trabalho que eu pensava.... rs
É o último do uso geral, e também faz parte da contabilidade, por isso tinha deixado pro fim.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

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

Meu modo de trabalho

Mensagempor JoséQuintas » 20 Set 2021 22:24

Apenas uma possibilidade, ainda não testado, mas....

Débito

CREATE FUNCTION ze_SaldoDebito( cConta VARCHAR(20), nMes INT(11) )
RETURNS DECIMAL(16,2)

BEGIN

DECLARE nValor DECIMAL(16,2) DEFAULT 0;

SET nValor = (
SELECT
CASE nMes
   WHEN  1 THEN cpDeb01
   WHEN  2 THEN cpDeb02
   WHEN  3 THEN cpDeb03
   WHEN  4 THEN cpDeb04
   WHEN  5 THEN cpDeb05
   WHEN  6 THEN cpDeb06
   WHEN  7 THEN cpDeb07
   WHEN  8 THEN cpDeb08
   WHEN  9 THEN cpDeb09
   WHEN 10 THEN cpDeb10
   WHEN 11 THEN cpDeb11
   WHEN 12 THEN cpDeb12
   WHEN 13 THEN cpDeb13
   WHEN 14 THEN cpDeb14
   WHEN 15 THEN cpDeb15
   WHEN 16 THEN cpDeb16
   WHEN 17 THEN cpDeb17
   WHEN 18 THEN cpDeb18
   WHEN 19 THEN cpDeb19
   WHEN 20 THEN cpDeb20
   WHEN 21 THEN cpDeb21
   WHEN 22 THEN cpDeb22
   WHEN 23 THEN cpDeb23
   WHEN 24 THEN cpDeb24
   WHEN 25 THEN cpDeb25
   WHEN 26 THEN cpDeb26
   WHEN 27 THEN cpDeb27
   WHEN 28 THEN cpDeb28
   WHEN 29 THEN cpDeb29
   WHEN 30 THEN cpDeb30
   WHEN 31 THEN cpDeb31
   WHEN 32 THEN cpDeb32
   WHEN 33 THEN cpDeb33
   WHEN 34 THEN cpDeb34
   WHEN 35 THEN cpDeb35
   WHEN 36 THEN cpDeb36
   WHEN 37 THEN cpDeb37
   WHEN 38 THEN cpDeb38
   WHEN 39 THEN cpDeb39
   WHEN 40 THEN cpDeb40
   WHEN 41 THEN cpDeb41
   WHEN 42 THEN cpDeb42
   WHEN 43 THEN cpDeb43
   WHEN 44 THEN cpDeb44
   WHEN 45 THEN cpDeb45
   WHEN 46 THEN cpDeb46
   WHEN 47 THEN cpDeb47
   WHEN 48 THEN cpDeb48
   WHEN 49 THEN cpDeb49
   WHEN 50 THEN cpDeb50
   WHEN 51 THEN cpDeb51
   WHEN 52 THEN cpDeb52
   WHEN 53 THEN cpDeb53
   WHEN 54 THEN cpDeb54
   WHEN 55 THEN cpDeb55
   WHEN 56 THEN cpDeb56
   WHEN 57 THEN cpDeb57
   WHEN 58 THEN cpDeb58
   WHEN 59 THEN cpDeb59
   WHEN 60 THEN cpDeb60
   WHEN 61 THEN cpDeb61
   WHEN 62 THEN cpDeb62
   WHEN 63 THEN cpDeb63
   WHEN 64 THEN cpDeb64
   WHEN 65 THEN cpDeb65
   WHEN 66 THEN cpDeb66
   WHEN 67 THEN cpDeb67
   WHEN 68 THEN cpDeb68
   WHEN 69 THEN cpDeb69
   WHEN 70 THEN cpDeb70
   WHEN 71 THEN cpDeb71
   WHEN 72 THEN cpDeb72
   WHEN 73 THEN cpDeb73
   WHEN 74 THEN cpDeb74
   WHEN 75 THEN cpDeb75
   WHEN 76 THEN cpDeb76
   WHEN 77 THEN cpDeb77
   WHEN 78 THEN cpDeb78
   WHEN 79 THEN cpDeb79
   WHEN 80 THEN cpDeb80
   WHEN 81 THEN cpDeb81
   WHEN 82 THEN cpDeb82
   WHEN 83 THEN cpDeb83
   WHEN 84 THEN cpDeb84
   WHEN 85 THEN cpDeb85
   WHEN 86 THEN cpDeb86
   WHEN 87 THEN cpDeb87
   WHEN 88 THEN cpDeb88
   WHEN 89 THEN cpDeb89
   WHEN 90 THEN cpDeb90
   WHEN 91 THEN cpDeb91
   WHEN 92 THEN cpDeb92
   WHEN 93 THEN cpDeb93
   WHEN 94 THEN cpDeb94
   WHEN 95 THEN cpDeb95
   WHEN 96 THEN cpDeb96
   ELSE 0
END
FROM jpctconta WHERE CPCONTA = cConta );

RETURN nValor;

END


Crédito

CREATE FUNCTION ze_SaldoCredito( cConta VARCHAR(20), nMes INT(11) )
RETURNS DECIMAL(16,2)

BEGIN

DECLARE nValor DECIMAL(16,2) DEFAULT 0;

SET nValor = (
SELECT
CASE nMes
   WHEN  1 THEN cpCre01
   WHEN  2 THEN cpCre02
   WHEN  3 THEN cpCre03
   WHEN  4 THEN cpCre04
   WHEN  5 THEN cpCre05
   WHEN  6 THEN cpCre06
   WHEN  7 THEN cpCre07
   WHEN  8 THEN cpCre08
   WHEN  9 THEN cpCre09
   WHEN 10 THEN cpCre10
   WHEN 11 THEN cpCre11
   WHEN 12 THEN cpCre12
   WHEN 13 THEN cpCre13
   WHEN 14 THEN cpCre14
   WHEN 15 THEN cpCre15
   WHEN 16 THEN cpCre16
   WHEN 17 THEN cpCre17
   WHEN 18 THEN cpCre18
   WHEN 19 THEN cpCre19
   WHEN 20 THEN cpCre20
   WHEN 21 THEN cpCre21
   WHEN 22 THEN cpCre22
   WHEN 23 THEN cpCre23
   WHEN 24 THEN cpCre24
   WHEN 25 THEN cpCre25
   WHEN 26 THEN cpCre26
   WHEN 27 THEN cpCre27
   WHEN 28 THEN cpCre28
   WHEN 29 THEN cpCre29
   WHEN 30 THEN cpCre30
   WHEN 31 THEN cpCre31
   WHEN 32 THEN cpCre32
   WHEN 33 THEN cpCre33
   WHEN 34 THEN cpCre34
   WHEN 35 THEN cpCre35
   WHEN 36 THEN cpCre36
   WHEN 37 THEN cpCre37
   WHEN 38 THEN cpCre38
   WHEN 39 THEN cpCre39
   WHEN 40 THEN cpCre40
   WHEN 41 THEN cpCre41
   WHEN 42 THEN cpCre42
   WHEN 43 THEN cpCre43
   WHEN 44 THEN cpCre44
   WHEN 45 THEN cpCre45
   WHEN 46 THEN cpCre46
   WHEN 47 THEN cpCre47
   WHEN 48 THEN cpCre48
   WHEN 49 THEN cpCre49
   WHEN 50 THEN cpCre50
   WHEN 51 THEN cpCre51
   WHEN 52 THEN cpCre52
   WHEN 53 THEN cpCre53
   WHEN 54 THEN cpCre54
   WHEN 55 THEN cpCre55
   WHEN 56 THEN cpCre56
   WHEN 57 THEN cpCre57
   WHEN 58 THEN cpCre58
   WHEN 59 THEN cpCre59
   WHEN 60 THEN cpCre60
   WHEN 61 THEN cpCre61
   WHEN 62 THEN cpCre62
   WHEN 63 THEN cpCre63
   WHEN 64 THEN cpCre64
   WHEN 65 THEN cpCre65
   WHEN 66 THEN cpCre66
   WHEN 67 THEN cpCre67
   WHEN 68 THEN cpCre68
   WHEN 69 THEN cpCre69
   WHEN 70 THEN cpCre70
   WHEN 71 THEN cpCre71
   WHEN 72 THEN cpCre72
   WHEN 73 THEN cpCre73
   WHEN 74 THEN cpCre74
   WHEN 75 THEN cpCre75
   WHEN 76 THEN cpCre76
   WHEN 77 THEN cpCre77
   WHEN 78 THEN cpCre78
   WHEN 79 THEN cpCre79
   WHEN 80 THEN cpCre80
   WHEN 81 THEN cpCre81
   WHEN 82 THEN cpCre82
   WHEN 83 THEN cpCre83
   WHEN 84 THEN cpCre84
   WHEN 85 THEN cpCre85
   WHEN 86 THEN cpCre86
   WHEN 87 THEN cpCre87
   WHEN 88 THEN cpCre88
   WHEN 89 THEN cpCre89
   WHEN 90 THEN cpCre90
   WHEN 91 THEN cpCre91
   WHEN 92 THEN cpCre92
   WHEN 93 THEN cpCre93
   WHEN 94 THEN cpCre94
   WHEN 95 THEN cpCre95
   WHEN 96 THEN cpCre96
   ELSE 0
END
FROM jpctconta WHERE CPCONTA = cConta );

RETURN nValor;

END


E a partir daí:

CREATE FUNCTION SaldoConta( cConta VARCHAR(20), nMes INT(11) )
RETURNS DECIMAL(16,2)

BEGIN

DECLARE nValor DECIMAL(16,2) DEFAULT 0;
DECLARE nCont INT(11) DEFAULT 0;

IF nMes = 0 THEN
   SET nValor = ( SELECT cpSaldoAnt FROM JPCTCONTA WHERE IDCONTA = cConta );
END IF;

LOOP_MES: LOOP
   SET nCont := nCont + 1;
   IF nCont > nMes THEN
      LEAVE LOOP_MES;
   END IF;
   SET nValor := nValor + ze_Debito( cConta, nCont ) - ze_Credito( cConta, nCont );
   END LOOP LOOP_MES;

RETURN nValor;

END


Vai ser muito select pra chegar a um simples saldo mas... é uma opção...
Falta testar velocidade disso.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Set 2021 18:19

Aqui dá pra notar uma mudança no passar dos tempos:

   mInformante := SoNumeros( cnSQL:ReturnSelect( "EMCNPJ FROM JPEMPRESA WHERE IDEMPRESA=1" ) )

   mInfoAge := ADOField( "AAANP", "C", "JPTABANPAGE", "AACNPJ=" + StringSQL( Left( mInformante, 8 ) ) )
   mInfoIns := ADOField( "AIANP", "C", "JPTABANPINS", "AICNPJ=" + StringSQL( mInformante ) )


Nas duas linhas de baixo tomando cuidado pro retorno ser o esperado.
Na primeira linha.... é direto sem dó....
Mas se não existir o cadastro da empresa... o aplicativo seria de quem? é obrigatório que a informação exista.
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Set 2021 18:21

Sobre aquilo do saldo de conta.....

CREATE FUNCTION SaldoConta( cConta VARCHAR(20), nMes INT(11) )
RETURNS DECIMAL(16,2)

BEGIN

DECLARE nValor DECIMAL(16,2) DEFAULT 0;

SET nValor := (
SELECT
CPSALDOANT
+ IF( nMes >  0, 0, CPDEB01 - CPCRE01 )
+ IF( nMes >  1, 0, CPDEB02 - CPCRE02 )
+ IF( nMes >  2, 0, CPDEB03 - CPCRE03 )
+ IF( nMes >  3, 0, CPDEB04 - CPCRE04 )
+ IF( nMes >  4, 0, CPDEB05 - CPCRE05 )
+ IF( nMes >  5, 0, CPDEB06 - CPCRE06 )
+ IF( nMes >  6, 0, CPDEB07 - CPCRE07 )
+ IF( nMes >  7, 0, CPDEB08 - CPCRE08 )
+ IF( nMes >  8, 0, CPDEB09 - CPCRE09 )
+ IF( nMes >  9, 0, CPDEB10 - CPCRE10 )
+ IF( nMes > 10, 0, CPDEB11 - CPCRE11 )
+ IF( nMes > 11, 0, CPDEB12 - CPCRE12 )
+ IF( nMes > 12, 0, CPDEB13 - CPCRE13 )
+ IF( nMes > 13, 0, CPDEB14 - CPCRE14 )
+ IF( nMes > 14, 0, CPDEB15 - CPCRE15 )
+ IF( nMes > 15, 0, CPDEB16 - CPCRE16 )
+ IF( nMes > 16, 0, CPDEB17 - CPCRE17 )
+ IF( nMes > 17, 0, CPDEB18 - CPCRE18 )
+ IF( nMes > 18, 0, CPDEB19 - CPCRE19 )
+ IF( nMes > 29, 0, CPDEB20 - CPCRE20 )
+ IF( nMes > 20, 0, CPDEB21 - CPCRE21 )
+ IF( nMes > 21, 0, CPDEB22 - CPCRE22 )
+ IF( nMes > 22, 0, CPDEB23 - CPCRE23 )
+ IF( nMes > 23, 0, CPDEB24 - CPCRE24 )
+ IF( nMes > 24, 0, CPDEB25 - CPCRE25 )
+ IF( nMes > 25, 0, CPDEB26 - CPCRE26 )
+ IF( nMes > 26, 0, CPDEB27 - CPCRE27 )
+ IF( nMes > 27, 0, CPDEB28 - CPCRE28 )
+ IF( nMes > 28, 0, CPDEB29 - CPCRE29 )
+ IF( nMes > 29, 0, CPDEB30 - CPCRE30 )
+ IF( nMes > 30, 0, CPDEB31 - CPCRE31 )
+ IF( nMes > 31, 0, CPDEB32 - CPCRE32 )
+ IF( nMes > 32, 0, CPDEB33 - CPCRE33 )
+ IF( nMes > 33, 0, CPDEB34 - CPCRE34 )
+ IF( nMes > 34, 0, CPDEB35 - CPCRE35 )
+ IF( nMes > 35, 0, CPDEB36 - CPCRE36 )
+ IF( nMes > 36, 0, CPDEB37 - CPCRE37 )
+ IF( nMes > 37, 0, CPDEB38 - CPCRE38 )
+ IF( nMes > 38, 0, CPDEB39 - CPCRE39 )
+ IF( nMes > 39, 0, CPDEB40 - CPCRE40 )
+ IF( nMes > 40, 0, CPDEB41 - CPCRE41 )
+ IF( nMes > 41, 0, CPDEB42 - CPCRE42 )
+ IF( nMes > 42, 0, CPDEB43 - CPCRE43 )
+ IF( nMes > 43, 0, CPDEB44 - CPCRE44 )
+ IF( nMes > 44, 0, CPDEB45 - CPCRE45 )
+ IF( nMes > 45, 0, CPDEB46 - CPCRE46 )
+ IF( nMes > 46, 0, CPDEB47 - CPCRE47 )
+ IF( nMes > 47, 0, CPDEB48 - CPCRE48 )
+ IF( nMes > 48, 0, CPDEB49 - CPCRE49 )
+ IF( nMes > 49, 0, CPDEB50 - CPCRE50 )
+ IF( nMes > 50, 0, CPDEB51 - CPCRE51 )
+ IF( nMes > 51, 0, CPDEB52 - CPCRE52 )
+ IF( nMes > 52, 0, CPDEB53 - CPCRE53 )
+ IF( nMes > 53, 0, CPDEB54 - CPCRE54 )
+ IF( nMes > 54, 0, CPDEB55 - CPCRE55 )
+ IF( nMes > 55, 0, CPDEB56 - CPCRE56 )
+ IF( nMes > 56, 0, CPDEB57 - CPCRE57 )
+ IF( nMes > 57, 0, CPDEB58 - CPCRE58 )
+ IF( nMes > 58, 0, CPDEB59 - CPCRE59 )
+ IF( nMes > 59, 0, CPDEB60 - CPCRE60 )
+ IF( nMes > 60, 0, CPDEB61 - CPCRE61 )
+ IF( nMes > 61, 0, CPDEB62 - CPCRE62 )
+ IF( nMes > 62, 0, CPDEB63 - CPCRE63 )
+ IF( nMes > 63, 0, CPDEB64 - CPCRE64 )
+ IF( nMes > 64, 0, CPDEB65 - CPCRE65 )
+ IF( nMes > 65, 0, CPDEB66 - CPCRE66 )
+ IF( nMes > 66, 0, CPDEB67 - CPCRE67 )
+ IF( nMes > 67, 0, CPDEB68 - CPCRE68 )
+ IF( nMes > 68, 0, CPDEB69 - CPCRE69 )
+ IF( nMes > 69, 0, CPDEB70 - CPCRE70 )
+ IF( nMes > 70, 0, CPDEB71 - CPCRE71 )
+ IF( nMes > 71, 0, CPDEB72 - CPCRE72 )
+ IF( nMes > 72, 0, CPDEB73 - CPCRE73 )
+ IF( nMes > 73, 0, CPDEB74 - CPCRE74 )
+ IF( nMes > 74, 0, CPDEB75 - CPCRE75 )
+ IF( nMes > 75, 0, CPDEB76 - CPCRE76 )
+ IF( nMes > 76, 0, CPDEB77 - CPCRE77 )
+ IF( nMes > 77, 0, CPDEB78 - CPCRE78 )
+ IF( nMes > 78, 0, CPDEB79 - CPCRE79 )
+ IF( nMes > 79, 0, CPDEB80 - CPCRE80 )
+ IF( nMes > 80, 0, CPDEB81 - CPCRE81 )
+ IF( nMes > 81, 0, CPDEB82 - CPCRE82 )
+ IF( nMes > 82, 0, CPDEB83 - CPCRE83 )
+ IF( nMes > 83, 0, CPDEB84 - CPCRE84 )
+ IF( nMes > 84, 0, CPDEB85 - CPCRE85 )
+ IF( nMes > 85, 0, CPDEB86 - CPCRE86 )
+ IF( nMes > 86, 0, CPDEB87 - CPCRE87 )
+ IF( nMes > 87, 0, CPDEB88 - CPCRE88 )
+ IF( nMes > 88, 0, CPDEB89 - CPCRE89 )
+ IF( nMes > 89, 0, CPDEB90 - CPCRE90 )
+ IF( nMes > 90, 0, CPDEB91 - CPCRE91 )
+ IF( nMes > 91, 0, CPDEB92 - CPCRE92 )
+ IF( nMes > 92, 0, CPDEB93 - CPCRE93 )
+ IF( nMes > 93, 0, CPDEB94 - CPCRE94 )
+ IF( nMes > 94, 0, CPDEB95 - CPCRE95 )
+ IF( nMes > 95, 0, CPDEB96 - CPCRE96 )
FROM JPCTCONTA
WHERE IDCONTA = cConta );

RETURN nValor;

END


Desta forma é um único SELECT.

Nota: só criei de curiosidade, ainda não resolvi se vou fazer assim mesmo, igual é em DBF.

Algumas coisas vou só fazendo testes, pra ver o que dá.... assim vou criando idéias...
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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Set 2021 18:26

jpempresa.png


O que estou mexendo no momento é o arquivo JPEMPRESA.DBF que virou a tabela JPEMPRESA.
Muita coisa é pra conversão, mas tem bastante.
Pra cada parte estou usando uma solução diferente.
Mas em muitos lugares foi esse cnSQL:ReturnSelect()
Em outros, aproveitei um SELECT já existente pra acrescentar a informação da empresa.
Em outros, criei variáveis no início da rotina.
Em certos casos, criei variáveis visíveis em multithread.

336 lugares de fonte usando jpempresa->, portanto o 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: 17689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 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 8 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