Página 7 de 35

Meu modo de trabalho

Enviado: 13 Set 2016 11:46
por JoséQuintas
Voltando ao que o A Simões postou:
Talvez dê pra usar o gtwvg.hbc como exemplo, onde adiciona .ch
Mas acho que pra usar em aplicativo teria que deixar na pasta como .hbm

Código: Selecionar todos

description=GTWVG (an extension of GTWVT, win-only)

skip={!allwin}

incpaths=.

headers=hbgtwvg.ch wvgparts.ch wvtwin.ch

gt=${_HB_DYNPREF}${hb_name}${_HB_DYNSUFF}

libs=hbwin.hbc

gui=yes
mt=yes

Meu modo de trabalho

Enviado: 13 Set 2016 13:09
por asimoes
Quintas,

Com -u

Uso assim:

-u+hbcompat.ch
-u+stdsmf.ch //header de uso em toda aplicação
-u+ga.ch //header de uso em toda aplicação

Pode usar no hbp ou hbm

Assim, só no hbc

headers=hbgtwvg.ch wvgparts.ch wvtwin.ch

Meu modo de trabalho

Enviado: 14 Set 2016 11:43
por JoséQuintas
Isso do mouse, será que não tem a ver com isto que retirei em 2012.
Usava #defines que existem no Harbour, mas não existiam no Clipper 5.2
2012.png
Se puder analisar a compilação do fonte usando -w3 -es2, poderemos identificar fácil quais as variáveis que precisa do jpa.ch, porque o atual não deve servir mais.

Meu modo de trabalho

Enviado: 14 Set 2016 12:14
por JoséQuintas
Comecei a usar o GIT em junho/2015.
Mas tinha ZIPs de backup antigos.
Com muita paciência, fui registrando um por um no GIT.

Isso me permitiu apagar alguns gigabytes do HD, sem perder os backups antigos.

Até deu trabalho fazer isso pra deixar registrado no GIT.
Mas foi pra fazer uma vez só.
Toda minha história de fontes está contida em 170MB, e não sei se algum dia vai chegar a 200MB.
O GIT economiza muito espaço em disco para controlar isso.
Bem melhor 170MB pra vida inteira, do que 100MB para cada dia de backup.

Recomendo a todos usar o GIT.
Nem que seja só pra usar de backup, enquanto não souber aproveitar mais os recursos.
Não sou expert nele, não conheço nem 1% dos recursos, mas o que conheço já ajuda muito.
Essa tela é da interface Windows, que é a que uso.
gitcontrol.png
Nota: Ao fazer o download do repositório do Harbour, também vém a vida inteira dele, desde a versão ZERO.
Por exemplo, o repositório do Vszakats, por ser um Fork, olha só o início do Harbour, em 1999, pelo menos a parte registrada no github
harbour.png

Meu modo de trabalho

Enviado: 16 Set 2016 09:44
por JoséQuintas
Só a título de curiosidade.
Geralmente só acrescento mais coisas no EXE, então ele sempre aumenta de tamanho.
Mas de vez em quando simplifico algumas rotinas já existentes.
Então às vezes fica menor.

Código: Selecionar todos

 Pasta de e:\backupd\cdrom\fontes\integra

08/09/2016  20:37         1.889.472 JPA.exe
               1 arquivo(s)      1.889.472 bytes
               0 pasta(s)   466.481.528.832 bytes disponíveis

d:\cdrom\fontes\integra>dir *.exe
 O volume na unidade D é TRABALHO
 O Número de Série do Volume é 640D-3E41

 Pasta de d:\cdrom\fontes\integra

16/09/2016  09:02         1.883.840 JPA.exe
               1 arquivo(s)      1.883.840 bytes
               0 pasta(s)   469.194.063.872 bytes disponíveis
Depois de uma semana, mesmo tendo acrescentado recursos, o EXE está menor.
Só altero fontes pra ficar mais fácil de mexer neles.
O tamanho do EXE não é o motivo, é apenas uma consequência das alterações.

Eu apenas aproveito ao fazer uma alteração, pra ver se não tem fontes parecidos que poderia fazer a mesma coisa.
Como tudo é o mesmo EXE, vale a pena, mesmo sendo um pouquinho de cada vez.

Meu modo de trabalho

Enviado: 18 Set 2016 11:23
por JoséQuintas
Uma coisa que acostumei a usar, mas não é obrigatória no Harbour, é o ALIAS no replace.

Código: Selecionar todos

   REPLACE ;
      jpcadas->cdEndereco WITH mcdEndereco, jpcadas->cdNumero   WITH mcdNumero,   jpcadas->cdCompl    WITH mcdCompl, ;
      jpcadas->cdBairro   WITH mcdBairro,   jpcadas->cdCidade   WITH mcdCidade,   jpcadas->cdUF       WITH mcdUf, ;
      jpcadas->cdCep      WITH mcdCep,      jpcadas->cdContato  WITH mcdContato,  jpcadas->cdTelefone WITH mcdTelefone, ;
      jpcadas->cdFax      WITH mcdFax,      jpcadas->cdEndCob   WITH mcdEndCob,   jpcadas->cdNumCob   WITH mcdNumCob, ;
      jpcadas->cdComCob   WITH mcdComCob,   jpcadas->cdBaiCob   WITH mcdBaiCob,   jpcadas->cdCidCob   WITH mcdCidCob, ;
      jpcadas->cdUFCob    WITH mcdUfCob,    jpcadas->cdCepCob   WITH mcdCepCob,   jpcadas->cdConCob   WITH mcdConCob, ;
      jpcadas->cdTelCob   WITH mcdTelCob,   jpcadas->cdFaxCob   WITH mcdFaxCob,   jpcadas->cdNomEnt   WITH mcdNomEnt, ;
      jpcadas->cdEndEnt   WITH mcdEndEnt,   jpcadas->cdNumEnt   WITH mcdNumEnt,   jpcadas->cdComEnt   WITH mcdComEnt, ;
      jpcadas->cdBaiEnt   WITH mcdBaiEnt,   jpcadas->cdCidEnt   WITH mcdCidEnt,   jpcadas->cdUfEnt    WITH mcdUfEnt, ;
      jpcadas->cdCepEnt   WITH mcdCepEnt,   jpcadas->cdConEnt   WITH mcdConEnt,   jpcadas->cdTelEnt   WITH mcdTelEnt, ;
      jpcadas->cdFaxEnt   WITH mcdFaxEnt
Isso vai me ajudar no MySql !!!
Por exemplo, se eu colocar pra atualizar simultâneo o JPCADAS no DBF e no MySql....
Vou ter que pesquisar todos os fontes que fazem replace no jpcadas.
Como todos tem o ALIAS, mais fácil.

Mas nessas horas faz falta um recurso que não encontrei em nenhum editor de texto: pesquisar no resultado de uma pesquisa, ou pesquisa combinada.
pesquisa combinada: Poderia procurar em todos os fontes a ocorrência das palavras JPCADAS e WITH na mesma linha.
ou pesquisar WITH no resultado da pesquisa de JPCADAS.

Primeiro passo: gravação simultânea DBF e MySQL - só o que for incluso/atualizado ficará no MySql
Segundo passo: gravar tudo dos DBFs no MySQL - tudo duplicado
Terceiro passo: buscar somente do MySQL
Quarto passo: gravar somente no MySql
Último passo: Mais e mais recursos do MySQL

Parece trabalhoso, mas não sei se perceberam:
Vou poder alterar um único fonte, e liberar para o cliente.
Alterar outro fonte, liberar para o cliente.
E por aí vai. Sempre alterando e instalando, nunca vai existir um fonte em espera.

Isso é diferente de: alterar tudo correndo pra tudo funcionar no MySQL, ficar sem relatórios até terminar, ficar sem instalar até terminar, criar duas versões de fonte pra trocar depois, etc.
E isso vai me dar tempo de ir tirando dúvidas do MySql, melhorar rotinas aproveitando novos recursos, etc.

Por enquanto a idéia que achei mais apropriada foi essa.

Meu modo de trabalho

Enviado: 27 Out 2016 15:12
por JoséQuintas
Tenho um relatório monstruoso de pedidos.
Preciso acrescentar opção de escolher um cliente, matriz e filiais, como fazer?

Simples: (nota: relatório é um dos poucos aonde ainda uso PRIVATE)

Primeiro as variáveis necessárias pra escolha: array de opções, variável com a opção selecionada, código do cliente
E a montagem de seleção, que como é sempre igual, tenho pronta.

Código: Selecionar todos

MEMVAR acTxtCliente, nOpcCliente, mCliente
...
 nOpcCliente := 1
      acTxtCliente := { "Todos", "Específico" }
      mCliente := Space(6)
...
   JPCADAS1Class():Intervalo( nOpcGeral + 3, 25, @nOpcCliente, @mCliente )
antes de emitir o relatório, pego a lista de códigos que corresponde ao mesmo prefixo de CNPJ

Código: Selecionar todos

   IF nOpcCliente != 1
      acClienteList := PNOT0100FiliaisList( mCliente )
   ENDIF
E na escolha de pedidos, coloco o filtro, que só depende do código de cliente

Código: Selecionar todos

     CASE nOpcCliente == 2 .AND. AScan( acClienteList, jppedi->pdCliFor ) == 0
         SKIP
         LOOP
E se fosse MySQL, seria só acrescentar esse filtro na cláusula WHERE.

Nem preciso me preocupar com o restante do relatório. Basta mexer aonde interessa.
Lógico, o programa do relatório estando organizado, cada coisa no seu lugar, já se sabe em que lugar mexer.

Nada de gênio, nada de expert, apenas solução simples no lugar correto.
Quer fazer igual? só deixar o fonte organizado, cada coisa no seu lugar.

Ah sim... as variáveis private.
É porque em certos casos quero aproveitar o array de seleção como complemento do titulo.
Apenas como exemplo:

Código: Selecionar todos

acTitulo := { "RELATORIO X", "Cliente:" + acTxtCliente[ nOpcaoCliente ] + iif( nOpcaoCliente == 1,"",  " " + mCliente ) }
De repente o usuário escolhe um filtro, e esquece que colocou filtro, melhor mostrar pra ele exatamente o que pediu.

Meu modo de trabalho

Enviado: 04 Nov 2016 13:45
por JoséQuintas
Chegou hoje por email:
DEMO Erro em 2016-11-04 09:25:53

Folder: C:\Users\admin\Desktop\lixo\
MySQL local: NÃO
Windows: Windows 7 6.1 SP1
Computer Name: BARBOSA-DSK
Windows User: admin
Logon Server: \BARBOSA-DSK
User Domain: BARBOSA-DSK
Harbour: Harbour 3.4.0dev (e679c4a) (2016-10-28 20:57)
Compiler: Microsoft Visual C++ 16.0.40219 (32-bit)
GT: WVG

Error BASE/1005 No exported variable: ENUMINDEX
Called from _ENUMINDEX(0)
Called from BOXMENU(770)
Called from BOXMENU(839)
Called from MENUPRINC(707)
Called from SISTEMA(129)
Called from (b)MAIN(69)
Deve ser na máquina de alguém aqui do fórum.
No fonte, coloquei um underline a menos, _EnumIndex ao invés de __EnumIndex.
Curioso é que o erro só aconteceu na máquina dele.
Já fiz a correção.

Meu modo de trabalho

Enviado: 04 Nov 2016 13:52
por JoséQuintas
Erro executando comando:-2147217900 Duplicate column name 'ATDESCRI'
Este foi em cliente.
Minha rotina de testar campo existente precisou de ajuste.
Motivo: No Linux, a tabela de schemmas é case sensitive, e usei o nome do banco de dados em maiúsculas, quando está em minúsculas.
No Windows isso não é problema.
Como acusou que não existia o campo.... deu erro na hora de acrescentar.

A titulo de curiosidade:

Código: Selecionar todos

METHOD FieldExists( cField, cTable ) CLASS ADOClass

   LOCAL nQtd

   ::cSql := "SELECT COUNT(*) AS QTD FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=" + StringSql( Lower( AppEmpresaApelido() ) ) + " AND TABLE_NAME=" + StringSql( cTable ) + ;
                   " AND COLUMN_NAME=" + StringSql( cField )
   ::Execute()
   nQtd := ::Value( "QTD" )
   ::CloseRecordset()

   RETURN nQtd > 0
Mas no post lembrei de um método que criei depois, e dá pra simplificar, pelo menos um pouquinho.

Código: Selecionar todos

METHOD FieldExists( cField, cTable ) CLASS ADOClass

   ::cSql := "SELECT COUNT(*) AS QTD FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=" + StringSql( Lower( AppEmpresaApelido() ) ) + " AND TABLE_NAME=" + StringSql( cTable ) + ;
                   " AND COLUMN_NAME=" + StringSql( cField )
   RETURN ::ReturnValueAndClose(  "QTD"  )

Meu modo de trabalho

Enviado: 04 Mar 2017 11:09
por Abel
Ola, JoseQuintas

Como voce fez para colocar esta imagem de fundo
com o menu sobreposto ?

pode dar um exemplo...?

Grato,
Abel

Meu modo de trabalho

Enviado: 04 Mar 2017 12:48
por JoséQuintas
Com a GTWVG e menu normal, trata-se apenas de um quebra-galho.
O que fiz foi o seguinte: desenhar e colocar o menu por cima do desenho.
Não dá pra perceber a repintura, e dá a sensação de que o desenho se mantém.

Exemplo:

Código: Selecionar todos

DO WHILE .T.
    DrawPicture( ... )
   @ 1, 0 PROMPT ...
   @ 2, 0 PROMPT ...
   # 3. 0 PROMPT ...
   MENU TO nOpc
ENDDO

Meu modo de trabalho

Enviado: 04 Mar 2017 16:49
por Abel
ola,
não achei nada no forum sobre DrawPicture

Qual a Lib e quais parametros preciso passar ?

Grato,
ABEL

Meu modo de trabalho

Enviado: 04 Mar 2017 17:13
por JoséQuintas
Desculpe, foi só exemplo.
Cada LIB tem uma opção, a que mencionei foi esta, da GTWVG:

https://github.com/JoseQuintas/AllInOne ... #L160-L164

Meu modo de trabalho

Enviado: 08 Mar 2017 10:27
por JoséQuintas
Fiz um teste agora, mas é um controle meu que não existe na GTWVG oficial.
Ainda não coloquei recurso no controle de redimensionar imagem, mas fica igual outras LIBs.
telajpa.png
Parece piada, mas é sério: até criei controles de uso em tela Windows, pra GTWVG, mas eu mesmo não uso.

Meu modo de trabalho

Enviado: 16 Jul 2017 12:39
por JoséQuintas
E agora José?
josequintas.png
josequintas.png (6.45 KiB) Exibido 85788 vezes