Página 2 de 3
Idéia pra armazenar comandos SQL
Enviado: 26 Jul 2021 14:06
por JoséQuintas
Até pensei que ia ficar no mesmo, mas....
o fonte C de update2020 reduziu em 700kb, mas o ze_resxml tá por volta de 600kb
Tá menor incluir como json do que incluir usando #include.
Interessante isso, pensei que seria o contrário.
Idéia pra armazenar comandos SQL
Enviado: 26 Jul 2021 20:25
por JoséQuintas
Vixe...
Como cresceu...
26.154 linhas !!!
Nada diferente de antes, apenas juntei tudo.
Idéia pra armazenar comandos SQL
Enviado: 26 Jul 2021 20:35
por JoséQuintas
Código: Selecionar todos
Pasta de d:\wwwjpa\arquivos
26/07/2021 12:43 3.513.264 JPA.EXE
Pasta de d:\fontes\integra
26/07/2021 20:32 3.502.512 jpa.exe
O EXE reduziu de 3.513 pra 3.502
NÃO estava nem interessado nisso, mas reduziu um pouco o tamanho.
Idéia pra armazenar comandos SQL
Enviado: 28 Jul 2021 01:49
por JoséQuintas
Uia...
LBALGER
O obj tinha 755.988
agora tem 220.440
Simples: Porque incluir a DLL normal, se posso incluir a DLL zipada....
A única coisa esquisita é que o EXE aumentou de tamanho.
Acho que a taxa de compressão final baixou.
Idéia pra armazenar comandos SQL
Enviado: 28 Jul 2021 09:00
por JoséQuintas
E depois de tudo isso....
capicom.dll, msxml5.dll, msxml5r.dll, rmchart.dll....
Quem vai usar isso precisa internet.
Se tenho um servidor grátis na internet.... gravar no MySQL da internet e pronto, em base64.
Quanto ao restante, vou avaliar aonde pode ser interessante deixar igual.
Notas:
- Não que seja grátis, faz parte do meu site, apenas não tenho cobrança adicional pra fazer uso dele.
- As dlls não faziam parte do arquivo, mas eram resource.
- Opcionalmente podem ficar no SQL do cliente, atualizado pelo da internet.
Idéia pra armazenar comandos SQL
Enviado: 28 Jul 2021 09:16
por JoséQuintas
E uma idéia gera outra....
Pra quem ainda transfere DBF....
Uma opção seria salvar o DBF inteiro no MySQL, pra transferência.
Tanto faz se é DBF, EXE, DLL, OCX, PDF, XLS, DOC, ZIP, ou qualquer coisa.
Idéia pra armazenar comandos SQL
Enviado: 28 Jul 2021 13:55
por JoséQuintas
Não sei no cliente, mas aqui que tá com uma internet do carvalho... fica mais rápido do que ler do HD... kkkk
E mesmo pro upload.
Por enquanto tem DLL e JSON
Idéia pra armazenar comandos SQL
Enviado: 29 Jul 2021 00:19
por JoséQuintas
Gostei desse esquema que acabei criando.
Uma tabela inteira vira apenas um campo no registro.
Ainda testando as possibilidades.
SELECT * FROM WEBBINARY WHERE NAME = 'sefazcfop'
Isso trás a tabela inteira de CFOP em ..... array !!!!
Muito interessante mesmo.
É aquele mesmo XML, mas agora dividido em registros do MySQL.
A parte XML sumiu e virou tabela MySQL.
Com isso, usar Excel ou DBF pra transferir informações virou coisa do passado.
Um gerador de relatórios capaz de ler JSON..... uau !!!
Idéia pra armazenar comandos SQL
Enviado: 30 Jul 2021 23:17
por JoséQuintas
Qual a diferença do anterior?
Esse é o servidor local, depois de ser atualizado com informações do servidor da internet.
A rotina de atualização que usei foi esta:
Código: Selecionar todos
STATIC FUNCTION AtualizaBinary()
LOCAL cnInternet := ADOClass():New( AppcnInternet() )
LOCAL cnSQL := ADOClass():New( AppConexao() )
SayScroll( "Atualizando referências" )
cnInternet:cSQL := "SELECT * FROM WEBBINARY"
cnInternet:Execute()
DO WHILE ! cnInternet:Eof()
cnSQL:cSQL := "SELECT BINDATE FROM JPBINARY WHERE BINNAME = " + StringSQL( cnInternet:String( "BINNAME" ) )
cnSQL:Execute()
IF cnSQL:Date( "BINDATE" ) < cnInternet:Date( "BINDATE" )
cnSQL:QueryCreate()
cnSQL:QueryAdd( "BINDATE", cnInternet:Date( "BINDATE" ) )
cnSQL:QueryAdd( "BINTYPE", cnInternet:String( "BINTYPE" ) )
cnSQL:QueryAdd( "BINVALUE", cnInternet:String( "BINVALUE" ) )
IF cnSQL:Eof()
cnSQL:QueryAdd( "BINNAME", cnInternet:String( "BINNAME" ) )
cnSQL:QueryExecuteInsert( "JPBINARY" )
ELSE
cnSQL:QueryExecuteUpdate( "JPBINARY", "BINNAME = " + StringSQL( cnInternet:String( "BINNAME" ) ) )
ENDIF
ENDIF
cnInternet:MoveNext()
ENDDO
cnInternet:CloseRecordset()
RETURN Nil
Serve pra trazer tudo que existir de atualização de uma vez.
Qualquer coisa: EXE, DLL, JSON, comando SQL, DBF, etc. qualquer coisa.
A partir daí, qualquer terminal tem acesso a tudo, sempre que precisar.
Idéia pra armazenar comandos SQL
Enviado: 30 Jul 2021 23:53
por JoséQuintas
Código: Selecionar todos
STATIC FUNCTION AtualizaBinary()
LOCAL cnInternet := ADOClass():New( AppcnInternet() )
LOCAL cnSQL := ADOClass():New( AppConexao() )
LOCAL aList := {}, aItem
SayScroll( "Atualizando referências" )
WITH OBJECT cnInternet
:cSQL := "SELECT BINNAME, BINDATE, BINTYPE FROM WEBBINARY"
:Execute()
DO WHILE ! cnInternet:Eof()
AAdd( aList, { :String( "BINNAME" ), :Date( "BINDATE" ), :String( "BINTYPE" ) } )
:MoveNext()
ENDDO
:CloseRecordset()
FOR EACH aItem IN aList
cnSQL:cSQL := "SELECT BINDATE FROM JPBINARY WHERE BINNAME = " + StringSQL( aItem[ 1 ] )
cnSQL:Execute()
IF cnSQL:Date( "BINDATE" ) < aItem[ 2 ]
cnInternet:cSQL := "SELECT * FROM WEBBINARY WHERE BINNAME = " + StringSQL( aItem[ 1 ] )
cnInternet:Execute()
cnSQL:ExecuteCmd( "DELETE FROM JPBINARY WHERE BINNAME = " + StringSQL( aItem[ 1 ] ) )
cnSQL:ExecuteCmd( "INSERT INTO JPBINARY ( BINNAME, BINDATE, BINTYPE, BINVALUE ) VALUES ( " + ;
StringSQL( aItem[ 1 ] ) + ", " + DateSQL( aItem[ 2 ] ) + ", " + StringSQL( aItem[ 3 ] ) + ", " + ;
StringSQL( cnInternet:String( "BINVALUE" ) ) + " )" )
cnInternet:CloseRecordset()
ENDIF
NEXT
ENDWITH
cnInternet:CloseConnection()
RETURN Nil
Versão atualizada.
Baixa uma coisa de cada vez, e só baixa se precisar.
Isso é bom, caso o tamanho dos arquivos cresça muito, pra não perder tempo com o que não interessa.
Falta testar com internet lenta....
Idéia pra armazenar comandos SQL
Enviado: 31 Jul 2021 12:19
por JoséQuintas
Abusar é um perigo....
Pensei... porque não também já não armazenar o ODBC de MySQL/MariaDB

?
Porque NÃO serve pra nada.
Se pra acessar o MySQL precisa do ODBC instalado.... eu só teria acesso a ele, se ele já estivesse instalado, e neste caso, eu baixaria ele pra que

?
Pois é... ainda bem que pensei nisso antes de fazer....
Idéia pra armazenar comandos SQL
Enviado: 31 Jul 2021 14:02
por JoséQuintas
Ainda nos testes iniciais.
4 DLLs
25 stored function
21 json
15 stored procedure
100 create table
passando de 4MB.
Por enquanto, puxando durante atualização de versão, mas não é o ideal ainda.
É que o aplicativo pode precisar de parte das coisas enquanto está sendo carregado, então desse jeito não atende totalmente.
Idéia pra armazenar comandos SQL
Enviado: 31 Jul 2021 14:18
por JoséQuintas
Essa é uma "tabela livre".
Não significa que criou as tabelas, procedures, functions, etc.
O aplicativo apenas vai trazer do servidor externo para o servidor local, sem mexer em mais nada, algo como "deixar anotado".
Depois.... o aplicativo vai fazer uso disso pra se atualizar.
Já acrescentei tamanho e CRC32, pra conferir tudo, e evitar problemas.
É que quando for usar pra valer... tem que funcionar... não pode correr o risco de estar com defeito.
Idéia pra armazenar comandos SQL
Enviado: 01 Ago 2021 18:24
por JoséQuintas
A rotina ficou complicada: ler um campo do SQL kkkk
Código: Selecionar todos
FUNCTION BinaryFromSQL( cName )
LOCAL cTxt
LOCAL cnSQL := ADOClass():New( AppConexao() )
WITH OBJECT cnSQL
:cSQL := "SELECT * FROM JPBINARY WHERE BINNAME = " + StringSQL( cName )
:Execute()
cTxt := :String( "BINVALUE" )
:CloseRecordset()
ENDWITH
RETURN cTxt
Idéia pra armazenar comandos SQL
Enviado: 01 Ago 2021 18:29
por JoséQuintas
Um módulo usando isso acima:
Código: Selecionar todos
#include "inkey.ch"
PROCEDURE pTesRemSony
LOCAL aList, nOpc, aHash
LOCAL oAparelho, nOpcAparelho := 1
LOCAL oFabricante, nOpcFabricante := 1
LOCAL oCode
aHash := hb_JsonDecode( BinaryFromSQL( "sonyremote" ) )
DO WHILE .T.
Cls()
aList := {}
FOR EACH oAparelho IN aHash[ "devices" ]
AAdd( aList, oAparelho[ "device" ] )
NEXT
wAchoiceNoClose( 1, 1, aList, @nOpcAparelho, "Device" )
IF Lastkey() == K_ESC
EXIT
ENDIF
DO WHILE .T.
@ 0, 60 CLEAR TO MaxRow(), MaxCol()
aList := {}
FOR EACH oFabricante IN aHash[ "devices", nOpcAparelho, "brandCodes" ]
AAdd( aList, oFabricante[ "brand" ] )
NEXT
wAchoiceNoClose( 5, 30, aList, @nOpcFabricante, aHash[ "devices", nOpcAparelho, "device" ] )
IF LastKey() == K_ESC
EXIT
ENDIF
aList := {}
FOR EACH oCode IN aHash[ "devices", nOpcAparelho, "brandCodes", nOpcFabricante, "codes" ]
AAdd( aList, oCode )
NEXT
wAchoice( 10, 60, aList, @nOpc, aHash[ "devices", nOpcAparelho, "brandCodes", nOpcFabricante, "brand" ] )
( nOpc )
Inkey(0)
wClose()
ENDDO
wClose()
ENDDO
//ShowJson( aHash, "aHash" )
//Inkey(0)
RETURN

É pra facilitar a configuração do meu controle remoto universal.
Tem o browse do tipo de equipamento, os fabricantes do tipo de equipamento, e os códigos.
Tudo montado a partir do JSON que vém do SQL.
Código: Selecionar todos
aHash := hb_JsonDecode( BinaryFromSQL( "sonyremote" ) )
Adorei isso.