Clipper On Line • Ver Tópico - Usuários/senhas/acessos/etc
Página 1 de 2

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 22:02
por JoséQuintas
Aqui não é bem uma contribuição.
Uso um esquema de senhas/acessos que acho prática.
Nesta semana acrescentei grupos.
Ainda estou me acostumando com essa idéia de grupos.
Só pra dar uma idéia, ainda não uso em lugar nenhum.

Como é comum pra nós programadores, fico imaginando se dá pra melhorar.

Vou mostrar como estou usando, de um modo geral, sem entrar em muitos detalhes dos fontes.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 22:12
por JoséQuintas
Montagem do menu.
Um estilo que considerava tradicional.
Lembro que a idéia foi a partir de um fonte da internet.

      MenuOption( "Cadastro Genérico",            "PGENERIC",    { || pgeneric() } )
      MenuOption( "Manutenção de senhas/acessos", "PHLSENHA",    { || phlsenha() } )
      MenuOption( "Log de Utilização do Sistema", "PUTI0040",    { || puti0040() } )
      MenuOption( "Opções Anuais" )
         MenuDrop()
         MenuOption( "Fechamento anual Corrente", "HLCCANUAL",  { || hlCCAnual() } )
         MenuOption( "Fechamento Anual Informe",  "HLIRANUAL",  { || hlIRAnual() } )
         MenuOption( "Fechamento Anual Dimob",    "HLDIMANUAL", { || hlDimAnual() } )
         MenuOption( "Acerto CIC no info14",      "HLCORIR14A", { || hlCorIR14a() } )
         MenuOption( "Acerto info14 manual",      "HLCORIR14M", { || hlCorIr14m() } )
         MenuOption( "Acerto endereço DIMOB",     "XXXXX" )
         MenuUnDrop()
      MenuOption( "Ferramentas" )
         MenuDrop()
         MenuOption( "Acesso remoto",         "PTERMSVR",    { || pTermSvr() } )
         MenuOption( "Backup DBFs/MySQL",     "HL_BACKUP",   { || hl_backup() } )
         MenuOption( "Dbase JMCQuintas",      "RDBASE",      { || RDbase() } )
         MenuOption( "Lista Opções do Menu",  "LISTMENU",    { || ListMenu() } )
         MenuUnDrop()


Neste menu específico, mantive o codeblock, mas na prática ele não é usado.
Só serve pra dar erro na compilação, caso esqueça de algum.
Fiz isso porque o fonte veio de terceiros, e com fontes misturados.
Isso garante que eu não apague um fonte em uso por engano, justamente por dar erro na compilação.

Com esse estilo de menu, o nome do módulo já fica disponível pra configuração.
Ao adicionar um novo módulo, teste ou não, aparece só na minha senha.

Para a configuração basta o nome do módulo. Não interessa em que nível ele esteja.

Estando disponível pra mim, posso liberar pra outra pessoa.
E posso fazer isso via aplicativo, numa atualização, liberando pra um usuário específico, pra uma empresa específica, ou pra alguém que tenha acesso a outra opção, ou o mais comum: pra quem pode definir acessos pra outras pessoas.
Também criei uma opção que pede nome do módulo, usuário e código de controle. Finalidade: posso passar um código por telefone pra liberar pra alguém na hora, sem precisar entrar remoto ou algo mais.

Com isso, já começa uma certa restrição:
- Tem módulos que só eu tenho acesso
- Tem módulos que só o administrador do cliente tem acesso - incluindo liberar acessos a outros usuários
- Cada usuário tem seus acessos definidos, e a configuração é pra cada ítem do menu

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 22:27
por JoséQuintas
Como ficou fácil mexer no menu, e toda configuração é automática a partir do menu:
Aproveitei o mesmo pra acrescentar opções "ocultas", que só servem pra configuração.
Aparecem na configuração, mas não no menu.
Tipo: se pode alterar determinada informação, se fica disponível Inclui, Altera, Exclui, etc.

Supondo que o nome utilizado seja "ADMLIBERADO", um novo bloqueio só precisa de duas coisas:

1) Colocar a opção no menu, talvez em opções administrativas
2) No módulo IF TemAcesso( "ADMLIBERACREDITO" ) ...

Simples e prático.
Depois é só passar senha por telefone, adicionar automático, adicionar por acesso remoto, adicionar acesso pessoalmente, etc.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 22:36
por JoséQuintas
Depois criei uma opção de importar acessos de um usuário para o outro.
Exemplo: 10 vendedores. Cadastra um, configura acessos, e para os demais basta importar os mesmos acessos do primeiro.

Nesta semana acrescentei a opção de importar acessos zerando ou não os acessos existentes.
Isso permite "acumular" acesssos para um usuário.

E a última foi a parte de grupos.
Agora basta definir os acessos do grupo vendedores, e incluir o vendedor nesse grupo.
Além do grupo, ainda dá pra acrescentar mais opções "exclusivas" para o usuário.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 22:47
por JoséQuintas
Com isso apareceu um novo desafio:
Como mostrar os acessos de um determinado usuário, mostrando também os acessos vindos do grupo?

Pensei que ia ser muito trabalhoso, porque é uma daquelas rotinas...
Mas até que foi.

Acho que nem precisa dizer que recursividade é normal nisso tudo.

Resumindo:
- O menu é um único array, uma única variável
- A configuração de acessos usa essa variável
- Como criei a opção de help on-line baseada no nome do módulo (do menu), acabei criando a opção de imprimir um manual, que utiliza o array do menu + os helps baseados em cada opção do menu.

Vai ser difícil usar outro estilo.

Quanto a menu estilo Windows, tudo bem, também faço a partir do array.
Só não gostei do menu em estilo Windows, e deixo desativado.

Faltou dizer:
O menu é uma variável.
Na hora de configurar o acesso, altero o conteúdo da variável, eliminando o que o usuário não pode mexer, e elimino as opções que servem apenas pra facilitar configuração, pra não aparecerem no menu.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:00
por JoséQuintas
Agora algumas telas de como tudo isso fica
senha1.png
senha1.png (10.6 KiB) Visualizado 1744 vezes


Tinha esquecido... essa opção "lista opções do menu" gera um TXT com todo menu.

O fonte dessa opção:
FUNCTION ListMenu()
   LOCAL mOpcoes, acMenu := {}, cTxt, nCont

   mOpcoes := MenuCria()
   ListaOpcoes( mOpcoes,,, acMenu )
   cTxt := ""
   FOR nCont = 1 TO Len( acMenu )
      cTxt += acMenu[ nCont ] + HB_EOL() + HB_EOL()
   NEXT
   HB_MemoWrit( "menuhl.txt", cTxt )
   ShellExecuteOpen( "menuhl.txt" )
   RETURN acMenu


Ela aciona a ListaOpcoes() que é recursiva (chama ela mesma)

STATIC FUNCTION ListaOpcoes( mOpcoes, nLevel, cSelecao, acMenu )
   LOCAL nCont, cModule, cDescription

   nLevel := iif( nLevel == NIL, 0, nLevel )
   nLevel := nLevel + 1
   cSelecao := iif( cSelecao == NIL, "", cSelecao )

   FOR nCont = 1 TO Len( mOpcoes )
      cModule := mOpcoes[ nCont, 3 ]
      IF ValType( cModule ) != "C"
         cModule := ""
      ENDIF
      cDescription := mOpcoes[ nCont, 1 ]
      Aadd( acMenu, Pad( cSelecao + StrZero( nCont, 2 ) + ".", 15 ) + Space( nLevel * 3 ) + cDescription + iif( Len( cModule ) !=  0, " (" + mOpcoes[ nCont, 3 ] + ")", "" ) )
      IF Len( mOpcoes[ nCont, 2 ] ) != 0
         ListaOpcoes( mOpcoes[ nCont, 2 ], nLevel, cSelecao + StrZero( nCont, 2 ) + ".", acMenu )
      ENDIF
   NEXT
   Aadd( acMenu, "" )
   RETURN NIL


É só um FOR/NEXT, e caso a opção tenha sub-opções, aciona a própria rotina pra mostrar as sub-opções, e assim sucessivamente por todos os níveis que existirem.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:20
por JoséQuintas
Um pequeno pedaço do txt gerado:

10.07.               Apenas testes
10.07.01.               Junta corrente/informe/dimob (PTESCORR)
10.07.02.               Compara cod.locador e nome (PTESCOR2)
10.07.03.               Pega backup\recibo*.* (PTESRECMES)
10.07.04.               Gera estrutura dbfback (PTESBACK)
10.07.05.               Salva no MySql (Teste) (PTES0170)
10.07.06.               Salva no MySql (Oficial) (HLSALVAMYSQL)


Foi o que deu a idéia depois de já gerar um manual pelo aplicativo....
Só não pensei ainda como transformar isso num índice, com numeração de página.
Mas sem conteúdo não adianta.
(O manual sempre é deixado pra algum dia....)

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:25
por JoséQuintas
senha2.png


Só pra facilitar e aproveitar o que já existia, acrescentei um ( U ) para usuários e ( G ) para grupos na lista inicial.

A partir do nome, o sub-menu de opções.
Só na minha senha mostra a opção de ver senha do usuário.
É que se precisar fazer algum teste na senha de determinado usuário, posso fazer isso sem ele do lado.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:30
por JoséQuintas
A parte de configuração segue exatamente o menu.
A única diferença é que o menu horizontal também fica na vertical durante a configuração.
Dá pra liberar um menu completo de uma vez (com todas as subopções) ou uma opção individual.
Só digitar S ou N.

senha3.png


Como falei antes, a parte de grupo é nova.
A idéia que tive, pra mostrar todos os acessos, foi colocar duas colunas: a primeira é o acesso individual, e a segunda é o acesso pelo usuário estar em determinado grupo.
Assim dá a visão geral do que ele pode mexer, sem ter que olhar o grupo.

Dá pra ver na imagem que para o usuário Barbosa, está sendo liberada a opção VENDAS por ele estar em algum grupo.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:38
por JoséQuintas
Acontece muito de ter que liberar a mesma opção pra mais de um usuário...
Ou de precisar saber quem pode mexer em determinada opção...
Então pra facilitar... caso tecle ENTER no módulo:

senha5.png


A lista de todos que podem mexer no módulo.
Podendo incluir ou excluir usuários da opção.

senha5.png


Na lista anterior, ninguém tinha acesso.
Ao clicar em incluir, aparecem os usuários que podem ser inclusos.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:41
por JoséQuintas
E no caso de um grupo, opção de definir membros, parecida com a rotina anterior.
Aliás, aproveitei a mesma rotina.

senha7.png


Ainda preciso ajustar o posicionamento de tudo.
Até mexi um pouco nesta semana, porque ela ainda usava o padrão antigo de 80 colunas.
Mas dá pra melhorar.

Usuários/senhas/acessos/etc

MensagemEnviado: 14 Jul 2015 23:46
por JoséQuintas
A configuração de acessos do grupo é idêntica à de configurar acessos do usuário.

Não permiti configurar grupo dentro de grupo.

Até ontem era pra não complicar mais ainda, ou aumentar a quantidade de pesquisas no arquivo de senhas.

Mas agora pensei num motivo ainda melhor:
supondo que o grupo VENDAS tenha acesso do grupo COMPRAS, e o grupo COMPRAS tenha acesso ao grupo VENDAS.
Isso poderia gerar um loop infinito, de um grupo trazendo o acesso do outro.

Mas pra quem ainda nem usa grupo, já tá bom demais.

Usuários/senhas/acessos/etc

MensagemEnviado: 15 Jul 2015 00:14
por JoséQuintas
E uma coisa leva a outra.....

Seria interessante a partir do usuário, ver a que grupos ele pertence.

Provavelmente essa vai ser a próxima opção.

A rotina pra toda essa navegação de acessos?
Usando recursividade... por incrível que pareça.... um FOR/NEXT.

Caso tecle ENTER numa opção com submenus, a rotina chama ela mesma passando esse array de submenus.

O fonte total no momento tem 695 linhas.

Isso inclui:
- rotina de alterar senha
- rotina de importar acessos
- rotina de mostrar senha do usuário
- rotina de selecionar membros do grupo
- rotina de selecionar usuários que acessam determinada opção
- rotina de configurar acessos individuais
- rotina que o sistema usa pra ver se determinado usuário tem acesso a determinada opção
- rotina de cadastrar novo usuário
- rotinas de menus adicionais
- linhas em branco e traços separando cada função/rotina
- anotações de data/hora sobre alterações que foram sendo feitas
- toda parte de ler/salvar no arquivo de senhas

Até ontem eu achava o fonte grande demais.
Agora que descrevi o que contém.... até que está pequeno.

A parte de grupo acrescentei duplicando algumas rotinas.

Antes que alguém pergunte:
Não uso classes nesse módulo. Vém desde os tempos do Clipper.
Nem sei se ajudaria em alguma coisa transformar em classe.

Me pergunto se precisaria alguma coisa a mais.
Até esta semana não via necessidade de acrescentar grupos, então não sei o que pode vir depois.

Usuários/senhas/acessos/etc

MensagemEnviado: 15 Jul 2015 00:26
por JoséQuintas
Não tinha pensado nisso, mas....
Como seria algo assim em ambiente gráfico?

Usuários/senhas/acessos/etc

MensagemEnviado: 15 Jul 2015 09:49
por Toledo
JoséQuintas escreveu:Como seria algo assim em ambiente gráfico?

Lendo suas mensagens deste tópico, já estava imaginando isto, onde os GRUPOS seria um ComboBox ou RadioGroup e a Lista de privilégios em um Tree View.

Ficaria muito legal.

Abraços,

Usuários/senhas/acessos/etc

MensagemEnviado: 15 Jul 2015 12:01
por frazato
Tenho uma rotina montada, quase que neste molde mais usando DBF!, feito em GTWVW com xharbour 99.70..

Usuários/senhas/acessos/etc

MensagemEnviado: 16 Jul 2015 20:13
por JoséQuintas
Um Treeview com opção de expandir cada opção do menu.
Realmente ficaria interessante.

Atualizei de leve, e acrescentei pra ver os grupos de um usuário.

Só a título de curiosidade ou talvez de exemplo.

acessos.png


Nessa imagem, tem o primeiro conjunto de opções com nome do usuário.
Depois tem mais três menus por cima.
Esses três vém daquele array do menu.

Reparem que a rotina é "feita a mão", usando FOR/NEXT pra montar o menu, e InKey(0) pro usuário teclar algo.
A rotina completa, sem limite de níveis, é esta, que só precisa do array com o menu:

   BoxAcesso( 4, 15, axMenu, 1, "ACESSOS DE " + cUsuario + " (PRÓPRIO/GRUPO)", .F. )
...

FUNCTION BoxAcesso( mLini, mColi, mMenuOpt, mOpc, mTitulo, mSaiSetas, lLiberado4, lLiberado5 )
   LOCAL mCont, mLinf, mColf, mTecla
   mLinf := mLini + Len( mMenuOpt ) + 2
   mColf := mColi + 44
   WOpen( mLini, mColi, mLinf, mColf, mTitulo )
   Mensagem( "Selecione e tecle ENTER, <S> (Tem Acesso), <N> (Sem Acesso), <ESC> sai" )
   DO WHILE .T.
      FOR mCont = 1 TO Len( mMenuOpt )
         @ mLini + 1 + mCont, mColi + 1 SAY " " + Pad( mMenuOpt[ mCont, 1 ], 31 ) + iif( Len( mMenuOpt[ mCont, 2 ] ) > 0, Chr(16), " " ) + " " + ;
         iif( mMenuOpt[ mCont, 4 ], "SIM", "---" ) + " " + iif( mMenuOpt[ mCont, 5 ], "SIM", "---" ) + " " COLOR iif( mCont == mOpc, SetColorFocus(), SetColorBox() )
      NEXT
      SetColor( SetColorNormal() )
      mTecla := Inkey(0)
      DO CASE
      CASE mTecla == K_ESC
         EXIT
      CASE mSaiSetas .AND. ( mTecla == K_RIGHT .OR. mTecla == Asc( "6" ) .OR. mTecla == K_LEFT .OR. mTecla == Asc( "4" ) ) // setas
         EXIT
      CASE mTecla == K_LBUTTONDOWN
         IF MROW() > mLini + 1 .AND. MROW() < mLini + 2 + Len( mMenuOpt ) .AND. MCOL() > mColi .AND. MCOL() < mColi + 38
            mOpc := MROW() - mLini - 1
            Keyboard Chr( K_ENTER )
         ENDIF
      CASE mTecla == K_RBUTTONDOWN                           ; Keyboard Chr( K_ESC )
      CASE mTecla == K_DOWN     .OR. mTecla == Asc( "2" )    ; mOpc := iif( mOpc == Len( mMenuOpt ), 1, mOpc + 1 )
      CASE mTecla == K_UP       .OR. mTecla == Asc( "8" )    ; mOpc := iif( mOpc == 1, Len( mMenuOpt ), mOpc - 1 )
      CASE mTecla == K_HOME     .OR. mTecla == Asc( "7" )    ; mOpc := 1
      CASE mTecla == K_END      .OR. mTecla == Asc( "1" )    ; mOpc := Len( mMenuOpt )
      CASE mTecla == Asc( "S" ) .OR. mTecla == Asc( "s" )    ; // MudaAcess( mMenuOpt, mOpc, .T. )
      CASE mTecla == Asc( "N" ) .OR. mTecla == Asc( "n" )    ; // MudaAcess( mMenuOpt, mOpc, .F. )
      CASE mTecla == K_ENTER
         IF Len( mMenuOpt[ mOpc, 2 ] ) > 0
            BoxAcesso( mLini + 2, mColi + 10, mMenuOpt[ mOpc, 2 ], 1, mMenuOpt[ mOpc, 1 ], @mMenuOpt[ mOpc, 4 ], @mMenuOpt[ mOpc, 5 ] )
         ELSE
            // SelecionaUsuarios( mColi + 20, mMenuOpt[ mOpc, 3 ] )
         ENDIF
      ENDCASE
   ENDDO
   WClose()
   FOR mCont = 1 TO Len( mMenuOpt )
      IF mMenuOpt[ mCont, 4 ]
         lLiberado4 := .T.
      ENDIF
      IF mMenuOpt[ mCont, 5 ]
         lLiberado5 := .T.
      ENDIF
   NEXT
   RETURN NIL


Rotinas externas:
- wOpen() e wClose() - apenas pra montar o box (contorno) da opção e salvar/restaurar tela.
- Mensagem() e SetColorNormal() - o nome diz tudo
- MudaAcess() e SelecionaUsuarios() já fazem parte de configuração, e não deste menu

Toda navegação é essa rotina, incluindo uso de mouse.

E ao teclar numa opção com subopções:
      CASE mTecla == K_ENTER
         IF Len( mMenuOpt[ mOpc, 2 ] ) > 0
            BoxAcesso( mLini + 2, mColi + 10, mMenuOpt[ mOpc, 2 ], 1, mMenuOpt[ mOpc, 1 ], @mMenuOpt[ mOpc, 4 ], @mMenuOpt[ mOpc, 5 ] )
         ELSE
            // SelecionaUsuarios( mColi + 20, mMenuOpt[ mOpc, 3 ] )
         ENDIF


Ela chama ela mesma, passando o "sub-array".

Conforme a configuração vai sendo feita, o próprio array armazena o resultado.

Acho que ficou visível o que precisei fazer pra acrescentar a parte de grupos.
Só acrescentei um elemento ao array.

Rotina sem classes, sem nada sofisticado, apenas comandos/funções simples.
O uso de recursividade é que fez a diferença.
Um ótimo exemplo pra mostrar a vantagem de variáveis LOCAL.
Se usasse variáveis PRIVATE ou PUBLIC, sem chance.

Usuários/senhas/acessos/etc

MensagemEnviado: 16 Jul 2015 20:20
por JoséQuintas
Frazato, deixei passar a sua mensagem.
Em DBF só é interessante se der a opção para o usuário organizar o menu do jeito que quiser.
No meu caso é fixo. só altera apenas o que pode ser visto.

Esse recurso de imagem de fundo é uma coisa que eu gostaria que tivesse na GTWVG.

Frazato:
Na mensagem da tela de configuração está HABILTAR.
Não sei se já corrigiu.

Usuários/senhas/acessos/etc

MensagemEnviado: 28 Jul 2015 15:55
por JoséQuintas
E não é que deu trabalho achar um erro nessa rotina.
Exatamente essa rotina que postei.

FUNCTION BoxAcesso( mLini, mColi, mMenuOpt, mOpc, mTitulo, mSaiSetas, lLiberado4, lLiberado5 )

BoxAcesso( mLini + 2, mColi + 10, mMenuOpt[ mOpc, 2 ], 1, mMenuOpt[ mOpc, 1 ], @mMenuOpt[ mOpc, 4 ], @mMenuOpt[ mOpc, 5 ] )



Quando não é o primeiro dos menus, tem a opção de sair pela seta: esse parâmetro mSaiSetas
Esqueci dele nessa chamada recursiva quando acrescentei grupos, e acabava mostrando errado na opção com subopções.
A sorte é que isso é usado só pro visual, então não comprometeu a configuração, que é pelo nome de módulos.

Também tive problema porque isolei a rotina de pegar grupos do usuário.
É que esqueci de retornar à área anterior (SELECT nAreaAnt) nessa rotina.
E como na minha senha pula tudo que é checagem... isso aconteceu no cliente.

Aqui também acontecem erros, não sou diferente de ninguém.

Usuários/senhas/acessos/etc

MensagemEnviado: 21 Jul 2019 12:57
por lwinter
Oi Jose!
Parabéns pelo trabalho ficou muito bom.
Como este fórum é para dar sugestões, segue a minha:
Acho interessante que a senha pudesse ser de pois fatores (por email já seria interessante e SMS seria um plus), onde o usuário poderia recuperar a sua senha e digitar um código. Desta forma evita suporte desnecessário.
Outro ponto é que depois que você introduzir o grupo, o acesso indivual em concomitância com o grupo se tornaria redundante. Lembrando que o usuário poderia ter vários grupos que acumulariam acessos. Mas o usuário especificamente poderia retirar ou adicionar acessos indivisuais (apos acesso do grupo).
Não sei se consegui explicar.

Uma duvida onde fica gracado estas opções do usuário? Como é o banco de dados?

Usuários/senhas/acessos/etc

MensagemEnviado: 21 Jul 2019 13:14
por lwinter
Oi Jose! Pelo que eu entendi você tem os seus fontes disponibilizados em open source. É isso mesmo?
Eu estava pensando em criar um pequeno ERP (mini) em opensource. O que você acha?

Usuários/senhas/acessos/etc

MensagemEnviado: 21 Jul 2019 14:13
por JoséQuintas
lwinter escreveu:Oi Jose! Pelo que eu entendi você tem os seus fontes disponibilizados em open source. É isso mesmo?


Na prática, dividi os fontes do meu aplicativo em 3 partes:

- sefazclass, é público no GitHub
- josequintas, é público no GitHub
- e a parte particular

Preciso dessas 3 partes pra gerar meu aplicativo que é distribuído aos clientes.
Pelo mesmo motivo, "josequintas" acaba tendo que manter compatibilidade com o aplicativo.
Talvez até divida em mais partes, só pra reduzir a parte "diferente".

Eu estava pensando em criar um pequeno ERP (mini) em opensource. O que você acha?


Lá tem muitas rotinas prontas do meu ERP.

Mas cada um usa banco de dados diferente, tipo de acesso ao banco de dados, LIB visual diferente, acho que não vai ser fácil isso.

Aproveitando:
A parte de direitos de acesso que perguntou em outro post, e que mostrei aqui...
Tinha esquecido, mas é só compilar o teste que vai ver em funcionamento.

Usuários/senhas/acessos/etc

MensagemEnviado: 22 Jul 2019 14:59
por lwinter
Não consegui encontrar o fonte do teste do menu em https://github.com/JoseQuintas/JoseQuintas
Seria outro repositório do GitHub?

rgds,

Usuários/senhas/acessos/etc

MensagemEnviado: 22 Jul 2019 18:38
por JoséQuintas
Talvez precise dividir/organizar por "assunto", porque no momento tá tudo misturado.
Mesmo que o menu esteja num fonte, as chamadas estão por outro.

Menu

https://github.com/JoseQuintas/JoseQuintas/blob/master/source/jpa_menu.prg

Configuração de acessos:

https://github.com/JoseQuintas/JoseQuintas/blob/master/source/padminacesso.prg

Usuários/senhas/acessos/etc

MensagemEnviado: 24 Jul 2019 15:38
por lwinter
Não consegui entender como compiltar o test.prg que esta dentro de tests, pois ao compilar o test.hbp apresenta "cannot find -ljosequintas". Me parece ser a biblioteca. Como faco para compilar?

Usuários/senhas/acessos/etc

MensagemEnviado: 24 Jul 2019 17:20
por JoséQuintas
Precisa indicar aonde estão os HBCs: da sefazclass e josequintas

Aqui simplifico colocando em \harbour\bin\hbmk.hbc
Assim posso usar em qualquer projeto diretamente.

libpaths=d:/cdrom/fontes/integra/sefazclass
libpaths=d:/cdrom/fontes/integra/josequintas
libpaths=d:/cdrom/fontes/integra/josequintas/bostaurus

se for indicar no hbp, coloque -LpathDoHBC

Isso indica aonde procurar o arquivo HBC, e o arquivo HBC já diz tudo que precisa pra linqueditar.

Importante: crie uma pasta para o EXE, e execute nessa pasta criada.
É porque vão ser criados os DBFs/CDXs, e assim fica centralizado numa pasta que poderá ser apagada depois.

Usuários/senhas/acessos/etc

MensagemEnviado: 24 Jul 2019 17:31
por JoséQuintas
lwinter escreveu:Não consegui entender como compiltar o test.prg que esta dentro de tests, pois ao compilar o test.hbp apresenta "cannot find -ljosequintas".
Me parece ser a biblioteca.
Como faco para compilar?


Pera aí... compilou as LIBs antes de compilar o teste?

Vamos por partes:

crie o arquivo hbmk.hbc dentro da pasta harbour\bin.
Isso não vai mexer com seus projetos, apenas vai indicar aonde pode ser pesquisada alguma coisa.
Ajuste para o path de onde instalou as LIBs

---hbmk.hbc---
libpaths=path-de-sefazclass.hbc
libpaths=path-de-josequintas.hbc

vai na pasta de sefazclass:
hbmk2 sefazclass.hbp

vai na pasta de josequintas:
hbmk2 josequintas.hbp

vai na pasta do programa de teste:
hbmk2 test.hbp

Nota:
Pra quem usa HMG Extended ou fivewin ou XHarbour....
Essas LIBs poderiam ser assim também. Uma única linha e tudo pronto pra uso. PRA TODAS.
O XHarbour também... usando HBMK2.