Acessar base de dados

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Giovany Vecchi
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 28 Mai 2014 17:32
Localização: Jales / SP

Acessar base de dados

Mensagem por Giovany Vecchi »

Desde 2014 faço conexão por internet nos meus clientes. Uso Ads AIS (Advantage Internet Server) com dicionario de dados e tabelas ADT. A velocidade é impressionante. Uso comandos SQL e recursos API com advantage.
Se Voce usa dbf fica facil a migração.

Se quiser testar e acessar um pequeno exemplo aqui no meu notebook com windows 7 que uso para servidor de ftp baixe o programa aqui:
https://filebin.net/7qjgcz8gkxrrwbmf/Sa ... t=1fs0ixpa

A classe tAds aqui:
https://github.com/giovanyvecchi/tAdsGit.git

Qualquer duvida me chame no skype
giovany.vecchi
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Acessar base de dados

Mensagem por Itamar M. Lins Jr. »

Ola!
Uso o LetoDB desde quando ainda não estava totalmente funcional e ainda continua com alguns bugs.
Mas o LetoDb[f] está muito estável. Muita gente está usando no mundo todo, alguns até querendo Pagar o Elch pelo excelente trabalho, e foi um trabalho que o Elch fez, em cima, ou em conjunto com o trabalho do Alexander Kresin...
Use o LetoDBf do Elch.
Não use ALIAS, quando for "MEXER" com índices, o servidor não enxerga as variáveis do lado CLIENTE.

Abra outro tópico na sessão de Banco de Dados, já que o assunto mudou.
Não desista, assim como eu e muitos Outros que trabalhamos com o Harbour, Letodb[f], CGI etc... Funciona e muito bem, apesar de lermos vez ou outra comentários desanimadores... Mas aqui é forum de aprendizado(programação), mostrando nossos códigos, perguntando e o nosso sucesso, procurando melhorar a comunidade do PCTOLEDO, atenção redobrada aos INTERMEDIÁRIOS, pois esses só estão aqui pelo $$$$ só isso.
Melhor DOCUMENTO que existe são os códigos dos que ajudam a comunidade Harbour.

Talvez em HTML+ Harbour seja até mais fácil resolver seu problema do que vc está imaginando. E vai disponibilizar seus pedidos até para celulares...

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Giovany Vecchi
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 28 Mai 2014 17:32
Localização: Jales / SP

Acessar base de dados

Mensagem por Giovany Vecchi »

Uma listagem usando Ads WebServer.
Neste exemplo não esta usando nenhum framework.
Apenas dados. O retorno esta defnido em json. copie o endereço e cole no Mozila Firefox, o Firefox tem tratamento de dados json.

http://usuario:123@168.205.46.26:6272/a ... ormat=json
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Acessar base de dados

Mensagem por Nascimento »

Itamar M. Lins Jr. disse: Use o LetoDBf do Elch.
Não use ALIAS, quando for "MEXER" com índices, o servidor não enxerga as variáveis do lado CLIENTE.
nobre Itamar vc poderia ser mais claro neste ponto?, estou estudando o letodbf, e ainda estou apanhando bastante em algumas coisas...
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Acessar base de dados

Mensagem por Itamar M. Lins Jr. »

Ola!
Variáveis da aplicação cliente, não são vistas pelo servidor, é assim com qualquer SGBD.
Por exemplo:

Código: Selecionar todos

use clientes alias cli
Esse alias "cli" não é visto pelo servidor na hora de indexar.
index on cli->nome ... Esse alias "cli" está fora, foi "criado" "lá na maquina" CLIENTE.
forma correta:

Código: Selecionar todos

select cli
index on field->nome...

Código: Selecionar todos

index on dtos(nascido) for nascido >= dInicial .and. nascido <= dFinal
As variáveis dInicial e dFinal, não existem do lado do servidor, portando vai acontecer um erro.
Como resolver ?

Código: Selecionar todos

Local cQuery := dtos(field->nascido)  ' >=  " ' + dtos(dInicial) + ".and." + ' <= " ' + dtos(dFinal) + " ' "
index on dtos(nascido) for &cQuery
É assim com qualquer SGBD, não podemos usar VARIÁVEIS, que não estão na memória lá do servidor LETODB.
e ainda estou apanhando bastante em algumas coisas...
Basta especificar mais seus problemas, e também se eu souber explicar, blz!

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Acessar base de dados

Mensagem por Nascimento »

tamar disse : Basta especificar mais seus problemas, e também se eu souber explicar, blz!
I

um deles é tipo quando apago os indices e abro o programa, ele recria normalmente porem quando vou digitar a senha de operador não acha é como se não usasse o indice recém-criado eu tenho que fechar o programa e abrir novamente assim fica tudo normal

segue abaixo o modo uma parte do .prg que uso para criar os indices

Código: Selecionar todos


// modo de uso
    if (!net_use("OPERADOR", "OPE", "OPERADOR"))
      quit
   endif 

#ifdef _LETO
   #include "rddleto.ch"   
#endif   
Function Net_use()
  parameters cFiledbf,cAlias,cFilecdx,lexcl,lretry
  private lforever
  private aFilecdx
  private bFilecdx
  private bFiledbf
  private nomearq
  lretry   := iif(type("lretry") != "N",500,lretry)
  lexcl    := iif(type("lexcl") != "L",.F.,lexcl)
  lforever := lretry == 0
  bFiledbf:= cFiledbf+'.DBF'  
  cFiledbf := PathLeto+cFiledbf+'.DBF'
  aFilecdx:= cFilecdx+".CDX"
  bFilecdx:= cFilecdx                    //"MCOCUP"
  cFilecdx := PathLeto+cFilecdx+'.CDX'  //"MCOCUP.CDX" 
  #ifdef _LETO
     cDriver := "LETO"
  #else
     cDriver := "DBFCDX"
  #endif	
  if !vFile(bFiledbf)
      msginfo("VERIFIQUE SE O SERVIDOR ESTA LIGADO OU A CONEXAO ESTA ATIVA  "+bFiledbf)
     quit
  endif   
  protect (bFiledbf,"D")
  do while (lretry > 0 .or. lforever)
     if (lexcl)
        DbUseArea( .T., cDriver, cFiledbf, cAlias,  .F.  )
     else 
        DbUseArea( .T., cDriver, cFiledbf, cAlias,  .T.  )
*        msgdebug(cfiledbf)
     endif
     if (Used())
        exit
     endif
     lretry =- 1
  enddo
if (Used())
     *-------------------------------------------
     if (bFilecdx = "OPERADOR")  // observo que cria normalmente esse indice mais é como se não abrisse pra uso ou não atualizasse s
        if (!vFile(aFilecdx))          // o quando fecho e abro o aplicativo novamente fica tudo normal!
           nomearq := bFilecdx            
           index on codigo tag operador to (cFilecdx)
           index on nome tag nomeoper to (cFilecdx)           
        endif
        DbSetIndex( cFileCdx )
     endif

endif



A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Acessar base de dados

Mensagem por Jairo Maia »

Olá Nascimento,
Nascimento escreveu:é como se não usasse o indice recém-criado
Estranho mesmo... Tente fazer esse teste modificando essa parte:

Código: Selecionar todos

if (bFilecdx = "OPERADOR")  // observo que cria normalmente esse indice mais é como se não abrisse pra uso ou não atualizasse s
   if (!vFile(aFilecdx))          // o quando fecho e abro o aplicativo novamente fica tudo normal!

      /////////////////////////////////////////////////////////////
      DbClearIndex()          // fecha todos os índices dessa área
      FileDelete( cFileCdx )  // apaga o arquivo de índices antigo
      /////////////////////////////////////////////////////////////

      nomearq := bFilecdx            
      index on codigo tag operador to (cFilecdx)
      index on nome tag nomeoper to (cFilecdx)           
   endif
   DbSetIndex( cFileCdx )
endif
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Acessar base de dados

Mensagem por Nascimento »

amigo jairo , lembre-se que é quando eu excluo todos os indices!, e o sistema cria os novos , como falei a cima eu boto codigo diz operador nao encontrado
então fecho e abro novamente , ja funciona normal, dai pra frente é tudo normal inclusão de operadores, exclusão em fim fica tudo certo

mais so na segunda abertura do soft após criar os indices

cenario: apago os indices abro o sistema , o sistem a recria os indices e por sua vez, não acha o operador "codigo inesistente operador não encontrado"
fecho o sistema "lembre-se que os indices ja foram criados", reabro o sistema pronto tudo normal!

essa parte que tem !vFile(blabla)

é esse trecho de codigo, para compatibilizar usando o letodb ou não , o #ifdef eu uso muito em .C como tambem pode ser usado no clipper e harbour
se não me engano em outras linguagens tambem, ajuda muito , pra vc não ter que esta fazendo 2 codigos fontes em um so vc tem 2 versões ou varias dependendo

Código: Selecionar todos

Function vFile()
  Parameters aFile
  local lReturn := .t.
  #ifdef _LETO	 
    lReturn := Leto_File(aFile)  
  #else
     aFile:= PathLeto+aFile
    lReturn := File(aFile)
  #endif  
Return (lReturn)

	  

A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Acessar base de dados

Mensagem por Jairo Maia »

Nascimento escreveu:#ifdef eu uso muito em .C como tambem pode ser usado no clipper e harbour
Sim, sem problemas. Mas vamos então entender algo que para mim ficou confuso nas diretivas ao compilador. Vou comentar seu fonte:

Código: Selecionar todos

Function vFile()
  Parameters aFile
  local lReturn := .t.
  #ifdef _LETO    // se a diretiva informa que uso LETO, compile isso...
    lReturn := Leto_File(aFile)  
  #else  // senão, então não uso LETO, então compile isso...
     aFile:= PathLeto+aFile  // aqui fica confuso... porque PathLeto se vc não usa leto nesse trecho?
    lReturn := File(aFile)
  #endif  
Return (lReturn)
O problema ocorre quando usa LETO ou quando não usa LETO?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Acessar base de dados

Mensagem por Nascimento »

O problema ocorre quando usa LETO ou quando não usa LETO?
quando eu ajustei o net_use() , ficou dando tanto no leto quanto normal

tirei o comando use blabla, para o dbusearea(blabla)
na parte da criação de indices pode se dizer que não foi mexido
aqui fica confuso... porque PathLeto se vc não usa leto nesse trecho?
Pathleto é uma variavel que pega infos em um arquivo.ini

pra entendimento seria mais ou menos isso

#ifdef _LETO
PathLeto := 192.168.2.43:2812/
#else
PathLeto := hb_dirbase()
#endif

Leto_File(aFile) // assim ele ja acha o arquivo que esta setado no letodb.ini

mais o file() tem que dar o caminho que ficaria por exemplo c:\meuarquivo.cdx
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

Acessar base de dados

Mensagem por Amparo »

ola amigos

bom dia a todos

desculpem por estar retornando somente agora, mas devido a enchente ocorrida no sábado e domingo da semana passada aqui em SP tive meu tempo esgotado pois tive que recuperar servidor e estações de trabalhos que foi totalmente imundada pela água.

bem mais isso é outro problema.
Itamar M. Lins Jr. escreveu:Não desista, assim como eu e muitos Outros que trabalhamos com o Harbour, Letodb[f], CGI etc... Funciona e muito bem, apesar de lermos vez ou outra comentários desanimadores... Mas aqui é forum de aprendizado(programação), mostrando nossos códigos, perguntando e o nosso sucesso, procurando melhorar a comunidade do PCTOLEDO, atenção redobrada aos INTERMEDIÁRIOS, pois esses só estão aqui pelo $$$$ só isso.
com certeza não vou desistir, essa palavra não me acompanha.
Itamar M. Lins Jr. escreveu:Talvez em HTML+ Harbour seja até mais fácil resolver seu problema do que vc está imaginando. E vai disponibilizar seus pedidos até para celulares...
pretendo chegar a este ponto!


eu consegui fazer uma conexão, estou avançando, graças a ajuda de vocês, sei que ainda haverá pedras no caminho.

abraços
e obrigado a todos
Avatar do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

Acessar base de dados

Mensagem por Amparo »

ola amigos

bom dia a todos

estou tento problema ao abrir as tabelas no letodb conforme abaixo:

abro desta forma:

Código: Selecionar todos

USE (cPath+"pedidos") INDEX (cPath+"pedidos") ALIAS "pedidos" SHARED NEW VIA "LETO"
erro:

Código: Selecionar todos

Application: C:\FONTES\MINIGUI\LETODBII\LIMPIUM.EXE
Date: 19/03/2019 Time: 10:18:16
Time from start: 0 days 0 hours 0 mins 7 secs
Error DBCMD/2001 Workarea nÆo est  em uso: ORDLISTADD


Called from ORDLISTADD(0) 
Called from DBSETINDEX(0) 
Called from ACESSA_PEDIDO(314) in module: LIMPIUM.PRG 
Called from VERIFICA_LOGIN(288) in module: LIMPIUM.PRG 
Called from (b)ACESSOAOSISTEMA(199) in module: LIMPIUM.PRG 
Called from _DOCONTROLEVENTPROCEDURE(1857) in module: h_windows.prg 
Called from EVENTS(2272) in module: h_events.prg 
Called from DOMESSAGELOOP(0) 
Called from _ACTIVATEWINDOW(1498) in module: h_windows.prg 
Called from ACESSOAOSISTEMA(208) in module: LIMPIUM.PRG 
Called from (b)MAIN(73) in module: LIMPIUM.PRG 
Called from _PROCESSINITPROCEDURE(1671) in module: h_windows.prg 
Called from _ACTIVATEWINDOW(1486) in module: h_windows.prg 
Called from MAIN(147) in module: LIMPIUM.PRG 
o porque do erro, tenho um sistema de controle de vendas e tudo mais, decidi fazer um aplicativo para ser instalado nos clientes, onde eles vão digitar o seu pedido, acontece que o pessoal no escritório esta com o sistema aberto e fazendo os procedimentos normais, só que, quando o cliente executa este aplicativo e faz a conexão da o erro mencionado, se eu mudar a forma de abertura da tabela colocando READONLY ai o erro não acontece mas por outro lado não consigo gravar na tabela.

exemplo:

Código: Selecionar todos

USE (cPath+"pedidos") INDEX (cPath+"pedidos") ALIAS "pedidos" SHARED NEW READONLY VIA "LETO"
neste caso consigo ler o ultimo pedido de um cliente incluo mais itens tudo perfeito, mas quando vou salvar da erro

Código: Selecionar todos

Application: C:\FONTES\MINIGUI\LETODBII\LIMPIUM.EXE
Date: 19/03/2019 Time: 10:37:40
Time from start: 0 days 0 hours 0 mins 16 secs
Error LETO/1025 Escrita nÆo permitida


Called from DBAPPEND(0) 
Called from SALVAR_PEDIDO(791) in module: LIMPIUM.PRG 
Called from (b)MAIN(129) in module: LIMPIUM.PRG 
Called from _DOCONTROLEVENTPROCEDURE(1857) in module: h_windows.prg 
Called from EVENTS(1796) in module: h_events.prg 
Called from DOMESSAGELOOP(0) 
Called from _ACTIVATEWINDOW(1498) in module: h_windows.prg 
Called from ACESSOAOSISTEMA(208) in module: LIMPIUM.PRG 
Called from (b)MAIN(73) in module: LIMPIUM.PRG 
Called from _PROCESSINITPROCEDURE(1671) in module: h_windows.prg 
Called from _ACTIVATEWINDOW(1486) in module: h_windows.prg 
Called from MAIN(147) in module: LIMPIUM.PRG 
lembrando que estes erros só ocorre se eu estiver com o meu sistema em funcionamento e depois executar o aplicativo que estou desenvolvendo, se o pessoal não estiver usando o sistema ai não da erro algum, isto acontece tando na maquina local como remotamente.

em meu sistema a abertura é feita desta forma:

Código: Selecionar todos

DBUseArea( .T., "dbfcdx", cFile, cAlias, .T. )
fica aqui a pergunta, não vou conseguir abrir uma tabela via leto estando com outro sistema aberto e trabalhando com estas tabelas?

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

Acessar base de dados

Mensagem por JoséQuintas »

O aplicativo DBF/CDX é somente console?
Coloca em Linux e pronto.

Quer fazer um simulado básico?
Se tem Windows 10, fica extremamente facilitado fazer teste em Linux.
Depois, cria o servidor Linux, virtual ou não, e bola pra frente.
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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Acessar base de dados

Mensagem por Itamar M. Lins Jr. »

Ola!
Cadê seu letodb.ini ?
Really important options commonly only are: DataPath, LogPath, Share_Tables, No_Save_WA.
If the server should use an existing DBF fileset, adapt 'Default_Driver' if DBFNTX was used.
Veja essa parte: No_Save_WA = 1
Esse é o padrão que eu uso.

Código: Selecionar todos

Port = 2812              
DEFAULT_DRIVER = CDX     
DATAPATH = c:\sistema\dados
ENABLEFILEFUNC = 1
CRYPT_TRAFFIC = 0
PASS_FOR_LOGIN = 0
PASS_FOR_MANAGE = 0
PASS_FOR_DATA = 0
Share_Tables  = 0
Cache_Records = 60
No_Save_WA = 1
[DATABASE]
DataPath = c:\sistema\dados\
Driver = CDX

Código: Selecionar todos

No_Save_WA = 1           -    server mode of internally handling database tables
                                    1  each dbUseArea() will cause a real file open operation by the OS,
                                       identical to what client requested, so workareas at the server are same as
                                       at client side. [ WA number, alias, filter conditions, relations ]
                                    0  each table is opened only one time, this workarea 'exchanged' in between client
                                       requests. so only one connection will have access to the table at a time.
                                       No relations active at server, Alias names at server are different from
                                       the client.
                                    Recommend '1' if you plan to execute functions at server side ( UDF ).
      Share_Tables = 0         -    other software simultanous access tables used by server,
                                    which changes logical or physical record locking -- in dependance:
                                    # No_Save_WA = 0
                                    0  server open all tables in exclusive mode, what leads to
                                       performance increase as e.g. record-/ file- locks are not applied by OS.
                                    1  tables are opened in the same mode [shared/exclusive] as client
                                       applications opened them, what allows LetoDB to work in coexistence with
                                       other applications [ non LetoDB users ] simultanous on the same DBF tables.
                                    # No_Save_WA = 1
                                    1  physical record-/ file- locks set with the OS are viewable for other
                                    0  only logical internally locking, don't respect other record locks
                                    * SAMBA: *
                                      co-work with Samba file-service needs very special treatment/ setup
and have limits of possibilities -- see chapter 4.4
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

Acessar base de dados

Mensagem por Amparo »

ola amigos

bom dia Itamar

meu letodb.ini esta conforme abaixo, acrescentei a linha No_Save_WA = 1 e aparentemente resolveu vou fazer mais teste

Código: Selecionar todos

Port = 2812              
Logfile = "letodb.log"   
DEFAULT_DRIVER = CDX     
DATAPATH = c:\limpium\dados\
ENABLEFILEFUNC = 1
CRYPT_TRAFFIC = 0
PASS_FOR_LOGIN = 0
PASS_FOR_MANAGE = 0
PASS_FOR_DATA = 0
Share_Tables  = 0
Cache_Records = 50
[DATABASE]
DataPath = c:\limpium\dados\
Driver = CDX
muito obrigado amigo, tenha um bom dia

abraços
Responder